// JavaScript Document

function validator() {
	
	
	this.errs = 0;
	this.els = document.createElement('div');
	this.els.appendChild(document.createElement('p'));
	this.els.firstChild.appendChild(document.createElement('b'));
	this.els.firstChild.firstChild.appendChild(document.createTextNode('Could not save for the following reason(s):'));
	this.els.appendChild(document.createElement('ul'));

	this.validate = function (valVar, valErr, valType) {
		switch (valType) {
			case "currency":
				re = new RegExp( /^\$?[0-9]+(.[0-9]+)?/) ;
				if (!document.getElementById(valVar).value.match(re)) this.addError(valErr);

			break;
			case "visa":
				prefix = /^4/;
				if (card_number.length != 16 || !prefix.test(card_number) || !luhnCheck(card_number)) {
					this.addError(valErr);
				}
				break;
			case "mastercard":
				prefix = /^5[1-5]/;
				if (card_number.length != 16 || !prefix.test(card_number) || !luhnCheck(card_number)) {
					this.addError(valErr);
				}
			break;
			case "amex":
				prefix = /^3(4|7)/;
				if (card_number.length != 15 || !prefix.test(card_number) || !luhnCheck(card_number)) {
					this.addError(valErr);
				}
			break;
			case "discover":
				prefix = /^(6011|65)/;
				if (card_number.length != 16 || !prefix.test(card_number) || !luhnCheck(card_number)) {
					this.addError(valErr);
				}
			break;
			case "email":
				re = new RegExp(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/) ;

				if (!document.getElementById(valVar).value.match(re)) this.addError(valErr);
			break;
			case "phone":
				re = new RegExp(/^[(]?[0-9]{3}[)-\.]?[ ]?[0-9]{3}[-\. ]?[0-9]{4}$/);
				if (!document.getElementById(valVar).value.match(re)) this.addError(valErr);

			break;
			case "date":
				re = new RegExp(/^(0?[1-9]|1[0-2])[.-/](0?[1-9]|[1-2][0-9]|30|31)[.-/](19|20)[0-9][0-9]$/);

				if (!document.getElementById(valVar).value.match(re)) this.addError(valErr);
			break;
			case "nonempty":
			default:
				if (document.getElementById(valVar).value == "") this.addError(valErr);
			break;			
		}

	}
	
	this.addError = function(valErr) {
		li = document.createElement('li');
		li.appendChild(document.createTextNode(valErr));
		this.els.lastChild.appendChild(li);
		this.errs++;
	}
	
	this.hasErrors = function () {
		return (this.errs > 0);
	}
	
	this.noErrors = function() {
		return !this.hasErrors();
	}
	
	this.displayErrors = function () {
		if (document.getElementById('errors').hasChildNodes()) {
			document.getElementById('errors').removeChild(document.getElementById('errors').firstChild);
		}
		document.getElementById('errors').appendChild(this.els);
		document.getElementById('errors').style.display = 'block';
		document.location.href= '#top';
	}

	
}

function luhnCheck(card_number) {
var total = 0;
 for (x = card_number.length - 1; x >= 0; x--)
    {
	
      numberProduct = parseInt(card_number.charAt(x)) * (2-((card_number.length-x) % 2));
      if (numberProduct > 9) { numberProduct = numberProduct-9; }
        total +=  parseInt(numberProduct);
    }
	
		  
    return (parseInt(total) % 10 == 0);
}