Skip to content

Instantly share code, notes, and snippets.

@rpheath
Created February 7, 2012 05:36
Show Gist options
  • Save rpheath/1757458 to your computer and use it in GitHub Desktop.
Save rpheath/1757458 to your computer and use it in GitHub Desktop.
Client-Side Password Validator
# 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