As part of a new UI library, I have created a National Identification Textbox (social security, social insurance, etc.) in a manner that follows the guidelines found in the Webgrown Solutions UI Manifesto. The National Identification Textbox supports the following features:
Just a basic input element, with a normal class attribute and some custom data (data-*) attributes to allow feature customization. Once the Script stuff is in place on a website, any page can implement the National Identification Textbox by simply setting the input element's class attribute to "nationalIdentificationTextbox" and setting the desired optional custom data attributes.
That sounds like a DRY solution to me (see UI Manifesto).
<div class="form legendLook horizontalFormLayout"> <div id="hdivFormTest1ConfirmationMessage" class="confirmationMessageWrapper hide"></div> <label for="txtUsSsn">U.S. Social Security Number:</label> <input type="text" id="txtUsSsn" class="nationalIdentificationTextbox" required placeholder="e.g. 123-12-1234" data-countryIsoCode="US" data-formGroup="formAuthenticate" name="Value" /> <label for="txtCaSin">Canada Social Insurance Number:</label> <input type="text" id="txtCaSin" class="nationalIdentificationTextbox" required placeholder="e.g. 123-123-123" data-countryIsoCode="CA" data-formGroup="formAuthenticate" name="_" /> <label for="txtDoCn">Dominican Republic Cédula Number:</label> <input type="text" id="txtDoCn" class="nationalIdentificationTextbox" required placeholder="e.g. 123-1234567-1" data-countryIsoCode="DO" data-formGroup="formAuthenticate" name="_" /> <div class="formButtonWrapper clearFix"> <input type="submit" class="ajaxFormPost buttonStrong" value="Submit" data-formGroup="formAuthenticate" data-serviceRequestUrl="..." data-successFunction="successFormTest1" data-confirmActionMessage="" data-processingMessage="" data-overlayWindowWhileProcessing="true" /> </div> </div>
function formatNationalIdentificationNumber(value, countryIsoCode, event) { var requestingElement = $("#" + event.target.id); //8 = Backspace //9 = Tab (so will stay highlighted) //16 = Reverse Tab - Shift+Tab (so will stay highlighted) if (getKeycode(event) != 8 && getKeycode(event) != 9 && getKeycode(event) != 16) { var unformattedNin = makeNumeric(value, false, null, null); var formattedNin = ""; var section1Count = 3; var section2Count = 2; var section3Count = 4; switch (countryIsoCode.toUpperCase()) { case "CA": //123-123-123 section1Count = 3; section2Count = 3; section3Count = 3; break; case "DO": //123-1234567-1 section1Count = 3; section2Count = 7; section3Count = 1; break; default: //123-12-1234 (US) section1Count = 3; section2Count = 2; section3Count = 4; break; } //Build and assign the "pattern", if not already there. if (!isAttrDefined(requestingElement.attr("pattern")) || requestingElement.attr("pattern").length == 0) { var patternValue = "/^((\\d{" + section1Count + "})-(\\d{" + section2Count + "})-(\\d{" + section3Count + "}))$/"; requestingElement.attr("pattern", patternValue); } //Assign the "maxlength", if not already there. if (!isAttrDefined(requestingElement.attr("maxlength")) || requestingElement.attr("maxlength").length == 0) { requestingElement.attr("maxlength", (section1Count + section2Count + section3Count + 2)); } //Section 1 var charCount = 0; while ((charCount + 1) <= section1Count) { //the (+1 & <=) is needed to not get messed up with Packer 3.1 compression formattedNin += unformattedNin.charAt(charCount); charCount++; } if (unformattedNin.length >= section1Count) { //Add dash formattedNin += "-"; //Section 2 charCount = 0; while ((charCount + 1) <= section2Count) { //the (+1 & <=) is needed to not get messed up with Packer 3.1 compression formattedNin += unformattedNin.charAt(charCount + section1Count); charCount++; } if (unformattedNin.length >= (section1Count + section2Count)) { //Add dash formattedNin += "-"; //Section 2 charCount = 0; while ((charCount + 1) <= section3Count) { //the (+1 & <=) is needed to not get messed up with Packer 3.1 compression formattedNin += unformattedNin.charAt(charCount + section1Count + section2Count); charCount++; } } } return formattedNin; } else { return value; } } //Enable National Identification Textbox(es) $(parentElementSelector + " input.nationalIdentificationTextbox").each(function () { $(this).keyup(function (event) { var countryIsoCode = ((!isAttrDefined($(this).attr("data-countryIsoCode")) || $(this).attr("data-countryIsoCode").length == 0) ? $("#hfGlobalCountryIsoCode").val() : $(this).attr("data-countryIsoCode")); $(this).val(formatNationalIdentificationNumber($(this).val(), countryIsoCode, event)); }); });
Not applicable.