Created
February 7, 2012 05:36
-
-
Save rpheath/1757458 to your computer and use it in GitHub Desktop.
Client-Side Password Validator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Playing around with CoffeeScript... | |
##################################################################################### | |
# Validator needs to inherit from Module class so we can support mixins | |
class Module | |
@include: (obj) -> | |
for key, value of obj | |
@::[key] = value | |
# ----------------------------------------------------------------------------------- | |
# properties to mixin character validations | |
characterValidationProperties = | |
load_character_requirements: -> | |
@requirements.push | |
regex: '(?=.[A-Z])' | |
message: 'Must contain at least 1 uppercase letter' | |
@requirements.push | |
regex: '(?=.[a-z])' | |
message: 'Must contain at least 1 lowercase letter' | |
@requirements.push | |
regex: '(?=.[@#$%^&])' | |
message: 'Must contain at least 1 special character' | |
@requirements | |
# properties to mixin number validations | |
numberValidationProperties = | |
load_number_requirements: -> | |
@requirements.push | |
regex: '(?=.[0-9])' | |
message: 'Must contain at least 1 number' | |
@requirements.push | |
regex: '^[^0-9].' | |
message: 'Cannot begin with a number' | |
@requirements.push | |
regex: '.[^0-9]$' | |
message: 'Cannot end with a number' | |
@requirements | |
# ----------------------------------------------------------------------------------- | |
# base class responsible for validating input | |
class Validator extends Module | |
constructor: -> | |
@requirements = @load_requirements() | |
@error_messages = [] | |
load_requirements: -> | |
validation_requirements = [] | |
validation_requirements.push | |
regex: '.{8,}$' | |
message: 'Must be at least 8 characters' | |
validation_requirements | |
validate: (input, callback) -> | |
@error_messages.length = 0 | |
for requirement in @requirements | |
regex = new RegExp(requirement.regex) | |
@error_messages.push(requirement.message) unless regex.test($(input).val()) | |
callback.call(null, @error_messages) | |
# extend base validator to support character-based validations | |
class CharacterValidator extends Validator | |
@include characterValidationProperties | |
constructor: -> | |
super | |
@load_character_requirements() | |
# extend base validator to support number-based validations | |
class NumberValidator extends Validator | |
@include numberValidationProperties | |
constructor: -> | |
super | |
@load_number_requirements() | |
# mixin both character and number validations | |
class CharacterAndNumberValidator extends Validator | |
@include characterValidationProperties | |
@include numberValidationProperties | |
constructor: -> | |
super | |
@load_character_requirements() | |
@load_number_requirements() | |
# ----------------------------------------------------------------------------------- | |
jQuery(document).ready ($) -> | |
$('#password').focus() | |
$('a.clear').click (e) -> | |
e.preventDefault() | |
$('#password').val('').focus() | |
$('form').submit (e) -> | |
e.preventDefault() | |
validator = new CharacterAndNumberValidator | |
validator.validate $('#password').get(0), (response) -> | |
response_html = if response.length > 0 | |
$.map response, (msg) -> $('<li />').html(msg).get(0); | |
else | |
$('<li />').html("Successful Validation").addClass('success') | |
$('ul#errors').html(response_html) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment