/* 
	Form Validation 
	This js file can be used for Validation of Form.
	It can validate 
	    whether the required fields are filled, 
	    do the number fields contains only number, 
	    is email address valid, 
	    is credit card number valid.
*/

var validator = {
	init: function (settings) {
		this.settings = settings;
		this.form = document.getElementById(this.settings["formId"]);
		formInputs = this.form.getElementsByTagName("input");
			error = validator.validate();
			if(error.length < 1) {
				return true;
			} else {
				return false;
			}
	},
	validate: function () {
		error = '';
		errorFields='';
		email_error='';
		ccmail_error='';
		cc_error='';
		flag=0;
		validationTypes = new Array("isRequired", "isEmail", "isNumeric", "isCreditCard", "isReqNum", "isReqEmail", "isReqCC");
		validationFields = new Array("ReqFields", "EmailFields", "NumFields", "CCFields", "ReqNumFields", "ReqEmailFields", "ReqCCFields");
		for(n=0; n<validationTypes.length; n++) {
			var x = this.settings[validationTypes[n]];
			var y = this.settings[validationFields[n]];
			if(x != null) {
				for(i=0; i<x.length; i++) 
				{
					inputField = document.getElementById(x[i]);
					switch (validationTypes[n]) {
						case "isRequired" :
						    valid = !isRequired(inputField.value);
						    errorMsg = "is a required field.";
						    break;
						case "isNumeric" :
						    if(!isRequired(inputField.value))
						    {
						        valid = isNumeric(inputField.value);
    						    if(!valid)
    						    {
						            errorMsg = "can only be a number.";
						        }
	    				    }
	    					else
						    {
                                valid = true;
						    }
                            break;
						case "isReqNum" :
						    valid = !isRequired(inputField.value) && isNumeric(inputField.value);
                            if(isRequired(inputField.value))
						        errorMsg = "is a required field.";
						    else if(!isNumeric(inputField.value))
						        errorMsg = "can only be a number.";
						    break;
						case "isReqEmail" :
						    valid = !isRequired(inputField.value) && isEmail(inputField.value);
                            if(isRequired(inputField.value))
                            {
						        errorMsg = "is a required field.";
						        email_error = "This is a required field.";
						    }
						    else if(!isEmail(inputField.value))
						    {
						        errorMsg = "is an invalid email address.";
						        email_error = "This is an invalid email address.";
						    }
						    break;
						case "isEmail" :
						    if(!isRequired(inputField.value))
						    {
    						    valid = isEmail(inputField.value);
    						    if(!valid)
    						    {
	    					        errorMsg = "is an invalid email address.";
	    					        ccmail_error = "This is an invalid email address.";
	    					    }
	    					    else
	    					    {
	    					        ccmail_error = '';
	    					    }
						    }
						    else
						    {
                                valid = true;
						    }
                            break;
						case "isCreditCard" :
						    if(!isRequired(inputField.value))
						    {
						        valid = !isCreditCard(inputField.value);
						        errorMsg = "is invalid.";
						        break;
						    }
						case "isReqCC" :
						    valid = !isRequired(inputField.value) && !isCreditCard(inputField.value);
                            if(isRequired(inputField.value))
                            {
						        errorMsg = "is a required field.";
						        cc_error = "This is a required field.";
						    }
						    else if(isCreditCard(inputField.value))
						    {
						        errorMsg = "is invalid.";
						        cc_error = "This is an invalid credit card number.";
						    }
						    break;
					}
					if(!valid) 
					{
 						if(flag>0)
 						    errorFields += ", #"+x[i];
 						else
 						    errorFields += "#"+x[i]; 						    
					    flag++;
 						error += y[i]+" "+errorMsg+"\n";
						inputField.style.background = this.settings["errorColors"][0];
					} else {
						inputField.style.background = this.settings["inputColors"][0];
					}
				}
			}
		}
		if (error === "") {
			$.cookie('displayShippingInfoCookie', 'yes', {path: '/'});
		}
		return error;
	},
	printError: function (error) {
		alert(error);
	}
};

// returns true if the string is not empty
function isRequired(str){
	return (str == null) || (str.length == 0);
}
// returns true if the string is a valid email
function isEmail(str){
	if(isRequired(str)) return false;
	var re = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i
	return re.test(str);
}
// returns true if the string only contains characters 0-9 and is not null
function isNumeric(str){
	if(isRequired(str)) return false;
	var re = /[\D]/g
	if (re.test(str)) return false;
	return true;
}
// returns false if the credit card number is valid
function isCreditCard(str) {
  var retval = false;
  
    if(isRequired(str)) return true;
    
  // Trim non-digits from card number field
  var cardno = str.replace(/\D+/g,'');
  
if ( cardno.length >= 13 && cardno.length < 20 ) {
    var sum = 0 * 0;
    var digits = cardno.split('');
    digits.reverse();
    
    for ( var i = 0; i < digits.length; i++ ) {
      var d = 1 * digits[i];
      if ( i % 2 == 0 ) {
        sum += d;
      }
      else {
        d *= 2;
        while ( d > 0 ) {
          sum += d % 10;
          d /= 10;
          d = Math.floor ( d );
        }
      }
    }
    
    retval = sum > 0 && sum % 10 == 0;
  }
    if ( !retval ) return true;
   
  return false;
}
