From 8ae65986d4f00ba13646c08214d1c3b31bf3ae98 Mon Sep 17 00:00:00 2001 From: jheaps Date: Fri, 22 Nov 2024 14:06:04 -0700 Subject: [PATCH] Add project files. --- JoshHeaps.Net.sln | 25 + JoshHeaps.Net/Controllers/HomeController.cs | 10 + JoshHeaps.Net/JoshHeaps.Net.csproj | 9 + JoshHeaps.Net/Pages/Index.cshtml | 47 + JoshHeaps.Net/Pages/Index.cshtml.cs | 12 + JoshHeaps.Net/Program.cs | 25 + JoshHeaps.Net/Properties/launchSettings.json | 38 + JoshHeaps.Net/appsettings.Development.json | 9 + JoshHeaps.Net/appsettings.json | 9 + .../wwwroot/css/imageLeftProject.css | 30 + .../wwwroot/css/imageRightProject.css | 32 + JoshHeaps.Net/wwwroot/css/project.css | 16 + JoshHeaps.Net/wwwroot/css/site.css | 17 + JoshHeaps.Net/wwwroot/favicon.ico | Bin 0 -> 5430 bytes JoshHeaps.Net/wwwroot/images/Chess.jpg | Bin 0 -> 109428 bytes JoshHeaps.Net/wwwroot/images/CompilerDemo.png | Bin 0 -> 41242 bytes .../wwwroot/js/opacityUpdateObserver.js | 27 + JoshHeaps.Net/wwwroot/js/site.js | 3 + JoshHeaps.Net/wwwroot/js/utils.js | 26 + .../jquery-validation-unobtrusive/LICENSE.txt | 23 + .../jquery.validate.unobtrusive.js | 435 + .../jquery.validate.unobtrusive.min.js | 8 + .../wwwroot/lib/jquery-validation/LICENSE.md | 22 + .../dist/additional-methods.js | 1512 +++ .../dist/additional-methods.min.js | 4 + .../jquery-validation/dist/jquery.validate.js | 1661 +++ .../dist/jquery.validate.min.js | 4 + JoshHeaps.Net/wwwroot/lib/jquery/LICENSE.txt | 21 + .../wwwroot/lib/jquery/dist/jquery.js | 10881 ++++++++++++++++ .../wwwroot/lib/jquery/dist/jquery.min.js | 2 + .../wwwroot/lib/jquery/dist/jquery.min.map | 1 + 31 files changed, 14909 insertions(+) create mode 100644 JoshHeaps.Net.sln create mode 100644 JoshHeaps.Net/Controllers/HomeController.cs create mode 100644 JoshHeaps.Net/JoshHeaps.Net.csproj create mode 100644 JoshHeaps.Net/Pages/Index.cshtml create mode 100644 JoshHeaps.Net/Pages/Index.cshtml.cs create mode 100644 JoshHeaps.Net/Program.cs create mode 100644 JoshHeaps.Net/Properties/launchSettings.json create mode 100644 JoshHeaps.Net/appsettings.Development.json create mode 100644 JoshHeaps.Net/appsettings.json create mode 100644 JoshHeaps.Net/wwwroot/css/imageLeftProject.css create mode 100644 JoshHeaps.Net/wwwroot/css/imageRightProject.css create mode 100644 JoshHeaps.Net/wwwroot/css/project.css create mode 100644 JoshHeaps.Net/wwwroot/css/site.css create mode 100644 JoshHeaps.Net/wwwroot/favicon.ico create mode 100644 JoshHeaps.Net/wwwroot/images/Chess.jpg create mode 100644 JoshHeaps.Net/wwwroot/images/CompilerDemo.png create mode 100644 JoshHeaps.Net/wwwroot/js/opacityUpdateObserver.js create mode 100644 JoshHeaps.Net/wwwroot/js/site.js create mode 100644 JoshHeaps.Net/wwwroot/js/utils.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation/LICENSE.md create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.min.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/jquery.validate.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery/LICENSE.txt create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery/dist/jquery.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery/dist/jquery.min.js create mode 100644 JoshHeaps.Net/wwwroot/lib/jquery/dist/jquery.min.map diff --git a/JoshHeaps.Net.sln b/JoshHeaps.Net.sln new file mode 100644 index 0000000..22237d0 --- /dev/null +++ b/JoshHeaps.Net.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34728.123 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JoshHeaps.Net", "JoshHeaps.Net\JoshHeaps.Net.csproj", "{9F0182CC-470F-4D1A-99F5-348D7921751E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9F0182CC-470F-4D1A-99F5-348D7921751E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F0182CC-470F-4D1A-99F5-348D7921751E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F0182CC-470F-4D1A-99F5-348D7921751E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F0182CC-470F-4D1A-99F5-348D7921751E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A5BBAD4D-70A1-436F-B3A5-27CED77B1E45} + EndGlobalSection +EndGlobal diff --git a/JoshHeaps.Net/Controllers/HomeController.cs b/JoshHeaps.Net/Controllers/HomeController.cs new file mode 100644 index 0000000..8e15774 --- /dev/null +++ b/JoshHeaps.Net/Controllers/HomeController.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Mvc; + +namespace JoshHeaps.Net.Controllers; + +[ApiController] +[Route("[controller]")] +public class HomeController : ControllerBase +{ + +} diff --git a/JoshHeaps.Net/JoshHeaps.Net.csproj b/JoshHeaps.Net/JoshHeaps.Net.csproj new file mode 100644 index 0000000..1b28a01 --- /dev/null +++ b/JoshHeaps.Net/JoshHeaps.Net.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/JoshHeaps.Net/Pages/Index.cshtml b/JoshHeaps.Net/Pages/Index.cshtml new file mode 100644 index 0000000..c610b23 --- /dev/null +++ b/JoshHeaps.Net/Pages/Index.cshtml @@ -0,0 +1,47 @@ +@page +@model JoshHeaps.Net.Pages.IndexModel +@{ + ViewData["Title"] = "Home page"; +} + + + + JoshHeaps.Net + + + + + + + + + +
+ +
+
+
+ +
+
+

Chess

+

+ As someone who loves chess, I wanted to create a chess game that I could play with my friends and family. This project is a work in progress, as currently it can only be played locally. It was built in C# on .NET 8.0, using winforms, because I like a challenge. I plan to add online multiplayer functionality in the future. +

+
+
+ +
+
+

Compiler

+

+ I love solving problems, and figuring out how things work. What better way to do both than writing a compiler myself? This project is a compiler that I wrote in C# on .NET 8.0. It takes in a simple language that I created, outputs the corresponding common intermediate language (CIL), and executes it. I plan to add more features in the future. +

+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/JoshHeaps.Net/Pages/Index.cshtml.cs b/JoshHeaps.Net/Pages/Index.cshtml.cs new file mode 100644 index 0000000..d374046 --- /dev/null +++ b/JoshHeaps.Net/Pages/Index.cshtml.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace JoshHeaps.Net.Pages +{ + public class IndexModel() : PageModel + { + public void OnGet() + { + + } + } +} diff --git a/JoshHeaps.Net/Program.cs b/JoshHeaps.Net/Program.cs new file mode 100644 index 0000000..bc275e4 --- /dev/null +++ b/JoshHeaps.Net/Program.cs @@ -0,0 +1,25 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddRazorPages(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); +app.UseStaticFiles(); + +app.UseRouting(); + +app.UseAuthorization(); + +app.MapRazorPages(); + +app.Run(); diff --git a/JoshHeaps.Net/Properties/launchSettings.json b/JoshHeaps.Net/Properties/launchSettings.json new file mode 100644 index 0000000..56f9bfc --- /dev/null +++ b/JoshHeaps.Net/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:4706", + "sslPort": 44345 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5200", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7118;http://localhost:5200", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/JoshHeaps.Net/appsettings.Development.json b/JoshHeaps.Net/appsettings.Development.json new file mode 100644 index 0000000..770d3e9 --- /dev/null +++ b/JoshHeaps.Net/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/JoshHeaps.Net/appsettings.json b/JoshHeaps.Net/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/JoshHeaps.Net/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/JoshHeaps.Net/wwwroot/css/imageLeftProject.css b/JoshHeaps.Net/wwwroot/css/imageLeftProject.css new file mode 100644 index 0000000..f6482ca --- /dev/null +++ b/JoshHeaps.Net/wwwroot/css/imageLeftProject.css @@ -0,0 +1,30 @@ +.diagonal-section-left { + position: absolute; + clip-path: polygon(0 0, 85vw 0, 60vw 100%, 0 100%); + background-color: rgb(104, 255, 0, 0.39); +} + +.projectImageLeft { + width: 33vw; + height: auto; + padding: 3vw; +} + +.projectTextRight { + position: relative; + z-index: 1; + margin-left: 50vw; +} + +.projectHeaderRight { + margin: 0; + color: rgb(212, 212, 212); + font-size: 4vw; +} + +.projectDescriptionRight { + margin: 0; + color: rgb(212, 212, 212); + font-size: 2vw; + width: 40vw; +} diff --git a/JoshHeaps.Net/wwwroot/css/imageRightProject.css b/JoshHeaps.Net/wwwroot/css/imageRightProject.css new file mode 100644 index 0000000..0afe65a --- /dev/null +++ b/JoshHeaps.Net/wwwroot/css/imageRightProject.css @@ -0,0 +1,32 @@ +.diagonal-section-right { + position: absolute; + clip-path: polygon(40vw 0, 100% 0, 100% 100%, 15vw 100%); + background-color: rgb(104, 255, 0, 0.39); +} + +.projectImageRight { + width: 33vw; + height: auto; + padding: 3vw; + float: right; +} + +.projectTextLeft { + position: relative; + z-index: 1; +} + +.projectHeaderLeft { + margin: 0; + color: rgb(212, 212, 212); + font-size: 4vw; + padding-left: 10vw; +} + +.projectDescriptionLeft { + margin: 0; + color: rgb(212, 212, 212); + font-size: 2vw; + width: 40vw; + padding-left: 10vw; +} diff --git a/JoshHeaps.Net/wwwroot/css/project.css b/JoshHeaps.Net/wwwroot/css/project.css new file mode 100644 index 0000000..92d294e --- /dev/null +++ b/JoshHeaps.Net/wwwroot/css/project.css @@ -0,0 +1,16 @@ +#ProjectsBox { + display: grid; + grid-auto-rows: 1fr; + gap: 20vw; +} + +.projectContainer { + position: relative; + display: flex; + align-items: center; +} + +.displayBox { + width: 100vw; + height: auto; +} diff --git a/JoshHeaps.Net/wwwroot/css/site.css b/JoshHeaps.Net/wwwroot/css/site.css new file mode 100644 index 0000000..8fc4476 --- /dev/null +++ b/JoshHeaps.Net/wwwroot/css/site.css @@ -0,0 +1,17 @@ +body { + margin: 0px; + background-color: #2b2c30; + color: #09ff00; + overflow-x: hidden; +} + +#WelcomeMessage { + font: 3vw arial; + width: auto; + height: 80vh; + max-height: 80vh; + text-align: center; + padding-top: 33vh; + padding-left: 10vw; + padding-right: 10vw; +} \ No newline at end of file diff --git a/JoshHeaps.Net/wwwroot/favicon.ico b/JoshHeaps.Net/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..63e859b476eff5055e0e557aaa151ca8223fbeef GIT binary patch literal 5430 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 literal 0 HcmV?d00001 diff --git a/JoshHeaps.Net/wwwroot/images/CompilerDemo.png b/JoshHeaps.Net/wwwroot/images/CompilerDemo.png new file mode 100644 index 0000000000000000000000000000000000000000..94125c0f369a511c35bb7efe6b2cf9bd7100fc14 GIT binary patch literal 41242 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 X+bnm3F1mjRV*mnAS3j3^P6 { + entries.forEach(entry => { + entry.target.style.opacity = entry.intersectionRatio; + }); +}; + +const opacityObserver = new IntersectionObserver(updateOpacityCallback, percentThresholdsOptions); + +window.addEventListener('load', createObserver); + +function createObserver() { + const targetImages = document.querySelectorAll(".projectImage"); + + targetImages.forEach(targetImage => { + opacityObserver.observe(targetImage); + }); +}; \ No newline at end of file diff --git a/JoshHeaps.Net/wwwroot/js/site.js b/JoshHeaps.Net/wwwroot/js/site.js new file mode 100644 index 0000000..ba5ac3b --- /dev/null +++ b/JoshHeaps.Net/wwwroot/js/site.js @@ -0,0 +1,3 @@ +window.onload = function () { + typeText("#WelcomeMessage", "Hey! You found me! Since I have your attention, why don't I tell you about myself?"); +} \ No newline at end of file diff --git a/JoshHeaps.Net/wwwroot/js/utils.js b/JoshHeaps.Net/wwwroot/js/utils.js new file mode 100644 index 0000000..89ed2e4 --- /dev/null +++ b/JoshHeaps.Net/wwwroot/js/utils.js @@ -0,0 +1,26 @@ +function typeText(selector, content) { + const element = document.querySelector(selector); + + if (!element) { + console.log("Element not found."); + return; + } + + simulateTyping(element, content); +} + +function simulateTyping(element, text) { + let index = 0; + let speed = 50; + let currentText = ""; + + const interval = setInterval(() => { + if (index < text.length) { + currentText += text.charAt(index); + index++; + element.textContent = currentText; + } else { + clearInterval(interval); + } + }, speed); +} \ No newline at end of file diff --git a/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt new file mode 100644 index 0000000..984713a --- /dev/null +++ b/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js new file mode 100644 index 0000000..0093060 --- /dev/null +++ b/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js @@ -0,0 +1,435 @@ +/** + * @license + * Unobtrusive validation support library for jQuery and jQuery Validate + * Copyright (c) .NET Foundation. All rights reserved. + * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + * @version v4.0.0 + */ + +/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */ +/*global document: false, jQuery: false */ + +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define("jquery.validate.unobtrusive", ['jquery-validation'], factory); + } else if (typeof module === 'object' && module.exports) { + // CommonJS-like environments that support module.exports + module.exports = factory(require('jquery-validation')); + } else { + // Browser global + jQuery.validator.unobtrusive = factory(jQuery); + } +}(function ($) { + var $jQval = $.validator, + adapters, + data_validation = "unobtrusiveValidation"; + + function setValidationValues(options, ruleName, value) { + options.rules[ruleName] = value; + if (options.message) { + options.messages[ruleName] = options.message; + } + } + + function splitAndTrim(value) { + return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g); + } + + function escapeAttributeValue(value) { + // As mentioned on http://api.jquery.com/category/selectors/ + return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); + } + + function getModelPrefix(fieldName) { + return fieldName.substr(0, fieldName.lastIndexOf(".") + 1); + } + + function appendModelPrefix(value, prefix) { + if (value.indexOf("*.") === 0) { + value = value.replace("*.", prefix); + } + return value; + } + + function onError(error, inputElement) { // 'this' is the form element + var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"), + replaceAttrValue = container.attr("data-valmsg-replace"), + replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null; + + container.removeClass("field-validation-valid").addClass("field-validation-error"); + error.data("unobtrusiveContainer", container); + + if (replace) { + container.empty(); + error.removeClass("input-validation-error").appendTo(container); + } + else { + error.hide(); + } + } + + function onErrors(event, validator) { // 'this' is the form element + var container = $(this).find("[data-valmsg-summary=true]"), + list = container.find("ul"); + + if (list && list.length && validator.errorList.length) { + list.empty(); + container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); + + $.each(validator.errorList, function () { + $("

  • ").html(this.message).appendTo(list); + }); + } + } + + function onSuccess(error) { // 'this' is the form element + var container = error.data("unobtrusiveContainer"); + + if (container) { + var replaceAttrValue = container.attr("data-valmsg-replace"), + replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null; + + container.addClass("field-validation-valid").removeClass("field-validation-error"); + error.removeData("unobtrusiveContainer"); + + if (replace) { + container.empty(); + } + } + } + + function onReset(event) { // 'this' is the form element + var $form = $(this), + key = '__jquery_unobtrusive_validation_form_reset'; + if ($form.data(key)) { + return; + } + // Set a flag that indicates we're currently resetting the form. + $form.data(key, true); + try { + $form.data("validator").resetForm(); + } finally { + $form.removeData(key); + } + + $form.find(".validation-summary-errors") + .addClass("validation-summary-valid") + .removeClass("validation-summary-errors"); + $form.find(".field-validation-error") + .addClass("field-validation-valid") + .removeClass("field-validation-error") + .removeData("unobtrusiveContainer") + .find(">*") // If we were using valmsg-replace, get the underlying error + .removeData("unobtrusiveContainer"); + } + + function validationInfo(form) { + var $form = $(form), + result = $form.data(data_validation), + onResetProxy = $.proxy(onReset, form), + defaultOptions = $jQval.unobtrusive.options || {}, + execInContext = function (name, args) { + var func = defaultOptions[name]; + func && $.isFunction(func) && func.apply(form, args); + }; + + if (!result) { + result = { + options: { // options structure passed to jQuery Validate's validate() method + errorClass: defaultOptions.errorClass || "input-validation-error", + errorElement: defaultOptions.errorElement || "span", + errorPlacement: function () { + onError.apply(form, arguments); + execInContext("errorPlacement", arguments); + }, + invalidHandler: function () { + onErrors.apply(form, arguments); + execInContext("invalidHandler", arguments); + }, + messages: {}, + rules: {}, + success: function () { + onSuccess.apply(form, arguments); + execInContext("success", arguments); + } + }, + attachValidation: function () { + $form + .off("reset." + data_validation, onResetProxy) + .on("reset." + data_validation, onResetProxy) + .validate(this.options); + }, + validate: function () { // a validation function that is called by unobtrusive Ajax + $form.validate(); + return $form.valid(); + } + }; + $form.data(data_validation, result); + } + + return result; + } + + $jQval.unobtrusive = { + adapters: [], + + parseElement: function (element, skipAttach) { + /// + /// Parses a single HTML element for unobtrusive validation attributes. + /// + /// The HTML element to be parsed. + /// [Optional] true to skip attaching the + /// validation to the form. If parsing just this single element, you should specify true. + /// If parsing several elements, you should specify false, and manually attach the validation + /// to the form when you are finished. The default is false. + var $element = $(element), + form = $element.parents("form")[0], + valInfo, rules, messages; + + if (!form) { // Cannot do client-side validation without a form + return; + } + + valInfo = validationInfo(form); + valInfo.options.rules[element.name] = rules = {}; + valInfo.options.messages[element.name] = messages = {}; + + $.each(this.adapters, function () { + var prefix = "data-val-" + this.name, + message = $element.attr(prefix), + paramValues = {}; + + if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy) + prefix += "-"; + + $.each(this.params, function () { + paramValues[this] = $element.attr(prefix + this); + }); + + this.adapt({ + element: element, + form: form, + message: message, + params: paramValues, + rules: rules, + messages: messages + }); + } + }); + + $.extend(rules, { "__dummy__": true }); + + if (!skipAttach) { + valInfo.attachValidation(); + } + }, + + parse: function (selector) { + /// + /// Parses all the HTML elements in the specified selector. It looks for input elements decorated + /// with the [data-val=true] attribute value and enables validation according to the data-val-* + /// attribute values. + /// + /// Any valid jQuery selector. + + // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one + // element with data-val=true + var $selector = $(selector), + $forms = $selector.parents() + .addBack() + .filter("form") + .add($selector.find("form")) + .has("[data-val=true]"); + + $selector.find("[data-val=true]").each(function () { + $jQval.unobtrusive.parseElement(this, true); + }); + + $forms.each(function () { + var info = validationInfo(this); + if (info) { + info.attachValidation(); + } + }); + } + }; + + adapters = $jQval.unobtrusive.adapters; + + adapters.add = function (adapterName, params, fn) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). + /// [Optional] An array of parameter names (strings) that will + /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and + /// mmmm is the parameter name). + /// The function to call, which adapts the values from the HTML + /// attributes into jQuery Validate rules and/or messages. + /// + if (!fn) { // Called with no params, just a function + fn = params; + params = []; + } + this.push({ name: adapterName, params: params, adapt: fn }); + return this; + }; + + adapters.addBool = function (adapterName, ruleName) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where + /// the jQuery Validate validation rule has no parameter values. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). + /// [Optional] The name of the jQuery Validate rule. If not provided, the value + /// of adapterName will be used instead. + /// + return this.add(adapterName, function (options) { + setValidationValues(options, ruleName || adapterName, true); + }); + }; + + adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where + /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and + /// one for min-and-max). The HTML parameters are expected to be named -min and -max. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). + /// The name of the jQuery Validate rule to be used when you only + /// have a minimum value. + /// The name of the jQuery Validate rule to be used when you only + /// have a maximum value. + /// The name of the jQuery Validate rule to be used when you + /// have both a minimum and maximum value. + /// [Optional] The name of the HTML attribute that + /// contains the minimum value. The default is "min". + /// [Optional] The name of the HTML attribute that + /// contains the maximum value. The default is "max". + /// + return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) { + var min = options.params.min, + max = options.params.max; + + if (min && max) { + setValidationValues(options, minMaxRuleName, [min, max]); + } + else if (min) { + setValidationValues(options, minRuleName, min); + } + else if (max) { + setValidationValues(options, maxRuleName, max); + } + }); + }; + + adapters.addSingleVal = function (adapterName, attribute, ruleName) { + /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where + /// the jQuery Validate validation rule has a single value. + /// The name of the adapter to be added. This matches the name used + /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name). + /// [Optional] The name of the HTML attribute that contains the value. + /// The default is "val". + /// [Optional] The name of the jQuery Validate rule. If not provided, the value + /// of adapterName will be used instead. + /// + return this.add(adapterName, [attribute || "val"], function (options) { + setValidationValues(options, ruleName || adapterName, options.params[attribute]); + }); + }; + + $jQval.addMethod("__dummy__", function (value, element, params) { + return true; + }); + + $jQval.addMethod("regex", function (value, element, params) { + var match; + if (this.optional(element)) { + return true; + } + + match = new RegExp(params).exec(value); + return (match && (match.index === 0) && (match[0].length === value.length)); + }); + + $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) { + var match; + if (nonalphamin) { + match = value.match(/\W/g); + match = match && match.length >= nonalphamin; + } + return match; + }); + + if ($jQval.methods.extension) { + adapters.addSingleVal("accept", "mimtype"); + adapters.addSingleVal("extension", "extension"); + } else { + // for backward compatibility, when the 'extension' validation method does not exist, such as with versions + // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for + // validating the extension, and ignore mime-type validations as they are not supported. + adapters.addSingleVal("extension", "extension", "accept"); + } + + adapters.addSingleVal("regex", "pattern"); + adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"); + adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range"); + adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength"); + adapters.add("equalto", ["other"], function (options) { + var prefix = getModelPrefix(options.element.name), + other = options.params.other, + fullOtherName = appendModelPrefix(other, prefix), + element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0]; + + setValidationValues(options, "equalTo", element); + }); + adapters.add("required", function (options) { + // jQuery Validate equates "required" with "mandatory" for checkbox elements + if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { + setValidationValues(options, "required", true); + } + }); + adapters.add("remote", ["url", "type", "additionalfields"], function (options) { + var value = { + url: options.params.url, + type: options.params.type || "GET", + data: {} + }, + prefix = getModelPrefix(options.element.name); + + $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { + var paramName = appendModelPrefix(fieldName, prefix); + value.data[paramName] = function () { + var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']"); + // For checkboxes and radio buttons, only pick up values from checked fields. + if (field.is(":checkbox")) { + return field.filter(":checked").val() || field.filter(":hidden").val() || ''; + } + else if (field.is(":radio")) { + return field.filter(":checked").val() || ''; + } + return field.val(); + }; + }); + + setValidationValues(options, "remote", value); + }); + adapters.add("password", ["min", "nonalphamin", "regex"], function (options) { + if (options.params.min) { + setValidationValues(options, "minlength", options.params.min); + } + if (options.params.nonalphamin) { + setValidationValues(options, "nonalphamin", options.params.nonalphamin); + } + if (options.params.regex) { + setValidationValues(options, "regex", options.params.regex); + } + }); + adapters.add("fileextensions", ["extensions"], function (options) { + setValidationValues(options, "extension", options.params.extensions); + }); + + $(function () { + $jQval.unobtrusive.parse(document); + }); + + return $jQval.unobtrusive; +})); diff --git a/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js new file mode 100644 index 0000000..d8d803c --- /dev/null +++ b/JoshHeaps.Net/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js @@ -0,0 +1,8 @@ +/** + * @license + * Unobtrusive validation support library for jQuery and jQuery Validate + * Copyright (c) .NET Foundation. All rights reserved. + * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + * @version v4.0.0 + */ +!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("
  • ").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file diff --git a/JoshHeaps.Net/wwwroot/lib/jquery-validation/LICENSE.md b/JoshHeaps.Net/wwwroot/lib/jquery-validation/LICENSE.md new file mode 100644 index 0000000..dc377cc --- /dev/null +++ b/JoshHeaps.Net/wwwroot/lib/jquery-validation/LICENSE.md @@ -0,0 +1,22 @@ +The MIT License (MIT) +===================== + +Copyright Jörn Zaefferer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.js b/JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.js new file mode 100644 index 0000000..c6a7229 --- /dev/null +++ b/JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.js @@ -0,0 +1,1512 @@ +/*! + * jQuery Validation Plugin v1.19.5 + * + * https://jqueryvalidation.org/ + * + * Copyright (c) 2022 Jörn Zaefferer + * Released under the MIT license + */ +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + define( ["jquery", "./jquery.validate"], factory ); + } else if (typeof module === "object" && module.exports) { + module.exports = factory( require( "jquery" ) ); + } else { + factory( jQuery ); + } +}(function( $ ) { + +( function() { + + function stripHtml( value ) { + + // Remove html tags and space chars + return value.replace( /<.[^<>]*?>/g, " " ).replace( / | /gi, " " ) + + // Remove punctuation + .replace( /[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "" ); + } + + $.validator.addMethod( "maxWords", function( value, element, params ) { + return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length <= params; + }, $.validator.format( "Please enter {0} words or less." ) ); + + $.validator.addMethod( "minWords", function( value, element, params ) { + return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length >= params; + }, $.validator.format( "Please enter at least {0} words." ) ); + + $.validator.addMethod( "rangeWords", function( value, element, params ) { + var valueStripped = stripHtml( value ), + regex = /\b\w+\b/g; + return this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ]; + }, $.validator.format( "Please enter between {0} and {1} words." ) ); + +}() ); + +/** + * This is used in the United States to process payments, deposits, + * or transfers using the Automated Clearing House (ACH) or Fedwire + * systems. A very common use case would be to validate a form for + * an ACH bill payment. + */ +$.validator.addMethod( "abaRoutingNumber", function( value ) { + var checksum = 0; + var tokens = value.split( "" ); + var length = tokens.length; + + // Length Check + if ( length !== 9 ) { + return false; + } + + // Calc the checksum + // https://en.wikipedia.org/wiki/ABA_routing_transit_number + for ( var i = 0; i < length; i += 3 ) { + checksum += parseInt( tokens[ i ], 10 ) * 3 + + parseInt( tokens[ i + 1 ], 10 ) * 7 + + parseInt( tokens[ i + 2 ], 10 ); + } + + // If not zero and divisible by 10 then valid + if ( checksum !== 0 && checksum % 10 === 0 ) { + return true; + } + + return false; +}, "Please enter a valid routing number." ); + +// Accept a value from a file input based on a required mimetype +$.validator.addMethod( "accept", function( value, element, param ) { + + // Split mime on commas in case we have multiple types we can accept + var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*", + optionalValue = this.optional( element ), + i, file, regex; + + // Element is optional + if ( optionalValue ) { + return optionalValue; + } + + if ( $( element ).attr( "type" ) === "file" ) { + + // Escape string to be used in the regex + // see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + // Escape also "/*" as "/.*" as a wildcard + typeParam = typeParam + .replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" ) + .replace( /,/g, "|" ) + .replace( /\/\*/g, "/.*" ); + + // Check if the element has a FileList before checking each file + if ( element.files && element.files.length ) { + regex = new RegExp( ".?(" + typeParam + ")$", "i" ); + for ( i = 0; i < element.files.length; i++ ) { + file = element.files[ i ]; + + // Grab the mimetype from the loaded file, verify it matches + if ( !file.type.match( regex ) ) { + return false; + } + } + } + } + + // Either return true because we've validated each file, or because the + // browser does not support element.files and the FileList feature + return true; +}, $.validator.format( "Please enter a value with a valid mimetype." ) ); + +$.validator.addMethod( "alphanumeric", function( value, element ) { + return this.optional( element ) || /^\w+$/i.test( value ); +}, "Letters, numbers, and underscores only please." ); + +/* + * Dutch bank account numbers (not 'giro' numbers) have 9 digits + * and pass the '11 check'. + * We accept the notation with spaces, as that is common. + * acceptable: 123456789 or 12 34 56 789 + */ +$.validator.addMethod( "bankaccountNL", function( value, element ) { + if ( this.optional( element ) ) { + return true; + } + if ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) { + return false; + } + + // Now '11 check' + var account = value.replace( / /g, "" ), // Remove spaces + sum = 0, + len = account.length, + pos, factor, digit; + for ( pos = 0; pos < len; pos++ ) { + factor = len - pos; + digit = account.substring( pos, pos + 1 ); + sum = sum + factor * digit; + } + return sum % 11 === 0; +}, "Please specify a valid bank account number." ); + +$.validator.addMethod( "bankorgiroaccountNL", function( value, element ) { + return this.optional( element ) || + ( $.validator.methods.bankaccountNL.call( this, value, element ) ) || + ( $.validator.methods.giroaccountNL.call( this, value, element ) ); +}, "Please specify a valid bank or giro account number." ); + +/** + * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity. + * + * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional) + * + * Validation is case-insensitive. Please make sure to normalize input yourself. + * + * BIC definition in detail: + * - First 4 characters - bank code (only letters) + * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters) + * - Next 2 characters - location code (letters and digits) + * a. shall not start with '0' or '1' + * b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing) + * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits) + */ +$.validator.addMethod( "bic", function( value, element ) { + return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() ); +}, "Please specify a valid BIC code." ); + +/* + * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities + * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal + * + * Spanish CIF structure: + * + * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ] + * + * Where: + * + * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW] + * P: 2 characters. Province. + * N: 5 characters. Secuencial Number within the province. + * C: 1 character. Control Digit: [0-9A-J]. + * + * [ T ]: Kind of Organizations. Possible values: + * + * A. Corporations + * B. LLCs + * C. General partnerships + * D. Companies limited partnerships + * E. Communities of goods + * F. Cooperative Societies + * G. Associations + * H. Communities of homeowners in horizontal property regime + * J. Civil Societies + * K. Old format + * L. Old format + * M. Old format + * N. Nonresident entities + * P. Local authorities + * Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions + * R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008) + * S. Organs of State Administration and regions + * V. Agrarian Transformation + * W. Permanent establishments of non-resident in Spain + * + * [ C ]: Control Digit. It can be a number or a letter depending on T value: + * [ T ] --> [ C ] + * ------ ---------- + * A Number + * B Number + * E Number + * H Number + * K Letter + * P Letter + * Q Letter + * S Letter + * + */ +$.validator.addMethod( "cifES", function( value, element ) { + "use strict"; + + if ( this.optional( element ) ) { + return true; + } + + var cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi ); + var letter = value.substring( 0, 1 ), // [ T ] + number = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ] + control = value.substring( 8, 9 ), // [ C ] + all_sum = 0, + even_sum = 0, + odd_sum = 0, + i, n, + control_digit, + control_letter; + + function isOdd( n ) { + return n % 2 === 0; + } + + // Quick format test + if ( value.length !== 9 || !cifRegEx.test( value ) ) { + return false; + } + + for ( i = 0; i < number.length; i++ ) { + n = parseInt( number[ i ], 10 ); + + // Odd positions + if ( isOdd( i ) ) { + + // Odd positions are multiplied first. + n *= 2; + + // If the multiplication is bigger than 10 we need to adjust + odd_sum += n < 10 ? n : n - 9; + + // Even positions + // Just sum them + } else { + even_sum += n; + } + } + + all_sum = even_sum + odd_sum; + control_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString(); + control_digit = parseInt( control_digit, 10 ) > 9 ? "0" : control_digit; + control_letter = "JABCDEFGHI".substr( control_digit, 1 ).toString(); + + // Control must be a digit + if ( letter.match( /[ABEH]/ ) ) { + return control === control_digit; + + // Control must be a letter + } else if ( letter.match( /[KPQS]/ ) ) { + return control === control_letter; + } + + // Can be either + return control === control_digit || control === control_letter; + +}, "Please specify a valid CIF number." ); + +/* + * Brazillian CNH number (Carteira Nacional de Habilitacao) is the License Driver number. + * CNH numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation. + */ +$.validator.addMethod( "cnhBR", function( value ) { + + // Removing special characters from value + value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" ); + + // Checking value to have 11 digits only + if ( value.length !== 11 ) { + return false; + } + + var sum = 0, dsc = 0, firstChar, + firstCN, secondCN, i, j, v; + + firstChar = value.charAt( 0 ); + + if ( new Array( 12 ).join( firstChar ) === value ) { + return false; + } + + // Step 1 - using first Check Number: + for ( i = 0, j = 9, v = 0; i < 9; ++i, --j ) { + sum += +( value.charAt( i ) * j ); + } + + firstCN = sum % 11; + if ( firstCN >= 10 ) { + firstCN = 0; + dsc = 2; + } + + sum = 0; + for ( i = 0, j = 1, v = 0; i < 9; ++i, ++j ) { + sum += +( value.charAt( i ) * j ); + } + + secondCN = sum % 11; + if ( secondCN >= 10 ) { + secondCN = 0; + } else { + secondCN = secondCN - dsc; + } + + return ( String( firstCN ).concat( secondCN ) === value.substr( -2 ) ); + +}, "Please specify a valid CNH number." ); + +/* + * Brazillian value number (Cadastrado de Pessoas Juridica). + * value numbers have 14 digits in total: 12 numbers followed by 2 check numbers that are being used for validation. + */ +$.validator.addMethod( "cnpjBR", function( value, element ) { + "use strict"; + + if ( this.optional( element ) ) { + return true; + } + + // Removing no number + value = value.replace( /[^\d]+/g, "" ); + + // Checking value to have 14 digits only + if ( value.length !== 14 ) { + return false; + } + + // Elimina values invalidos conhecidos + if ( value === "00000000000000" || + value === "11111111111111" || + value === "22222222222222" || + value === "33333333333333" || + value === "44444444444444" || + value === "55555555555555" || + value === "66666666666666" || + value === "77777777777777" || + value === "88888888888888" || + value === "99999999999999" ) { + return false; + } + + // Valida DVs + var tamanho = ( value.length - 2 ); + var numeros = value.substring( 0, tamanho ); + var digitos = value.substring( tamanho ); + var soma = 0; + var pos = tamanho - 7; + + for ( var i = tamanho; i >= 1; i-- ) { + soma += numeros.charAt( tamanho - i ) * pos--; + if ( pos < 2 ) { + pos = 9; + } + } + + var resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; + + if ( resultado !== parseInt( digitos.charAt( 0 ), 10 ) ) { + return false; + } + + tamanho = tamanho + 1; + numeros = value.substring( 0, tamanho ); + soma = 0; + pos = tamanho - 7; + + for ( var il = tamanho; il >= 1; il-- ) { + soma += numeros.charAt( tamanho - il ) * pos--; + if ( pos < 2 ) { + pos = 9; + } + } + + resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; + + if ( resultado !== parseInt( digitos.charAt( 1 ), 10 ) ) { + return false; + } + + return true; + +}, "Please specify a CNPJ value number." ); + +/* + * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number. + * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation. + */ +$.validator.addMethod( "cpfBR", function( value, element ) { + "use strict"; + + if ( this.optional( element ) ) { + return true; + } + + // Removing special characters from value + value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" ); + + // Checking value to have 11 digits only + if ( value.length !== 11 ) { + return false; + } + + var sum = 0, + firstCN, secondCN, checkResult, i; + + firstCN = parseInt( value.substring( 9, 10 ), 10 ); + secondCN = parseInt( value.substring( 10, 11 ), 10 ); + + checkResult = function( sum, cn ) { + var result = ( sum * 10 ) % 11; + if ( ( result === 10 ) || ( result === 11 ) ) { + result = 0; + } + return ( result === cn ); + }; + + // Checking for dump data + if ( value === "" || + value === "00000000000" || + value === "11111111111" || + value === "22222222222" || + value === "33333333333" || + value === "44444444444" || + value === "55555555555" || + value === "66666666666" || + value === "77777777777" || + value === "88888888888" || + value === "99999999999" + ) { + return false; + } + + // Step 1 - using first Check Number: + for ( i = 1; i <= 9; i++ ) { + sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i ); + } + + // If first Check Number (CN) is valid, move to Step 2 - using second Check Number: + if ( checkResult( sum, firstCN ) ) { + sum = 0; + for ( i = 1; i <= 10; i++ ) { + sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i ); + } + return checkResult( sum, secondCN ); + } + return false; + +}, "Please specify a valid CPF number." ); + +// https://jqueryvalidation.org/creditcard-method/ +// based on https://en.wikipedia.org/wiki/Luhn_algorithm +$.validator.addMethod( "creditcard", function( value, element ) { + if ( this.optional( element ) ) { + return "dependency-mismatch"; + } + + // Accept only spaces, digits and dashes + if ( /[^0-9 \-]+/.test( value ) ) { + return false; + } + + var nCheck = 0, + nDigit = 0, + bEven = false, + n, cDigit; + + value = value.replace( /\D/g, "" ); + + // Basing min and max length on + // https://dev.ean.com/general-info/valid-card-types/ + if ( value.length < 13 || value.length > 19 ) { + return false; + } + + for ( n = value.length - 1; n >= 0; n-- ) { + cDigit = value.charAt( n ); + nDigit = parseInt( cDigit, 10 ); + if ( bEven ) { + if ( ( nDigit *= 2 ) > 9 ) { + nDigit -= 9; + } + } + + nCheck += nDigit; + bEven = !bEven; + } + + return ( nCheck % 10 ) === 0; +}, "Please enter a valid credit card number." ); + +/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator + * Redistributed under the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0 + * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings) + */ +$.validator.addMethod( "creditcardtypes", function( value, element, param ) { + if ( /[^0-9\-]+/.test( value ) ) { + return false; + } + + value = value.replace( /\D/g, "" ); + + var validTypes = 0x0000; + + if ( param.mastercard ) { + validTypes |= 0x0001; + } + if ( param.visa ) { + validTypes |= 0x0002; + } + if ( param.amex ) { + validTypes |= 0x0004; + } + if ( param.dinersclub ) { + validTypes |= 0x0008; + } + if ( param.enroute ) { + validTypes |= 0x0010; + } + if ( param.discover ) { + validTypes |= 0x0020; + } + if ( param.jcb ) { + validTypes |= 0x0040; + } + if ( param.unknown ) { + validTypes |= 0x0080; + } + if ( param.all ) { + validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080; + } + if ( validTypes & 0x0001 && ( /^(5[12345])/.test( value ) || /^(2[234567])/.test( value ) ) ) { // Mastercard + return value.length === 16; + } + if ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa + return value.length === 16; + } + if ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex + return value.length === 15; + } + if ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub + return value.length === 14; + } + if ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute + return value.length === 15; + } + if ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover + return value.length === 16; + } + if ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb + return value.length === 16; + } + if ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb + return value.length === 15; + } + if ( validTypes & 0x0080 ) { // Unknown + return true; + } + return false; +}, "Please enter a valid credit card number." ); + +/** + * Validates currencies with any given symbols by @jameslouiz + * Symbols can be optional or required. Symbols required by default + * + * Usage examples: + * currency: ["£", false] - Use false for soft currency validation + * currency: ["$", false] + * currency: ["RM", false] - also works with text based symbols such as "RM" - Malaysia Ringgit etc + * + * + * + * Soft symbol checking + * currencyInput: { + * currency: ["$", false] + * } + * + * Strict symbol checking (default) + * currencyInput: { + * currency: "$" + * //OR + * currency: ["$", true] + * } + * + * Multiple Symbols + * currencyInput: { + * currency: "$,£,¢" + * } + */ +$.validator.addMethod( "currency", function( value, element, param ) { + var isParamString = typeof param === "string", + symbol = isParamString ? param : param[ 0 ], + soft = isParamString ? true : param[ 1 ], + regex; + + symbol = symbol.replace( /,/g, "" ); + symbol = soft ? symbol + "]" : symbol + "]?"; + regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$"; + regex = new RegExp( regex ); + return this.optional( element ) || regex.test( value ); + +}, "Please specify a valid currency." ); + +$.validator.addMethod( "dateFA", function( value, element ) { + return this.optional( element ) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value ); +}, $.validator.messages.date ); + +/** + * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy. + * + * @example $.validator.methods.date("01/01/1900") + * @result true + * + * @example $.validator.methods.date("01/13/1990") + * @result false + * + * @example $.validator.methods.date("01.01.1900") + * @result false + * + * @example + * @desc Declares an optional input element whose value must be a valid date. + * + * @name $.validator.methods.dateITA + * @type Boolean + * @cat Plugins/Validate/Methods + */ +$.validator.addMethod( "dateITA", function( value, element ) { + var check = false, + re = /^\d{1,2}\/\d{1,2}\/\d{4}$/, + adata, gg, mm, aaaa, xdata; + if ( re.test( value ) ) { + adata = value.split( "/" ); + gg = parseInt( adata[ 0 ], 10 ); + mm = parseInt( adata[ 1 ], 10 ); + aaaa = parseInt( adata[ 2 ], 10 ); + xdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) ); + if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) { + check = true; + } else { + check = false; + } + } else { + check = false; + } + return this.optional( element ) || check; +}, $.validator.messages.date ); + +$.validator.addMethod( "dateNL", function( value, element ) { + return this.optional( element ) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test( value ); +}, $.validator.messages.date ); + +// Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept +$.validator.addMethod( "extension", function( value, element, param ) { + param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif"; + return this.optional( element ) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) ); +}, $.validator.format( "Please enter a value with a valid extension." ) ); + +/** + * Dutch giro account numbers (not bank numbers) have max 7 digits + */ +$.validator.addMethod( "giroaccountNL", function( value, element ) { + return this.optional( element ) || /^[0-9]{1,7}$/.test( value ); +}, "Please specify a valid giro account number." ); + +$.validator.addMethod( "greaterThan", function( value, element, param ) { + var target = $( param ); + + if ( this.settings.onfocusout && target.not( ".validate-greaterThan-blur" ).length ) { + target.addClass( "validate-greaterThan-blur" ).on( "blur.validate-greaterThan", function() { + $( element ).valid(); + } ); + } + + return value > target.val(); +}, "Please enter a greater value." ); + +$.validator.addMethod( "greaterThanEqual", function( value, element, param ) { + var target = $( param ); + + if ( this.settings.onfocusout && target.not( ".validate-greaterThanEqual-blur" ).length ) { + target.addClass( "validate-greaterThanEqual-blur" ).on( "blur.validate-greaterThanEqual", function() { + $( element ).valid(); + } ); + } + + return value >= target.val(); +}, "Please enter a greater value." ); + +/** + * IBAN is the international bank account number. + * It has a country - specific format, that is checked here too + * + * Validation is case-insensitive. Please make sure to normalize input yourself. + */ +$.validator.addMethod( "iban", function( value, element ) { + + // Some quick simple tests to prevent needless work + if ( this.optional( element ) ) { + return true; + } + + // Remove spaces and to upper case + var iban = value.replace( / /g, "" ).toUpperCase(), + ibancheckdigits = "", + leadingZeroes = true, + cRest = "", + cOperator = "", + countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p; + + // Check for IBAN code length. + // It contains: + // country code ISO 3166-1 - two letters, + // two check digits, + // Basic Bank Account Number (BBAN) - up to 30 chars + var minimalIBANlength = 5; + if ( iban.length < minimalIBANlength ) { + return false; + } + + // Check the country code and find the country specific format + countrycode = iban.substring( 0, 2 ); + bbancountrypatterns = { + "AL": "\\d{8}[\\dA-Z]{16}", + "AD": "\\d{8}[\\dA-Z]{12}", + "AT": "\\d{16}", + "AZ": "[\\dA-Z]{4}\\d{20}", + "BE": "\\d{12}", + "BH": "[A-Z]{4}[\\dA-Z]{14}", + "BA": "\\d{16}", + "BR": "\\d{23}[A-Z][\\dA-Z]", + "BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}", + "CR": "\\d{17}", + "HR": "\\d{17}", + "CY": "\\d{8}[\\dA-Z]{16}", + "CZ": "\\d{20}", + "DK": "\\d{14}", + "DO": "[A-Z]{4}\\d{20}", + "EE": "\\d{16}", + "FO": "\\d{14}", + "FI": "\\d{14}", + "FR": "\\d{10}[\\dA-Z]{11}\\d{2}", + "GE": "[\\dA-Z]{2}\\d{16}", + "DE": "\\d{18}", + "GI": "[A-Z]{4}[\\dA-Z]{15}", + "GR": "\\d{7}[\\dA-Z]{16}", + "GL": "\\d{14}", + "GT": "[\\dA-Z]{4}[\\dA-Z]{20}", + "HU": "\\d{24}", + "IS": "\\d{22}", + "IE": "[\\dA-Z]{4}\\d{14}", + "IL": "\\d{19}", + "IT": "[A-Z]\\d{10}[\\dA-Z]{12}", + "KZ": "\\d{3}[\\dA-Z]{13}", + "KW": "[A-Z]{4}[\\dA-Z]{22}", + "LV": "[A-Z]{4}[\\dA-Z]{13}", + "LB": "\\d{4}[\\dA-Z]{20}", + "LI": "\\d{5}[\\dA-Z]{12}", + "LT": "\\d{16}", + "LU": "\\d{3}[\\dA-Z]{13}", + "MK": "\\d{3}[\\dA-Z]{10}\\d{2}", + "MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}", + "MR": "\\d{23}", + "MU": "[A-Z]{4}\\d{19}[A-Z]{3}", + "MC": "\\d{10}[\\dA-Z]{11}\\d{2}", + "MD": "[\\dA-Z]{2}\\d{18}", + "ME": "\\d{18}", + "NL": "[A-Z]{4}\\d{10}", + "NO": "\\d{11}", + "PK": "[\\dA-Z]{4}\\d{16}", + "PS": "[\\dA-Z]{4}\\d{21}", + "PL": "\\d{24}", + "PT": "\\d{21}", + "RO": "[A-Z]{4}[\\dA-Z]{16}", + "SM": "[A-Z]\\d{10}[\\dA-Z]{12}", + "SA": "\\d{2}[\\dA-Z]{18}", + "RS": "\\d{18}", + "SK": "\\d{20}", + "SI": "\\d{15}", + "ES": "\\d{20}", + "SE": "\\d{20}", + "CH": "\\d{5}[\\dA-Z]{12}", + "TN": "\\d{20}", + "TR": "\\d{5}[\\dA-Z]{17}", + "AE": "\\d{3}\\d{16}", + "GB": "[A-Z]{4}\\d{14}", + "VG": "[\\dA-Z]{4}\\d{16}" + }; + + bbanpattern = bbancountrypatterns[ countrycode ]; + + // As new countries will start using IBAN in the + // future, we only check if the countrycode is known. + // This prevents false negatives, while almost all + // false positives introduced by this, will be caught + // by the checksum validation below anyway. + // Strict checking should return FALSE for unknown + // countries. + if ( typeof bbanpattern !== "undefined" ) { + ibanregexp = new RegExp( "^[A-Z]{2}\\d{2}" + bbanpattern + "$", "" ); + if ( !( ibanregexp.test( iban ) ) ) { + return false; // Invalid country specific format + } + } + + // Now check the checksum, first convert to digits + ibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 ); + for ( i = 0; i < ibancheck.length; i++ ) { + charAt = ibancheck.charAt( i ); + if ( charAt !== "0" ) { + leadingZeroes = false; + } + if ( !leadingZeroes ) { + ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( charAt ); + } + } + + // Calculate the result of: ibancheckdigits % 97 + for ( p = 0; p < ibancheckdigits.length; p++ ) { + cChar = ibancheckdigits.charAt( p ); + cOperator = "" + cRest + "" + cChar; + cRest = cOperator % 97; + } + return cRest === 1; +}, "Please specify a valid IBAN." ); + +$.validator.addMethod( "integer", function( value, element ) { + return this.optional( element ) || /^-?\d+$/.test( value ); +}, "A positive or negative non-decimal number please." ); + +$.validator.addMethod( "ipv4", function( value, element ) { + return this.optional( element ) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test( value ); +}, "Please enter a valid IP v4 address." ); + +$.validator.addMethod( "ipv6", function( value, element ) { + return this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value ); +}, "Please enter a valid IP v6 address." ); + +$.validator.addMethod( "lessThan", function( value, element, param ) { + var target = $( param ); + + if ( this.settings.onfocusout && target.not( ".validate-lessThan-blur" ).length ) { + target.addClass( "validate-lessThan-blur" ).on( "blur.validate-lessThan", function() { + $( element ).valid(); + } ); + } + + return value < target.val(); +}, "Please enter a lesser value." ); + +$.validator.addMethod( "lessThanEqual", function( value, element, param ) { + var target = $( param ); + + if ( this.settings.onfocusout && target.not( ".validate-lessThanEqual-blur" ).length ) { + target.addClass( "validate-lessThanEqual-blur" ).on( "blur.validate-lessThanEqual", function() { + $( element ).valid(); + } ); + } + + return value <= target.val(); +}, "Please enter a lesser value." ); + +$.validator.addMethod( "lettersonly", function( value, element ) { + return this.optional( element ) || /^[a-z]+$/i.test( value ); +}, "Letters only please." ); + +$.validator.addMethod( "letterswithbasicpunc", function( value, element ) { + return this.optional( element ) || /^[a-z\-.,()'"\s]+$/i.test( value ); +}, "Letters or punctuation only please." ); + +// Limit the number of files in a FileList. +$.validator.addMethod( "maxfiles", function( value, element, param ) { + if ( this.optional( element ) ) { + return true; + } + + if ( $( element ).attr( "type" ) === "file" ) { + if ( element.files && element.files.length > param ) { + return false; + } + } + + return true; +}, $.validator.format( "Please select no more than {0} files." ) ); + +// Limit the size of each individual file in a FileList. +$.validator.addMethod( "maxsize", function( value, element, param ) { + if ( this.optional( element ) ) { + return true; + } + + if ( $( element ).attr( "type" ) === "file" ) { + if ( element.files && element.files.length ) { + for ( var i = 0; i < element.files.length; i++ ) { + if ( element.files[ i ].size > param ) { + return false; + } + } + } + } + + return true; +}, $.validator.format( "File size must not exceed {0} bytes each." ) ); + +// Limit the size of all files in a FileList. +$.validator.addMethod( "maxsizetotal", function( value, element, param ) { + if ( this.optional( element ) ) { + return true; + } + + if ( $( element ).attr( "type" ) === "file" ) { + if ( element.files && element.files.length ) { + var totalSize = 0; + + for ( var i = 0; i < element.files.length; i++ ) { + totalSize += element.files[ i ].size; + if ( totalSize > param ) { + return false; + } + } + } + } + + return true; +}, $.validator.format( "Total size of all files must not exceed {0} bytes." ) ); + + +$.validator.addMethod( "mobileNL", function( value, element ) { + return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test( value ); +}, "Please specify a valid mobile number." ); + +$.validator.addMethod( "mobileRU", function( phone_number, element ) { + var ruPhone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); + return this.optional( element ) || ruPhone_number.length > 9 && /^((\+7|7|8)+([0-9]){10})$/.test( ruPhone_number ); +}, "Please specify a valid mobile number." ); + +/* For UK phone functions, do the following server side processing: + * Compare original input with this RegEx pattern: + * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$ + * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0' + * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2. + * A number of very detailed GB telephone number RegEx patterns can also be found at: + * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers + */ +$.validator.addMethod( "mobileUK", function( phone_number, element ) { + phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); + return this.optional( element ) || phone_number.length > 9 && + phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ ); +}, "Please specify a valid mobile number." ); + +$.validator.addMethod( "netmask", function( value, element ) { + return this.optional( element ) || /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test( value ); +}, "Please enter a valid netmask." ); + +/* + * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish + * authorities to any foreigner. + * + * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal + * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to + * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter. + */ +$.validator.addMethod( "nieES", function( value, element ) { + "use strict"; + + if ( this.optional( element ) ) { + return true; + } + + var nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi ); + var validChars = "TRWAGMYFPDXBNJZSQVHLCKET", + letter = value.substr( value.length - 1 ).toUpperCase(), + number; + + value = value.toString().toUpperCase(); + + // Quick format test + if ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) { + return false; + } + + // X means same number + // Y means number + 10000000 + // Z means number + 20000000 + value = value.replace( /^[X]/, "0" ) + .replace( /^[Y]/, "1" ) + .replace( /^[Z]/, "2" ); + + number = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 ); + + return validChars.charAt( parseInt( number, 10 ) % 23 ) === letter; + +}, "Please specify a valid NIE number." ); + +/* + * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals + */ +$.validator.addMethod( "nifES", function( value, element ) { + "use strict"; + + if ( this.optional( element ) ) { + return true; + } + + value = value.toUpperCase(); + + // Basic format test + if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) { + return false; + } + + // Test NIF + if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) { + return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) ); + } + + // Test specials NIF (starts with K, L or M) + if ( /^[KLM]{1}/.test( value ) ) { + return ( value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 1 ) % 23 ) ); + } + + return false; + +}, "Please specify a valid NIF number." ); + +/* + * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies + */ +$.validator.addMethod( "nipPL", function( value ) { + "use strict"; + + value = value.replace( /[^0-9]/g, "" ); + + if ( value.length !== 10 ) { + return false; + } + + var arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ]; + var intSum = 0; + for ( var i = 0; i < 9; i++ ) { + intSum += arrSteps[ i ] * value[ i ]; + } + var int2 = intSum % 11; + var intControlNr = ( int2 === 10 ) ? 0 : int2; + + return ( intControlNr === parseInt( value[ 9 ], 10 ) ); +}, "Please specify a valid NIP number." ); + +/** + * Created for project jquery-validation. + * @Description Brazillian PIS or NIS number (Número de Identificação Social Pis ou Pasep) is the equivalent of a + * Brazilian tax registration number NIS of PIS numbers have 11 digits in total: 10 numbers followed by 1 check numbers + * that are being used for validation. + * @copyright (c) 21/08/2018 13:14, Cleiton da Silva Mendonça + * @author Cleiton da Silva Mendonça + * @link http://gitlab.com/csmendonca Gitlab of Cleiton da Silva Mendonça + * @link http://github.com/csmendonca Github of Cleiton da Silva Mendonça + */ +$.validator.addMethod( "nisBR", function( value ) { + var number; + var cn; + var sum = 0; + var dv; + var count; + var multiplier; + + // Removing special characters from value + value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" ); + + // Checking value to have 11 digits only + if ( value.length !== 11 ) { + return false; + } + + //Get check number of value + cn = parseInt( value.substring( 10, 11 ), 10 ); + + //Get number with 10 digits of the value + number = parseInt( value.substring( 0, 10 ), 10 ); + + for ( count = 2; count < 12; count++ ) { + multiplier = count; + if ( count === 10 ) { + multiplier = 2; + } + if ( count === 11 ) { + multiplier = 3; + } + sum += ( ( number % 10 ) * multiplier ); + number = parseInt( number / 10, 10 ); + } + dv = ( sum % 11 ); + + if ( dv > 1 ) { + dv = ( 11 - dv ); + } else { + dv = 0; + } + + if ( cn === dv ) { + return true; + } else { + return false; + } +}, "Please specify a valid NIS/PIS number." ); + +$.validator.addMethod( "notEqualTo", function( value, element, param ) { + return this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param ); +}, "Please enter a different value, values must not be the same." ); + +$.validator.addMethod( "nowhitespace", function( value, element ) { + return this.optional( element ) || /^\S+$/i.test( value ); +}, "No white space please." ); + +/** +* Return true if the field value matches the given format RegExp +* +* @example $.validator.methods.pattern("AR1004",element,/^AR\d{4}$/) +* @result true +* +* @example $.validator.methods.pattern("BR1004",element,/^AR\d{4}$/) +* @result false +* +* @name $.validator.methods.pattern +* @type Boolean +* @cat Plugins/Validate/Methods +*/ +$.validator.addMethod( "pattern", function( value, element, param ) { + if ( this.optional( element ) ) { + return true; + } + if ( typeof param === "string" ) { + param = new RegExp( "^(?:" + param + ")$" ); + } + return param.test( value ); +}, "Invalid format." ); + +/** + * Dutch phone numbers have 10 digits (or 11 and start with +31). + */ +$.validator.addMethod( "phoneNL", function( value, element ) { + return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test( value ); +}, "Please specify a valid phone number." ); + +/** + * Polish telephone numbers have 9 digits. + * + * Mobile phone numbers starts with following digits: + * 45, 50, 51, 53, 57, 60, 66, 69, 72, 73, 78, 79, 88. + * + * Fixed-line numbers starts with area codes: + * 12, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, 29, 32, 33, + * 34, 41, 42, 43, 44, 46, 48, 52, 54, 55, 56, 58, 59, 61, + * 62, 63, 65, 67, 68, 71, 74, 75, 76, 77, 81, 82, 83, 84, + * 85, 86, 87, 89, 91, 94, 95. + * + * Ministry of National Defence numbers and VoIP numbers starts with 26 and 39. + * + * Excludes intelligent networks (premium rate, shared cost, free phone numbers). + * + * Poland National Numbering Plan http://www.itu.int/oth/T02020000A8/en + */ +$.validator.addMethod( "phonePL", function( phone_number, element ) { + phone_number = phone_number.replace( /\s+/g, "" ); + var regexp = /^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/; + return this.optional( element ) || regexp.test( phone_number ); +}, "Please specify a valid phone number." ); + +/* For UK phone functions, do the following server side processing: + * Compare original input with this RegEx pattern: + * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$ + * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0' + * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2. + * A number of very detailed GB telephone number RegEx patterns can also be found at: + * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers + */ + +// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers +$.validator.addMethod( "phonesUK", function( phone_number, element ) { + phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); + return this.optional( element ) || phone_number.length > 9 && + phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ ); +}, "Please specify a valid uk phone number." ); + +/* For UK phone functions, do the following server side processing: + * Compare original input with this RegEx pattern: + * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$ + * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0' + * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2. + * A number of very detailed GB telephone number RegEx patterns can also be found at: + * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers + */ +$.validator.addMethod( "phoneUK", function( phone_number, element ) { + phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); + return this.optional( element ) || phone_number.length > 9 && + phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/ ); +}, "Please specify a valid phone number." ); + +/** + * Matches US phone number format + * + * where the area code may not start with 1 and the prefix may not start with 1 + * allows '-' or ' ' as a separator and allows parens around area code + * some people may want to put a '1' in front of their number + * + * 1(212)-999-2345 or + * 212 999 2344 or + * 212-999-0983 + * + * but not + * 111-123-5434 + * and not + * 212 123 4567 + */ +$.validator.addMethod( "phoneUS", function( phone_number, element ) { + phone_number = phone_number.replace( /\s+/g, "" ); + return this.optional( element ) || phone_number.length > 9 && + phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/ ); +}, "Please specify a valid phone number." ); + +/* +* Valida CEPs do brasileiros: +* +* Formatos aceitos: +* 99999-999 +* 99.999-999 +* 99999999 +*/ +$.validator.addMethod( "postalcodeBR", function( cep_value, element ) { + return this.optional( element ) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value ); +}, "Informe um CEP válido." ); + +/** + * Matches a valid Canadian Postal Code + * + * @example jQuery.validator.methods.postalCodeCA( "H0H 0H0", element ) + * @result true + * + * @example jQuery.validator.methods.postalCodeCA( "H0H0H0", element ) + * @result false + * + * @name jQuery.validator.methods.postalCodeCA + * @type Boolean + * @cat Plugins/Validate/Methods + */ +$.validator.addMethod( "postalCodeCA", function( value, element ) { + return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value ); +}, "Please specify a valid postal code." ); + +/* Matches Italian postcode (CAP) */ +$.validator.addMethod( "postalcodeIT", function( value, element ) { + return this.optional( element ) || /^\d{5}$/.test( value ); +}, "Please specify a valid postal code." ); + +$.validator.addMethod( "postalcodeNL", function( value, element ) { + return this.optional( element ) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test( value ); +}, "Please specify a valid postal code." ); + +// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK) +$.validator.addMethod( "postcodeUK", function( value, element ) { + return this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test( value ); +}, "Please specify a valid UK postcode." ); + +/* + * Lets you say "at least X inputs that match selector Y must be filled." + * + * The end result is that neither of these inputs: + * + * + * + * + * ...will validate unless at least one of them is filled. + * + * partnumber: {require_from_group: [1,".productinfo"]}, + * description: {require_from_group: [1,".productinfo"]} + * + * options[0]: number of fields that must be filled in the group + * options[1]: CSS selector that defines the group of conditionally required fields + */ +$.validator.addMethod( "require_from_group", function( value, element, options ) { + var $fields = $( options[ 1 ], element.form ), + $fieldsFirst = $fields.eq( 0 ), + validator = $fieldsFirst.data( "valid_req_grp" ) ? $fieldsFirst.data( "valid_req_grp" ) : $.extend( {}, this ), + isValid = $fields.filter( function() { + return validator.elementValue( this ); + } ).length >= options[ 0 ]; + + // Store the cloned validator for future validation + $fieldsFirst.data( "valid_req_grp", validator ); + + // If element isn't being validated, run each require_from_group field's validation rules + if ( !$( element ).data( "being_validated" ) ) { + $fields.data( "being_validated", true ); + $fields.each( function() { + validator.element( this ); + } ); + $fields.data( "being_validated", false ); + } + return isValid; +}, $.validator.format( "Please fill at least {0} of these fields." ) ); + +/* + * Lets you say "either at least X inputs that match selector Y must be filled, + * OR they must all be skipped (left blank)." + * + * The end result, is that none of these inputs: + * + * + * + * + * + * ...will validate unless either at least two of them are filled, + * OR none of them are. + * + * partnumber: {skip_or_fill_minimum: [2,".productinfo"]}, + * description: {skip_or_fill_minimum: [2,".productinfo"]}, + * color: {skip_or_fill_minimum: [2,".productinfo"]} + * + * options[0]: number of fields that must be filled in the group + * options[1]: CSS selector that defines the group of conditionally required fields + * + */ +$.validator.addMethod( "skip_or_fill_minimum", function( value, element, options ) { + var $fields = $( options[ 1 ], element.form ), + $fieldsFirst = $fields.eq( 0 ), + validator = $fieldsFirst.data( "valid_skip" ) ? $fieldsFirst.data( "valid_skip" ) : $.extend( {}, this ), + numberFilled = $fields.filter( function() { + return validator.elementValue( this ); + } ).length, + isValid = numberFilled === 0 || numberFilled >= options[ 0 ]; + + // Store the cloned validator for future validation + $fieldsFirst.data( "valid_skip", validator ); + + // If element isn't being validated, run each skip_or_fill_minimum field's validation rules + if ( !$( element ).data( "being_validated" ) ) { + $fields.data( "being_validated", true ); + $fields.each( function() { + validator.element( this ); + } ); + $fields.data( "being_validated", false ); + } + return isValid; +}, $.validator.format( "Please either skip these fields or fill at least {0} of them." ) ); + +/* Validates US States and/or Territories by @jdforsythe + * Can be case insensitive or require capitalization - default is case insensitive + * Can include US Territories or not - default does not + * Can include US Military postal abbreviations (AA, AE, AP) - default does not + * + * Note: "States" always includes DC (District of Colombia) + * + * Usage examples: + * + * This is the default - case insensitive, no territories, no military zones + * stateInput: { + * caseSensitive: false, + * includeTerritories: false, + * includeMilitary: false + * } + * + * Only allow capital letters, no territories, no military zones + * stateInput: { + * caseSensitive: false + * } + * + * Case insensitive, include territories but not military zones + * stateInput: { + * includeTerritories: true + * } + * + * Only allow capital letters, include territories and military zones + * stateInput: { + * caseSensitive: true, + * includeTerritories: true, + * includeMilitary: true + * } + * + */ +$.validator.addMethod( "stateUS", function( value, element, options ) { + var isDefault = typeof options === "undefined", + caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive, + includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories, + includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary, + regex; + + if ( !includeTerritories && !includeMilitary ) { + regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$"; + } else if ( includeTerritories && includeMilitary ) { + regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$"; + } else if ( includeTerritories ) { + regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$"; + } else { + regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$"; + } + + regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" ); + return this.optional( element ) || regex.test( value ); +}, "Please specify a valid state." ); + +// TODO check if value starts with <, otherwise don't try stripping anything +$.validator.addMethod( "strippedminlength", function( value, element, param ) { + return $( value ).text().length >= param; +}, $.validator.format( "Please enter at least {0} characters." ) ); + +$.validator.addMethod( "time", function( value, element ) { + return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value ); +}, "Please enter a valid time, between 00:00 and 23:59." ); + +$.validator.addMethod( "time12h", function( value, element ) { + return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value ); +}, "Please enter a valid time in 12-hour am/pm format." ); + +// Same as url, but TLD is optional +$.validator.addMethod( "url2", function( value, element ) { + return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?)|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff])|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62}\.)))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value ); +}, $.validator.messages.url ); + +/** + * Return true, if the value is a valid vehicle identification number (VIN). + * + * Works with all kind of text inputs. + * + * @example + * @desc Declares a required input element whose value must be a valid vehicle identification number. + * + * @name $.validator.methods.vinUS + * @type Boolean + * @cat Plugins/Validate/Methods + */ +$.validator.addMethod( "vinUS", function( v ) { + if ( v.length !== 17 ) { + return false; + } + + var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ], + VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ], + FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ], + rs = 0, + i, n, d, f, cd, cdv; + + for ( i = 0; i < 17; i++ ) { + f = FL[ i ]; + d = v.slice( i, i + 1 ); + if ( i === 8 ) { + cdv = d; + } + if ( !isNaN( d ) ) { + d *= f; + } else { + for ( n = 0; n < LL.length; n++ ) { + if ( d.toUpperCase() === LL[ n ] ) { + d = VL[ n ]; + d *= f; + if ( isNaN( cdv ) && n === 8 ) { + cdv = LL[ n ]; + } + break; + } + } + } + rs += d; + } + cd = rs % 11; + if ( cd === 10 ) { + cd = "X"; + } + if ( cd === cdv ) { + return true; + } + return false; +}, "The specified vehicle identification number (VIN) is invalid." ); + +$.validator.addMethod( "zipcodeUS", function( value, element ) { + return this.optional( element ) || /^\d{5}(-\d{4})?$/.test( value ); +}, "The specified US ZIP Code is invalid." ); + +$.validator.addMethod( "ziprange", function( value, element ) { + return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value ); +}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx." ); +return $; +})); \ No newline at end of file diff --git a/JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.min.js new file mode 100644 index 0000000..80f14b5 --- /dev/null +++ b/JoshHeaps.Net/wwwroot/lib/jquery-validation/dist/additional-methods.min.js @@ -0,0 +1,4 @@ +/*! jQuery Validation Plugin - v1.19.5 - 7/1/2022 + * https://jqueryvalidation.org/ + * Copyright (c) 2022 Jörn Zaefferer; Licensed MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("abaRoutingNumber",function(a){var b=0,c=a.split(""),d=c.length;if(9!==d)return!1;for(var e=0;e9?"0":f,g="JABCDEFGHI".substr(f,1).toString(),i.match(/[ABEH]/)?k===f:i.match(/[KPQS]/)?k===g:k===f||k===g},"Please specify a valid CIF number."),a.validator.addMethod("cnhBR",function(a){if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var b,c,d,e,f,g,h=0,i=0;if(b=a.charAt(0),new Array(12).join(b)===a)return!1;for(e=0,f=9,g=0;e<9;++e,--f)h+=+(a.charAt(e)*f);for(c=h%11,c>=10&&(c=0,i=2),h=0,e=0,f=1,g=0;e<9;++e,++f)h+=+(a.charAt(e)*f);return d=h%11,d>=10?d=0:d-=i,String(c).concat(d)===a.substr(-2)},"Please specify a valid CNH number."),a.validator.addMethod("cnpjBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/[^\d]+/g,""),14!==a.length)return!1;if("00000000000000"===a||"11111111111111"===a||"22222222222222"===a||"33333333333333"===a||"44444444444444"===a||"55555555555555"===a||"66666666666666"===a||"77777777777777"===a||"88888888888888"===a||"99999999999999"===a)return!1;for(var c=a.length-2,d=a.substring(0,c),e=a.substring(c),f=0,g=c-7,h=c;h>=1;h--)f+=d.charAt(c-h)*g--,g<2&&(g=9);var i=f%11<2?0:11-f%11;if(i!==parseInt(e.charAt(0),10))return!1;c+=1,d=a.substring(0,c),f=0,g=c-7;for(var j=c;j>=1;j--)f+=d.charAt(c-j)*g--,g<2&&(g=9);return i=f%11<2?0:11-f%11,i===parseInt(e.charAt(1),10)},"Please specify a CNPJ value number."),a.validator.addMethod("cpfBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var c,d,e,f,g=0;if(c=parseInt(a.substring(9,10),10),d=parseInt(a.substring(10,11),10),e=function(a,b){var c=10*a%11;return 10!==c&&11!==c||(c=0),c===b},""===a||"00000000000"===a||"11111111111"===a||"22222222222"===a||"33333333333"===a||"44444444444"===a||"55555555555"===a||"66666666666"===a||"77777777777"===a||"88888888888"===a||"99999999999"===a)return!1;for(f=1;f<=9;f++)g+=parseInt(a.substring(f-1,f),10)*(11-f);if(e(g,c)){for(g=0,f=1;f<=10;f++)g+=parseInt(a.substring(f-1,f),10)*(12-f);return e(g,d)}return!1},"Please specify a valid CPF number."),a.validator.addMethod("creditcard",function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},"Please enter a valid credit card number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&(/^(5[12345])/.test(a)||/^(2[234567])/.test(a))?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:!!(128&d)},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=!!e||c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency."),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},a.validator.messages.date),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(Date.UTC(f,e-1,d,12,0,0,0)),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d):h=!1,this.optional(b)||h},a.validator.messages.date),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},a.validator.messages.date),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp("\\.("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number."),a.validator.addMethod("greaterThan",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThan-blur").length&&e.addClass("validate-greaterThan-blur").on("blur.validate-greaterThan",function(){a(c).valid()}),b>e.val()},"Please enter a greater value."),a.validator.addMethod("greaterThanEqual",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThanEqual-blur").length&&e.addClass("validate-greaterThanEqual-blur").on("blur.validate-greaterThanEqual",function(){a(c).valid()}),b>=e.val()},"Please enter a greater value."),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="",q=5;if(l.lengthd)},a.validator.format("Please select no more than {0} files.")),a.validator.addMethod("maxsize",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0;ed)return!1;return!0},a.validator.format("File size must not exceed {0} bytes each.")),a.validator.addMethod("maxsizetotal",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0,f=0;fd)return!1;return!0},a.validator.format("Total size of all files must not exceed {0} bytes.")),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number."),a.validator.addMethod("mobileRU",function(a,b){var c=a.replace(/\(|\)|\s+|-/g,"");return this.optional(b)||c.length>9&&/^((\+7|7|8)+([0-9]){10})$/.test(c)},"Please specify a valid mobile number."),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number."),a.validator.addMethod("netmask",function(a,b){return this.optional(b)||/^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test(a)},"Please enter a valid netmask."),a.validator.addMethod("nieES",function(a,b){"use strict";if(this.optional(b))return!0;var c,d=new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi),e="TRWAGMYFPDXBNJZSQVHLCKET",f=a.substr(a.length-1).toUpperCase();return a=a.toString().toUpperCase(),!(a.length>10||a.length<9||!d.test(a))&&(a=a.replace(/^[X]/,"0").replace(/^[Y]/,"1").replace(/^[Z]/,"2"),c=9===a.length?a.substr(0,8):a.substr(0,9),e.charAt(parseInt(c,10)%23)===f)},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a,b){"use strict";return!!this.optional(b)||(a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):!!/^[KLM]{1}/.test(a)&&a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,1)%23)))},"Please specify a valid NIF number."),a.validator.addMethod("nipPL",function(a){"use strict";if(a=a.replace(/[^0-9]/g,""),10!==a.length)return!1;for(var b=[6,5,7,2,3,4,5,6,7],c=0,d=0;d<9;d++)c+=b[d]*a[d];var e=c%11,f=10===e?0:e;return f===parseInt(a[9],10)},"Please specify a valid NIP number."),a.validator.addMethod("nisBR",function(a){var b,c,d,e,f,g=0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;for(c=parseInt(a.substring(10,11),10),b=parseInt(a.substring(0,10),10),e=2;e<12;e++)f=e,10===e&&(f=2),11===e&&(f=3),g+=b%10*f,b=parseInt(b/10,10);return d=g%11,d=d>1?11-d:0,c===d},"Please specify a valid NIS/PIS number."),a.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please."),a.validator.addMethod("pattern",function(a,b,c){return!!this.optional(b)||("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonePL",function(a,b){a=a.replace(/\s+/g,"");var c=/^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;return this.optional(b)||c.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number."),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/)},"Please specify a valid phone number."),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(a)},"Please specify a valid postal code."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code."),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code."),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode."),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=!e&&"undefined"!=typeof c.caseSensitive&&c.caseSensitive,g=!e&&"undefined"!=typeof c.includeTerritories&&c.includeTerritories,h=!e&&"undefined"!=typeof c.includeMilitary&&c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state."),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters.")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59."),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format."),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?)|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff])|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62}\.)))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;b<17;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c