//  *********************************************************************
//              
//     Program: errors.js $Id: //depot/tomcat/common/errors.js#1 $
//              
//     Written: Thu Aug 15, 2002
//              
//     Purpose: 
//              
//       Notes: 
//              
// Last Update: $Change: 90 $ $Revision: #1 $ $DateTime: 2002/09/09 13:14:25 $ $Author: prubin $ 
//
//==========================================================================
var validationOn=true;
function isNum(value) {
	for( var i = 0; i < value.length; ++i ) {		// make sure the number is all digits.. (by design)
		var c = value.charAt(i);
		if( c < '0' || c > '9' ) return false;
	}
	return true;
}
function mod10( cardNumber ) { // LUHN Formula for validation of credit card numbers.
	var ar = new Array( cardNumber.length );
	var i = 0,sum = 0;
	for( i = 0; i < cardNumber.length; ++i ) {
		ar[i] = parseInt(cardNumber.charAt(i));
	}
	for( i = ar.length -2; i >= 0; i-=2 ) { // you have to start from the right, and work back.
		ar[i] *= 2;							 // every second digit starting with the right most (check digit)
		if( ar[i] > 9 ) ar[i]-=9;			 // will be doubled, and summed with the skipped digits.
	}										 // if the double digit is > 9, ADD those individual digits together 
	for( i = 0; i < ar.length; ++i ) {
		sum += ar[i];						 // if the sum is divisible by 10 mod10 succeeds
	}
	return (((sum%10)==0)?true:false);	 	
}
function validateCard(cardNumber) {
	if (!isNum(cardNumber)) return ' Credit Card contains non-numeric digits';
	var length = cardNumber.length;			//perform card specific length and prefix tests
	var typeDigits = parseInt(cardNumber.substring(0,2));
	var cardType = '';
	if (typeDigits >= 50 && typeDigits <= 55 ) cardType = 'm';
	else if (typeDigits == 34 || typeDigits == 37) cardType = 'a';
	else if (typeDigits >= 40 && typeDigits <= 49) cardType = 'v';
	else if (typeDigits = 60) cardType = 'd'; 
	var message = " Unknown Credit Card Type";
	var error=false;
	switch( cardType ) {
		case 'a':
			message='Anerican Express card number';
			if( length != 15 ) error=true;
			break;
		case 'd':
			message='Discover card number';
			if( length != 16 ) error=true;
			break;
		case 'm':
			message='Master card number';
			if( length != 16 ) error=true;
			break;
		case 'v':
			message='Visa card number';
			if( length != 16 && length != 13 ) error=true;
			break;
		default:
			error=true;
	}
	if( !error && !mod10( cardNumber ) ) error=true
	if (error) return ' Invalid ' + message;
	return ""; // at this point card has not been proven to be invalid
}

function getVisibility(element) {
	var ret = "";
	if (element.style.visibility == "inherit")
		ret = "visible";
	if (element.parentElement) {
		var ret1 = getVisibility(element.parentElement);
		if (ret1 != "") 
			ret = ret1
	}
	return ret;
}

function ValidateForm(form, more) {
	if (!validationOn) return true;
	var i;
	var errors = "";
	if (more) errors = more;
	var numErrors=0;
	var focusElement=null;
	for(i=0; i<form.elements.length; i++) {
		var element = form.elements[i];
		var validate = element.validate;
		var value = element.value;
		if (value == "&nbsp;" || value == " ")
			value = "";
		var name = element.name;
		var title = element.title;
		if (!title) title = name;
		if (validate) {
			if (value!="") {
				if (validate.indexOf('isEmail')!=-1) { 
					var reEmail = /^.+\@.+\..+$/;
					if (!reEmail.test(value)) {
						errors+='- '+title+' must contain an e-mail address.\n';
						if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					}
				} else if (validate.indexOf('isPhone')!=-1) { 
					var rePhone = /^\(*[0-9][0-9][0-9]\)*[\- \.0-9x]+$/;
					if ( value.length < 4 ) {
						errors+='- '+title+' must contain a phone number.\n';
						if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					} else if (!rePhone.test(value)) {
						errors+='- '+title+' must contain a valid phone number.\n';
						if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					}	
				} else if (validate.indexOf('isSsn')!=-1) { 
					var reSsn = /^[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]$/;
					if (!reSsn.test(value)) {
						errors+='- '+title+' must contain a valid social security number.\n';
						if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					}	
				} else if (validate.indexOf('isDate')!=-1) { 
					var rePhone = /^[0-9][0-9]-[A-Za-z][A-Za-z][A-Za-z]-[0-9][0-9]+$/;
					if (!rePhone.test(value)) {
						errors+='- '+title+' must contain a valid date.\n';
						if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					}	
				} else if (validate.indexOf('isInteger')!=-1) { 
					var digits = /^[0-9]+$/;
					if (!digits.test(value) && value.length > 0 ) {	 
						errors+='- '+title+' must be an Integer.\n'; 
						if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					}
				} else if (validate.indexOf('is2decimal')!=-1) { 
					var digits = "1234567890.";
					var er = 0;
					var decimalStart = 0 ;
					var  decimalPlaces = 0; 
					if ( value.length > 0 ) {
						for (var ii=0; ii < value.length; ii++) {
							if ( decimalStart == 1 ) { decimalPlaces++ ; }
							if (digits.indexOf(value.charAt(ii)) == -1) { er = 1;   }
							else if ( value.charAt(ii) == "." ) { decimalStart = 1 ; }	
						}
						if ( er == 1 )	{ 
							errors+='- '+title+' must be a number with max 2 decimals.\n'; 
							if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
						}
						if ( decimalPlaces > 2 )	{ 
							errors+='- '+title+' number has more than  2 decimals.\n'; 
							if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
						}																				
					}
				} else if (validate.indexOf('isNumber')!=-1) { 
					if (isNaN(value)) {
						errors+='- '+title+' must contain a number.\n';
							if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					} else {
						var min = element.min;
						var max = element.max;
						var num = parseFloat(value);
						if (min && max && (num < min || num >max)) {
							errors+='- '+title+' must contain a number between '+min+' and '+max+'.\n';
							if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
						} else if (min && num < min) {
							errors+='- '+title+' must contain a number greater than '+min+'.\n';
							if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
						} else if (max && num > max) {
							errors+='- '+title+' must contain a number less than '+max+'.\n';
							if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
						} 
					} 
				} else if (validate.indexOf('isCC')!=-1) { 
					//4635...7905
					var regex = /^\d\d\d\d\.\.\.\d\d\d\d$/g;
					if (!regex.test(value)) {
						regex = /[ -]/g;
						value = value.replace(regex, "");
						var ccError = validateCard(value);
						if (ccError != "") {
							errors+='- '+title+ccError+'\n';
							if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
						}
					} 
				} else if (isNaN(validate.substr(1))) {
					var width = parseFloat(validate.substr(1));
					if (value.length < width) {
						errors+='- '+title+' must contain a value greater than '+width+' in length.\n';
						if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
					}	
				}
			} else if (validate.charAt(0) == 'R') {
				errors += '- '+title+' is required.\n'; 
				if (focusElement == null && getVisibility(element) == "visible") focusElement = element;
			}	
		}
	}
	if (errors) 
		alert('The following error(s) occurred:\n'+errors);
	if (focusElement) 
		focusElement.focus();
	return (errors == '');
}

function netscapeValidations(form) {
	var i;
	var validate= "if (navigator.appName != \"Microsoft Internet Explorer\") {<br>";
	validate += "&nbsp;&nbsp;&nbsp;var form = document.forms." + form.name + ";<br>";
	var lastChild="";
	for(i=0; i<form.elements.length; i++) {
		var name = form.elements[i].name;
		var pos = name.indexOf(".");
		if (pos>=0) {
			var child = name.substring(0, pos);
			if (child != lastChild) {
				if (lastChild != "")
					validate += "&nbsp;&nbsp;&nbsp;&lt;!-- Child Block End --&gt;<br>";
				validate += "&nbsp;&nbsp;&nbsp;&lt;!-- Child Block " + child + " --&gt;<br>";
				lastChild = child;
			}
			if (form.elements[i].validate)
				validate += "&nbsp;&nbsp;&nbsp;form.elements[\""+form.elements[i].name+"\"].validate = \"" 
					+ form.elements[i].validate + "\";<br>";
			if (form.elements[i].title)
				validate += "&nbsp;&nbsp;&nbsp;form.elements[\""+form.elements[i].name+"\"].title = \"" 
					+ form.elements[i].title + "\";<br>";
			if (form.elements[i].min)
				validate += "&nbsp;&nbsp;&nbsp;form.elements[\""+form.elements[i].name+"\"].min = \"" 
					+ form.elements[i].min + "\";<br>";
			if (form.elements[i].max)
				validate += "&nbsp;&nbsp;&nbsp;form.elements[\""+form.elements[i].name+"\"].max = \"" 
					+ form.elements[i].max + "\";<br>";
		} else {
			if (form.elements[i].validate)
				validate += "&nbsp;&nbsp;&nbsp;form." + form.elements[i].name + ".validate = \"" 
					+ form.elements[i].validate + "\";<br>";
			if (form.elements[i].title)
				validate += "&nbsp;&nbsp;&nbsp;form." + form.elements[i].name + ".title = \"" 
					+ form.elements[i].title + "\";<br>";
			if (form.elements[i].min)
				validate += "&nbsp;&nbsp;&nbsp;form." + form.elements[i].name + ".min = \"" 
					+ form.elements[i].min + "\";<br>";
			if (form.elements[i].max)
				validate += "&nbsp;&nbsp;&nbsp;form." + form.elements[i].name + ".max = \"" 
					+ form.elements[i].max + "\";<br>";
		}
	}
	if (lastChild != "")
		validate += "&nbsp;&nbsp;&nbsp;&lt;!-- Child Block End --&gt;<br>";
	validate += "}<br>";
	document.write(validate);
}


