	ns4 = (document.layers)? true:false
	ie4 = (document.all)? true:false
	
	_DEBUG = false;
	errs = new Array;
	_order = new Array;
	_index = new Array;

	label = new Array;
	text = new Array;
	mandatory = new Array;
	_dataType = new Array;
	_minLength = new Array;
	_maxLength = new Array;
	_validation = new Array;
	_section = new Array;
	_disabled = new Array;

	_doValidation = false;
	_doParking = false;

	_svrIndex = 0;
	_svrFields = new Array;
	_svrErrors = new Array; 

function _doScotiaCardModCheck(aCardNumber)
{
	mod10Weights = [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1];
	return _isValidModMultAddParts(10, mod10Weights, aCardNumber);
}
//************************************************************************
// Function		: _doVISAModCheck(aVISANumber)
// Description  : Determines whether the provided value passes the mod-10 check
//************************************************************************
function _doVISAModCheck(aVISANumber)
{   
    if (!_isInteger(aVISANumber))  return  false;
	if (! aVISANumber.length == 16)  return  false;
	if ((aVISANumber.charAt(0) != '4')) return false;
	mod10Weights = [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1];
	return _isValidModMultAddParts(10, mod10Weights, aVISANumber);
}
function printPage() { 
		if(document.all) { 
			document.all.print.style.visibility = 'hidden'; 
			window.print(); 
			document.all.print.style.visibility = 'visible'; 
		} else { 
			document.getElementById('print').style.visibility = 'hidden'; 
			window.print(); 
			document.getElementById('print').style.visibility = 'visible'; 
		} 
	} 

function _isInteger(anIntegerString){
	return -1 == anIntegerString.search(/[^0-9]/);
}

function _isNumeric(aNumericString){
	var len = aNumericString.length;
	if (len < 1)
		return false;
	return -1 == aNumericString.search(/[^0-9.]/);
}



//************************************************************************
// Function		: _isValidModMultAddParts(aModulus, theWeights, aValue)
// Description  : Checks the provided number against the desired modulus
//             	  using the provided weights for each of the digits within
//             	  the number
//************************************************************************
function _isValidModMultAddParts(aModulus, theWeights, aValue)
{
	var len = aValue.length;

	if (len != theWeights.length)
		return false;

	if (! _isInteger(aValue))
		return false;

	var answer = 0;
	var c;
	var multDigit;
	var answer = 0;
	for (i = 0; i < len; i++)
	{
		c = aValue.charAt(i);
		multDigit = Math.round((c - '0') * theWeights[i]);
		answer += Math.floor(multDigit / 10) + (multDigit % 10);
	}
	return ((answer % aModulus) == 0);
}

function _isEmail(aString, aMaxLength)
{ 
	if (aMaxLength)
	{
		if (aString.length > aMaxLength)
		{
			return false;
		}
	}
	if (aString)
	{
		var ok = aString.search(/^[a-z0-9_][a-z-_0-9.]*@[a-z0-9_][a-z-_0-9.]*/gi);
		return ok != -1;
	}
}
function _isText(aString)
{
	if (aString) return true;
	else return false;

}
function _isAlphanumericOrPunctuation(aString)
{
	return _isAlphanumeric(aString);			//ISSfo10801
}
function _isSpace(aString)
{
	// return false if is space in the string
	return  (-1 == aString.search(/ /gi));
}

function _isAlphabetic(aString)
{
	if (aString)
	{
		if (_isEnglish())
			return (-1 == aString.search(/[^a-z-,\/.' ]/gi));		//ISSfo10801
		else
		{
			return (-1 == aString.search(/[^a-zà-åç-ïñ-öù-ý-,\/.' ÿ]/gi));
		}
	}

	return false;
}
function _isAlphanumericSpecial(aString)
{
	if (aString)
	{
		if (_isEnglish())
			return (-1 == aString.search(/[^a-z0-9-.,'\/\\()#&@_ $*]/gi));	//ISSfo10801
		else
			return (-1 == aString.search(/[^a-z0-9à-åç-ïñ-öù-ý-.,'\/\\()#&@_ ÿ]/gi));	//ISSfo10801
	}

	return false;
}

function _isAlphanumeric(aString)
{
	if (aString)
	{
		if (_isEnglish())
			return (-1 == aString.search(/[^a-z0-9()-.,'\/ ]/gi));	//ISSfo10801
		else
			return (-1 == aString.search(/[^a-z0-9()à-åç-ïñ-öù-ý-.,'\/ ÿ]/gi));
	}

	return false;
}
function _isEnglish(){
	return _languageCode == 1;
}

function _isFrench(){
	return _languageCode == 0;
}
function checkPhoneRequired(phoneID){
  //alert(phoneID);
	var pos = phoneID.lastIndexOf('_AREA_CODE') + 1;
	if (pos <= 0)	return true;
	var prefix = phoneID.substring(0, pos);
	var areaCode = getFieldValue(phoneID);
	var exchange = getFieldValue(prefix + "EXCHANGE");
	var number = getFieldValue(prefix + "NUMBER");
	if ((areaCode.length > 0 || exchange.length > 0 || number.length > 0)
		&& (areaCode.length == 0 || exchange.length == 0 || number.length == 0))
		return false;
	return  true;
}

function checkAreaCode(textID){	
	if (!_isInteger(getFieldValue(textID)))
		return _IS_INVALID;
	return checkPhoneRequired(textID);
}
function disableField(fieldID){
	alert("disable");
	enableField(fieldID, false);
}

function enableField(fieldID, enable){
	var obj = getInputObj(fieldID);
	if (obj)	{
	alert (obj.type);
		if (enable == false){
			_disabled[fieldID] = true;
			if (obj.type == "text")	{
				disableTextField(obj);
			}
			else if (obj.type == "checkbox")
			{
				disableCheckBox(obj);
			}
			else if (obj.type == "select-one")	//listbox
			{
				disableDropDown(obj);
			}
			else if (obj.type == "select-multiple")	//listbox
			{
				disableMultiDropDown(obj);
			}
			else if (obj.type == "radio")	// one radio button
			{
				disableRadioGroup(obj);
			}
			else if (obj.type ==  "submit" || obj.type == "button" || obj.type == "reset")
			{
				disableButton(obj);
			}
			else if (obj[0] && obj[0].type == "radio")	//radio group
			{
				disableRadioGroup(obj);
			}
			else
			{
				if (_DEBUG == true)
					alert("cannot disable unknown obj.type : " + obj.type);
			}
		}
		else{
			_disabled[fieldID] = null;
			if (obj.type == "text")			{
				enableTextField(obj);
			}
			else if (obj.type == "checkbox"){
				enableCheckBox(obj);
			}
			else if (obj.type == "select-one" || obj.type == "select-multiple")	//listbox
			{
				enableDropDown(obj);
			}
			else if (obj.type == "radio")	// one radio button
			{
				enableRadioGroup(obj);
			}
			else if (obj.type ==  "submit" || obj.type == "button" || obj.type == "reset")
			{
				enableButton(obj);
			}
			else if (obj[0] && obj[0].type == "radio")	//radio group
			{
				enableRadioGroup(obj);
			}
		}
	}
}
function disableTextField(field)
{
   	field.disabled = true;
	if (ns4)
  	{
    	field.onfocus = _skip;
  	}
}

function enableTextField(field)
{
	field.disabled = false;
	if (ns4)
  	{
    	field.onfocus = this.focus();
    }
}

function clearTextField(field)
{
	field.value = "";
}
function setOptions(obj, data, offset)
{
	while (obj.length > offset)
		obj.options[obj.length - 1] = null;
	for (var i = 0; i < data.length; i++)
		obj.options[i + offset] = new Option(data[i][1], data[i][0]);
}

function getInputObj(inputID)
{
	var inputObj = null;
	with (document.forms[0])
	{
		if (ns4)
		{
			if (document.forms[0][inputID])
				inputObj = eval(inputID);
		}
		else
		{
			if (document.getElementById(inputID))
				inputObj = eval(inputID);
		}
		if (!inputObj)
		{
			//debug purposes only!
			if (_DEBUG == true)
				alert(inputID + " -- input field does not exist");
		}
	}
	return inputObj;
}

function checkCountryProvinceState(countryID, provinceStateID)
{
	var err = NO_ERROR;
	var country = getFieldValue(countryID);
	var provStateIdx = getInputObj(provinceStateID).selectedIndex;
	//NOTE: code assumes first options is blank & that there are 13 provinces at the beginning of the list with states following

	if (provStateIdx > 0 &&
		country.length > 0)
	{
		if (country == CANADA)
		{
			if (provStateIdx > 13)
			{
				err = _IS_INVALID;
			}
		}
		else if (country == USA)
		{
			if (provStateIdx <= 13)
			{
				err = _IS_INVALID;
			}
		}
	}
	return err;
}
function disableDropDown(dropdown)
{
	if (!dropdown.disabled)
	{
		dropdown.disabled = true;
		if (ns4)
		{
	    	dropdown.oldOnFocus = dropdown.onfocus ? dropdown.onfocus : null;
      		dropdown.onfocus = _skip;
			_saveDropDownState(dropdown);
		}
	}
}
function enableDropDown(dropdown)
{
	if (ns4)
	{
		dropdown.onfocus = dropdown.oldOnFocus;
		if (dropdown.type != "select-multiple")
			_restoreDropDownState(dropdown);
	}
	dropdown.disabled = false;
}
function _saveDropDownState(dropdown)
{
	var data = new Array;

	for (var i = 0; i < dropdown.length; i++)
	{
		data[i] = new Array;
		data[i][0] = dropdown.options[i].value;
		data[i][1] = dropdown.options[i].text;
	}

	dropdown.savedOptions = data;
	var sel = getListSelectionValue(dropdown);
	dropdown.savedValue = sel;
	for (var i = dropdown.length - 1; i >= 0; i--)
	{
		if (dropdown.options[i].value != sel)
		{
			dropdown.options[i] = null;
		}
	}
}

function _restoreDropDownState(dropdown)
{
	if (dropdown.disabled)
	{
		//alert("start _restoreDropDownState : " + dropdown);

		setOptions(dropdown, dropdown.savedOptions, 0);
		//dropdown.selectedIndex = dropdown.savedIndex;
		dropdown.savedOptions = null;
		setListSelection(dropdown, dropdown.savedValue);
		dropdown.savedValue = null;
		//alert("finish _restoreDropDownState : " + dropdown);
	}
}
 
 //function date
function diffDates(date1, date2)		//return 1 if date1 > date2, -1 if date1 < date2, else 0
{   var diff2 = (date1 - date2)/86400000; 
	return diff2;
}

function checkBetweenTwoDate(date1, date2, date3, date4) { //return 1 if date 3 are NOT between date1 and date 2 othervise return -1
	if(compareDates(date3, date1) < 1) {
		if(compareDates(date4, date1) > -1) return -1		
	} 
	else {
		if(compareDates(date3, date2) < 1) return -1
		else {
			if(compareDates(date3, date2) <1) return -1
		}
	}	
	return 1;
}

function compareDates(date1, date2)		//return 1 if date1 > date2, -1 if date1 < date2, else 0
{  
	var diff = date1.getTime() - date2.getTime();
	if (diff > 0) return 1;
	else if (diff < 0) return -1;
	return 0;
}
function checkFutureDate(fieldID){
	//precondition:
	// date is valid date
	if (_isFutureDate(fieldID))
		return NO_ERROR;
	return _IS_INVALID;
}

function _isDate(year, month, day){
	if (Number(year) < 1900) //year must be 1900 & above
		return false;
	var date = new Date(year, month, day);
	return (date.getFullYear() == year && date.getMonth() == month && date.getDate() == day);
}


function checkDate(aDateField){
	//precondition:
	//	year field is not empty
	var prefix = aDateField.name.substring(0, aDateField.name.lastIndexOf('_') + 1);
	var day = getFieldValue(prefix + "DAY");
	var month = getFieldValue(prefix + "MONTH");
	var year = getFieldValue(prefix + "YEAR");
	if (day.length == 0 && month.length == 0 && year.length == 0)
		return _IS_REQUIRED;
	if (day.length == 0 && isDisabled(prefix + "DAY"))	{
		day = "1";	//for validation
	}
	if (month.length == 0 || year.length == 0 || day.length == 0)	{
		return _INCOMPLETE;	}
	if (!_isDate(Number(year), Number(month) - 1, Number(day)))
		return _IS_INVALID;
	return NO_ERROR;

}
function checkPastDate(fieldID){
	//precondition:
	// date is valid date
	if (_isFutureDate(fieldID))
		return _IS_INVALID;
	return NO_ERROR;
}
function _isFutureDate(aDateFieldID){
	//precondition: date is valid date
	alert(new Date().getMonth());
	var aDateField = getInputObj(aDateFieldID);
	alert(aDateField.name);
	var prefix = aDateField.name.substring(0, aDateField.name.lastIndexOf('/') + 1);
	alert(prefix);
	var day = getFieldValue(prefix + "DAY");
	var month = getFieldValue(prefix + "MONTH");
	var year = getFieldValue(prefix + "YEAR");
	alert(prefix + day );
	return 1 == compareDates(aDateFieldID, new Date());
}
// JavaScript Document