var required_fields = new Array();
var email_fields = new Array ();
var numeric_fields = new Array(); // numeric fields
var numeric_fields_positiv = new Array(); // positiv numeric fields
var cc_number_fields = new Array(); // valid credit card number
var expired_fields = new Array();

function flag(form_name, fname, caption){
    eval('var obj = document.'+form_name+'.elements["'+fname+'"];');
	
	    if ((trim(obj.value).length) == 0) {
	        obj_focus(obj, "Please enter '"+caption+"'.");
	        return false;
	     } else return true;
	
	
}
function validateCCNum(cardType,cardNum)
{
   var result = false;
   cardType = cardType.toUpperCase();
   
   var cardLen = cardNum.length;
   var firstdig = cardNum.substring(0,1);
   var seconddig = cardNum.substring(1,2);
   var first4digs = cardNum.substring(0,4);
   switch (cardType)
   {
      case "VISA":
         result = ((cardLen == 16) || (cardLen == 13)) && (firstdig == "4");
         break;
      case "AMEX":
         var validNums = "47";
         result = (cardLen == 15) && (firstdig == "3") && (validNums.indexOf(seconddig)>=0);
         break;
      case "MASTERCARD":
         var validNums = "12345";
         result = (cardLen == 16) && (firstdig == "5") && (validNums.indexOf(seconddig)>=0);
         break;
      case "DISCOVER":
         result = (cardLen == 16) && (first4digs == "6011");
         break;
      case "DINERS":
         var validNums = "068";
         result = (cardLen == 14) && (firstdig == "3") && (validNums.indexOf(seconddig)>=0);
         break;
   }
   return result;
}

function LuhnCheck(str)
{
  var result = true;
  var sum = 0;
  var mul = 1;
  var strLen = str.length;
  for (i = 0; i < strLen; i++)
  {
    var digit = str.substring(strLen-i-1,strLen-i);
    var tproduct = parseInt(digit ,10)*mul;
    if (tproduct >= 10)
      sum += (tproduct % 10) + 1;
    else
      sum += tproduct;
    if (mul == 1)
      mul++;
    else
      mul--;
  }
  if ((sum % 10) != 0)
    result = false;
  return result;
}

function flag_cc_number (form_name, fname) {
    
    eval("var obj = document."+form_name+".elements[\""+fname+"\"];");
    
    if (obj == undefined ) {return true;}
    
    if (obj.value == '' ) {
        return true;
    }
    var fl = flag_num_pos(form_name, fname, 'Credit Card Number');
    if (fl) {
        if (!(validateCCNum('VISA', obj.value) ||  validateCCNum('AMEX', obj.value) ||  validateCCNum('MASTERCARD', obj.value)) || !LuhnCheck(obj.value)) {
            obj_select(obj, "Invalid Credit Card Number.");
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    } 
}

function validEmail(email)
{
  email_regular_expression=new RegExp("^([-!#\$%&'*+./0-9=?A-Z^_`a-z{|}~ ])+@([-!#\$%&'*+/0-9=?A-Z^_`a-z{|}~ ]+\\.)+[a-zA-Z]{2,5}\$");   // email_regular_expression= '^.+@.+\\..+$';  // simple one
  return email_regular_expression.test(email);
}


function flag_num(form_name, fname, caption){
    eval("var obj = document."+form_name+".elements[\""+fname+"\"];");
    if (obj == undefined ) {return true;}
        if (isNaN(trim(obj.value))) {
            obj_select(obj, "Please enter numeric value for '"+caption+"'.");
            return false;
         } else return true;
    
    
}
function flag_num_pos(form_name, fname, caption){
    eval("var obj = document."+form_name+".elements[\""+fname+"\"];");
    if (obj == undefined ) {return true;}
        if (isNaN(trim(obj.value))) {
            obj_select(obj, "Please enter numeric value for '"+caption+"'.");
            return false;
         } else if (trim(obj.value)<0) {
            obj_select(obj, "Please enter positive numeric value for '"+caption+"'.");
            return false;
         } else return true;
}


function flag_email(form_name, fname, caption){
    eval("var obj = document."+form_name+".elements[\""+fname+"\"];");
		
		if ((trim(obj.value).length) != 0) {
        
         	if (!validEmail(obj.value)) {
            	 obj_select(obj,"Your '"+caption+"' is invalid!" + '\n' + "Please type in valid '"+caption+"'.");
				 return false;
			} else {
				 return true;
			}
		} else {
			return true;
		}
}
function validExpired(val) {
	fl = false;
	regular_expression=new RegExp("^[0-9]{4,4}\$");   
  	
  	if (regular_expression.test(val)) {
  		
  		y = new Number('20'+val.substr(0,2));
  		m = new Number(val.substr(2,2));
  		
  		msg = validatedate_m(m,1,y, '');
  		
  		if (msg == '') {
  			fl = true;
  		}
  	}
  	return fl;
	
}
function validatedate_m(m,d,y,desc)
{

    var msg = "";
    if (m<1 || m>12) {
         msg=desc+" is not a valid date";
         return msg;
    }
    
    var date = new Date(y, m, 0); 
   
    var last_day = date.getDate();
    
    if(d>last_day)
    {
        msg=desc+" is not a valid date";
    }
    
    return msg;
}

function flag_expired(form_name, fname, caption) {
	 eval("var obj = document."+form_name+".elements[\""+fname+"\"];");
	 if ((trim(obj.value).length) != 0) {
	 	if (!validExpired(obj.value)) {
            	 obj_select(obj,"Your '"+caption+"' is invalid!" + '\n' + "Please type in valid '"+caption+"'.");
				 return false;
			} else {
				 return true;
		}
	 } else {
	 	return true;
	 }
}

function test_f(form, form_name) {
	var flag1 = 0;
	
    for (var i = 0; i < required_fields.length; i+=2) {
        if (!flag(form_name,required_fields[i],required_fields[i+1])) {
            return false; 
        } 
    }
	
	
	
	for (var i = 0; i < email_fields.length; i+=2) {
		if (!flag_email(form_name, email_fields[i],email_fields[i+1])) {
			return false;
		}
	}
	for (var i = 0; i < numeric_fields.length; i+=2) {
        if (!flag_num(form_name,numeric_fields[i],numeric_fields[i+1])) {
            return false; 
        } 
    }
    for (var i = 0; i < expired_fields.length; i+=2) {
        if (!flag_expired(form_name,expired_fields[i],expired_fields[i+1])) {
            return false; 
        } 
    }
    for (var i = 0; i < numeric_fields_positiv.length; i+=2) {
        if (!flag_num_pos(form_name,numeric_fields_positiv[i],numeric_fields_positiv[i+1])) {
            return false; 
        } 
    }
    for (var i = 0; i < cc_number_fields.length; i+=2) {
        
        if (!flag_cc_number(form_name, cc_number_fields[i])) {
            return false;
        }
    }

	return true;
    
}
function submit_valid_form(form, form_name, act) {
	if ( test_f(form, form_name)) {
		if (act !=undefined) {
			form.action = act;
		}
		form.submit();
		return true;
	} else {
		return false;
	}
}