/*  This code copyright iWeb Solutions Pty Ltd 
	
	iStore Version 1.0
	Modified: 04th March 2002
	By: r.breuer@iwebsolutions.com.au
	Date Validation
*/
// Global Variables

var csv = new Object();
function setCSV(){
	csv.Debug = false;
	csv.Frm = null;
	csv.Errors = '';
	csv.ErrCount = 0;
	csv.Valid = Validate;
	csv.showErrors = showErrors; 
};
WinLoad(setCSV);
function showErrors(){
	//if (csv.Errors != ''){
		alert(csv.Errors);
	//}
};

function setDisabled(){
	frm = document.TheForm;
	for (var i=0;i<frm.length;i++){
		el = frm.elements[i];
		var eli = null;
		var val = null;
		if(csv.Debug) showEl(el);
		if (el.getAttribute('v')){// validation rule exists
			var vr = new Array();
			vr = el.getAttribute('v').split(',');
			var eli = document.getElementById('img'+el.id);
			switch(vr[0])
			{
				case "DF":
					var df = document.getElementById(vr[3]);
					if (df) {
						if (!(df.type=='radio' || df.type=='checkbox')){
							if ((df.value != vr[4]) || ((vr[4] != "" || vr[4] != null )&&df.value == "" )){
								el.disabled=true;
								if (eli) eli.style['display'] = 'inline';
							}else{
								el.disabled=false;
								el.value = "";
								if (eli) eli.style['display'] = 'none';
							}
						} else {
							if (df.checked){
								el.disabled=false;
								if (eli) eli.style['display'] = 'inline';
							}else{
								el.disabled=true;
								el.value = "";
								if (eli) eli.style['display'] = 'none';
							}
						}
					}
					break;
				default:
					break;
			} //End Switch 
		} //End If
	} //End For
}


/*
vr[0] - rule E;R;D;DF;NR;N;dfsv : Email, Required, Date, DependentFiled, Not Required, Number, Dep Field Set Value
vr[1] - second rule E;R;D
vr[2] - error message
vr[3] - dependant field name 
vr[4] - dependant field value
*/
function Validate(frm){
	csv.Errors = '';
	var isErr = false;
	for (var i=0;i<frm.length;i++)
		{
			el = frm.elements[i];
			var val = null;
			if(csv.Debug) showEl(el);
			if (el.getAttribute('v')){// validation rule exists
				var vr = new Array();
				vr = el.getAttribute('v').split(',');
				var l = document.getElementById('l'+el.id);
				if (l) l.style['color'] = '#333333';
				//if (el.type == 'checkbox') alert(el.checked);
				
				switch(vr[0])//First Pass
				{
					case "DF":
						var df = document.getElementById(vr[3]);
						if (df) {
							if (!(df.type=='radio' || df.type=='checkbox')){
								if ((df.value == vr[4]) || ((vr[4] == "" || vr[4] == null )&&df.value != "" )){
									isErr = checkRule(vr[1], el, vr[4]);
								}
							} else {
								if (df.checked){
									isErr = checkRule(vr[1], el );
								}
							}
						}
						break;
					case "DFSV":
						var df = document.getElementById(vr[3]);
						if (df) {
							if (checkRule('SV', df, vr[4])){
								isErr = checkRule(vr[1], el);
							}
						}
						break;
					default:
						isErr = checkRule(vr[0], el);
						break;
				}
				if (isErr) {
					if (l) l.style['color'] = '#FF0000';
					csv.ErrCount ++;
					csv.Errors += csv.ErrCount + ". " + vr[2]+'\n';
					isErr = false;
				}
			}
	    }
	return false;
}
function checkRule(rule, el, val){
	switch(rule)//Put validation Rules Here
	{
		case "E":
			return !validEmail(el.value);
			break;
		case "R":
			if (!(el.type=='radio' || el.type=='checkbox')){
				return !CheckNull(el.value);
				break;
			}else{
				return Checked(el);
				break;
			}
		case "NR":
			return CheckNull(el.value);
			break;
		case "SV":
			return CheckSetValue(el.value, val);
			break;
		case "D":
			return !validDate(el.value);
			break;
		case "N":
			return !validNumber(el.value);
			break;
		default:
			break;
	}
}

function showEl(el){
	var out = "";
	out += ('\nElement ID: ' + el.id);
	out += ('\nName: ' + el.name);
	out += ('\nType: ' + el.type);
	out += ('\nValue: ' + el.value + '\n');
	out += ('\nValidation: ' + el.getAttribute('v'));
	alert(out);
}
function CheckNull(sValue){return!(sValue==null||sValue==""||sValue=="0"||sValue=="-1");};
function Checked(el){return!(el.checked);};
function CheckSetValue(sValue, val){return(sValue==val);};
function validNUmber(sValue){return!(isNaN(sValue)||sValue=="")};
//Validate that the user password has at liast one digit and one letter and is minimum 6 characters long.
function validPassword(password){
	var passPat = /^(?![0-9]{6,20})[0-9a-zA-Z]{6,20}$/;
	var matchArray=password.match(passPat);
	if (matchArray==null) {	// password with at leat 6 char to 20 chars
		return false;
	}
	return true;
}
function validDate(strDate) {

var strDatestyle = "EU";  //European date style - US for United States
var strDate;
var strDateArray;
var strDay;
var strMonth;
var strYear;
var intday;
var intMonth;
var intYear;
var booFound = false;
var strSeparatorArray = new Array("-"," ","/",".");
var intElementNr;
var err = 0;
var strMonthArray = new Array(12);

strMonthArray[0] = "Jan";
strMonthArray[1] = "Feb";
strMonthArray[2] = "Mar";
strMonthArray[3] = "Apr";
strMonthArray[4] = "May";
strMonthArray[5] = "Jun";
strMonthArray[6] = "Jul";
strMonthArray[7] = "Aug";
strMonthArray[8] = "Sep";
strMonthArray[9] = "Oct";
strMonthArray[10] = "Nov";
strMonthArray[11] = "Dec";

if (strDate.length < 1) {
  return false;
}

for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
  if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
    strDateArray = strDate.split(strSeparatorArray[intElementNr]);
    if (strDateArray.length != 3) {
      err = 1;
      return false;
    } else {
      strDay = strDateArray[0];
      strMonth = strDateArray[1];
      strYear = strDateArray[2];
    }
    booFound = true;
  }
}

if (booFound == false) {
  if (strDate.length>5) {
    strDay = strDate.substr(0, 2);
    strMonth = strDate.substr(2, 2);
    strYear = strDate.substr(4);
  }
}

if (strYear.length == 2) { // Modified by Mark to fix a y2k problem 13/6/01
  	if (strYear < "50") {
		strYear = "20" + strYear;
	}else{
		strYear = "19" + strYear;
	}
}

// US style
if (strDatestyle == "US") {
  strTemp = strDay;
  strDay = strMonth;
  strMonth = strTemp;
}

intday = parseInt(strDay, 10);
if (isNaN(intday)) {
  err = 2;
  return false;
}

intMonth = parseInt(strMonth, 10);
if (isNaN(intMonth)) {
  for (i = 0;i<12;i++) {
    if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
      intMonth = i+1;
      strMonth = strMonthArray[i];
      i = 12;
   }
  }
  if (isNaN(intMonth)) {
    err = 3;
    return false;
  }
}

intYear = parseInt(strYear, 10);
if (isNaN(intYear)) {
  err = 4;
  return false;
}

if (intMonth>12 || intMonth<1) {
  err = 5;
  return false;
}

if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
  err = 6;
  return false;
}

if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
  err = 7;
  return false;
}

if (intMonth == 2) {
  if (intday < 1) {
    err = 8;
    return false;
  }
  if (LeapYear(intYear) == true) {
    if (intday > 29) {
      err = 9;
      return false;
    }
  } else {
    if (intday > 28) {
      err = 10;
      return false;
    }
  }
}

// Set the hidden form element to an American date format for use in an SQL statement.
// datefield.value = intday + " " + strMonthArray[intMonth-1] + " " + strYear;
// datefield.value = intMonth + "/" + intday + "/" + strYear;
// datefield.value = intday + "-" + strMonthArray[intMonth-1] + "-" + strYear;
return true;
}

function LeapYear(intYear) {
  if (intYear % 100 == 0) {
    if (intYear % 400 == 0) { return true; }
  } else {
    if ((intYear % 4) == 0) { return true; }
  }
  return false;
}

/* Validate length of Text Area 
	Usage: onKeyUp="fnLength(this, 255);" */
function fnLength(el, len){ if (el.value.length > len) el.value = el.value.slice(0,len); }
/* Validate numbers */
function validNum(oCtrl, strField){
	if ((isNaN(oCtrl.value)) || (oCtrl.value == "")){return false;}
	return true;			
}

/* Email Validation */
function validEmail(emailStr) { // Complex eMail Address Validation
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	
	if (emailStr.length < 1 ){ //Email address is invalid 0 length string.
		return false;
	}

	var matchArray=emailStr.match(emailPat)
	if (matchArray==null) {	// Email address invalid - @ and .'s)
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	if (user.match(userPat)==null) { // The username is invalid.
		return false;
	}
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) { // Destination IP address is invalid
				return false; }
		}
		return true;
	}
	var domainArray=domain.match(domainPat);
	if (domainArray==null) { // The domain name is invalid.
		return false; }
	var atomPat=new RegExp(atom,"g");
	var domArr=domain.match(atomPat);
	var len=domArr.length;
	if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) { // The domain must be three-letters
		return false;
	}
	if (len<2) { // This address is missing a hostname!
		return false; }
	// The Address is Valid	
	return true;
}

// CreditCard Validation : Validates that the CC is well formed.
function ValidCC(CardNum,CardType)
{
	var CleanCardNum = "";
	var Total = 0;
	var Length = 0;
	var isValid = false;
	var ValidLength = false;
	var prefixRegExp;
	// Clean CardNum String
	for (i = 0; i < CardNum.length; i++) {
		c = parseInt(CardNum.charAt(i), 10);
		CleanCardNum += (c >= 0 && c <= 9) ? c : "";
	}
	Length = CleanCardNum.length;
	// Check Card Prefix and length
	switch(CardType)
	{
		case "MasterCard":
			ValidLength = (Length == 16);
			prefixRegExp = /^5[1-5]/;
			break;
		case "Visa":
			ValidLength = (Length == 16 || Length == 13);
			prefixRegExp = /^4/;
			break;
		case "AMEX":
			ValidLength = (Length == 15);
			prefixRegExp = /^3(4|7)/;
			break;
		case "Diners":
			ValidLength = (Length == 15);
			prefixRegExp = /^3(0|6|8)/;
			break;
		case "BankCard":
			ValidLength = (Length == 16);
			prefixRegExp = /^5610/;
			break;
		default:
			prefixRegExp = /^$/;
	//		alert("Card type not found");
			return false;
	}
	isValid = (prefixRegExp.test(CleanCardNum) && ValidLength)
	// Perform the Luhn Test
	if (isValid)
	{
		for (var i = Length - 1; i >= 0; i--)
		{
			Total += parseInt(CleanCardNum.charAt(i), 10);
			i--;
			numProduct = String((CleanCardNum.charAt(i) * 2));
			for (var x = 0; x < numProduct.length; x++)
			{
				Total += parseInt(numProduct.charAt(x));
			}
		}
	
		isValid = (Total % 10 == 0);
	}
//	if (!isValid)
//	{
//		alert("Your card details are not correct please check your Card Type and Number.");
//	}
	return isValid;
}

