jQuery.validator.addMethod("nameonly", function (value, element) {
	return this.optional(element) || /^[a-zA-Z''-'\s]{1,100}$/i.test(value);
}, "Please specify a valid name");

jQuery.validator.addMethod("lettersnumberspunc", function (value, element) {
	return this.optional(element) || /^[a-zA-Z0-9-.,()'\"\s]+$/i.test(value);
}, "Letters, numbers, or punctuation only please");

/*
* jQuery creditcard2 extension for the jQuery Validation plugin (http://plugins.jquery.com/project/validate).
* Ported from http://www.braemoor.co.uk/software/creditcard.shtml by John Gardner, with some enhancements.
* Author: Jack Killpatrick Copyright (c) 2010 iHwy, Inc.
* Version 1.0.1 (1/12/2010)
* History:
* 1.0.1 - released 2010-01-12 -> updated card prefixes based on data at: http://en.wikipedia.org/wiki/Credit_card_number and added support for LaserCard
* Visit http://www.ihwy.com/labs/jquery-validate-credit-card-extension.aspx for usage information
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*/

jQuery.validator.addMethod("creditcardmodten", function (value, element, param) {
	var cardName = param;

	// BuildCentral Modification
	var cardTypeProperty = '#' + param['dependentproperty'];

	// get the actual value of the dependent control
	// note - this probably needs to cater for more control types, e.g. radios
	var control = $(cardTypeProperty);
	var controltype = control.attr('type');
	var actualvalue =
	controltype === 'checkbox' ?
	control.attr('checked').toString() :
	control.val();

	switch (actualvalue) {
		case "1":
			cardName = "Visa";
			break;
		case "2":
			cardName = "MasterCard";
			break;
		case "3":
			cardName = "AmEx";
			break;
		case "4":
			cardName = "Discover";
			break;
		default:
			cardName = "Visa";
			break;
	}
	// BuildCentral Modification

	var cards = new Array();
	cards[0] = { cardName: "Visa", lengths: "13,16", prefixes: "4", checkdigit: true };
	cards[1] = { cardName: "MasterCard", lengths: "16", prefixes: "51,52,53,54,55", checkdigit: true };
	cards[2] = { cardName: "DinersClub", lengths: "14,16", prefixes: "305,36,38,54,55", checkdigit: true };
	cards[3] = { cardName: "CarteBlanche", lengths: "14", prefixes: "300,301,302,303,304,305", checkdigit: true };
	cards[4] = { cardName: "AmEx", lengths: "15", prefixes: "34,37", checkdigit: true };
	cards[5] = { cardName: "Discover", lengths: "16", prefixes: "6011,622,64,65", checkdigit: true };
	cards[6] = { cardName: "JCB", lengths: "16", prefixes: "35", checkdigit: true };
	cards[7] = { cardName: "enRoute", lengths: "15", prefixes: "2014,2149", checkdigit: true };
	cards[8] = { cardName: "Solo", lengths: "16,18,19", prefixes: "6334, 6767", checkdigit: true };
	cards[9] = { cardName: "Switch", lengths: "16,18,19", prefixes: "4903,4905,4911,4936,564182,633110,6333,6759", checkdigit: true };
	cards[10] = { cardName: "Maestro", lengths: "12,13,14,15,16,18,19", prefixes: "5018,5020,5038,6304,6759,6761", checkdigit: true };
	cards[11] = { cardName: "VisaElectron", lengths: "16", prefixes: "417500,4917,4913,4508,4844", checkdigit: true };
	cards[12] = { cardName: "LaserCard", lengths: "16,17,18,19", prefixes: "6304,6706,6771,6709", checkdigit: true };

	var cardType = -1;
	for (var i = 0; i < cards.length; i++) {
		if (cardName.toLowerCase() == cards[i].cardName.toLowerCase()) {
			cardType = i;
			break;
		}
	}
	if (cardType == -1) { return false; } // card type not found

	value = value.replace(/[\s-]/g, ""); // remove spaces and dashes
	if (value.length == 0) { return false; } // no length

	var cardNo = value;
	var cardexp = /^[0-9]{13,19}$/;
	if (!cardexp.exec(cardNo)) { return false; } // has chars or wrong length

	cardNo = cardNo.replace(/\D/g, ""); // strip down to digits

	if (cards[cardType].checkdigit) {
		var checksum = 0;
		var mychar = "";
		var j = 1;

		var calc;
		for (i = cardNo.length - 1; i >= 0; i--) {
			calc = Number(cardNo.charAt(i)) * j;
			if (calc > 9) {
				checksum = checksum + 1;
				calc = calc - 10;
			}
			checksum = checksum + calc;
			if (j == 1) { j = 2 } else { j = 1 };
		}

		if (checksum % 10 != 0) { return false; } // not mod10
	}

	var lengthValid = false;
	var prefixValid = false;
	var prefix = new Array();
	var lengths = new Array();

	prefix = cards[cardType].prefixes.split(",");
	for (i = 0; i < prefix.length; i++) {
		var exp = new RegExp("^" + prefix[i]);
		if (exp.test(cardNo)) prefixValid = true;
	}
	if (!prefixValid) { return false; } // invalid prefix

	lengths = cards[cardType].lengths.split(",");
	for (j = 0; j < lengths.length; j++) {
		if (cardNo.length == lengths[j]) lengthValid = true;
	}
	if (!lengthValid) { return false; } // wrong length

	return true;
}, jQuery.validator.messages.creditcard);


// Load additional validation
(function ($) {
	$.validator.unobtrusive.adapters.addBool("letterswithbasicpunc");
	$.validator.unobtrusive.adapters.addBool("alphanumeric");
	$.validator.unobtrusive.adapters.addBool("lettersonly");
	$.validator.unobtrusive.adapters.addBool("integer");
	$.validator.unobtrusive.adapters.addBool("phoneUS");
	$.validator.unobtrusive.adapters.addBool("nameonly");
	$.validator.unobtrusive.adapters.addBool("lettersnumberspunc");

	// Conditional Validation
	$.validator.unobtrusive.adapters.add(
		'creditcardmodten', 
		['dependentproperty'], 
		function (options) {
			options.rules['creditcardmodten'] = {
			dependentproperty: options.params['dependentproperty']
		};
		options.messages['creditcardmodten'] = options.message;
	});

} (jQuery));

