diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 7f45d07..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-.DS_Store
-
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-
-pids
-logs
-results
-tmp
-
-npm-debug.log
-node_modules
-bower_components
-.grunt
-_site
-
-sauce_connect.log
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index 7c75e5e..0000000
--- a/.jshintrc
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "node": true,
-  "camelcase": true,
-  "curly": true,
-  "eqeqeq": true,
-  "immed": true,
-  "indent": false,
-  "latedef": true,
-  "newcap": true,
-  "noarg": true,
-  "quotmark": "single",
-  "undef": false,
-  "unused": false,
-  "trailing": true,
-  "smarttabs": true,
-  "laxbreak": true,
-  "boss": true,
-  "sub": true,
-  "immed": false,
-  "predef": {
-    "describe": true,
-    "it": true,
-    "before": true,
-    "beforeEach": true,
-    "after": true,
-    "afterEach": true
-  }
-}
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index e3117b8..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-language: node_js
-node_js:
-- 0.1
-before_script:
-- npm install -g grunt-cli
-- npm install -g bower
-- npm install --no-bin-links
-- bower install
-notifications:
-  email:
-    - jarid@firstopinion.co
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
deleted file mode 100644
index 1e6731c..0000000
--- a/Gruntfile.js
+++ /dev/null
@@ -1,327 +0,0 @@
-/*!
- * Gruntfile.js
- * 
- * Copyright (c) 2014
- */
-
-
-module.exports = function (grunt) {
-
-
-// Load tasks
-require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
-
-
-// Browsers
-var browsers = [
-  // Latest Versions
-  { browserName: 'firefox', platform: 'WIN8' },
-  { browserName: 'chrome', platform: 'WIN8' },
-  { browserName: 'opera', platform: 'WIN7' },
-
-  // Internet Explorer
-  { browserName: 'internet explorer', platform: 'WIN8', version: '10' },
-  { browserName: 'internet explorer', platform: 'VISTA', version: '9' },
-  { browserName: 'internet explorer', platform: 'XP', version: '8' }
-];
-
-
-// Config
-grunt.initConfig({
-
-  // --------------------------------------------------------------------------
-  // PKG CONFIG
-  // --------------------------------------------------------------------------
-
-  'pkg': grunt.file.readJSON('package.json'),
-
-
-  // --------------------------------------------------------------------------
-  // JSHINT
-  // --------------------------------------------------------------------------
-
-  'jshint': {
-    src: [
-      'Gruntfile.js',
-      'src/**/*.js',
-      'test/**/*.js'
-    ],
-    build: [
-      'dist/**/*.js',
-      '!dist/**/*.min.js'
-    ],
-    options: {
-      jshintrc: '.jshintrc',
-      force: true
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // CLEAN (EMPTY DIRECTORY)
-  // --------------------------------------------------------------------------
-
-  'clean': {
-    dist: [
-      'dist'
-    ],
-    docs: [
-      'docs/javascripts/*formatter.js',
-      'docs/javascripts/*formatter.min.js',
-      'docs/index.md'
-    ]
-  },
-
-
-  // --------------------------------------------------------------------------
-  // REQUIREJS BUILD
-  // --------------------------------------------------------------------------
-
-  'requirejs': {
-    compile: {
-      options: {
-        name: 'formatter',
-        baseUrl: 'src',
-        out: 'dist/formatter.js',
-        optimize: 'none',
-        skipModuleInsertion: true,
-        onBuildWrite: function(name, path, contents) {
-          return require('amdclean').clean({
-            code: contents,
-            prefixMode: 'camelCase',
-            escodegen: {
-              format: {
-                indent: { style: '  ' }
-              }
-            }
-          });
-        }
-      }
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // UMD WRAP
-  // --------------------------------------------------------------------------
-
-  'umd': {
-    jquery: {
-      src: 'dist/formatter.js',
-      dest: 'dist/jquery.formatter.js',
-      template: 'src/tmpls/jquery.hbs',
-      deps: { 'default': ['jQuery'] }
-    },
-    umd: {
-      src: 'dist/formatter.js',
-      objectToExport: 'formatter',
-      globalAlias: 'Formatter',
-      template: 'src/tmpls/umd.hbs',
-      dest: 'dist/formatter.js'
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // ADD BANNER
-  // --------------------------------------------------------------------------
-
-  'concat': {
-    options: {
-      banner: '/*!\n' +
-        ' * v<%= pkg.version %>\n' +
-        ' * Copyright (c) 2014 First Opinion\n' +
-        ' * formatter.js is open sourced under the MIT license.\n' +
-        ' *\n' +
-        ' * thanks to digitalBush/jquery.maskedinput for some of the trickier\n' +
-        ' * keycode handling\n' +
-        ' */ \n\n',
-      stripBanners: true
-    },
-    umd: {
-      src: 'dist/formatter.js',
-      dest: 'dist/formatter.js'
-    },
-    jquery: {
-      src: 'dist/jquery.formatter.js',
-      dest: 'dist/jquery.formatter.js'
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // MINIFY JS
-  // --------------------------------------------------------------------------
-
-  'uglify': {
-    umd: {
-      src: 'dist/formatter.js',
-      dest: 'dist/formatter.min.js'
-    },
-    jquery: {
-      src: 'dist/jquery.formatter.js',
-      dest: 'dist/jquery.formatter.min.js'
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // CREATE COMMONJS VERSION IN DIST
-  // --------------------------------------------------------------------------
-
-  'nodefy': {
-    all: {
-      expand: true,
-      src: ['**/*.js'],
-      cwd: 'src/',
-      dest: 'dist/common'
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // COPY AMD TO DIST
-  // --------------------------------------------------------------------------
-
-  'copy': {
-    amd: {
-      expand: true,
-      src: ['**/*.js'],
-      cwd: 'src/',
-      dest: 'dist/amd'
-    },
-    javascripts: {
-      expand: true,
-      src: ['*.js'],
-      cwd: 'dist',
-      dest: 'docs/javascripts'
-    },
-    readme: {
-      src: 'README.md',
-      dest: 'docs/index.md'
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // WRAP
-  // --------------------------------------------------------------------------
-
-  'wrap': {
-    readme: {
-      src: ['docs/index.md'],
-      dest: 'docs/index.md',
-      options: {
-        wrapper: ['---\nlayout: master\n---\n{% raw %}', '{% endraw %}']
-      }
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // WATCH FILES
-  // --------------------------------------------------------------------------
-
-  'watch': {
-    options: { spawn: true },
-    build: {
-      files: ['Gruntfile.js'],
-      tasks: ['build', 'docs'],
-      options: { livereload: true }
-    },
-    src: {
-      files: ['src/**/*.js'],
-      tasks: ['build'],
-      options: { livereload: true }
-    },
-    docs: {
-      files: ['docs/**/*'],
-      tasks: ['jekyll'],
-      options: { livereload: true }
-    },
-    test: {
-      files: ['test/**/*'],
-      options: { livereload: true }
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // STATIC SERVER
-  // --------------------------------------------------------------------------
-
-  'connect': {
-    docs: {
-      options: { base: '_site', port: 9998 }
-    },
-    test: {
-      options: { base: '', port: 9999 }
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // BUILD AND SERVE JEKYLL DOCS
-  // --------------------------------------------------------------------------
-
-  'jekyll': {
-    all: {
-      options: {
-        src : 'docs',
-        dest: '_site'
-      }
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // PUSH DOCS LIVE
-  // --------------------------------------------------------------------------
-
-  'gh-pages': {
-    options: {
-      base: 'docs'
-    },
-    src: ['**']
-  },
-
-
-  // --------------------------------------------------------------------------
-  // TESTS
-  // --------------------------------------------------------------------------
-
-  'saucelabs-mocha': {
-    all: {
-      options: {
-        urls: ['http://127.0.0.1:9999/test/_runner.html'],
-        build: process.env.TRAVIS_JOB_ID || '<%= pkg.version %>',
-        tunnelTimeout: 5,
-        concurrency: 3,
-        browsers: browsers,
-        testname: 'formatter.js'
-      }
-    }
-  },
-
-
-  // --------------------------------------------------------------------------
-  // MOCHA
-  // --------------------------------------------------------------------------
-
-  'mocha_phantomjs': {
-    all: ['test/_runner.html']
-  }
-
-});
-
-
-// Tasks
-grunt.registerTask('default', ['build']);
-grunt.registerTask('dev', ['build', 'docs', 'connect', 'watch']);
-grunt.registerTask('test', ['build', 'mocha_phantomjs']);
-grunt.registerTask('test-cloud', ['build', 'connect:test', 'saucelabs-mocha']);
-grunt.registerTask('docs', ['clean:docs', 'copy:javascripts', 'copy:readme', 'wrap:readme', 'jekyll']);
-grunt.registerTask('build', ['jshint:src', 'clean:dist', 'requirejs', 'umd:jquery', 'umd:umd', 'concat:umd', 'concat:jquery', 'uglify:umd', 'uglify:jquery', 'nodefy', 'copy:amd']);
-
-
-};
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 364eac2..0000000
--- a/README.md
+++ /dev/null
@@ -1,144 +0,0 @@
-formatter.js [![Build Status](https://travis-ci.org/firstopinion/formatter.js.png)](https://travis-ci.org/firstopinion/formatter.js)
-============
-
-       ___                    __  __              _   
-      / _/__  ______ _  ___ _/ /_/ /____ ____    (_)__
-     / _/ _ \/ __/  ' \/ _ `/ __/ __/ -_) __/   / (_-<
-    /_/ \___/_/ /_/_/_/\_,_/\__/\__/\__/_/ (_)_/ /___/
-                                            |___/     
-                                            
-Format user input to match a specified pattern
-
-
-
-Demos/Examples
---------------
-
-[view demo](http://firstopinion.github.io/formatter.js/demos.html)
-
-
-
-Why?
-----
-
-Sometimes it is useful to format user input as they type. Existing libraries lacked proper functionality / flexibility. Formatter was built from the ground up with no dependencies. There is however a jquery wrapper version for quick use.
-
-
-
-On Bower
---------
-
-    bower install formatter
-
-
-
-Usage
------
-
-### Vanilla Javascript
-
-* **uncompressed**: formatter.js
-* **compressed**: formatter.min.js
-
-#### new Formatter(el, opts)
-
-    var formatted = new Formatter(document.getElementById('credit-input'), {
-      'pattern': '{{999}}-{{999}}-{{999}}-{{9999}}',
-      'persistent': true
-    });
-
-
-### Jquery
-
-* **uncompressed**: jquery.formatter.js
-* **compressed**: jquery.formatter.min.js
-
-#### $(selector).formatter(opts)
-
-    $('#credit-input').formatter({
-      'pattern': '{{999}}-{{999}}-{{999}}-{{9999}}',
-      'persistent': true
-    });
-
-
-
-Opts
-----
-
-* **pattern** (required): String representing the pattern of your formatted input. User input areas begin with `{{` and end with `}}`. For example, a phone number may be represented: `({{999}}) {{999}}-{{999}}`. You can specify numbers, letters, or numbers and letters.
-  * 9: [0-9]
-  * a: [A-Za-z]
-  * \*: [A-Za-z0-9] 
-* **persistent**: \[False\] Boolean representing if the formatted characters are always visible (persistent), or if they appear as you type.
-* **patterns** (optional, replaces *pattern*): Array representing a priority ordered set of patterns that may apply dynamically based on the current input value. Each value in the array is an object, whose key is a regular expression string and value is a *pattern* (see above). The regular expression is tested against the unformatted input value. You may use the special key `'*'` to catch all input values.
-```
-[
-  { '^\d{5}$': 'zip: {{99999}}' },
-  { '^.{6,8}$: 'postal code: {{********}}' },
-  { '*': 'unknown: {{**********}}' }
-]
-```
-
-
-
-Class Methods
--------------
-
-#### addInptType(char, regexp)
-
-Add regular expressions for different input types.
-
-**Vanilla Javascript**
-
-    Formatter.addInptType('L', /[A-Z]/);
-
-**Jquery**
-
-    $.fn.formatter.addInptType('L', /[A-Z]/);
-
-
-
-Instance Methods
-----------------
-
-#### resetPattern(pattern)
-
-Fairly self explanatory here :) reset the pattern on an existing Formatter instance.
-
-**Vanilla Javascript**
-
-(assuming you already created a new instance and saved it to the var `formatted`)
-
-    formatted.resetPattern('{{999}}.{{999}}.{{9999}}');
-
-**Jquery**
-
-(assuming you already initiated formatter on `#selector`)
-
-    $('#selector').formatter().resetPattern();
-
-
-
-Tests
------
-
-Install Dependencies:
-    
-    npm install
-
-Run Tests:
-    
-    npm test
-
-
-
-License
--------
-
-The MIT License (MIT) Copyright (c) 2013 First Opinion
-
-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/docs/_layouts/master.html b/_layouts/master.html
similarity index 100%
rename from docs/_layouts/master.html
rename to _layouts/master.html
diff --git a/bower.json b/bower.json
deleted file mode 100644
index d2dd241..0000000
--- a/bower.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "formatter.js",
-  "version": "0.1.5",
-  "devDependencies": {
-    "easy-amdtest": "~0.0.1",
-    "requirejs": "~2.1.11",
-    "jquery": "~1.11.0",
-    "fakey": "~0.0.8"
-  },
-  "ignore": [
-    "**/.*",
-    "Gruntfile.js",
-    "src",
-    "docs",
-    "test"
-  ],
-  "main": [
-    "dist/formatter.js",
-    "dist/formatter.min.js",
-    "dist/jquery.formatter.js",
-    "dist/jquery.formatter.min.js"
-  ]
-}
diff --git a/docs/demos.html b/demos.html
similarity index 100%
rename from docs/demos.html
rename to demos.html
diff --git a/dist/amd/formatter.js b/dist/amd/formatter.js
deleted file mode 100644
index c17e714..0000000
--- a/dist/amd/formatter.js
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * formatter.js
- *
- * Class used to format input based on passed pattern
- *
- */
-
-define([
-  'pattern-matcher',
-  'inpt-sel',
-  'utils'
-], function (patternMatcher, inptSel, utils) {
-
-
-// Defaults
-var defaults = {
-  persistent: false,
-  repeat: false,
-  placeholder: ' '
-};
-
-// Regexs for input validation
-var inptRegs = {
-  '9': /[0-9]/,
-  'a': /[A-Za-z]/,
-  '*': /[A-Za-z0-9]/
-};
-
-//
-// Class Constructor - Called with new Formatter(el, opts)
-// Responsible for setting up required instance variables, and
-// attaching the event listener to the element.
-//
-function Formatter(el, opts) {
-  // Cache this
-  var self = this;
-
-  // Make sure we have an element. Make accesible to instance
-  self.el = el;
-  if (!self.el) {
-    throw new TypeError('Must provide an existing element');
-  }
-
-  // Merge opts with defaults
-  self.opts = utils.extend({}, defaults, opts);
-
-  // 1 pattern is special case
-  if (typeof self.opts.pattern !== 'undefined') {
-    self.opts.patterns = self._specFromSinglePattern(self.opts.pattern);
-    delete self.opts.pattern;
-  }
-
-  // Make sure we have valid opts
-  if (typeof self.opts.patterns === 'undefined') {
-    throw new TypeError('Must provide a pattern or array of patterns');
-  }
-
-  self.patternMatcher = patternMatcher(self.opts.patterns);
-
-  // Upate pattern with initial value
-  self._updatePattern();
-
-  // Init values
-  self.hldrs = {};
-  self.focus = 0;
-
-  // Add Listeners
-  utils.addListener(self.el, 'keydown', function (evt) {
-    self._keyDown(evt);
-  });
-  utils.addListener(self.el, 'keypress', function (evt) {
-    self._keyPress(evt);
-  });
-  utils.addListener(self.el, 'paste', function (evt) {
-    self._paste(evt);
-  });
-
-  // Persistence
-  if (self.opts.persistent) {
-    // Format on start
-    self._processKey('', false);
-    self.el.blur();
-
-    // Add Listeners
-    utils.addListener(self.el, 'focus', function (evt) {
-      self._focus(evt);
-    });
-    utils.addListener(self.el, 'click', function (evt) {
-      self._focus(evt);
-    });
-    utils.addListener(self.el, 'touchstart', function (evt) {
-      self._focus(evt);
-    });
-  }
-}
-
-//
-// @public
-// Add new char
-//
-Formatter.addInptType = function (chr, reg) {
-  inptRegs[chr] = reg;
-};
-
-//
-// @public
-// Apply the given pattern to the current input without moving caret.
-//
-Formatter.prototype.resetPattern = function (str) {
-  // Update opts to hold new pattern
-  this.opts.patterns = str ? this._specFromSinglePattern(str) : this.opts.patterns;
-
-  // Get current state
-  this.sel = inptSel.get(this.el);
-  this.val = this.el.value;
-
-  // Init values
-  this.delta = 0;
-
-  // Remove all formatted chars from val
-  this._removeChars();
-
-  this.patternMatcher = patternMatcher(this.opts.patterns);
-
-  // Update pattern
-  var newPattern = this.patternMatcher.getPattern(this.val);
-  this.mLength   = newPattern.mLength;
-  this.chars     = newPattern.chars;
-  this.inpts     = newPattern.inpts;
-
-  // Format on start
-  this._processKey('', false, true);
-};
-
-//
-// @private
-// Determine correct format pattern based on input val
-//
-Formatter.prototype._updatePattern = function () {
-  // Determine appropriate pattern
-  var newPattern = this.patternMatcher.getPattern(this.val);
-
-  // Only update the pattern if there is an appropriate pattern for the value.
-  // Otherwise, leave the current pattern (and likely delete the latest character.)
-  if (newPattern) {
-    // Get info about the given pattern
-    this.mLength = newPattern.mLength;
-    this.chars   = newPattern.chars;
-    this.inpts   = newPattern.inpts;
-  }
-};
-
-//
-// @private
-// Handler called on all keyDown strokes. All keys trigger
-// this handler. Only process delete keys.
-//
-Formatter.prototype._keyDown = function (evt) {
-  // The first thing we need is the character code
-  var k = evt.which || evt.keyCode;
-
-  // If delete key
-  if (k && utils.isDelKeyDown(evt.which, evt.keyCode)) {
-    // Process the keyCode and prevent default
-    this._processKey(null, k);
-    return utils.preventDefault(evt);
-  }
-};
-
-//
-// @private
-// Handler called on all keyPress strokes. Only processes
-// character keys (as long as no modifier key is in use).
-//
-Formatter.prototype._keyPress = function (evt) {
-  // The first thing we need is the character code
-  var k, isSpecial;
-  // Mozilla will trigger on special keys and assign the the value 0
-  // We want to use that 0 rather than the keyCode it assigns.
-  k = evt.which || evt.keyCode;
-  isSpecial = utils.isSpecialKeyPress(evt.which, evt.keyCode);
-
-  // Process the keyCode and prevent default
-  if (!utils.isDelKeyPress(evt.which, evt.keyCode) && !isSpecial && !utils.isModifier(evt)) {
-    this._processKey(String.fromCharCode(k), false);
-    return utils.preventDefault(evt);
-  }
-};
-
-//
-// @private
-// Handler called on paste event.
-//
-Formatter.prototype._paste = function (evt) {
-  // Process the clipboard paste and prevent default
-  this._processKey(utils.getClip(evt), false);
-  return utils.preventDefault(evt);
-};
-
-//
-// @private
-// Handle called on focus event.
-//
-Formatter.prototype._focus = function () {
-  // Wrapped in timeout so that we can grab input selection
-  var self = this;
-  setTimeout(function () {
-    // Grab selection
-    var selection = inptSel.get(self.el);
-    // Char check
-    var isAfterStart = selection.end > self.focus,
-        isFirstChar  = selection.end === 0;
-    // If clicked in front of start, refocus to start
-    if (isAfterStart || isFirstChar) {
-      inptSel.set(self.el, self.focus);
-    }
-  }, 0);
-};
-
-//
-// @private
-// Using the provided key information, alter el value.
-//
-Formatter.prototype._processKey = function (chars, delKey, ignoreCaret) {
-  // Get current state
-  this.sel = inptSel.get(this.el);
-  this.val = this.el.value;
-
-  // Init values
-  this.delta = 0;
-
-  // If chars were highlighted, we need to remove them
-  if (this.sel.begin !== this.sel.end) {
-    this.delta = (-1) * Math.abs(this.sel.begin - this.sel.end);
-    this.val   = utils.removeChars(this.val, this.sel.begin, this.sel.end);
-  }
-
-  // Delete key (moves opposite direction)
-  else if (delKey && delKey === 46) {
-    this._delete();
-
-  // or Backspace and not at start
-  } else if (delKey && this.sel.begin - 1 >= 0) {
-
-    // Always have a delta of at least -1 for the character being deleted.
-    this.val = utils.removeChars(this.val, this.sel.end -1, this.sel.end);
-    this.delta -= 1;
-
-  // or Backspace and at start - exit
-  } else if (delKey) {
-    return true;
-  }
-
-  // If the key is not a del key, it should convert to a str
-  if (!delKey) {
-    // Add char at position and increment delta
-    this.val = utils.addChars(this.val, chars, this.sel.begin);
-    this.delta += chars.length;
-  }
-
-  // Format el.value (also handles updating caret position)
-  this._formatValue(ignoreCaret);
-};
-
-//
-// @private
-// Deletes the character in front of it
-//
-Formatter.prototype._delete = function () {
-  // Adjust focus to make sure its not on a formatted char
-  while (this.chars[this.sel.begin]) {
-    this._nextPos();
-  }
-
-  // As long as we are not at the end
-  if (this.sel.begin < this.val.length) {
-    // We will simulate a delete by moving the caret to the next char
-    // and then deleting
-    this._nextPos();
-    this.val = utils.removeChars(this.val, this.sel.end -1, this.sel.end);
-    this.delta = -1;
-  }
-};
-
-//
-// @private
-// Quick helper method to move the caret to the next pos
-//
-Formatter.prototype._nextPos = function () {
-  this.sel.end ++;
-  this.sel.begin ++;
-};
-
-//
-// @private
-// Alter element value to display characters matching the provided
-// instance pattern. Also responsible for updating
-//
-Formatter.prototype._formatValue = function (ignoreCaret) {
-  // Set caret pos
-  this.newPos = this.sel.end + this.delta;
-
-  // Remove all formatted chars from val
-  this._removeChars();
-
-  // Switch to first matching pattern based on val
-  this._updatePattern();
-
-  // Validate inputs
-  this._validateInpts();
-
-  // Add formatted characters
-  this._addChars();
-
-  // Set value and adhere to maxLength
-  this.el.value = this.val.substr(0, this.mLength);
-
-  // Set new caret position
-  if ((typeof ignoreCaret) === 'undefined' || ignoreCaret === false) {
-    inptSel.set(this.el, this.newPos);
-  }
-};
-
-//
-// @private
-// Remove all formatted before and after a specified pos
-//
-Formatter.prototype._removeChars = function () {
-  // Delta shouldn't include placeholders
-  if (this.sel.end > this.focus) {
-    this.delta += this.sel.end - this.focus;
-  }
-  
-  // Account for shifts during removal
-  var shift = 0;
-
-  // Loop through all possible char positions
-  for (var i = 0; i <= this.mLength; i++) {
-    // Get transformed position
-    var curChar = this.chars[i],
-        curHldr = this.hldrs[i],
-        pos = i + shift,
-        val;
-
-    // If after selection we need to account for delta
-    pos = (i >= this.sel.begin) ? pos + this.delta : pos;
-    val = this.val.charAt(pos);
-    // Remove char and account for shift
-    if (curChar && curChar === val || curHldr && curHldr === val) {
-      this.val = utils.removeChars(this.val, pos, pos + 1);
-      shift--;
-    }
-  }
-
-  // All hldrs should be removed now
-  this.hldrs = {};
-
-  // Set focus to last character
-  this.focus = this.val.length;
-};
-
-//
-// @private
-// Make sure all inpts are valid, else remove and update delta
-//
-Formatter.prototype._validateInpts = function () {
-  // Loop over each char and validate
-  for (var i = 0; i < this.val.length; i++) {
-    // Get char inpt type
-    var inptType = this.inpts[i];
-
-    // Checks
-    var isBadType = !inptRegs[inptType],
-        isInvalid = !isBadType && !inptRegs[inptType].test(this.val.charAt(i)),
-        inBounds  = this.inpts[i];
-
-    // Remove if incorrect and inbounds
-    if ((isBadType || isInvalid) && inBounds) {
-      this.val = utils.removeChars(this.val, i, i + 1);
-      this.focusStart--;
-      this.newPos--;
-      this.delta--;
-      i--;
-    }
-  }
-};
-
-//
-// @private
-// Loop over val and add formatted chars as necessary
-//
-Formatter.prototype._addChars = function () {
-  if (this.opts.persistent) {
-    // Loop over all possible characters
-    for (var i = 0; i <= this.mLength; i++) {
-      if (!this.val.charAt(i)) {
-        // Add placeholder at pos
-        this.val = utils.addChars(this.val, this.opts.placeholder, i);
-        this.hldrs[i] = this.opts.placeholder;
-      }
-      this._addChar(i);
-    }
-
-    // Adjust focus to make sure its not on a formatted char
-    while (this.chars[this.focus]) {
-      this.focus++;
-    }
-  } else {
-    // Avoid caching val.length, as they may change in _addChar.
-    for (var j = 0; j <= this.val.length; j++) {
-      // When moving backwards there are some race conditions where we
-      // dont want to add the character
-      if (this.delta <= 0 && (j === this.focus)) { return true; }
-
-      // Place character in current position of the formatted string.
-      this._addChar(j);
-    }
-  }
-};
-
-//
-// @private
-// Add formattted char at position
-//
-Formatter.prototype._addChar = function (i) {
-  // If char exists at position
-  var chr = this.chars[i];
-  if (!chr) { return true; }
-
-  // If chars are added in between the old pos and new pos
-  // we need to increment pos and delta
-  if (utils.isBetween(i, [this.sel.begin -1, this.newPos +1])) {
-    this.newPos ++;
-    this.delta ++;
-  }
-
-  // If character added before focus, incr
-  if (i <= this.focus) {
-    this.focus++;
-  }
-
-  // Updateholder
-  if (this.hldrs[i]) {
-    delete this.hldrs[i];
-    this.hldrs[i + 1] = this.opts.placeholder;
-  }
-
-  // Update value
-  this.val = utils.addChars(this.val, chr, i);
-};
-
-//
-// @private
-// Create a patternSpec for passing into patternMatcher that
-// has exactly one catch all pattern.
-//
-Formatter.prototype._specFromSinglePattern = function (patternStr) {
-  return [{ '*': patternStr }];
-};
-
-
-// Expose
-return Formatter;
-
-
-});
\ No newline at end of file
diff --git a/dist/amd/inpt-sel.js b/dist/amd/inpt-sel.js
deleted file mode 100644
index 9f1f771..0000000
--- a/dist/amd/inpt-sel.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * inpt-sel.js
- *
- * Cross browser implementation to get and set input selections
- *
- */
-
-
-define(function () {
-
-
-// Define module
-var inptSel = {};
-
-//
-// Get begin and end positions of selected input. Return 0's
-// if there is no selectiion data
-//
-inptSel.get = function (el) {
-  // If normal browser return with result
-  if (typeof el.selectionStart === 'number') {
-    return { 
-      begin: el.selectionStart,
-      end: el.selectionEnd
-    };
-  }
-
-  // Uh-Oh. We must be IE. Fun with TextRange!!
-  var range = document.selection.createRange();
-  // Determine if there is a selection
-  if (range && range.parentElement() === el) {
-    var inputRange = el.createTextRange(),
-        endRange   = el.createTextRange(),
-        length     = el.value.length;
-
-    // Create a working TextRange for the input selection
-    inputRange.moveToBookmark(range.getBookmark());
-
-    // Move endRange begin pos to end pos (hence endRange)
-    endRange.collapse(false);
-    
-    // If we are at the very end of the input, begin and end
-    // must both be the length of the el.value
-    if (inputRange.compareEndPoints('StartToEnd', endRange) > -1) {
-      return { begin: length, end: length };
-    }
-
-    // Note: moveStart usually returns the units moved, which 
-    // one may think is -length, however, it will stop when it
-    // gets to the begin of the range, thus giving us the
-    // negative value of the pos.
-    return {
-      begin: -inputRange.moveStart('character', -length),
-      end: -inputRange.moveEnd('character', -length)
-    };
-  }
-
-  //Return 0's on no selection data
-  return { begin: 0, end: 0 };
-};
-
-//
-// Set the caret position at a specified location
-//
-inptSel.set = function (el, pos) {
-  // Normalize pos
-  if (typeof pos !== 'object') {
-    pos = { begin: pos, end: pos };
-  }
-
-  // If normal browser
-  if (el.setSelectionRange) {
-    el.focus();
-    el.setSelectionRange(pos.begin, pos.end);
-
-  // IE = TextRange fun
-  } else if (el.createTextRange) {
-    var range = el.createTextRange();
-    range.collapse(true);
-    range.moveEnd('character', pos.end);
-    range.moveStart('character', pos.begin);
-    range.select();
-  }
-};
-
-
-// Expose
-return inptSel;
-
-
-});
\ No newline at end of file
diff --git a/dist/amd/pattern-matcher.js b/dist/amd/pattern-matcher.js
deleted file mode 100644
index 780726b..0000000
--- a/dist/amd/pattern-matcher.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-* pattern-matcher.js
-*
-* Parses a pattern specification and determines appropriate pattern for an
-* input string
-*
-*/
-
-
-define([
-  'pattern',
-  'utils'
-], function (pattern, utils) {
-
-
-//
-// Parse a matcher string into a RegExp. Accepts valid regular
-// expressions and the catchall '*'.
-// @private
-//
-var parseMatcher = function (matcher) {
-  if (matcher === '*') {
-    return /.*/;
-  }
-  return new RegExp(matcher);
-};
-
-//
-// Parse a pattern spec and return a function that returns a pattern
-// based on user input. The first matching pattern will be chosen.
-// Pattern spec format:
-// Array [
-//  Object: { Matcher(RegExp String) : Pattern(Pattern String) },
-//  ...
-// ]
-function patternMatcher (patternSpec) {
-  var matchers = [],
-    patterns = [];
-
-  // Iterate over each pattern in order.
-  utils.forEach(patternSpec, function (patternMatcher) {
-    // Process single property object to obtain pattern and matcher.
-    utils.forEach(patternMatcher, function (patternStr, matcherStr) {
-      var parsedPattern = pattern.parse(patternStr),
-        regExpMatcher = parseMatcher(matcherStr);
-
-      matchers.push(regExpMatcher);
-      patterns.push(parsedPattern);
-
-      // Stop after one iteration.
-      return false;
-    });
-  });
-
-  var getPattern = function (input) {
-    var matchedIndex;
-    utils.forEach(matchers, function (matcher, index) {
-      if (matcher.test(input)) {
-        matchedIndex = index;
-        return false;
-      }
-    });
-
-    return matchedIndex === undefined ? null : patterns[matchedIndex];
-  };
-
-  return {
-    getPattern: getPattern,
-    patterns: patterns,
-    matchers: matchers
-  };
-}
-
-
-// Expose
-return patternMatcher;
-
-
-});
\ No newline at end of file
diff --git a/dist/amd/pattern.js b/dist/amd/pattern.js
deleted file mode 100644
index 4d61efa..0000000
--- a/dist/amd/pattern.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * pattern.js
- *
- * Utilities to parse str pattern and return info
- *
- */
-
-
-define(function () {
-
-
-// Define module
-var pattern = {};
-
-// Match information
-var DELIM_SIZE = 4;
-
-// Our regex used to parse
-var regexp  = new RegExp('{{([^}]+)}}', 'g');
-
-//
-// Helper method to parse pattern str
-//
-var getMatches = function (pattern) {
-  // Populate array of matches
-  var matches = [],
-      match;
-  while(match = regexp.exec(pattern)) {
-    matches.push(match);
-  }
-
-  return matches;
-};
-
-//
-// Create an object holding all formatted characters
-// with corresponding positions
-//
-pattern.parse = function (pattern) {
-  // Our obj to populate
-  var info = { inpts: {}, chars: {} };
-
-  // Pattern information
-  var matches = getMatches(pattern),
-      pLength = pattern.length;
-
-  // Counters
-  var mCount = 0,
-      iCount = 0,
-      i = 0;
-
-  // Add inpts, move to end of match, and process
-  var processMatch = function (val) {
-    var valLength = val.length;
-    for (var j = 0; j < valLength; j++) {
-      info.inpts[iCount] = val.charAt(j);
-      iCount++;
-    }
-    mCount ++;
-    i += (val.length + DELIM_SIZE - 1);
-  };
-
-  // Process match or add chars
-  for (i; i < pLength; i++) {
-    if (mCount < matches.length && i === matches[mCount].index) {
-      processMatch(matches[mCount][1]);
-    } else {
-      info.chars[i - (mCount * DELIM_SIZE)] = pattern.charAt(i);
-    }
-  }
-
-  // Set mLength and return
-  info.mLength = i - (mCount * DELIM_SIZE);
-  return info;
-};
-
-
-// Expose
-return pattern;
-
-
-});
\ No newline at end of file
diff --git a/dist/amd/utils.js b/dist/amd/utils.js
deleted file mode 100644
index cfe9ddc..0000000
--- a/dist/amd/utils.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * utils.js
- *
- * Independent helper methods (cross browser, etc..)
- *
- */
-
-
-define(function () {
-
-
-// Define module
-var utils = {};
-
-// Useragent info for keycode handling
-var uAgent = (typeof navigator !== 'undefined') ? navigator.userAgent : null;
-
-//
-// Shallow copy properties from n objects to destObj
-//
-utils.extend = function (destObj) {
-  for (var i = 1; i < arguments.length; i++) {
-    for (var key in arguments[i]) {
-      destObj[key] = arguments[i][key];
-    }
-  }
-  return destObj;
-};
-
-//
-// Add a given character to a string at a defined pos
-//
-utils.addChars = function (str, chars, pos) {
-  return str.substr(0, pos) + chars + str.substr(pos, str.length);
-};
-
-//
-// Remove a span of characters
-//
-utils.removeChars = function (str, start, end) {
-  return str.substr(0, start) + str.substr(end, str.length);
-};
-
-//
-// Return true/false is num false between bounds
-//
-utils.isBetween = function (num, bounds) {
-  bounds.sort(function(a,b) { return a-b; });
-  return (num > bounds[0] && num < bounds[1]);
-};
-
-//
-// Helper method for cross browser event listeners
-//
-utils.addListener = function (el, evt, handler) {
-  return (typeof el.addEventListener !== 'undefined')
-    ? el.addEventListener(evt, handler, false)
-    : el.attachEvent('on' + evt, handler);
-};
-
-//
-// Helper method for cross browser implementation of preventDefault
-//
-utils.preventDefault = function (evt) {
-  return (evt.preventDefault) ? evt.preventDefault() : (evt.returnValue = false);
-};
-
-//
-// Helper method for cross browser implementation for grabbing
-// clipboard data
-//
-utils.getClip = function (evt) {
-  if (evt.clipboardData) { return evt.clipboardData.getData('Text'); }
-  if (window.clipboardData) { return window.clipboardData.getData('Text'); }
-};
-
-//
-// Loop over object and checking for matching properties
-//
-utils.getMatchingKey = function (which, keyCode, keys) {
-  // Loop over and return if matched.
-  for (var k in keys) {
-    var key = keys[k];
-    if (which === key.which && keyCode === key.keyCode) {
-      return k;
-    }
-  }
-};
-
-//
-// Returns true/false if k is a del keyDown
-//
-utils.isDelKeyDown = function (which, keyCode) {
-  var keys = {
-    'backspace': { 'which': 8, 'keyCode': 8 },
-    'delete': { 'which': 46, 'keyCode': 46 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-//
-// Returns true/false if k is a del keyPress
-//
-utils.isDelKeyPress = function (which, keyCode) {
-  var keys = {
-    'backspace': { 'which': 8, 'keyCode': 8, 'shiftKey': false },
-    'delete': { 'which': 0, 'keyCode': 46 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-// //
-// // Determine if keydown relates to specialKey
-// //
-// utils.isSpecialKeyDown = function (which, keyCode) {
-//   var keys = {
-//     'tab': { 'which': 9, 'keyCode': 9 },
-//     'enter': { 'which': 13, 'keyCode': 13 },
-//     'end': { 'which': 35, 'keyCode': 35 },
-//     'home': { 'which': 36, 'keyCode': 36 },
-//     'leftarrow': { 'which': 37, 'keyCode': 37 },
-//     'uparrow': { 'which': 38, 'keyCode': 38 },
-//     'rightarrow': { 'which': 39, 'keyCode': 39 },
-//     'downarrow': { 'which': 40, 'keyCode': 40 },
-//     'F5': { 'which': 116, 'keyCode': 116 }
-//   };
-
-//   return utils.getMatchingKey(which, keyCode, keys);
-// };
-
-//
-// Determine if keypress relates to specialKey
-//
-utils.isSpecialKeyPress = function (which, keyCode) {
-  var keys = {
-    'tab': { 'which': 0, 'keyCode': 9 },
-    'enter': { 'which': 13, 'keyCode': 13 },
-    'end': { 'which': 0, 'keyCode': 35 },
-    'home': { 'which': 0, 'keyCode': 36 },
-    'leftarrow': { 'which': 0, 'keyCode': 37 },
-    'uparrow': { 'which': 0, 'keyCode': 38 },
-    'rightarrow': { 'which': 0, 'keyCode': 39 },
-    'downarrow': { 'which': 0, 'keyCode': 40 },
-    'F5': { 'which': 116, 'keyCode': 116 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-//
-// Returns true/false if modifier key is held down
-//
-utils.isModifier = function (evt) {
-  return evt.ctrlKey || evt.altKey || evt.metaKey;
-};
-
-//
-// Iterates over each property of object or array.
-//
-utils.forEach = function (collection, callback, thisArg) {
-  if (collection.hasOwnProperty('length')) {
-    for (var index = 0, len = collection.length; index < len; index++) {
-      if (callback.call(thisArg, collection[index], index, collection) === false) {
-        break;
-      }
-    }
-  } else {
-    for (var key in collection) {
-      if (collection.hasOwnProperty(key)) {
-        if (callback.call(thisArg, collection[key], key, collection) === false) {
-          break;
-        }
-      }
-    }
-  }
-};
-
-
-// Expose
-return utils;
-
-
-});
\ No newline at end of file
diff --git a/dist/common/formatter.js b/dist/common/formatter.js
deleted file mode 100644
index f8c1ac6..0000000
--- a/dist/common/formatter.js
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * formatter.js
- *
- * Class used to format input based on passed pattern
- *
- */
-
-var patternMatcher = require('pattern-matcher');
-var inptSel = require('inpt-sel');
-var utils = require('utils');
-
-
-// Defaults
-var defaults = {
-  persistent: false,
-  repeat: false,
-  placeholder: ' '
-};
-
-// Regexs for input validation
-var inptRegs = {
-  '9': /[0-9]/,
-  'a': /[A-Za-z]/,
-  '*': /[A-Za-z0-9]/
-};
-
-//
-// Class Constructor - Called with new Formatter(el, opts)
-// Responsible for setting up required instance variables, and
-// attaching the event listener to the element.
-//
-function Formatter(el, opts) {
-  // Cache this
-  var self = this;
-
-  // Make sure we have an element. Make accesible to instance
-  self.el = el;
-  if (!self.el) {
-    throw new TypeError('Must provide an existing element');
-  }
-
-  // Merge opts with defaults
-  self.opts = utils.extend({}, defaults, opts);
-
-  // 1 pattern is special case
-  if (typeof self.opts.pattern !== 'undefined') {
-    self.opts.patterns = self._specFromSinglePattern(self.opts.pattern);
-    delete self.opts.pattern;
-  }
-
-  // Make sure we have valid opts
-  if (typeof self.opts.patterns === 'undefined') {
-    throw new TypeError('Must provide a pattern or array of patterns');
-  }
-
-  self.patternMatcher = patternMatcher(self.opts.patterns);
-
-  // Upate pattern with initial value
-  self._updatePattern();
-
-  // Init values
-  self.hldrs = {};
-  self.focus = 0;
-
-  // Add Listeners
-  utils.addListener(self.el, 'keydown', function (evt) {
-    self._keyDown(evt);
-  });
-  utils.addListener(self.el, 'keypress', function (evt) {
-    self._keyPress(evt);
-  });
-  utils.addListener(self.el, 'paste', function (evt) {
-    self._paste(evt);
-  });
-
-  // Persistence
-  if (self.opts.persistent) {
-    // Format on start
-    self._processKey('', false);
-    self.el.blur();
-
-    // Add Listeners
-    utils.addListener(self.el, 'focus', function (evt) {
-      self._focus(evt);
-    });
-    utils.addListener(self.el, 'click', function (evt) {
-      self._focus(evt);
-    });
-    utils.addListener(self.el, 'touchstart', function (evt) {
-      self._focus(evt);
-    });
-  }
-}
-
-//
-// @public
-// Add new char
-//
-Formatter.addInptType = function (chr, reg) {
-  inptRegs[chr] = reg;
-};
-
-//
-// @public
-// Apply the given pattern to the current input without moving caret.
-//
-Formatter.prototype.resetPattern = function (str) {
-  // Update opts to hold new pattern
-  this.opts.patterns = str ? this._specFromSinglePattern(str) : this.opts.patterns;
-
-  // Get current state
-  this.sel = inptSel.get(this.el);
-  this.val = this.el.value;
-
-  // Init values
-  this.delta = 0;
-
-  // Remove all formatted chars from val
-  this._removeChars();
-
-  this.patternMatcher = patternMatcher(this.opts.patterns);
-
-  // Update pattern
-  var newPattern = this.patternMatcher.getPattern(this.val);
-  this.mLength   = newPattern.mLength;
-  this.chars     = newPattern.chars;
-  this.inpts     = newPattern.inpts;
-
-  // Format on start
-  this._processKey('', false, true);
-};
-
-//
-// @private
-// Determine correct format pattern based on input val
-//
-Formatter.prototype._updatePattern = function () {
-  // Determine appropriate pattern
-  var newPattern = this.patternMatcher.getPattern(this.val);
-
-  // Only update the pattern if there is an appropriate pattern for the value.
-  // Otherwise, leave the current pattern (and likely delete the latest character.)
-  if (newPattern) {
-    // Get info about the given pattern
-    this.mLength = newPattern.mLength;
-    this.chars   = newPattern.chars;
-    this.inpts   = newPattern.inpts;
-  }
-};
-
-//
-// @private
-// Handler called on all keyDown strokes. All keys trigger
-// this handler. Only process delete keys.
-//
-Formatter.prototype._keyDown = function (evt) {
-  // The first thing we need is the character code
-  var k = evt.which || evt.keyCode;
-
-  // If delete key
-  if (k && utils.isDelKeyDown(evt.which, evt.keyCode)) {
-    // Process the keyCode and prevent default
-    this._processKey(null, k);
-    return utils.preventDefault(evt);
-  }
-};
-
-//
-// @private
-// Handler called on all keyPress strokes. Only processes
-// character keys (as long as no modifier key is in use).
-//
-Formatter.prototype._keyPress = function (evt) {
-  // The first thing we need is the character code
-  var k, isSpecial;
-  // Mozilla will trigger on special keys and assign the the value 0
-  // We want to use that 0 rather than the keyCode it assigns.
-  k = evt.which || evt.keyCode;
-  isSpecial = utils.isSpecialKeyPress(evt.which, evt.keyCode);
-
-  // Process the keyCode and prevent default
-  if (!utils.isDelKeyPress(evt.which, evt.keyCode) && !isSpecial && !utils.isModifier(evt)) {
-    this._processKey(String.fromCharCode(k), false);
-    return utils.preventDefault(evt);
-  }
-};
-
-//
-// @private
-// Handler called on paste event.
-//
-Formatter.prototype._paste = function (evt) {
-  // Process the clipboard paste and prevent default
-  this._processKey(utils.getClip(evt), false);
-  return utils.preventDefault(evt);
-};
-
-//
-// @private
-// Handle called on focus event.
-//
-Formatter.prototype._focus = function () {
-  // Wrapped in timeout so that we can grab input selection
-  var self = this;
-  setTimeout(function () {
-    // Grab selection
-    var selection = inptSel.get(self.el);
-    // Char check
-    var isAfterStart = selection.end > self.focus,
-        isFirstChar  = selection.end === 0;
-    // If clicked in front of start, refocus to start
-    if (isAfterStart || isFirstChar) {
-      inptSel.set(self.el, self.focus);
-    }
-  }, 0);
-};
-
-//
-// @private
-// Using the provided key information, alter el value.
-//
-Formatter.prototype._processKey = function (chars, delKey, ignoreCaret) {
-  // Get current state
-  this.sel = inptSel.get(this.el);
-  this.val = this.el.value;
-
-  // Init values
-  this.delta = 0;
-
-  // If chars were highlighted, we need to remove them
-  if (this.sel.begin !== this.sel.end) {
-    this.delta = (-1) * Math.abs(this.sel.begin - this.sel.end);
-    this.val   = utils.removeChars(this.val, this.sel.begin, this.sel.end);
-  }
-
-  // Delete key (moves opposite direction)
-  else if (delKey && delKey === 46) {
-    this._delete();
-
-  // or Backspace and not at start
-  } else if (delKey && this.sel.begin - 1 >= 0) {
-
-    // Always have a delta of at least -1 for the character being deleted.
-    this.val = utils.removeChars(this.val, this.sel.end -1, this.sel.end);
-    this.delta -= 1;
-
-  // or Backspace and at start - exit
-  } else if (delKey) {
-    return true;
-  }
-
-  // If the key is not a del key, it should convert to a str
-  if (!delKey) {
-    // Add char at position and increment delta
-    this.val = utils.addChars(this.val, chars, this.sel.begin);
-    this.delta += chars.length;
-  }
-
-  // Format el.value (also handles updating caret position)
-  this._formatValue(ignoreCaret);
-};
-
-//
-// @private
-// Deletes the character in front of it
-//
-Formatter.prototype._delete = function () {
-  // Adjust focus to make sure its not on a formatted char
-  while (this.chars[this.sel.begin]) {
-    this._nextPos();
-  }
-
-  // As long as we are not at the end
-  if (this.sel.begin < this.val.length) {
-    // We will simulate a delete by moving the caret to the next char
-    // and then deleting
-    this._nextPos();
-    this.val = utils.removeChars(this.val, this.sel.end -1, this.sel.end);
-    this.delta = -1;
-  }
-};
-
-//
-// @private
-// Quick helper method to move the caret to the next pos
-//
-Formatter.prototype._nextPos = function () {
-  this.sel.end ++;
-  this.sel.begin ++;
-};
-
-//
-// @private
-// Alter element value to display characters matching the provided
-// instance pattern. Also responsible for updating
-//
-Formatter.prototype._formatValue = function (ignoreCaret) {
-  // Set caret pos
-  this.newPos = this.sel.end + this.delta;
-
-  // Remove all formatted chars from val
-  this._removeChars();
-
-  // Switch to first matching pattern based on val
-  this._updatePattern();
-
-  // Validate inputs
-  this._validateInpts();
-
-  // Add formatted characters
-  this._addChars();
-
-  // Set value and adhere to maxLength
-  this.el.value = this.val.substr(0, this.mLength);
-
-  // Set new caret position
-  if ((typeof ignoreCaret) === 'undefined' || ignoreCaret === false) {
-    inptSel.set(this.el, this.newPos);
-  }
-};
-
-//
-// @private
-// Remove all formatted before and after a specified pos
-//
-Formatter.prototype._removeChars = function () {
-  // Delta shouldn't include placeholders
-  if (this.sel.end > this.focus) {
-    this.delta += this.sel.end - this.focus;
-  }
-  
-  // Account for shifts during removal
-  var shift = 0;
-
-  // Loop through all possible char positions
-  for (var i = 0; i <= this.mLength; i++) {
-    // Get transformed position
-    var curChar = this.chars[i],
-        curHldr = this.hldrs[i],
-        pos = i + shift,
-        val;
-
-    // If after selection we need to account for delta
-    pos = (i >= this.sel.begin) ? pos + this.delta : pos;
-    val = this.val.charAt(pos);
-    // Remove char and account for shift
-    if (curChar && curChar === val || curHldr && curHldr === val) {
-      this.val = utils.removeChars(this.val, pos, pos + 1);
-      shift--;
-    }
-  }
-
-  // All hldrs should be removed now
-  this.hldrs = {};
-
-  // Set focus to last character
-  this.focus = this.val.length;
-};
-
-//
-// @private
-// Make sure all inpts are valid, else remove and update delta
-//
-Formatter.prototype._validateInpts = function () {
-  // Loop over each char and validate
-  for (var i = 0; i < this.val.length; i++) {
-    // Get char inpt type
-    var inptType = this.inpts[i];
-
-    // Checks
-    var isBadType = !inptRegs[inptType],
-        isInvalid = !isBadType && !inptRegs[inptType].test(this.val.charAt(i)),
-        inBounds  = this.inpts[i];
-
-    // Remove if incorrect and inbounds
-    if ((isBadType || isInvalid) && inBounds) {
-      this.val = utils.removeChars(this.val, i, i + 1);
-      this.focusStart--;
-      this.newPos--;
-      this.delta--;
-      i--;
-    }
-  }
-};
-
-//
-// @private
-// Loop over val and add formatted chars as necessary
-//
-Formatter.prototype._addChars = function () {
-  if (this.opts.persistent) {
-    // Loop over all possible characters
-    for (var i = 0; i <= this.mLength; i++) {
-      if (!this.val.charAt(i)) {
-        // Add placeholder at pos
-        this.val = utils.addChars(this.val, this.opts.placeholder, i);
-        this.hldrs[i] = this.opts.placeholder;
-      }
-      this._addChar(i);
-    }
-
-    // Adjust focus to make sure its not on a formatted char
-    while (this.chars[this.focus]) {
-      this.focus++;
-    }
-  } else {
-    // Avoid caching val.length, as they may change in _addChar.
-    for (var j = 0; j <= this.val.length; j++) {
-      // When moving backwards there are some race conditions where we
-      // dont want to add the character
-      if (this.delta <= 0 && (j === this.focus)) { return true; }
-
-      // Place character in current position of the formatted string.
-      this._addChar(j);
-    }
-  }
-};
-
-//
-// @private
-// Add formattted char at position
-//
-Formatter.prototype._addChar = function (i) {
-  // If char exists at position
-  var chr = this.chars[i];
-  if (!chr) { return true; }
-
-  // If chars are added in between the old pos and new pos
-  // we need to increment pos and delta
-  if (utils.isBetween(i, [this.sel.begin -1, this.newPos +1])) {
-    this.newPos ++;
-    this.delta ++;
-  }
-
-  // If character added before focus, incr
-  if (i <= this.focus) {
-    this.focus++;
-  }
-
-  // Updateholder
-  if (this.hldrs[i]) {
-    delete this.hldrs[i];
-    this.hldrs[i + 1] = this.opts.placeholder;
-  }
-
-  // Update value
-  this.val = utils.addChars(this.val, chr, i);
-};
-
-//
-// @private
-// Create a patternSpec for passing into patternMatcher that
-// has exactly one catch all pattern.
-//
-Formatter.prototype._specFromSinglePattern = function (patternStr) {
-  return [{ '*': patternStr }];
-};
-
-
-// Expose
-module.exports = Formatter;
-
-
diff --git a/dist/common/inpt-sel.js b/dist/common/inpt-sel.js
deleted file mode 100644
index 3f11c3e..0000000
--- a/dist/common/inpt-sel.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * inpt-sel.js
- *
- * Cross browser implementation to get and set input selections
- *
- */
-
-
-
-
-
-// Define module
-var inptSel = {};
-
-//
-// Get begin and end positions of selected input. Return 0's
-// if there is no selectiion data
-//
-inptSel.get = function (el) {
-  // If normal browser return with result
-  if (typeof el.selectionStart === 'number') {
-    return { 
-      begin: el.selectionStart,
-      end: el.selectionEnd
-    };
-  }
-
-  // Uh-Oh. We must be IE. Fun with TextRange!!
-  var range = document.selection.createRange();
-  // Determine if there is a selection
-  if (range && range.parentElement() === el) {
-    var inputRange = el.createTextRange(),
-        endRange   = el.createTextRange(),
-        length     = el.value.length;
-
-    // Create a working TextRange for the input selection
-    inputRange.moveToBookmark(range.getBookmark());
-
-    // Move endRange begin pos to end pos (hence endRange)
-    endRange.collapse(false);
-    
-    // If we are at the very end of the input, begin and end
-    // must both be the length of the el.value
-    if (inputRange.compareEndPoints('StartToEnd', endRange) > -1) {
-      return { begin: length, end: length };
-    }
-
-    // Note: moveStart usually returns the units moved, which 
-    // one may think is -length, however, it will stop when it
-    // gets to the begin of the range, thus giving us the
-    // negative value of the pos.
-    return {
-      begin: -inputRange.moveStart('character', -length),
-      end: -inputRange.moveEnd('character', -length)
-    };
-  }
-
-  //Return 0's on no selection data
-  return { begin: 0, end: 0 };
-};
-
-//
-// Set the caret position at a specified location
-//
-inptSel.set = function (el, pos) {
-  // Normalize pos
-  if (typeof pos !== 'object') {
-    pos = { begin: pos, end: pos };
-  }
-
-  // If normal browser
-  if (el.setSelectionRange) {
-    el.focus();
-    el.setSelectionRange(pos.begin, pos.end);
-
-  // IE = TextRange fun
-  } else if (el.createTextRange) {
-    var range = el.createTextRange();
-    range.collapse(true);
-    range.moveEnd('character', pos.end);
-    range.moveStart('character', pos.begin);
-    range.select();
-  }
-};
-
-
-// Expose
-module.exports = inptSel;
-
-
diff --git a/dist/common/pattern-matcher.js b/dist/common/pattern-matcher.js
deleted file mode 100644
index cdbae78..0000000
--- a/dist/common/pattern-matcher.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
-* pattern-matcher.js
-*
-* Parses a pattern specification and determines appropriate pattern for an
-* input string
-*
-*/
-
-
-var pattern = require('pattern');
-var utils = require('utils');
-
-
-//
-// Parse a matcher string into a RegExp. Accepts valid regular
-// expressions and the catchall '*'.
-// @private
-//
-var parseMatcher = function (matcher) {
-  if (matcher === '*') {
-    return /.*/;
-  }
-  return new RegExp(matcher);
-};
-
-//
-// Parse a pattern spec and return a function that returns a pattern
-// based on user input. The first matching pattern will be chosen.
-// Pattern spec format:
-// Array [
-//  Object: { Matcher(RegExp String) : Pattern(Pattern String) },
-//  ...
-// ]
-function patternMatcher (patternSpec) {
-  var matchers = [],
-    patterns = [];
-
-  // Iterate over each pattern in order.
-  utils.forEach(patternSpec, function (patternMatcher) {
-    // Process single property object to obtain pattern and matcher.
-    utils.forEach(patternMatcher, function (patternStr, matcherStr) {
-      var parsedPattern = pattern.parse(patternStr),
-        regExpMatcher = parseMatcher(matcherStr);
-
-      matchers.push(regExpMatcher);
-      patterns.push(parsedPattern);
-
-      // Stop after one iteration.
-      return false;
-    });
-  });
-
-  var getPattern = function (input) {
-    var matchedIndex;
-    utils.forEach(matchers, function (matcher, index) {
-      if (matcher.test(input)) {
-        matchedIndex = index;
-        return false;
-      }
-    });
-
-    return matchedIndex === undefined ? null : patterns[matchedIndex];
-  };
-
-  return {
-    getPattern: getPattern,
-    patterns: patterns,
-    matchers: matchers
-  };
-}
-
-
-// Expose
-module.exports = patternMatcher;
-
-
diff --git a/dist/common/pattern.js b/dist/common/pattern.js
deleted file mode 100644
index 3e2613d..0000000
--- a/dist/common/pattern.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * pattern.js
- *
- * Utilities to parse str pattern and return info
- *
- */
-
-
-
-
-
-// Define module
-var pattern = {};
-
-// Match information
-var DELIM_SIZE = 4;
-
-// Our regex used to parse
-var regexp  = new RegExp('{{([^}]+)}}', 'g');
-
-//
-// Helper method to parse pattern str
-//
-var getMatches = function (pattern) {
-  // Populate array of matches
-  var matches = [],
-      match;
-  while(match = regexp.exec(pattern)) {
-    matches.push(match);
-  }
-
-  return matches;
-};
-
-//
-// Create an object holding all formatted characters
-// with corresponding positions
-//
-pattern.parse = function (pattern) {
-  // Our obj to populate
-  var info = { inpts: {}, chars: {} };
-
-  // Pattern information
-  var matches = getMatches(pattern),
-      pLength = pattern.length;
-
-  // Counters
-  var mCount = 0,
-      iCount = 0,
-      i = 0;
-
-  // Add inpts, move to end of match, and process
-  var processMatch = function (val) {
-    var valLength = val.length;
-    for (var j = 0; j < valLength; j++) {
-      info.inpts[iCount] = val.charAt(j);
-      iCount++;
-    }
-    mCount ++;
-    i += (val.length + DELIM_SIZE - 1);
-  };
-
-  // Process match or add chars
-  for (i; i < pLength; i++) {
-    if (mCount < matches.length && i === matches[mCount].index) {
-      processMatch(matches[mCount][1]);
-    } else {
-      info.chars[i - (mCount * DELIM_SIZE)] = pattern.charAt(i);
-    }
-  }
-
-  // Set mLength and return
-  info.mLength = i - (mCount * DELIM_SIZE);
-  return info;
-};
-
-
-// Expose
-module.exports = pattern;
-
-
diff --git a/dist/common/utils.js b/dist/common/utils.js
deleted file mode 100644
index dbc08e1..0000000
--- a/dist/common/utils.js
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * utils.js
- *
- * Independent helper methods (cross browser, etc..)
- *
- */
-
-
-
-
-
-// Define module
-var utils = {};
-
-// Useragent info for keycode handling
-var uAgent = (typeof navigator !== 'undefined') ? navigator.userAgent : null;
-
-//
-// Shallow copy properties from n objects to destObj
-//
-utils.extend = function (destObj) {
-  for (var i = 1; i < arguments.length; i++) {
-    for (var key in arguments[i]) {
-      destObj[key] = arguments[i][key];
-    }
-  }
-  return destObj;
-};
-
-//
-// Add a given character to a string at a defined pos
-//
-utils.addChars = function (str, chars, pos) {
-  return str.substr(0, pos) + chars + str.substr(pos, str.length);
-};
-
-//
-// Remove a span of characters
-//
-utils.removeChars = function (str, start, end) {
-  return str.substr(0, start) + str.substr(end, str.length);
-};
-
-//
-// Return true/false is num false between bounds
-//
-utils.isBetween = function (num, bounds) {
-  bounds.sort(function(a,b) { return a-b; });
-  return (num > bounds[0] && num < bounds[1]);
-};
-
-//
-// Helper method for cross browser event listeners
-//
-utils.addListener = function (el, evt, handler) {
-  return (typeof el.addEventListener !== 'undefined')
-    ? el.addEventListener(evt, handler, false)
-    : el.attachEvent('on' + evt, handler);
-};
-
-//
-// Helper method for cross browser implementation of preventDefault
-//
-utils.preventDefault = function (evt) {
-  return (evt.preventDefault) ? evt.preventDefault() : (evt.returnValue = false);
-};
-
-//
-// Helper method for cross browser implementation for grabbing
-// clipboard data
-//
-utils.getClip = function (evt) {
-  if (evt.clipboardData) { return evt.clipboardData.getData('Text'); }
-  if (window.clipboardData) { return window.clipboardData.getData('Text'); }
-};
-
-//
-// Loop over object and checking for matching properties
-//
-utils.getMatchingKey = function (which, keyCode, keys) {
-  // Loop over and return if matched.
-  for (var k in keys) {
-    var key = keys[k];
-    if (which === key.which && keyCode === key.keyCode) {
-      return k;
-    }
-  }
-};
-
-//
-// Returns true/false if k is a del keyDown
-//
-utils.isDelKeyDown = function (which, keyCode) {
-  var keys = {
-    'backspace': { 'which': 8, 'keyCode': 8 },
-    'delete': { 'which': 46, 'keyCode': 46 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-//
-// Returns true/false if k is a del keyPress
-//
-utils.isDelKeyPress = function (which, keyCode) {
-  var keys = {
-    'backspace': { 'which': 8, 'keyCode': 8, 'shiftKey': false },
-    'delete': { 'which': 0, 'keyCode': 46 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-// //
-// // Determine if keydown relates to specialKey
-// //
-// utils.isSpecialKeyDown = function (which, keyCode) {
-//   var keys = {
-//     'tab': { 'which': 9, 'keyCode': 9 },
-//     'enter': { 'which': 13, 'keyCode': 13 },
-//     'end': { 'which': 35, 'keyCode': 35 },
-//     'home': { 'which': 36, 'keyCode': 36 },
-//     'leftarrow': { 'which': 37, 'keyCode': 37 },
-//     'uparrow': { 'which': 38, 'keyCode': 38 },
-//     'rightarrow': { 'which': 39, 'keyCode': 39 },
-//     'downarrow': { 'which': 40, 'keyCode': 40 },
-//     'F5': { 'which': 116, 'keyCode': 116 }
-//   };
-
-//   return utils.getMatchingKey(which, keyCode, keys);
-// };
-
-//
-// Determine if keypress relates to specialKey
-//
-utils.isSpecialKeyPress = function (which, keyCode) {
-  var keys = {
-    'tab': { 'which': 0, 'keyCode': 9 },
-    'enter': { 'which': 13, 'keyCode': 13 },
-    'end': { 'which': 0, 'keyCode': 35 },
-    'home': { 'which': 0, 'keyCode': 36 },
-    'leftarrow': { 'which': 0, 'keyCode': 37 },
-    'uparrow': { 'which': 0, 'keyCode': 38 },
-    'rightarrow': { 'which': 0, 'keyCode': 39 },
-    'downarrow': { 'which': 0, 'keyCode': 40 },
-    'F5': { 'which': 116, 'keyCode': 116 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-//
-// Returns true/false if modifier key is held down
-//
-utils.isModifier = function (evt) {
-  return evt.ctrlKey || evt.altKey || evt.metaKey;
-};
-
-//
-// Iterates over each property of object or array.
-//
-utils.forEach = function (collection, callback, thisArg) {
-  if (collection.hasOwnProperty('length')) {
-    for (var index = 0, len = collection.length; index < len; index++) {
-      if (callback.call(thisArg, collection[index], index, collection) === false) {
-        break;
-      }
-    }
-  } else {
-    for (var key in collection) {
-      if (collection.hasOwnProperty(key)) {
-        if (callback.call(thisArg, collection[key], key, collection) === false) {
-          break;
-        }
-      }
-    }
-  }
-};
-
-
-// Expose
-module.exports = utils;
-
-
diff --git a/dist/formatter.js b/dist/formatter.js
deleted file mode 100644
index 386444f..0000000
--- a/dist/formatter.js
+++ /dev/null
@@ -1,840 +0,0 @@
-/*!
- * v0.1.5
- * Copyright (c) 2014 First Opinion
- * formatter.js is open sourced under the MIT license.
- *
- * thanks to digitalBush/jquery.maskedinput for some of the trickier
- * keycode handling
- */ 
-
-//
-// Uses Node, AMD or browser globals to create a module. This example creates
-// a global even when AMD is used. This is useful if you have some scripts
-// that are loaded by an AMD loader, but they still want access to globals.
-// If you do not need to export a global for the AMD case,
-// see returnExports.js.
-//
-// If you want something that will work in other stricter CommonJS environments,
-// or if you need to create a circular dependency, see commonJsStrictGlobal.js
-//
-// Defines a module "returnExportsGlobal" that depends another module called
-// "b". Note that the name of the module is implied by the file name. It is
-// best if the file name and the exported global have matching names.
-//
-// If the 'b' module also uses this type of boilerplate, then
-// in the browser, it will create a global .b that is used below.
-//
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define([], function () {
-      return (root.returnExportsGlobal = factory());
-    });
-  } else if (typeof exports === 'object') {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like enviroments that support module.exports,
-    // like Node.
-    module.exports = factory();
-  } else {
-    root['Formatter'] = factory();
-  }
-}(this, function () {
-
-
-/*
- * pattern.js
- *
- * Utilities to parse str pattern and return info
- *
- */
-var pattern = function () {
-    // Define module
-    var pattern = {};
-    // Match information
-    var DELIM_SIZE = 4;
-    // Our regex used to parse
-    var regexp = new RegExp('{{([^}]+)}}', 'g');
-    //
-    // Helper method to parse pattern str
-    //
-    var getMatches = function (pattern) {
-      // Populate array of matches
-      var matches = [], match;
-      while (match = regexp.exec(pattern)) {
-        matches.push(match);
-      }
-      return matches;
-    };
-    //
-    // Create an object holding all formatted characters
-    // with corresponding positions
-    //
-    pattern.parse = function (pattern) {
-      // Our obj to populate
-      var info = {
-          inpts: {},
-          chars: {}
-        };
-      // Pattern information
-      var matches = getMatches(pattern), pLength = pattern.length;
-      // Counters
-      var mCount = 0, iCount = 0, i = 0;
-      // Add inpts, move to end of match, and process
-      var processMatch = function (val) {
-        var valLength = val.length;
-        for (var j = 0; j < valLength; j++) {
-          info.inpts[iCount] = val.charAt(j);
-          iCount++;
-        }
-        mCount++;
-        i += val.length + DELIM_SIZE - 1;
-      };
-      // Process match or add chars
-      for (i; i < pLength; i++) {
-        if (mCount < matches.length && i === matches[mCount].index) {
-          processMatch(matches[mCount][1]);
-        } else {
-          info.chars[i - mCount * DELIM_SIZE] = pattern.charAt(i);
-        }
-      }
-      // Set mLength and return
-      info.mLength = i - mCount * DELIM_SIZE;
-      return info;
-    };
-    // Expose
-    return pattern;
-  }();
-/*
- * utils.js
- *
- * Independent helper methods (cross browser, etc..)
- *
- */
-var utils = function () {
-    // Define module
-    var utils = {};
-    // Useragent info for keycode handling
-    var uAgent = typeof navigator !== 'undefined' ? navigator.userAgent : null;
-    //
-    // Shallow copy properties from n objects to destObj
-    //
-    utils.extend = function (destObj) {
-      for (var i = 1; i < arguments.length; i++) {
-        for (var key in arguments[i]) {
-          destObj[key] = arguments[i][key];
-        }
-      }
-      return destObj;
-    };
-    //
-    // Add a given character to a string at a defined pos
-    //
-    utils.addChars = function (str, chars, pos) {
-      return str.substr(0, pos) + chars + str.substr(pos, str.length);
-    };
-    //
-    // Remove a span of characters
-    //
-    utils.removeChars = function (str, start, end) {
-      return str.substr(0, start) + str.substr(end, str.length);
-    };
-    //
-    // Return true/false is num false between bounds
-    //
-    utils.isBetween = function (num, bounds) {
-      bounds.sort(function (a, b) {
-        return a - b;
-      });
-      return num > bounds[0] && num < bounds[1];
-    };
-    //
-    // Helper method for cross browser event listeners
-    //
-    utils.addListener = function (el, evt, handler) {
-      return typeof el.addEventListener !== 'undefined' ? el.addEventListener(evt, handler, false) : el.attachEvent('on' + evt, handler);
-    };
-    //
-    // Helper method for cross browser implementation of preventDefault
-    //
-    utils.preventDefault = function (evt) {
-      return evt.preventDefault ? evt.preventDefault() : evt.returnValue = false;
-    };
-    //
-    // Helper method for cross browser implementation for grabbing
-    // clipboard data
-    //
-    utils.getClip = function (evt) {
-      if (evt.clipboardData) {
-        return evt.clipboardData.getData('Text');
-      }
-      if (window.clipboardData) {
-        return window.clipboardData.getData('Text');
-      }
-    };
-    //
-    // Loop over object and checking for matching properties
-    //
-    utils.getMatchingKey = function (which, keyCode, keys) {
-      // Loop over and return if matched.
-      for (var k in keys) {
-        var key = keys[k];
-        if (which === key.which && keyCode === key.keyCode) {
-          return k;
-        }
-      }
-    };
-    //
-    // Returns true/false if k is a del keyDown
-    //
-    utils.isDelKeyDown = function (which, keyCode) {
-      var keys = {
-          'backspace': {
-            'which': 8,
-            'keyCode': 8
-          },
-          'delete': {
-            'which': 46,
-            'keyCode': 46
-          }
-        };
-      return utils.getMatchingKey(which, keyCode, keys);
-    };
-    //
-    // Returns true/false if k is a del keyPress
-    //
-    utils.isDelKeyPress = function (which, keyCode) {
-      var keys = {
-          'backspace': {
-            'which': 8,
-            'keyCode': 8,
-            'shiftKey': false
-          },
-          'delete': {
-            'which': 0,
-            'keyCode': 46
-          }
-        };
-      return utils.getMatchingKey(which, keyCode, keys);
-    };
-    // //
-    // // Determine if keydown relates to specialKey
-    // //
-    // utils.isSpecialKeyDown = function (which, keyCode) {
-    //   var keys = {
-    //     'tab': { 'which': 9, 'keyCode': 9 },
-    //     'enter': { 'which': 13, 'keyCode': 13 },
-    //     'end': { 'which': 35, 'keyCode': 35 },
-    //     'home': { 'which': 36, 'keyCode': 36 },
-    //     'leftarrow': { 'which': 37, 'keyCode': 37 },
-    //     'uparrow': { 'which': 38, 'keyCode': 38 },
-    //     'rightarrow': { 'which': 39, 'keyCode': 39 },
-    //     'downarrow': { 'which': 40, 'keyCode': 40 },
-    //     'F5': { 'which': 116, 'keyCode': 116 }
-    //   };
-    //   return utils.getMatchingKey(which, keyCode, keys);
-    // };
-    //
-    // Determine if keypress relates to specialKey
-    //
-    utils.isSpecialKeyPress = function (which, keyCode) {
-      var keys = {
-          'tab': {
-            'which': 0,
-            'keyCode': 9
-          },
-          'enter': {
-            'which': 13,
-            'keyCode': 13
-          },
-          'end': {
-            'which': 0,
-            'keyCode': 35
-          },
-          'home': {
-            'which': 0,
-            'keyCode': 36
-          },
-          'leftarrow': {
-            'which': 0,
-            'keyCode': 37
-          },
-          'uparrow': {
-            'which': 0,
-            'keyCode': 38
-          },
-          'rightarrow': {
-            'which': 0,
-            'keyCode': 39
-          },
-          'downarrow': {
-            'which': 0,
-            'keyCode': 40
-          },
-          'F5': {
-            'which': 116,
-            'keyCode': 116
-          }
-        };
-      return utils.getMatchingKey(which, keyCode, keys);
-    };
-    //
-    // Returns true/false if modifier key is held down
-    //
-    utils.isModifier = function (evt) {
-      return evt.ctrlKey || evt.altKey || evt.metaKey;
-    };
-    //
-    // Iterates over each property of object or array.
-    //
-    utils.forEach = function (collection, callback, thisArg) {
-      if (collection.hasOwnProperty('length')) {
-        for (var index = 0, len = collection.length; index < len; index++) {
-          if (callback.call(thisArg, collection[index], index, collection) === false) {
-            break;
-          }
-        }
-      } else {
-        for (var key in collection) {
-          if (collection.hasOwnProperty(key)) {
-            if (callback.call(thisArg, collection[key], key, collection) === false) {
-              break;
-            }
-          }
-        }
-      }
-    };
-    // Expose
-    return utils;
-  }();
-/*
-* pattern-matcher.js
-*
-* Parses a pattern specification and determines appropriate pattern for an
-* input string
-*
-*/
-var patternMatcher = function (pattern, utils) {
-    //
-    // Parse a matcher string into a RegExp. Accepts valid regular
-    // expressions and the catchall '*'.
-    // @private
-    //
-    var parseMatcher = function (matcher) {
-      if (matcher === '*') {
-        return /.*/;
-      }
-      return new RegExp(matcher);
-    };
-    //
-    // Parse a pattern spec and return a function that returns a pattern
-    // based on user input. The first matching pattern will be chosen.
-    // Pattern spec format:
-    // Array [
-    //  Object: { Matcher(RegExp String) : Pattern(Pattern String) },
-    //  ...
-    // ]
-    function patternMatcher(patternSpec) {
-      var matchers = [], patterns = [];
-      // Iterate over each pattern in order.
-      utils.forEach(patternSpec, function (patternMatcher) {
-        // Process single property object to obtain pattern and matcher.
-        utils.forEach(patternMatcher, function (patternStr, matcherStr) {
-          var parsedPattern = pattern.parse(patternStr), regExpMatcher = parseMatcher(matcherStr);
-          matchers.push(regExpMatcher);
-          patterns.push(parsedPattern);
-          // Stop after one iteration.
-          return false;
-        });
-      });
-      var getPattern = function (input) {
-        var matchedIndex;
-        utils.forEach(matchers, function (matcher, index) {
-          if (matcher.test(input)) {
-            matchedIndex = index;
-            return false;
-          }
-        });
-        return matchedIndex === undefined ? null : patterns[matchedIndex];
-      };
-      return {
-        getPattern: getPattern,
-        patterns: patterns,
-        matchers: matchers
-      };
-    }
-    // Expose
-    return patternMatcher;
-  }(pattern, utils);
-/*
- * inpt-sel.js
- *
- * Cross browser implementation to get and set input selections
- *
- */
-var inptSel = function () {
-    // Define module
-    var inptSel = {};
-    //
-    // Get begin and end positions of selected input. Return 0's
-    // if there is no selectiion data
-    //
-    inptSel.get = function (el) {
-      // If normal browser return with result
-      if (typeof el.selectionStart === 'number') {
-        return {
-          begin: el.selectionStart,
-          end: el.selectionEnd
-        };
-      }
-      // Uh-Oh. We must be IE. Fun with TextRange!!
-      var range = document.selection.createRange();
-      // Determine if there is a selection
-      if (range && range.parentElement() === el) {
-        var inputRange = el.createTextRange(), endRange = el.createTextRange(), length = el.value.length;
-        // Create a working TextRange for the input selection
-        inputRange.moveToBookmark(range.getBookmark());
-        // Move endRange begin pos to end pos (hence endRange)
-        endRange.collapse(false);
-        // If we are at the very end of the input, begin and end
-        // must both be the length of the el.value
-        if (inputRange.compareEndPoints('StartToEnd', endRange) > -1) {
-          return {
-            begin: length,
-            end: length
-          };
-        }
-        // Note: moveStart usually returns the units moved, which 
-        // one may think is -length, however, it will stop when it
-        // gets to the begin of the range, thus giving us the
-        // negative value of the pos.
-        return {
-          begin: -inputRange.moveStart('character', -length),
-          end: -inputRange.moveEnd('character', -length)
-        };
-      }
-      //Return 0's on no selection data
-      return {
-        begin: 0,
-        end: 0
-      };
-    };
-    //
-    // Set the caret position at a specified location
-    //
-    inptSel.set = function (el, pos) {
-      // Normalize pos
-      if (typeof pos !== 'object') {
-        pos = {
-          begin: pos,
-          end: pos
-        };
-      }
-      // If normal browser
-      if (el.setSelectionRange) {
-        el.focus();
-        el.setSelectionRange(pos.begin, pos.end);
-      } else if (el.createTextRange) {
-        var range = el.createTextRange();
-        range.collapse(true);
-        range.moveEnd('character', pos.end);
-        range.moveStart('character', pos.begin);
-        range.select();
-      }
-    };
-    // Expose
-    return inptSel;
-  }();
-/*
- * formatter.js
- *
- * Class used to format input based on passed pattern
- *
- */
-var formatter = function (patternMatcher, inptSel, utils) {
-    // Defaults
-    var defaults = {
-        persistent: false,
-        repeat: false,
-        placeholder: ' '
-      };
-    // Regexs for input validation
-    var inptRegs = {
-        '9': /[0-9]/,
-        'a': /[A-Za-z]/,
-        '*': /[A-Za-z0-9]/
-      };
-    //
-    // Class Constructor - Called with new Formatter(el, opts)
-    // Responsible for setting up required instance variables, and
-    // attaching the event listener to the element.
-    //
-    function Formatter(el, opts) {
-      // Cache this
-      var self = this;
-      // Make sure we have an element. Make accesible to instance
-      self.el = el;
-      if (!self.el) {
-        throw new TypeError('Must provide an existing element');
-      }
-      // Merge opts with defaults
-      self.opts = utils.extend({}, defaults, opts);
-      // 1 pattern is special case
-      if (typeof self.opts.pattern !== 'undefined') {
-        self.opts.patterns = self._specFromSinglePattern(self.opts.pattern);
-        delete self.opts.pattern;
-      }
-      // Make sure we have valid opts
-      if (typeof self.opts.patterns === 'undefined') {
-        throw new TypeError('Must provide a pattern or array of patterns');
-      }
-      self.patternMatcher = patternMatcher(self.opts.patterns);
-      // Upate pattern with initial value
-      self._updatePattern();
-      // Init values
-      self.hldrs = {};
-      self.focus = 0;
-      // Add Listeners
-      utils.addListener(self.el, 'keydown', function (evt) {
-        self._keyDown(evt);
-      });
-      utils.addListener(self.el, 'keypress', function (evt) {
-        self._keyPress(evt);
-      });
-      utils.addListener(self.el, 'paste', function (evt) {
-        self._paste(evt);
-      });
-      // Persistence
-      if (self.opts.persistent) {
-        // Format on start
-        self._processKey('', false);
-        self.el.blur();
-        // Add Listeners
-        utils.addListener(self.el, 'focus', function (evt) {
-          self._focus(evt);
-        });
-        utils.addListener(self.el, 'click', function (evt) {
-          self._focus(evt);
-        });
-        utils.addListener(self.el, 'touchstart', function (evt) {
-          self._focus(evt);
-        });
-      }
-    }
-    //
-    // @public
-    // Add new char
-    //
-    Formatter.addInptType = function (chr, reg) {
-      inptRegs[chr] = reg;
-    };
-    //
-    // @public
-    // Apply the given pattern to the current input without moving caret.
-    //
-    Formatter.prototype.resetPattern = function (str) {
-      // Update opts to hold new pattern
-      this.opts.patterns = str ? this._specFromSinglePattern(str) : this.opts.patterns;
-      // Get current state
-      this.sel = inptSel.get(this.el);
-      this.val = this.el.value;
-      // Init values
-      this.delta = 0;
-      // Remove all formatted chars from val
-      this._removeChars();
-      this.patternMatcher = patternMatcher(this.opts.patterns);
-      // Update pattern
-      var newPattern = this.patternMatcher.getPattern(this.val);
-      this.mLength = newPattern.mLength;
-      this.chars = newPattern.chars;
-      this.inpts = newPattern.inpts;
-      // Format on start
-      this._processKey('', false, true);
-    };
-    //
-    // @private
-    // Determine correct format pattern based on input val
-    //
-    Formatter.prototype._updatePattern = function () {
-      // Determine appropriate pattern
-      var newPattern = this.patternMatcher.getPattern(this.val);
-      // Only update the pattern if there is an appropriate pattern for the value.
-      // Otherwise, leave the current pattern (and likely delete the latest character.)
-      if (newPattern) {
-        // Get info about the given pattern
-        this.mLength = newPattern.mLength;
-        this.chars = newPattern.chars;
-        this.inpts = newPattern.inpts;
-      }
-    };
-    //
-    // @private
-    // Handler called on all keyDown strokes. All keys trigger
-    // this handler. Only process delete keys.
-    //
-    Formatter.prototype._keyDown = function (evt) {
-      // The first thing we need is the character code
-      var k = evt.which || evt.keyCode;
-      // If delete key
-      if (k && utils.isDelKeyDown(evt.which, evt.keyCode)) {
-        // Process the keyCode and prevent default
-        this._processKey(null, k);
-        return utils.preventDefault(evt);
-      }
-    };
-    //
-    // @private
-    // Handler called on all keyPress strokes. Only processes
-    // character keys (as long as no modifier key is in use).
-    //
-    Formatter.prototype._keyPress = function (evt) {
-      // The first thing we need is the character code
-      var k, isSpecial;
-      // Mozilla will trigger on special keys and assign the the value 0
-      // We want to use that 0 rather than the keyCode it assigns.
-      k = evt.which || evt.keyCode;
-      isSpecial = utils.isSpecialKeyPress(evt.which, evt.keyCode);
-      // Process the keyCode and prevent default
-      if (!utils.isDelKeyPress(evt.which, evt.keyCode) && !isSpecial && !utils.isModifier(evt)) {
-        this._processKey(String.fromCharCode(k), false);
-        return utils.preventDefault(evt);
-      }
-    };
-    //
-    // @private
-    // Handler called on paste event.
-    //
-    Formatter.prototype._paste = function (evt) {
-      // Process the clipboard paste and prevent default
-      this._processKey(utils.getClip(evt), false);
-      return utils.preventDefault(evt);
-    };
-    //
-    // @private
-    // Handle called on focus event.
-    //
-    Formatter.prototype._focus = function () {
-      // Wrapped in timeout so that we can grab input selection
-      var self = this;
-      setTimeout(function () {
-        // Grab selection
-        var selection = inptSel.get(self.el);
-        // Char check
-        var isAfterStart = selection.end > self.focus, isFirstChar = selection.end === 0;
-        // If clicked in front of start, refocus to start
-        if (isAfterStart || isFirstChar) {
-          inptSel.set(self.el, self.focus);
-        }
-      }, 0);
-    };
-    //
-    // @private
-    // Using the provided key information, alter el value.
-    //
-    Formatter.prototype._processKey = function (chars, delKey, ignoreCaret) {
-      // Get current state
-      this.sel = inptSel.get(this.el);
-      this.val = this.el.value;
-      // Init values
-      this.delta = 0;
-      // If chars were highlighted, we need to remove them
-      if (this.sel.begin !== this.sel.end) {
-        this.delta = -1 * Math.abs(this.sel.begin - this.sel.end);
-        this.val = utils.removeChars(this.val, this.sel.begin, this.sel.end);
-      } else if (delKey && delKey === 46) {
-        this._delete();
-      } else if (delKey && this.sel.begin - 1 >= 0) {
-        // Always have a delta of at least -1 for the character being deleted.
-        this.val = utils.removeChars(this.val, this.sel.end - 1, this.sel.end);
-        this.delta -= 1;
-      } else if (delKey) {
-        return true;
-      }
-      // If the key is not a del key, it should convert to a str
-      if (!delKey) {
-        // Add char at position and increment delta
-        this.val = utils.addChars(this.val, chars, this.sel.begin);
-        this.delta += chars.length;
-      }
-      // Format el.value (also handles updating caret position)
-      this._formatValue(ignoreCaret);
-    };
-    //
-    // @private
-    // Deletes the character in front of it
-    //
-    Formatter.prototype._delete = function () {
-      // Adjust focus to make sure its not on a formatted char
-      while (this.chars[this.sel.begin]) {
-        this._nextPos();
-      }
-      // As long as we are not at the end
-      if (this.sel.begin < this.val.length) {
-        // We will simulate a delete by moving the caret to the next char
-        // and then deleting
-        this._nextPos();
-        this.val = utils.removeChars(this.val, this.sel.end - 1, this.sel.end);
-        this.delta = -1;
-      }
-    };
-    //
-    // @private
-    // Quick helper method to move the caret to the next pos
-    //
-    Formatter.prototype._nextPos = function () {
-      this.sel.end++;
-      this.sel.begin++;
-    };
-    //
-    // @private
-    // Alter element value to display characters matching the provided
-    // instance pattern. Also responsible for updating
-    //
-    Formatter.prototype._formatValue = function (ignoreCaret) {
-      // Set caret pos
-      this.newPos = this.sel.end + this.delta;
-      // Remove all formatted chars from val
-      this._removeChars();
-      // Switch to first matching pattern based on val
-      this._updatePattern();
-      // Validate inputs
-      this._validateInpts();
-      // Add formatted characters
-      this._addChars();
-      // Set value and adhere to maxLength
-      this.el.value = this.val.substr(0, this.mLength);
-      // Set new caret position
-      if (typeof ignoreCaret === 'undefined' || ignoreCaret === false) {
-        inptSel.set(this.el, this.newPos);
-      }
-    };
-    //
-    // @private
-    // Remove all formatted before and after a specified pos
-    //
-    Formatter.prototype._removeChars = function () {
-      // Delta shouldn't include placeholders
-      if (this.sel.end > this.focus) {
-        this.delta += this.sel.end - this.focus;
-      }
-      // Account for shifts during removal
-      var shift = 0;
-      // Loop through all possible char positions
-      for (var i = 0; i <= this.mLength; i++) {
-        // Get transformed position
-        var curChar = this.chars[i], curHldr = this.hldrs[i], pos = i + shift, val;
-        // If after selection we need to account for delta
-        pos = i >= this.sel.begin ? pos + this.delta : pos;
-        val = this.val.charAt(pos);
-        // Remove char and account for shift
-        if (curChar && curChar === val || curHldr && curHldr === val) {
-          this.val = utils.removeChars(this.val, pos, pos + 1);
-          shift--;
-        }
-      }
-      // All hldrs should be removed now
-      this.hldrs = {};
-      // Set focus to last character
-      this.focus = this.val.length;
-    };
-    //
-    // @private
-    // Make sure all inpts are valid, else remove and update delta
-    //
-    Formatter.prototype._validateInpts = function () {
-      // Loop over each char and validate
-      for (var i = 0; i < this.val.length; i++) {
-        // Get char inpt type
-        var inptType = this.inpts[i];
-        // Checks
-        var isBadType = !inptRegs[inptType], isInvalid = !isBadType && !inptRegs[inptType].test(this.val.charAt(i)), inBounds = this.inpts[i];
-        // Remove if incorrect and inbounds
-        if ((isBadType || isInvalid) && inBounds) {
-          this.val = utils.removeChars(this.val, i, i + 1);
-          this.focusStart--;
-          this.newPos--;
-          this.delta--;
-          i--;
-        }
-      }
-    };
-    //
-    // @private
-    // Loop over val and add formatted chars as necessary
-    //
-    Formatter.prototype._addChars = function () {
-      if (this.opts.persistent) {
-        // Loop over all possible characters
-        for (var i = 0; i <= this.mLength; i++) {
-          if (!this.val.charAt(i)) {
-            // Add placeholder at pos
-            this.val = utils.addChars(this.val, this.opts.placeholder, i);
-            this.hldrs[i] = this.opts.placeholder;
-          }
-          this._addChar(i);
-        }
-        // Adjust focus to make sure its not on a formatted char
-        while (this.chars[this.focus]) {
-          this.focus++;
-        }
-      } else {
-        // Avoid caching val.length, as they may change in _addChar.
-        for (var j = 0; j <= this.val.length; j++) {
-          // When moving backwards there are some race conditions where we
-          // dont want to add the character
-          if (this.delta <= 0 && j === this.focus) {
-            return true;
-          }
-          // Place character in current position of the formatted string.
-          this._addChar(j);
-        }
-      }
-    };
-    //
-    // @private
-    // Add formattted char at position
-    //
-    Formatter.prototype._addChar = function (i) {
-      // If char exists at position
-      var chr = this.chars[i];
-      if (!chr) {
-        return true;
-      }
-      // If chars are added in between the old pos and new pos
-      // we need to increment pos and delta
-      if (utils.isBetween(i, [
-          this.sel.begin - 1,
-          this.newPos + 1
-        ])) {
-        this.newPos++;
-        this.delta++;
-      }
-      // If character added before focus, incr
-      if (i <= this.focus) {
-        this.focus++;
-      }
-      // Updateholder
-      if (this.hldrs[i]) {
-        delete this.hldrs[i];
-        this.hldrs[i + 1] = this.opts.placeholder;
-      }
-      // Update value
-      this.val = utils.addChars(this.val, chr, i);
-    };
-    //
-    // @private
-    // Create a patternSpec for passing into patternMatcher that
-    // has exactly one catch all pattern.
-    //
-    Formatter.prototype._specFromSinglePattern = function (patternStr) {
-      return [{ '*': patternStr }];
-    };
-    // Expose
-    return Formatter;
-  }(patternMatcher, inptSel, utils);
-
-
-return formatter;
-
-
-
-}));
\ No newline at end of file
diff --git a/dist/jquery.formatter.js b/dist/jquery.formatter.js
deleted file mode 100644
index 7909731..0000000
--- a/dist/jquery.formatter.js
+++ /dev/null
@@ -1,861 +0,0 @@
-/*!
- * v0.1.5
- * Copyright (c) 2014 First Opinion
- * formatter.js is open sourced under the MIT license.
- *
- * thanks to digitalBush/jquery.maskedinput for some of the trickier
- * keycode handling
- */ 
-
-//
-// Uses CommonJS, AMD or browser globals to create a jQuery plugin.
-//
-// Similar to jqueryPlugin.js but also tries to
-// work in a CommonJS environment.
-// It is unlikely jQuery will run in a CommonJS
-// environment. See jqueryPlugin.js if you do
-// not want to add the extra CommonJS detection.
-//
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define(['jQuery'], factory);
-  } else if (typeof exports === 'object') {
-    factory(require('jQuery'));
-  } else {
-    // Browser globals
-    factory(root.jQuery);
-  }
-}(this, function (jQuery) {
-
-
-/*
- * pattern.js
- *
- * Utilities to parse str pattern and return info
- *
- */
-var pattern = function () {
-    // Define module
-    var pattern = {};
-    // Match information
-    var DELIM_SIZE = 4;
-    // Our regex used to parse
-    var regexp = new RegExp('{{([^}]+)}}', 'g');
-    //
-    // Helper method to parse pattern str
-    //
-    var getMatches = function (pattern) {
-      // Populate array of matches
-      var matches = [], match;
-      while (match = regexp.exec(pattern)) {
-        matches.push(match);
-      }
-      return matches;
-    };
-    //
-    // Create an object holding all formatted characters
-    // with corresponding positions
-    //
-    pattern.parse = function (pattern) {
-      // Our obj to populate
-      var info = {
-          inpts: {},
-          chars: {}
-        };
-      // Pattern information
-      var matches = getMatches(pattern), pLength = pattern.length;
-      // Counters
-      var mCount = 0, iCount = 0, i = 0;
-      // Add inpts, move to end of match, and process
-      var processMatch = function (val) {
-        var valLength = val.length;
-        for (var j = 0; j < valLength; j++) {
-          info.inpts[iCount] = val.charAt(j);
-          iCount++;
-        }
-        mCount++;
-        i += val.length + DELIM_SIZE - 1;
-      };
-      // Process match or add chars
-      for (i; i < pLength; i++) {
-        if (mCount < matches.length && i === matches[mCount].index) {
-          processMatch(matches[mCount][1]);
-        } else {
-          info.chars[i - mCount * DELIM_SIZE] = pattern.charAt(i);
-        }
-      }
-      // Set mLength and return
-      info.mLength = i - mCount * DELIM_SIZE;
-      return info;
-    };
-    // Expose
-    return pattern;
-  }();
-/*
- * utils.js
- *
- * Independent helper methods (cross browser, etc..)
- *
- */
-var utils = function () {
-    // Define module
-    var utils = {};
-    // Useragent info for keycode handling
-    var uAgent = typeof navigator !== 'undefined' ? navigator.userAgent : null;
-    //
-    // Shallow copy properties from n objects to destObj
-    //
-    utils.extend = function (destObj) {
-      for (var i = 1; i < arguments.length; i++) {
-        for (var key in arguments[i]) {
-          destObj[key] = arguments[i][key];
-        }
-      }
-      return destObj;
-    };
-    //
-    // Add a given character to a string at a defined pos
-    //
-    utils.addChars = function (str, chars, pos) {
-      return str.substr(0, pos) + chars + str.substr(pos, str.length);
-    };
-    //
-    // Remove a span of characters
-    //
-    utils.removeChars = function (str, start, end) {
-      return str.substr(0, start) + str.substr(end, str.length);
-    };
-    //
-    // Return true/false is num false between bounds
-    //
-    utils.isBetween = function (num, bounds) {
-      bounds.sort(function (a, b) {
-        return a - b;
-      });
-      return num > bounds[0] && num < bounds[1];
-    };
-    //
-    // Helper method for cross browser event listeners
-    //
-    utils.addListener = function (el, evt, handler) {
-      return typeof el.addEventListener !== 'undefined' ? el.addEventListener(evt, handler, false) : el.attachEvent('on' + evt, handler);
-    };
-    //
-    // Helper method for cross browser implementation of preventDefault
-    //
-    utils.preventDefault = function (evt) {
-      return evt.preventDefault ? evt.preventDefault() : evt.returnValue = false;
-    };
-    //
-    // Helper method for cross browser implementation for grabbing
-    // clipboard data
-    //
-    utils.getClip = function (evt) {
-      if (evt.clipboardData) {
-        return evt.clipboardData.getData('Text');
-      }
-      if (window.clipboardData) {
-        return window.clipboardData.getData('Text');
-      }
-    };
-    //
-    // Loop over object and checking for matching properties
-    //
-    utils.getMatchingKey = function (which, keyCode, keys) {
-      // Loop over and return if matched.
-      for (var k in keys) {
-        var key = keys[k];
-        if (which === key.which && keyCode === key.keyCode) {
-          return k;
-        }
-      }
-    };
-    //
-    // Returns true/false if k is a del keyDown
-    //
-    utils.isDelKeyDown = function (which, keyCode) {
-      var keys = {
-          'backspace': {
-            'which': 8,
-            'keyCode': 8
-          },
-          'delete': {
-            'which': 46,
-            'keyCode': 46
-          }
-        };
-      return utils.getMatchingKey(which, keyCode, keys);
-    };
-    //
-    // Returns true/false if k is a del keyPress
-    //
-    utils.isDelKeyPress = function (which, keyCode) {
-      var keys = {
-          'backspace': {
-            'which': 8,
-            'keyCode': 8,
-            'shiftKey': false
-          },
-          'delete': {
-            'which': 0,
-            'keyCode': 46
-          }
-        };
-      return utils.getMatchingKey(which, keyCode, keys);
-    };
-    // //
-    // // Determine if keydown relates to specialKey
-    // //
-    // utils.isSpecialKeyDown = function (which, keyCode) {
-    //   var keys = {
-    //     'tab': { 'which': 9, 'keyCode': 9 },
-    //     'enter': { 'which': 13, 'keyCode': 13 },
-    //     'end': { 'which': 35, 'keyCode': 35 },
-    //     'home': { 'which': 36, 'keyCode': 36 },
-    //     'leftarrow': { 'which': 37, 'keyCode': 37 },
-    //     'uparrow': { 'which': 38, 'keyCode': 38 },
-    //     'rightarrow': { 'which': 39, 'keyCode': 39 },
-    //     'downarrow': { 'which': 40, 'keyCode': 40 },
-    //     'F5': { 'which': 116, 'keyCode': 116 }
-    //   };
-    //   return utils.getMatchingKey(which, keyCode, keys);
-    // };
-    //
-    // Determine if keypress relates to specialKey
-    //
-    utils.isSpecialKeyPress = function (which, keyCode) {
-      var keys = {
-          'tab': {
-            'which': 0,
-            'keyCode': 9
-          },
-          'enter': {
-            'which': 13,
-            'keyCode': 13
-          },
-          'end': {
-            'which': 0,
-            'keyCode': 35
-          },
-          'home': {
-            'which': 0,
-            'keyCode': 36
-          },
-          'leftarrow': {
-            'which': 0,
-            'keyCode': 37
-          },
-          'uparrow': {
-            'which': 0,
-            'keyCode': 38
-          },
-          'rightarrow': {
-            'which': 0,
-            'keyCode': 39
-          },
-          'downarrow': {
-            'which': 0,
-            'keyCode': 40
-          },
-          'F5': {
-            'which': 116,
-            'keyCode': 116
-          }
-        };
-      return utils.getMatchingKey(which, keyCode, keys);
-    };
-    //
-    // Returns true/false if modifier key is held down
-    //
-    utils.isModifier = function (evt) {
-      return evt.ctrlKey || evt.altKey || evt.metaKey;
-    };
-    //
-    // Iterates over each property of object or array.
-    //
-    utils.forEach = function (collection, callback, thisArg) {
-      if (collection.hasOwnProperty('length')) {
-        for (var index = 0, len = collection.length; index < len; index++) {
-          if (callback.call(thisArg, collection[index], index, collection) === false) {
-            break;
-          }
-        }
-      } else {
-        for (var key in collection) {
-          if (collection.hasOwnProperty(key)) {
-            if (callback.call(thisArg, collection[key], key, collection) === false) {
-              break;
-            }
-          }
-        }
-      }
-    };
-    // Expose
-    return utils;
-  }();
-/*
-* pattern-matcher.js
-*
-* Parses a pattern specification and determines appropriate pattern for an
-* input string
-*
-*/
-var patternMatcher = function (pattern, utils) {
-    //
-    // Parse a matcher string into a RegExp. Accepts valid regular
-    // expressions and the catchall '*'.
-    // @private
-    //
-    var parseMatcher = function (matcher) {
-      if (matcher === '*') {
-        return /.*/;
-      }
-      return new RegExp(matcher);
-    };
-    //
-    // Parse a pattern spec and return a function that returns a pattern
-    // based on user input. The first matching pattern will be chosen.
-    // Pattern spec format:
-    // Array [
-    //  Object: { Matcher(RegExp String) : Pattern(Pattern String) },
-    //  ...
-    // ]
-    function patternMatcher(patternSpec) {
-      var matchers = [], patterns = [];
-      // Iterate over each pattern in order.
-      utils.forEach(patternSpec, function (patternMatcher) {
-        // Process single property object to obtain pattern and matcher.
-        utils.forEach(patternMatcher, function (patternStr, matcherStr) {
-          var parsedPattern = pattern.parse(patternStr), regExpMatcher = parseMatcher(matcherStr);
-          matchers.push(regExpMatcher);
-          patterns.push(parsedPattern);
-          // Stop after one iteration.
-          return false;
-        });
-      });
-      var getPattern = function (input) {
-        var matchedIndex;
-        utils.forEach(matchers, function (matcher, index) {
-          if (matcher.test(input)) {
-            matchedIndex = index;
-            return false;
-          }
-        });
-        return matchedIndex === undefined ? null : patterns[matchedIndex];
-      };
-      return {
-        getPattern: getPattern,
-        patterns: patterns,
-        matchers: matchers
-      };
-    }
-    // Expose
-    return patternMatcher;
-  }(pattern, utils);
-/*
- * inpt-sel.js
- *
- * Cross browser implementation to get and set input selections
- *
- */
-var inptSel = function () {
-    // Define module
-    var inptSel = {};
-    //
-    // Get begin and end positions of selected input. Return 0's
-    // if there is no selectiion data
-    //
-    inptSel.get = function (el) {
-      // If normal browser return with result
-      if (typeof el.selectionStart === 'number') {
-        return {
-          begin: el.selectionStart,
-          end: el.selectionEnd
-        };
-      }
-      // Uh-Oh. We must be IE. Fun with TextRange!!
-      var range = document.selection.createRange();
-      // Determine if there is a selection
-      if (range && range.parentElement() === el) {
-        var inputRange = el.createTextRange(), endRange = el.createTextRange(), length = el.value.length;
-        // Create a working TextRange for the input selection
-        inputRange.moveToBookmark(range.getBookmark());
-        // Move endRange begin pos to end pos (hence endRange)
-        endRange.collapse(false);
-        // If we are at the very end of the input, begin and end
-        // must both be the length of the el.value
-        if (inputRange.compareEndPoints('StartToEnd', endRange) > -1) {
-          return {
-            begin: length,
-            end: length
-          };
-        }
-        // Note: moveStart usually returns the units moved, which 
-        // one may think is -length, however, it will stop when it
-        // gets to the begin of the range, thus giving us the
-        // negative value of the pos.
-        return {
-          begin: -inputRange.moveStart('character', -length),
-          end: -inputRange.moveEnd('character', -length)
-        };
-      }
-      //Return 0's on no selection data
-      return {
-        begin: 0,
-        end: 0
-      };
-    };
-    //
-    // Set the caret position at a specified location
-    //
-    inptSel.set = function (el, pos) {
-      // Normalize pos
-      if (typeof pos !== 'object') {
-        pos = {
-          begin: pos,
-          end: pos
-        };
-      }
-      // If normal browser
-      if (el.setSelectionRange) {
-        el.focus();
-        el.setSelectionRange(pos.begin, pos.end);
-      } else if (el.createTextRange) {
-        var range = el.createTextRange();
-        range.collapse(true);
-        range.moveEnd('character', pos.end);
-        range.moveStart('character', pos.begin);
-        range.select();
-      }
-    };
-    // Expose
-    return inptSel;
-  }();
-/*
- * formatter.js
- *
- * Class used to format input based on passed pattern
- *
- */
-var formatter = function (patternMatcher, inptSel, utils) {
-    // Defaults
-    var defaults = {
-        persistent: false,
-        repeat: false,
-        placeholder: ' '
-      };
-    // Regexs for input validation
-    var inptRegs = {
-        '9': /[0-9]/,
-        'a': /[A-Za-z]/,
-        '*': /[A-Za-z0-9]/
-      };
-    //
-    // Class Constructor - Called with new Formatter(el, opts)
-    // Responsible for setting up required instance variables, and
-    // attaching the event listener to the element.
-    //
-    function Formatter(el, opts) {
-      // Cache this
-      var self = this;
-      // Make sure we have an element. Make accesible to instance
-      self.el = el;
-      if (!self.el) {
-        throw new TypeError('Must provide an existing element');
-      }
-      // Merge opts with defaults
-      self.opts = utils.extend({}, defaults, opts);
-      // 1 pattern is special case
-      if (typeof self.opts.pattern !== 'undefined') {
-        self.opts.patterns = self._specFromSinglePattern(self.opts.pattern);
-        delete self.opts.pattern;
-      }
-      // Make sure we have valid opts
-      if (typeof self.opts.patterns === 'undefined') {
-        throw new TypeError('Must provide a pattern or array of patterns');
-      }
-      self.patternMatcher = patternMatcher(self.opts.patterns);
-      // Upate pattern with initial value
-      self._updatePattern();
-      // Init values
-      self.hldrs = {};
-      self.focus = 0;
-      // Add Listeners
-      utils.addListener(self.el, 'keydown', function (evt) {
-        self._keyDown(evt);
-      });
-      utils.addListener(self.el, 'keypress', function (evt) {
-        self._keyPress(evt);
-      });
-      utils.addListener(self.el, 'paste', function (evt) {
-        self._paste(evt);
-      });
-      // Persistence
-      if (self.opts.persistent) {
-        // Format on start
-        self._processKey('', false);
-        self.el.blur();
-        // Add Listeners
-        utils.addListener(self.el, 'focus', function (evt) {
-          self._focus(evt);
-        });
-        utils.addListener(self.el, 'click', function (evt) {
-          self._focus(evt);
-        });
-        utils.addListener(self.el, 'touchstart', function (evt) {
-          self._focus(evt);
-        });
-      }
-    }
-    //
-    // @public
-    // Add new char
-    //
-    Formatter.addInptType = function (chr, reg) {
-      inptRegs[chr] = reg;
-    };
-    //
-    // @public
-    // Apply the given pattern to the current input without moving caret.
-    //
-    Formatter.prototype.resetPattern = function (str) {
-      // Update opts to hold new pattern
-      this.opts.patterns = str ? this._specFromSinglePattern(str) : this.opts.patterns;
-      // Get current state
-      this.sel = inptSel.get(this.el);
-      this.val = this.el.value;
-      // Init values
-      this.delta = 0;
-      // Remove all formatted chars from val
-      this._removeChars();
-      this.patternMatcher = patternMatcher(this.opts.patterns);
-      // Update pattern
-      var newPattern = this.patternMatcher.getPattern(this.val);
-      this.mLength = newPattern.mLength;
-      this.chars = newPattern.chars;
-      this.inpts = newPattern.inpts;
-      // Format on start
-      this._processKey('', false, true);
-    };
-    //
-    // @private
-    // Determine correct format pattern based on input val
-    //
-    Formatter.prototype._updatePattern = function () {
-      // Determine appropriate pattern
-      var newPattern = this.patternMatcher.getPattern(this.val);
-      // Only update the pattern if there is an appropriate pattern for the value.
-      // Otherwise, leave the current pattern (and likely delete the latest character.)
-      if (newPattern) {
-        // Get info about the given pattern
-        this.mLength = newPattern.mLength;
-        this.chars = newPattern.chars;
-        this.inpts = newPattern.inpts;
-      }
-    };
-    //
-    // @private
-    // Handler called on all keyDown strokes. All keys trigger
-    // this handler. Only process delete keys.
-    //
-    Formatter.prototype._keyDown = function (evt) {
-      // The first thing we need is the character code
-      var k = evt.which || evt.keyCode;
-      // If delete key
-      if (k && utils.isDelKeyDown(evt.which, evt.keyCode)) {
-        // Process the keyCode and prevent default
-        this._processKey(null, k);
-        return utils.preventDefault(evt);
-      }
-    };
-    //
-    // @private
-    // Handler called on all keyPress strokes. Only processes
-    // character keys (as long as no modifier key is in use).
-    //
-    Formatter.prototype._keyPress = function (evt) {
-      // The first thing we need is the character code
-      var k, isSpecial;
-      // Mozilla will trigger on special keys and assign the the value 0
-      // We want to use that 0 rather than the keyCode it assigns.
-      k = evt.which || evt.keyCode;
-      isSpecial = utils.isSpecialKeyPress(evt.which, evt.keyCode);
-      // Process the keyCode and prevent default
-      if (!utils.isDelKeyPress(evt.which, evt.keyCode) && !isSpecial && !utils.isModifier(evt)) {
-        this._processKey(String.fromCharCode(k), false);
-        return utils.preventDefault(evt);
-      }
-    };
-    //
-    // @private
-    // Handler called on paste event.
-    //
-    Formatter.prototype._paste = function (evt) {
-      // Process the clipboard paste and prevent default
-      this._processKey(utils.getClip(evt), false);
-      return utils.preventDefault(evt);
-    };
-    //
-    // @private
-    // Handle called on focus event.
-    //
-    Formatter.prototype._focus = function () {
-      // Wrapped in timeout so that we can grab input selection
-      var self = this;
-      setTimeout(function () {
-        // Grab selection
-        var selection = inptSel.get(self.el);
-        // Char check
-        var isAfterStart = selection.end > self.focus, isFirstChar = selection.end === 0;
-        // If clicked in front of start, refocus to start
-        if (isAfterStart || isFirstChar) {
-          inptSel.set(self.el, self.focus);
-        }
-      }, 0);
-    };
-    //
-    // @private
-    // Using the provided key information, alter el value.
-    //
-    Formatter.prototype._processKey = function (chars, delKey, ignoreCaret) {
-      // Get current state
-      this.sel = inptSel.get(this.el);
-      this.val = this.el.value;
-      // Init values
-      this.delta = 0;
-      // If chars were highlighted, we need to remove them
-      if (this.sel.begin !== this.sel.end) {
-        this.delta = -1 * Math.abs(this.sel.begin - this.sel.end);
-        this.val = utils.removeChars(this.val, this.sel.begin, this.sel.end);
-      } else if (delKey && delKey === 46) {
-        this._delete();
-      } else if (delKey && this.sel.begin - 1 >= 0) {
-        // Always have a delta of at least -1 for the character being deleted.
-        this.val = utils.removeChars(this.val, this.sel.end - 1, this.sel.end);
-        this.delta -= 1;
-      } else if (delKey) {
-        return true;
-      }
-      // If the key is not a del key, it should convert to a str
-      if (!delKey) {
-        // Add char at position and increment delta
-        this.val = utils.addChars(this.val, chars, this.sel.begin);
-        this.delta += chars.length;
-      }
-      // Format el.value (also handles updating caret position)
-      this._formatValue(ignoreCaret);
-    };
-    //
-    // @private
-    // Deletes the character in front of it
-    //
-    Formatter.prototype._delete = function () {
-      // Adjust focus to make sure its not on a formatted char
-      while (this.chars[this.sel.begin]) {
-        this._nextPos();
-      }
-      // As long as we are not at the end
-      if (this.sel.begin < this.val.length) {
-        // We will simulate a delete by moving the caret to the next char
-        // and then deleting
-        this._nextPos();
-        this.val = utils.removeChars(this.val, this.sel.end - 1, this.sel.end);
-        this.delta = -1;
-      }
-    };
-    //
-    // @private
-    // Quick helper method to move the caret to the next pos
-    //
-    Formatter.prototype._nextPos = function () {
-      this.sel.end++;
-      this.sel.begin++;
-    };
-    //
-    // @private
-    // Alter element value to display characters matching the provided
-    // instance pattern. Also responsible for updating
-    //
-    Formatter.prototype._formatValue = function (ignoreCaret) {
-      // Set caret pos
-      this.newPos = this.sel.end + this.delta;
-      // Remove all formatted chars from val
-      this._removeChars();
-      // Switch to first matching pattern based on val
-      this._updatePattern();
-      // Validate inputs
-      this._validateInpts();
-      // Add formatted characters
-      this._addChars();
-      // Set value and adhere to maxLength
-      this.el.value = this.val.substr(0, this.mLength);
-      // Set new caret position
-      if (typeof ignoreCaret === 'undefined' || ignoreCaret === false) {
-        inptSel.set(this.el, this.newPos);
-      }
-    };
-    //
-    // @private
-    // Remove all formatted before and after a specified pos
-    //
-    Formatter.prototype._removeChars = function () {
-      // Delta shouldn't include placeholders
-      if (this.sel.end > this.focus) {
-        this.delta += this.sel.end - this.focus;
-      }
-      // Account for shifts during removal
-      var shift = 0;
-      // Loop through all possible char positions
-      for (var i = 0; i <= this.mLength; i++) {
-        // Get transformed position
-        var curChar = this.chars[i], curHldr = this.hldrs[i], pos = i + shift, val;
-        // If after selection we need to account for delta
-        pos = i >= this.sel.begin ? pos + this.delta : pos;
-        val = this.val.charAt(pos);
-        // Remove char and account for shift
-        if (curChar && curChar === val || curHldr && curHldr === val) {
-          this.val = utils.removeChars(this.val, pos, pos + 1);
-          shift--;
-        }
-      }
-      // All hldrs should be removed now
-      this.hldrs = {};
-      // Set focus to last character
-      this.focus = this.val.length;
-    };
-    //
-    // @private
-    // Make sure all inpts are valid, else remove and update delta
-    //
-    Formatter.prototype._validateInpts = function () {
-      // Loop over each char and validate
-      for (var i = 0; i < this.val.length; i++) {
-        // Get char inpt type
-        var inptType = this.inpts[i];
-        // Checks
-        var isBadType = !inptRegs[inptType], isInvalid = !isBadType && !inptRegs[inptType].test(this.val.charAt(i)), inBounds = this.inpts[i];
-        // Remove if incorrect and inbounds
-        if ((isBadType || isInvalid) && inBounds) {
-          this.val = utils.removeChars(this.val, i, i + 1);
-          this.focusStart--;
-          this.newPos--;
-          this.delta--;
-          i--;
-        }
-      }
-    };
-    //
-    // @private
-    // Loop over val and add formatted chars as necessary
-    //
-    Formatter.prototype._addChars = function () {
-      if (this.opts.persistent) {
-        // Loop over all possible characters
-        for (var i = 0; i <= this.mLength; i++) {
-          if (!this.val.charAt(i)) {
-            // Add placeholder at pos
-            this.val = utils.addChars(this.val, this.opts.placeholder, i);
-            this.hldrs[i] = this.opts.placeholder;
-          }
-          this._addChar(i);
-        }
-        // Adjust focus to make sure its not on a formatted char
-        while (this.chars[this.focus]) {
-          this.focus++;
-        }
-      } else {
-        // Avoid caching val.length, as they may change in _addChar.
-        for (var j = 0; j <= this.val.length; j++) {
-          // When moving backwards there are some race conditions where we
-          // dont want to add the character
-          if (this.delta <= 0 && j === this.focus) {
-            return true;
-          }
-          // Place character in current position of the formatted string.
-          this._addChar(j);
-        }
-      }
-    };
-    //
-    // @private
-    // Add formattted char at position
-    //
-    Formatter.prototype._addChar = function (i) {
-      // If char exists at position
-      var chr = this.chars[i];
-      if (!chr) {
-        return true;
-      }
-      // If chars are added in between the old pos and new pos
-      // we need to increment pos and delta
-      if (utils.isBetween(i, [
-          this.sel.begin - 1,
-          this.newPos + 1
-        ])) {
-        this.newPos++;
-        this.delta++;
-      }
-      // If character added before focus, incr
-      if (i <= this.focus) {
-        this.focus++;
-      }
-      // Updateholder
-      if (this.hldrs[i]) {
-        delete this.hldrs[i];
-        this.hldrs[i + 1] = this.opts.placeholder;
-      }
-      // Update value
-      this.val = utils.addChars(this.val, chr, i);
-    };
-    //
-    // @private
-    // Create a patternSpec for passing into patternMatcher that
-    // has exactly one catch all pattern.
-    //
-    Formatter.prototype._specFromSinglePattern = function (patternStr) {
-      return [{ '*': patternStr }];
-    };
-    // Expose
-    return Formatter;
-  }(patternMatcher, inptSel, utils);
-
-
-
-// A really lightweight plugin wrapper around the constructor,
-// preventing against multiple instantiations
-var pluginName = 'formatter';
-
-$.fn[pluginName] = function (options) {
-
-  // Initiate plugin if options passed
-  if (typeof options == 'object') {
-    this.each(function () {
-      if (!$.data(this, 'plugin_' + pluginName)) {
-        $.data(this, 'plugin_' + pluginName,
-        new formatter(this, options));
-      }
-    });
-  }
-
-  // Add resetPattern method to plugin
-  this.resetPattern = function (str) {
-    this.each(function () {
-      var formatted = $.data(this, 'plugin_' + pluginName);
-      // resetPattern for instance
-      if (formatted) { formatted.resetPattern(str); }
-    });
-    // Chainable please
-    return this;
-  };
-
-  // Chainable please
-  return this;
-};
-
-$.fn[pluginName].addInptType = function (chr, regexp) {
-  formatter.addInptType(chr, regexp);
-};
-
-
-}));
\ No newline at end of file
diff --git a/docs/javascripts/formatter.min.js b/docs/javascripts/formatter.min.js
deleted file mode 100644
index 1b78053..0000000
--- a/docs/javascripts/formatter.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(a,b){"function"==typeof define&&define.amd?define([],function(){return a.returnExportsGlobal=b()}):"object"==typeof exports?module.exports=b():a.Formatter=b()}(this,function(){var a=function(){var a={},b=4,c=new RegExp("{{([^}]+)}}","g"),d=function(a){for(var b,d=[];b=c.exec(a);)d.push(b);return d};return a.parse=function(a){var c={inpts:{},chars:{}},e=d(a),f=a.length,g=0,h=0,i=0,j=function(a){for(var d=a.length,e=0;d>e;e++)c.inpts[h]=a.charAt(e),h++;g++,i+=a.length+b-1};for(i;f>i;i++)g<e.length&&i===e[g].index?j(e[g][1]):c.chars[i-g*b]=a.charAt(i);return c.mLength=i-g*b,c},a}(),b=function(){{var a={};"undefined"!=typeof navigator?navigator.userAgent:null}return a.extend=function(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])a[c]=arguments[b][c];return a},a.addChars=function(a,b,c){return a.substr(0,c)+b+a.substr(c,a.length)},a.removeChars=function(a,b,c){return a.substr(0,b)+a.substr(c,a.length)},a.isBetween=function(a,b){return b.sort(function(a,b){return a-b}),a>b[0]&&a<b[1]},a.addListener=function(a,b,c){return"undefined"!=typeof a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent("on"+b,c)},a.preventDefault=function(a){return a.preventDefault?a.preventDefault():a.returnValue=!1},a.getClip=function(a){return a.clipboardData?a.clipboardData.getData("Text"):window.clipboardData?window.clipboardData.getData("Text"):void 0},a.getMatchingKey=function(a,b,c){for(var d in c){var e=c[d];if(a===e.which&&b===e.keyCode)return d}},a.isDelKeyDown=function(b,c){var d={backspace:{which:8,keyCode:8},"delete":{which:46,keyCode:46}};return a.getMatchingKey(b,c,d)},a.isDelKeyPress=function(b,c){var d={backspace:{which:8,keyCode:8,shiftKey:!1},"delete":{which:0,keyCode:46}};return a.getMatchingKey(b,c,d)},a.isSpecialKeyPress=function(b,c){var d={tab:{which:0,keyCode:9},enter:{which:13,keyCode:13},end:{which:0,keyCode:35},home:{which:0,keyCode:36},leftarrow:{which:0,keyCode:37},uparrow:{which:0,keyCode:38},rightarrow:{which:0,keyCode:39},downarrow:{which:0,keyCode:40},F5:{which:116,keyCode:116}};return a.getMatchingKey(b,c,d)},a.isModifier=function(a){return a.ctrlKey||a.altKey||a.metaKey},a.forEach=function(a,b,c){if(a.hasOwnProperty("length"))for(var d=0,e=a.length;e>d&&b.call(c,a[d],d,a)!==!1;d++);else for(var f in a)if(a.hasOwnProperty(f)&&b.call(c,a[f],f,a)===!1)break},a}(),c=function(a,b){function c(c){var e=[],f=[];b.forEach(c,function(c){b.forEach(c,function(b,c){var g=a.parse(b),h=d(c);return e.push(h),f.push(g),!1})});var g=function(a){var c;return b.forEach(e,function(b,d){return b.test(a)?(c=d,!1):void 0}),void 0===c?null:f[c]};return{getPattern:g,patterns:f,matchers:e}}var d=function(a){return"*"===a?/.*/:new RegExp(a)};return c}(a,b),d=function(){var a={};return a.get=function(a){if("number"==typeof a.selectionStart)return{begin:a.selectionStart,end:a.selectionEnd};var b=document.selection.createRange();if(b&&b.parentElement()===a){var c=a.createTextRange(),d=a.createTextRange(),e=a.value.length;return c.moveToBookmark(b.getBookmark()),d.collapse(!1),c.compareEndPoints("StartToEnd",d)>-1?{begin:e,end:e}:{begin:-c.moveStart("character",-e),end:-c.moveEnd("character",-e)}}return{begin:0,end:0}},a.set=function(a,b){if("object"!=typeof b&&(b={begin:b,end:b}),a.setSelectionRange)a.focus(),a.setSelectionRange(b.begin,b.end);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b.end),c.moveStart("character",b.begin),c.select()}},a}(),e=function(a,b,c){function d(b,d){var f=this;if(f.el=b,!f.el)throw new TypeError("Must provide an existing element");if(f.opts=c.extend({},e,d),"undefined"!=typeof f.opts.pattern&&(f.opts.patterns=f._specFromSinglePattern(f.opts.pattern),delete f.opts.pattern),"undefined"==typeof f.opts.patterns)throw new TypeError("Must provide a pattern or array of patterns");f.patternMatcher=a(f.opts.patterns),f._updatePattern(),f.hldrs={},f.focus=0,c.addListener(f.el,"keydown",function(a){f._keyDown(a)}),c.addListener(f.el,"keypress",function(a){f._keyPress(a)}),c.addListener(f.el,"paste",function(a){f._paste(a)}),f.opts.persistent&&(f._processKey("",!1),f.el.blur(),c.addListener(f.el,"focus",function(a){f._focus(a)}),c.addListener(f.el,"click",function(a){f._focus(a)}),c.addListener(f.el,"touchstart",function(a){f._focus(a)}))}var e={persistent:!1,repeat:!1,placeholder:" "},f={9:/[0-9]/,a:/[A-Za-z]/,"*":/[A-Za-z0-9]/};return d.addInptType=function(a,b){f[a]=b},d.prototype.resetPattern=function(c){this.opts.patterns=c?this._specFromSinglePattern(c):this.opts.patterns,this.sel=b.get(this.el),this.val=this.el.value,this.delta=0,this._removeChars(),this.patternMatcher=a(this.opts.patterns);var d=this.patternMatcher.getPattern(this.val);this.mLength=d.mLength,this.chars=d.chars,this.inpts=d.inpts,this._processKey("",!1,!0)},d.prototype._updatePattern=function(){var a=this.patternMatcher.getPattern(this.val);a&&(this.mLength=a.mLength,this.chars=a.chars,this.inpts=a.inpts)},d.prototype._keyDown=function(a){var b=a.which||a.keyCode;return b&&c.isDelKeyDown(a.which,a.keyCode)?(this._processKey(null,b),c.preventDefault(a)):void 0},d.prototype._keyPress=function(a){var b,d;return b=a.which||a.keyCode,d=c.isSpecialKeyPress(a.which,a.keyCode),c.isDelKeyPress(a.which,a.keyCode)||d||c.isModifier(a)?void 0:(this._processKey(String.fromCharCode(b),!1),c.preventDefault(a))},d.prototype._paste=function(a){return this._processKey(c.getClip(a),!1),c.preventDefault(a)},d.prototype._focus=function(){var a=this;setTimeout(function(){var c=b.get(a.el),d=c.end>a.focus,e=0===c.end;(d||e)&&b.set(a.el,a.focus)},0)},d.prototype._processKey=function(a,d,e){if(this.sel=b.get(this.el),this.val=this.el.value,this.delta=0,this.sel.begin!==this.sel.end)this.delta=-1*Math.abs(this.sel.begin-this.sel.end),this.val=c.removeChars(this.val,this.sel.begin,this.sel.end);else if(d&&46===d)this._delete();else if(d&&this.sel.begin-1>=0)this.val=c.removeChars(this.val,this.sel.end-1,this.sel.end),this.delta-=1;else if(d)return!0;d||(this.val=c.addChars(this.val,a,this.sel.begin),this.delta+=a.length),this._formatValue(e)},d.prototype._delete=function(){for(;this.chars[this.sel.begin];)this._nextPos();this.sel.begin<this.val.length&&(this._nextPos(),this.val=c.removeChars(this.val,this.sel.end-1,this.sel.end),this.delta=-1)},d.prototype._nextPos=function(){this.sel.end++,this.sel.begin++},d.prototype._formatValue=function(a){this.newPos=this.sel.end+this.delta,this._removeChars(),this._updatePattern(),this._validateInpts(),this._addChars(),this.el.value=this.val.substr(0,this.mLength),("undefined"==typeof a||a===!1)&&b.set(this.el,this.newPos)},d.prototype._removeChars=function(){this.sel.end>this.focus&&(this.delta+=this.sel.end-this.focus);for(var a=0,b=0;b<=this.mLength;b++){var d,e=this.chars[b],f=this.hldrs[b],g=b+a;g=b>=this.sel.begin?g+this.delta:g,d=this.val.charAt(g),(e&&e===d||f&&f===d)&&(this.val=c.removeChars(this.val,g,g+1),a--)}this.hldrs={},this.focus=this.val.length},d.prototype._validateInpts=function(){for(var a=0;a<this.val.length;a++){var b=this.inpts[a],d=!f[b],e=!d&&!f[b].test(this.val.charAt(a)),g=this.inpts[a];(d||e)&&g&&(this.val=c.removeChars(this.val,a,a+1),this.focusStart--,this.newPos--,this.delta--,a--)}},d.prototype._addChars=function(){if(this.opts.persistent){for(var a=0;a<=this.mLength;a++)this.val.charAt(a)||(this.val=c.addChars(this.val,this.opts.placeholder,a),this.hldrs[a]=this.opts.placeholder),this._addChar(a);for(;this.chars[this.focus];)this.focus++}else for(var b=0;b<=this.val.length;b++){if(this.delta<=0&&b===this.focus)return!0;this._addChar(b)}},d.prototype._addChar=function(a){var b=this.chars[a];return b?(c.isBetween(a,[this.sel.begin-1,this.newPos+1])&&(this.newPos++,this.delta++),a<=this.focus&&this.focus++,this.hldrs[a]&&(delete this.hldrs[a],this.hldrs[a+1]=this.opts.placeholder),void(this.val=c.addChars(this.val,b,a))):!0},d.prototype._specFromSinglePattern=function(a){return[{"*":a}]},d}(c,d,b);return e});
\ No newline at end of file
diff --git a/docs/javascripts/jquery.formatter.min.js b/docs/javascripts/jquery.formatter.min.js
deleted file mode 100644
index 7001b39..0000000
--- a/docs/javascripts/jquery.formatter.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(a,b){"function"==typeof define&&define.amd?define(["jQuery"],b):b("object"==typeof exports?require("jQuery"):a.jQuery)}(this,function(){var a=function(){var a={},b=4,c=new RegExp("{{([^}]+)}}","g"),d=function(a){for(var b,d=[];b=c.exec(a);)d.push(b);return d};return a.parse=function(a){var c={inpts:{},chars:{}},e=d(a),f=a.length,g=0,h=0,i=0,j=function(a){for(var d=a.length,e=0;d>e;e++)c.inpts[h]=a.charAt(e),h++;g++,i+=a.length+b-1};for(i;f>i;i++)g<e.length&&i===e[g].index?j(e[g][1]):c.chars[i-g*b]=a.charAt(i);return c.mLength=i-g*b,c},a}(),b=function(){{var a={};"undefined"!=typeof navigator?navigator.userAgent:null}return a.extend=function(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])a[c]=arguments[b][c];return a},a.addChars=function(a,b,c){return a.substr(0,c)+b+a.substr(c,a.length)},a.removeChars=function(a,b,c){return a.substr(0,b)+a.substr(c,a.length)},a.isBetween=function(a,b){return b.sort(function(a,b){return a-b}),a>b[0]&&a<b[1]},a.addListener=function(a,b,c){return"undefined"!=typeof a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent("on"+b,c)},a.preventDefault=function(a){return a.preventDefault?a.preventDefault():a.returnValue=!1},a.getClip=function(a){return a.clipboardData?a.clipboardData.getData("Text"):window.clipboardData?window.clipboardData.getData("Text"):void 0},a.getMatchingKey=function(a,b,c){for(var d in c){var e=c[d];if(a===e.which&&b===e.keyCode)return d}},a.isDelKeyDown=function(b,c){var d={backspace:{which:8,keyCode:8},"delete":{which:46,keyCode:46}};return a.getMatchingKey(b,c,d)},a.isDelKeyPress=function(b,c){var d={backspace:{which:8,keyCode:8,shiftKey:!1},"delete":{which:0,keyCode:46}};return a.getMatchingKey(b,c,d)},a.isSpecialKeyPress=function(b,c){var d={tab:{which:0,keyCode:9},enter:{which:13,keyCode:13},end:{which:0,keyCode:35},home:{which:0,keyCode:36},leftarrow:{which:0,keyCode:37},uparrow:{which:0,keyCode:38},rightarrow:{which:0,keyCode:39},downarrow:{which:0,keyCode:40},F5:{which:116,keyCode:116}};return a.getMatchingKey(b,c,d)},a.isModifier=function(a){return a.ctrlKey||a.altKey||a.metaKey},a.forEach=function(a,b,c){if(a.hasOwnProperty("length"))for(var d=0,e=a.length;e>d&&b.call(c,a[d],d,a)!==!1;d++);else for(var f in a)if(a.hasOwnProperty(f)&&b.call(c,a[f],f,a)===!1)break},a}(),c=function(a,b){function c(c){var e=[],f=[];b.forEach(c,function(c){b.forEach(c,function(b,c){var g=a.parse(b),h=d(c);return e.push(h),f.push(g),!1})});var g=function(a){var c;return b.forEach(e,function(b,d){return b.test(a)?(c=d,!1):void 0}),void 0===c?null:f[c]};return{getPattern:g,patterns:f,matchers:e}}var d=function(a){return"*"===a?/.*/:new RegExp(a)};return c}(a,b),d=function(){var a={};return a.get=function(a){if("number"==typeof a.selectionStart)return{begin:a.selectionStart,end:a.selectionEnd};var b=document.selection.createRange();if(b&&b.parentElement()===a){var c=a.createTextRange(),d=a.createTextRange(),e=a.value.length;return c.moveToBookmark(b.getBookmark()),d.collapse(!1),c.compareEndPoints("StartToEnd",d)>-1?{begin:e,end:e}:{begin:-c.moveStart("character",-e),end:-c.moveEnd("character",-e)}}return{begin:0,end:0}},a.set=function(a,b){if("object"!=typeof b&&(b={begin:b,end:b}),a.setSelectionRange)a.focus(),a.setSelectionRange(b.begin,b.end);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b.end),c.moveStart("character",b.begin),c.select()}},a}(),e=function(a,b,c){function d(b,d){var f=this;if(f.el=b,!f.el)throw new TypeError("Must provide an existing element");if(f.opts=c.extend({},e,d),"undefined"!=typeof f.opts.pattern&&(f.opts.patterns=f._specFromSinglePattern(f.opts.pattern),delete f.opts.pattern),"undefined"==typeof f.opts.patterns)throw new TypeError("Must provide a pattern or array of patterns");f.patternMatcher=a(f.opts.patterns),f._updatePattern(),f.hldrs={},f.focus=0,c.addListener(f.el,"keydown",function(a){f._keyDown(a)}),c.addListener(f.el,"keypress",function(a){f._keyPress(a)}),c.addListener(f.el,"paste",function(a){f._paste(a)}),f.opts.persistent&&(f._processKey("",!1),f.el.blur(),c.addListener(f.el,"focus",function(a){f._focus(a)}),c.addListener(f.el,"click",function(a){f._focus(a)}),c.addListener(f.el,"touchstart",function(a){f._focus(a)}))}var e={persistent:!1,repeat:!1,placeholder:" "},f={9:/[0-9]/,a:/[A-Za-z]/,"*":/[A-Za-z0-9]/};return d.addInptType=function(a,b){f[a]=b},d.prototype.resetPattern=function(c){this.opts.patterns=c?this._specFromSinglePattern(c):this.opts.patterns,this.sel=b.get(this.el),this.val=this.el.value,this.delta=0,this._removeChars(),this.patternMatcher=a(this.opts.patterns);var d=this.patternMatcher.getPattern(this.val);this.mLength=d.mLength,this.chars=d.chars,this.inpts=d.inpts,this._processKey("",!1,!0)},d.prototype._updatePattern=function(){var a=this.patternMatcher.getPattern(this.val);a&&(this.mLength=a.mLength,this.chars=a.chars,this.inpts=a.inpts)},d.prototype._keyDown=function(a){var b=a.which||a.keyCode;return b&&c.isDelKeyDown(a.which,a.keyCode)?(this._processKey(null,b),c.preventDefault(a)):void 0},d.prototype._keyPress=function(a){var b,d;return b=a.which||a.keyCode,d=c.isSpecialKeyPress(a.which,a.keyCode),c.isDelKeyPress(a.which,a.keyCode)||d||c.isModifier(a)?void 0:(this._processKey(String.fromCharCode(b),!1),c.preventDefault(a))},d.prototype._paste=function(a){return this._processKey(c.getClip(a),!1),c.preventDefault(a)},d.prototype._focus=function(){var a=this;setTimeout(function(){var c=b.get(a.el),d=c.end>a.focus,e=0===c.end;(d||e)&&b.set(a.el,a.focus)},0)},d.prototype._processKey=function(a,d,e){if(this.sel=b.get(this.el),this.val=this.el.value,this.delta=0,this.sel.begin!==this.sel.end)this.delta=-1*Math.abs(this.sel.begin-this.sel.end),this.val=c.removeChars(this.val,this.sel.begin,this.sel.end);else if(d&&46===d)this._delete();else if(d&&this.sel.begin-1>=0)this.val=c.removeChars(this.val,this.sel.end-1,this.sel.end),this.delta-=1;else if(d)return!0;d||(this.val=c.addChars(this.val,a,this.sel.begin),this.delta+=a.length),this._formatValue(e)},d.prototype._delete=function(){for(;this.chars[this.sel.begin];)this._nextPos();this.sel.begin<this.val.length&&(this._nextPos(),this.val=c.removeChars(this.val,this.sel.end-1,this.sel.end),this.delta=-1)},d.prototype._nextPos=function(){this.sel.end++,this.sel.begin++},d.prototype._formatValue=function(a){this.newPos=this.sel.end+this.delta,this._removeChars(),this._updatePattern(),this._validateInpts(),this._addChars(),this.el.value=this.val.substr(0,this.mLength),("undefined"==typeof a||a===!1)&&b.set(this.el,this.newPos)},d.prototype._removeChars=function(){this.sel.end>this.focus&&(this.delta+=this.sel.end-this.focus);for(var a=0,b=0;b<=this.mLength;b++){var d,e=this.chars[b],f=this.hldrs[b],g=b+a;g=b>=this.sel.begin?g+this.delta:g,d=this.val.charAt(g),(e&&e===d||f&&f===d)&&(this.val=c.removeChars(this.val,g,g+1),a--)}this.hldrs={},this.focus=this.val.length},d.prototype._validateInpts=function(){for(var a=0;a<this.val.length;a++){var b=this.inpts[a],d=!f[b],e=!d&&!f[b].test(this.val.charAt(a)),g=this.inpts[a];(d||e)&&g&&(this.val=c.removeChars(this.val,a,a+1),this.focusStart--,this.newPos--,this.delta--,a--)}},d.prototype._addChars=function(){if(this.opts.persistent){for(var a=0;a<=this.mLength;a++)this.val.charAt(a)||(this.val=c.addChars(this.val,this.opts.placeholder,a),this.hldrs[a]=this.opts.placeholder),this._addChar(a);for(;this.chars[this.focus];)this.focus++}else for(var b=0;b<=this.val.length;b++){if(this.delta<=0&&b===this.focus)return!0;this._addChar(b)}},d.prototype._addChar=function(a){var b=this.chars[a];return b?(c.isBetween(a,[this.sel.begin-1,this.newPos+1])&&(this.newPos++,this.delta++),a<=this.focus&&this.focus++,this.hldrs[a]&&(delete this.hldrs[a],this.hldrs[a+1]=this.opts.placeholder),void(this.val=c.addChars(this.val,b,a))):!0},d.prototype._specFromSinglePattern=function(a){return[{"*":a}]},d}(c,d,b),f="formatter";$.fn[f]=function(a){return"object"==typeof a&&this.each(function(){$.data(this,"plugin_"+f)||$.data(this,"plugin_"+f,new e(this,a))}),this.resetPattern=function(a){return this.each(function(){var b=$.data(this,"plugin_"+f);b&&b.resetPattern(a)}),this},this},$.fn[f].addInptType=function(a,b){e.addInptType(a,b)}});
\ No newline at end of file
diff --git a/docs/index.md b/index.md
similarity index 100%
rename from docs/index.md
rename to index.md
diff --git a/docs/javascripts/formatter.js b/javascripts/formatter.js
similarity index 100%
rename from docs/javascripts/formatter.js
rename to javascripts/formatter.js
diff --git a/dist/formatter.min.js b/javascripts/formatter.min.js
similarity index 100%
rename from dist/formatter.min.js
rename to javascripts/formatter.min.js
diff --git a/docs/javascripts/jquery.formatter.js b/javascripts/jquery.formatter.js
similarity index 100%
rename from docs/javascripts/jquery.formatter.js
rename to javascripts/jquery.formatter.js
diff --git a/dist/jquery.formatter.min.js b/javascripts/jquery.formatter.min.js
similarity index 100%
rename from dist/jquery.formatter.min.js
rename to javascripts/jquery.formatter.min.js
diff --git a/docs/javascripts/scale.fix.js b/javascripts/scale.fix.js
similarity index 100%
rename from docs/javascripts/scale.fix.js
rename to javascripts/scale.fix.js
diff --git a/package.json b/package.json
deleted file mode 100644
index fa5ac83..0000000
--- a/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "name": "formatter.js",
-  "version": "0.1.5",
-  "description": "Format user input to match a specified pattern",
-  "author": "Jarid Margolin <jarid@firstopinion.com>",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/firstopinion/formatter.js"
-  },
-  "bugs": {
-    "url": "https://github.com/easy-js/easy-amdtest/issues"
-  },
-  "scripts": {
-    "test": "grunt test"
-  },
-  "main": "./dist/common/formatter.js",
-  "devDependencies": {
-    "amdclean": "~1.5.0",
-    "grunt": "~0.4.3",
-    "grunt-contrib-clean": "~0.5.0",
-    "grunt-contrib-concat": "~0.4.0",
-    "grunt-contrib-connect": "~0.7.1",
-    "grunt-contrib-copy": "~0.5.0",
-    "grunt-contrib-jshint": "~0.10.0",
-    "grunt-contrib-nodefy": "~0.2.1",
-    "grunt-contrib-requirejs": "~0.4.1",
-    "grunt-contrib-uglify": "~0.4.0",
-    "grunt-contrib-watch": "~0.6.1",
-    "grunt-gh-pages": "~0.9.1",
-    "grunt-jekyll": "~0.4.2",
-    "grunt-mocha-phantomjs": "~0.5.0",
-    "grunt-saucelabs": "~5.1.0",
-    "grunt-umd": "~1.7.3",
-    "grunt-wrap": "~0.3.0",
-    "matchdep": "~0.3.0",
-    "mocha": "~1.18.2",
-    "proclaim": "~2.0.0",
-    "sinon": "~1.9.0"
-  },
-  "license": "MIT"
-}
diff --git a/src/formatter.js b/src/formatter.js
deleted file mode 100644
index c17e714..0000000
--- a/src/formatter.js
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * formatter.js
- *
- * Class used to format input based on passed pattern
- *
- */
-
-define([
-  'pattern-matcher',
-  'inpt-sel',
-  'utils'
-], function (patternMatcher, inptSel, utils) {
-
-
-// Defaults
-var defaults = {
-  persistent: false,
-  repeat: false,
-  placeholder: ' '
-};
-
-// Regexs for input validation
-var inptRegs = {
-  '9': /[0-9]/,
-  'a': /[A-Za-z]/,
-  '*': /[A-Za-z0-9]/
-};
-
-//
-// Class Constructor - Called with new Formatter(el, opts)
-// Responsible for setting up required instance variables, and
-// attaching the event listener to the element.
-//
-function Formatter(el, opts) {
-  // Cache this
-  var self = this;
-
-  // Make sure we have an element. Make accesible to instance
-  self.el = el;
-  if (!self.el) {
-    throw new TypeError('Must provide an existing element');
-  }
-
-  // Merge opts with defaults
-  self.opts = utils.extend({}, defaults, opts);
-
-  // 1 pattern is special case
-  if (typeof self.opts.pattern !== 'undefined') {
-    self.opts.patterns = self._specFromSinglePattern(self.opts.pattern);
-    delete self.opts.pattern;
-  }
-
-  // Make sure we have valid opts
-  if (typeof self.opts.patterns === 'undefined') {
-    throw new TypeError('Must provide a pattern or array of patterns');
-  }
-
-  self.patternMatcher = patternMatcher(self.opts.patterns);
-
-  // Upate pattern with initial value
-  self._updatePattern();
-
-  // Init values
-  self.hldrs = {};
-  self.focus = 0;
-
-  // Add Listeners
-  utils.addListener(self.el, 'keydown', function (evt) {
-    self._keyDown(evt);
-  });
-  utils.addListener(self.el, 'keypress', function (evt) {
-    self._keyPress(evt);
-  });
-  utils.addListener(self.el, 'paste', function (evt) {
-    self._paste(evt);
-  });
-
-  // Persistence
-  if (self.opts.persistent) {
-    // Format on start
-    self._processKey('', false);
-    self.el.blur();
-
-    // Add Listeners
-    utils.addListener(self.el, 'focus', function (evt) {
-      self._focus(evt);
-    });
-    utils.addListener(self.el, 'click', function (evt) {
-      self._focus(evt);
-    });
-    utils.addListener(self.el, 'touchstart', function (evt) {
-      self._focus(evt);
-    });
-  }
-}
-
-//
-// @public
-// Add new char
-//
-Formatter.addInptType = function (chr, reg) {
-  inptRegs[chr] = reg;
-};
-
-//
-// @public
-// Apply the given pattern to the current input without moving caret.
-//
-Formatter.prototype.resetPattern = function (str) {
-  // Update opts to hold new pattern
-  this.opts.patterns = str ? this._specFromSinglePattern(str) : this.opts.patterns;
-
-  // Get current state
-  this.sel = inptSel.get(this.el);
-  this.val = this.el.value;
-
-  // Init values
-  this.delta = 0;
-
-  // Remove all formatted chars from val
-  this._removeChars();
-
-  this.patternMatcher = patternMatcher(this.opts.patterns);
-
-  // Update pattern
-  var newPattern = this.patternMatcher.getPattern(this.val);
-  this.mLength   = newPattern.mLength;
-  this.chars     = newPattern.chars;
-  this.inpts     = newPattern.inpts;
-
-  // Format on start
-  this._processKey('', false, true);
-};
-
-//
-// @private
-// Determine correct format pattern based on input val
-//
-Formatter.prototype._updatePattern = function () {
-  // Determine appropriate pattern
-  var newPattern = this.patternMatcher.getPattern(this.val);
-
-  // Only update the pattern if there is an appropriate pattern for the value.
-  // Otherwise, leave the current pattern (and likely delete the latest character.)
-  if (newPattern) {
-    // Get info about the given pattern
-    this.mLength = newPattern.mLength;
-    this.chars   = newPattern.chars;
-    this.inpts   = newPattern.inpts;
-  }
-};
-
-//
-// @private
-// Handler called on all keyDown strokes. All keys trigger
-// this handler. Only process delete keys.
-//
-Formatter.prototype._keyDown = function (evt) {
-  // The first thing we need is the character code
-  var k = evt.which || evt.keyCode;
-
-  // If delete key
-  if (k && utils.isDelKeyDown(evt.which, evt.keyCode)) {
-    // Process the keyCode and prevent default
-    this._processKey(null, k);
-    return utils.preventDefault(evt);
-  }
-};
-
-//
-// @private
-// Handler called on all keyPress strokes. Only processes
-// character keys (as long as no modifier key is in use).
-//
-Formatter.prototype._keyPress = function (evt) {
-  // The first thing we need is the character code
-  var k, isSpecial;
-  // Mozilla will trigger on special keys and assign the the value 0
-  // We want to use that 0 rather than the keyCode it assigns.
-  k = evt.which || evt.keyCode;
-  isSpecial = utils.isSpecialKeyPress(evt.which, evt.keyCode);
-
-  // Process the keyCode and prevent default
-  if (!utils.isDelKeyPress(evt.which, evt.keyCode) && !isSpecial && !utils.isModifier(evt)) {
-    this._processKey(String.fromCharCode(k), false);
-    return utils.preventDefault(evt);
-  }
-};
-
-//
-// @private
-// Handler called on paste event.
-//
-Formatter.prototype._paste = function (evt) {
-  // Process the clipboard paste and prevent default
-  this._processKey(utils.getClip(evt), false);
-  return utils.preventDefault(evt);
-};
-
-//
-// @private
-// Handle called on focus event.
-//
-Formatter.prototype._focus = function () {
-  // Wrapped in timeout so that we can grab input selection
-  var self = this;
-  setTimeout(function () {
-    // Grab selection
-    var selection = inptSel.get(self.el);
-    // Char check
-    var isAfterStart = selection.end > self.focus,
-        isFirstChar  = selection.end === 0;
-    // If clicked in front of start, refocus to start
-    if (isAfterStart || isFirstChar) {
-      inptSel.set(self.el, self.focus);
-    }
-  }, 0);
-};
-
-//
-// @private
-// Using the provided key information, alter el value.
-//
-Formatter.prototype._processKey = function (chars, delKey, ignoreCaret) {
-  // Get current state
-  this.sel = inptSel.get(this.el);
-  this.val = this.el.value;
-
-  // Init values
-  this.delta = 0;
-
-  // If chars were highlighted, we need to remove them
-  if (this.sel.begin !== this.sel.end) {
-    this.delta = (-1) * Math.abs(this.sel.begin - this.sel.end);
-    this.val   = utils.removeChars(this.val, this.sel.begin, this.sel.end);
-  }
-
-  // Delete key (moves opposite direction)
-  else if (delKey && delKey === 46) {
-    this._delete();
-
-  // or Backspace and not at start
-  } else if (delKey && this.sel.begin - 1 >= 0) {
-
-    // Always have a delta of at least -1 for the character being deleted.
-    this.val = utils.removeChars(this.val, this.sel.end -1, this.sel.end);
-    this.delta -= 1;
-
-  // or Backspace and at start - exit
-  } else if (delKey) {
-    return true;
-  }
-
-  // If the key is not a del key, it should convert to a str
-  if (!delKey) {
-    // Add char at position and increment delta
-    this.val = utils.addChars(this.val, chars, this.sel.begin);
-    this.delta += chars.length;
-  }
-
-  // Format el.value (also handles updating caret position)
-  this._formatValue(ignoreCaret);
-};
-
-//
-// @private
-// Deletes the character in front of it
-//
-Formatter.prototype._delete = function () {
-  // Adjust focus to make sure its not on a formatted char
-  while (this.chars[this.sel.begin]) {
-    this._nextPos();
-  }
-
-  // As long as we are not at the end
-  if (this.sel.begin < this.val.length) {
-    // We will simulate a delete by moving the caret to the next char
-    // and then deleting
-    this._nextPos();
-    this.val = utils.removeChars(this.val, this.sel.end -1, this.sel.end);
-    this.delta = -1;
-  }
-};
-
-//
-// @private
-// Quick helper method to move the caret to the next pos
-//
-Formatter.prototype._nextPos = function () {
-  this.sel.end ++;
-  this.sel.begin ++;
-};
-
-//
-// @private
-// Alter element value to display characters matching the provided
-// instance pattern. Also responsible for updating
-//
-Formatter.prototype._formatValue = function (ignoreCaret) {
-  // Set caret pos
-  this.newPos = this.sel.end + this.delta;
-
-  // Remove all formatted chars from val
-  this._removeChars();
-
-  // Switch to first matching pattern based on val
-  this._updatePattern();
-
-  // Validate inputs
-  this._validateInpts();
-
-  // Add formatted characters
-  this._addChars();
-
-  // Set value and adhere to maxLength
-  this.el.value = this.val.substr(0, this.mLength);
-
-  // Set new caret position
-  if ((typeof ignoreCaret) === 'undefined' || ignoreCaret === false) {
-    inptSel.set(this.el, this.newPos);
-  }
-};
-
-//
-// @private
-// Remove all formatted before and after a specified pos
-//
-Formatter.prototype._removeChars = function () {
-  // Delta shouldn't include placeholders
-  if (this.sel.end > this.focus) {
-    this.delta += this.sel.end - this.focus;
-  }
-  
-  // Account for shifts during removal
-  var shift = 0;
-
-  // Loop through all possible char positions
-  for (var i = 0; i <= this.mLength; i++) {
-    // Get transformed position
-    var curChar = this.chars[i],
-        curHldr = this.hldrs[i],
-        pos = i + shift,
-        val;
-
-    // If after selection we need to account for delta
-    pos = (i >= this.sel.begin) ? pos + this.delta : pos;
-    val = this.val.charAt(pos);
-    // Remove char and account for shift
-    if (curChar && curChar === val || curHldr && curHldr === val) {
-      this.val = utils.removeChars(this.val, pos, pos + 1);
-      shift--;
-    }
-  }
-
-  // All hldrs should be removed now
-  this.hldrs = {};
-
-  // Set focus to last character
-  this.focus = this.val.length;
-};
-
-//
-// @private
-// Make sure all inpts are valid, else remove and update delta
-//
-Formatter.prototype._validateInpts = function () {
-  // Loop over each char and validate
-  for (var i = 0; i < this.val.length; i++) {
-    // Get char inpt type
-    var inptType = this.inpts[i];
-
-    // Checks
-    var isBadType = !inptRegs[inptType],
-        isInvalid = !isBadType && !inptRegs[inptType].test(this.val.charAt(i)),
-        inBounds  = this.inpts[i];
-
-    // Remove if incorrect and inbounds
-    if ((isBadType || isInvalid) && inBounds) {
-      this.val = utils.removeChars(this.val, i, i + 1);
-      this.focusStart--;
-      this.newPos--;
-      this.delta--;
-      i--;
-    }
-  }
-};
-
-//
-// @private
-// Loop over val and add formatted chars as necessary
-//
-Formatter.prototype._addChars = function () {
-  if (this.opts.persistent) {
-    // Loop over all possible characters
-    for (var i = 0; i <= this.mLength; i++) {
-      if (!this.val.charAt(i)) {
-        // Add placeholder at pos
-        this.val = utils.addChars(this.val, this.opts.placeholder, i);
-        this.hldrs[i] = this.opts.placeholder;
-      }
-      this._addChar(i);
-    }
-
-    // Adjust focus to make sure its not on a formatted char
-    while (this.chars[this.focus]) {
-      this.focus++;
-    }
-  } else {
-    // Avoid caching val.length, as they may change in _addChar.
-    for (var j = 0; j <= this.val.length; j++) {
-      // When moving backwards there are some race conditions where we
-      // dont want to add the character
-      if (this.delta <= 0 && (j === this.focus)) { return true; }
-
-      // Place character in current position of the formatted string.
-      this._addChar(j);
-    }
-  }
-};
-
-//
-// @private
-// Add formattted char at position
-//
-Formatter.prototype._addChar = function (i) {
-  // If char exists at position
-  var chr = this.chars[i];
-  if (!chr) { return true; }
-
-  // If chars are added in between the old pos and new pos
-  // we need to increment pos and delta
-  if (utils.isBetween(i, [this.sel.begin -1, this.newPos +1])) {
-    this.newPos ++;
-    this.delta ++;
-  }
-
-  // If character added before focus, incr
-  if (i <= this.focus) {
-    this.focus++;
-  }
-
-  // Updateholder
-  if (this.hldrs[i]) {
-    delete this.hldrs[i];
-    this.hldrs[i + 1] = this.opts.placeholder;
-  }
-
-  // Update value
-  this.val = utils.addChars(this.val, chr, i);
-};
-
-//
-// @private
-// Create a patternSpec for passing into patternMatcher that
-// has exactly one catch all pattern.
-//
-Formatter.prototype._specFromSinglePattern = function (patternStr) {
-  return [{ '*': patternStr }];
-};
-
-
-// Expose
-return Formatter;
-
-
-});
\ No newline at end of file
diff --git a/src/inpt-sel.js b/src/inpt-sel.js
deleted file mode 100644
index 9f1f771..0000000
--- a/src/inpt-sel.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * inpt-sel.js
- *
- * Cross browser implementation to get and set input selections
- *
- */
-
-
-define(function () {
-
-
-// Define module
-var inptSel = {};
-
-//
-// Get begin and end positions of selected input. Return 0's
-// if there is no selectiion data
-//
-inptSel.get = function (el) {
-  // If normal browser return with result
-  if (typeof el.selectionStart === 'number') {
-    return { 
-      begin: el.selectionStart,
-      end: el.selectionEnd
-    };
-  }
-
-  // Uh-Oh. We must be IE. Fun with TextRange!!
-  var range = document.selection.createRange();
-  // Determine if there is a selection
-  if (range && range.parentElement() === el) {
-    var inputRange = el.createTextRange(),
-        endRange   = el.createTextRange(),
-        length     = el.value.length;
-
-    // Create a working TextRange for the input selection
-    inputRange.moveToBookmark(range.getBookmark());
-
-    // Move endRange begin pos to end pos (hence endRange)
-    endRange.collapse(false);
-    
-    // If we are at the very end of the input, begin and end
-    // must both be the length of the el.value
-    if (inputRange.compareEndPoints('StartToEnd', endRange) > -1) {
-      return { begin: length, end: length };
-    }
-
-    // Note: moveStart usually returns the units moved, which 
-    // one may think is -length, however, it will stop when it
-    // gets to the begin of the range, thus giving us the
-    // negative value of the pos.
-    return {
-      begin: -inputRange.moveStart('character', -length),
-      end: -inputRange.moveEnd('character', -length)
-    };
-  }
-
-  //Return 0's on no selection data
-  return { begin: 0, end: 0 };
-};
-
-//
-// Set the caret position at a specified location
-//
-inptSel.set = function (el, pos) {
-  // Normalize pos
-  if (typeof pos !== 'object') {
-    pos = { begin: pos, end: pos };
-  }
-
-  // If normal browser
-  if (el.setSelectionRange) {
-    el.focus();
-    el.setSelectionRange(pos.begin, pos.end);
-
-  // IE = TextRange fun
-  } else if (el.createTextRange) {
-    var range = el.createTextRange();
-    range.collapse(true);
-    range.moveEnd('character', pos.end);
-    range.moveStart('character', pos.begin);
-    range.select();
-  }
-};
-
-
-// Expose
-return inptSel;
-
-
-});
\ No newline at end of file
diff --git a/src/pattern-matcher.js b/src/pattern-matcher.js
deleted file mode 100644
index 780726b..0000000
--- a/src/pattern-matcher.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-* pattern-matcher.js
-*
-* Parses a pattern specification and determines appropriate pattern for an
-* input string
-*
-*/
-
-
-define([
-  'pattern',
-  'utils'
-], function (pattern, utils) {
-
-
-//
-// Parse a matcher string into a RegExp. Accepts valid regular
-// expressions and the catchall '*'.
-// @private
-//
-var parseMatcher = function (matcher) {
-  if (matcher === '*') {
-    return /.*/;
-  }
-  return new RegExp(matcher);
-};
-
-//
-// Parse a pattern spec and return a function that returns a pattern
-// based on user input. The first matching pattern will be chosen.
-// Pattern spec format:
-// Array [
-//  Object: { Matcher(RegExp String) : Pattern(Pattern String) },
-//  ...
-// ]
-function patternMatcher (patternSpec) {
-  var matchers = [],
-    patterns = [];
-
-  // Iterate over each pattern in order.
-  utils.forEach(patternSpec, function (patternMatcher) {
-    // Process single property object to obtain pattern and matcher.
-    utils.forEach(patternMatcher, function (patternStr, matcherStr) {
-      var parsedPattern = pattern.parse(patternStr),
-        regExpMatcher = parseMatcher(matcherStr);
-
-      matchers.push(regExpMatcher);
-      patterns.push(parsedPattern);
-
-      // Stop after one iteration.
-      return false;
-    });
-  });
-
-  var getPattern = function (input) {
-    var matchedIndex;
-    utils.forEach(matchers, function (matcher, index) {
-      if (matcher.test(input)) {
-        matchedIndex = index;
-        return false;
-      }
-    });
-
-    return matchedIndex === undefined ? null : patterns[matchedIndex];
-  };
-
-  return {
-    getPattern: getPattern,
-    patterns: patterns,
-    matchers: matchers
-  };
-}
-
-
-// Expose
-return patternMatcher;
-
-
-});
\ No newline at end of file
diff --git a/src/pattern.js b/src/pattern.js
deleted file mode 100644
index 4d61efa..0000000
--- a/src/pattern.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * pattern.js
- *
- * Utilities to parse str pattern and return info
- *
- */
-
-
-define(function () {
-
-
-// Define module
-var pattern = {};
-
-// Match information
-var DELIM_SIZE = 4;
-
-// Our regex used to parse
-var regexp  = new RegExp('{{([^}]+)}}', 'g');
-
-//
-// Helper method to parse pattern str
-//
-var getMatches = function (pattern) {
-  // Populate array of matches
-  var matches = [],
-      match;
-  while(match = regexp.exec(pattern)) {
-    matches.push(match);
-  }
-
-  return matches;
-};
-
-//
-// Create an object holding all formatted characters
-// with corresponding positions
-//
-pattern.parse = function (pattern) {
-  // Our obj to populate
-  var info = { inpts: {}, chars: {} };
-
-  // Pattern information
-  var matches = getMatches(pattern),
-      pLength = pattern.length;
-
-  // Counters
-  var mCount = 0,
-      iCount = 0,
-      i = 0;
-
-  // Add inpts, move to end of match, and process
-  var processMatch = function (val) {
-    var valLength = val.length;
-    for (var j = 0; j < valLength; j++) {
-      info.inpts[iCount] = val.charAt(j);
-      iCount++;
-    }
-    mCount ++;
-    i += (val.length + DELIM_SIZE - 1);
-  };
-
-  // Process match or add chars
-  for (i; i < pLength; i++) {
-    if (mCount < matches.length && i === matches[mCount].index) {
-      processMatch(matches[mCount][1]);
-    } else {
-      info.chars[i - (mCount * DELIM_SIZE)] = pattern.charAt(i);
-    }
-  }
-
-  // Set mLength and return
-  info.mLength = i - (mCount * DELIM_SIZE);
-  return info;
-};
-
-
-// Expose
-return pattern;
-
-
-});
\ No newline at end of file
diff --git a/src/tmpls/jquery.hbs b/src/tmpls/jquery.hbs
deleted file mode 100644
index a6a791c..0000000
--- a/src/tmpls/jquery.hbs
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Uses CommonJS, AMD or browser globals to create a jQuery plugin.
-//
-// Similar to jqueryPlugin.js but also tries to
-// work in a CommonJS environment.
-// It is unlikely jQuery will run in a CommonJS
-// environment. See jqueryPlugin.js if you do
-// not want to add the extra CommonJS detection.
-//
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define({{#if amdModuleId}}'{{amdModuleId}}', {{/if}}[{{{amdDependencies}}}], factory);
-  } else if (typeof exports === 'object') {
-    factory({{{cjsDependencies}}});
-  } else {
-    // Browser globals
-    factory({{{globalDependencies}}});
-  }
-}(this, function ({{dependencies}}) {
-
-
-{{{code}}}
-
-
-// A really lightweight plugin wrapper around the constructor,
-// preventing against multiple instantiations
-var pluginName = 'formatter';
-
-$.fn[pluginName] = function (options) {
-
-  // Initiate plugin if options passed
-  if (typeof options == 'object') {
-    this.each(function () {
-      if (!$.data(this, 'plugin_' + pluginName)) {
-        $.data(this, 'plugin_' + pluginName,
-        new formatter(this, options));
-      }
-    });
-  }
-
-  // Add resetPattern method to plugin
-  this.resetPattern = function (str) {
-    this.each(function () {
-      var formatted = $.data(this, 'plugin_' + pluginName);
-      // resetPattern for instance
-      if (formatted) { formatted.resetPattern(str); }
-    });
-    // Chainable please
-    return this;
-  };
-
-  // Chainable please
-  return this;
-};
-
-$.fn[pluginName].addInptType = function (chr, regexp) {
-  formatter.addInptType(chr, regexp);
-};
-
-
-}));
\ No newline at end of file
diff --git a/src/tmpls/umd.hbs b/src/tmpls/umd.hbs
deleted file mode 100644
index 4fd3751..0000000
--- a/src/tmpls/umd.hbs
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Uses Node, AMD or browser globals to create a module. This example creates
-// a global even when AMD is used. This is useful if you have some scripts
-// that are loaded by an AMD loader, but they still want access to globals.
-// If you do not need to export a global for the AMD case,
-// see returnExports.js.
-//
-// If you want something that will work in other stricter CommonJS environments,
-// or if you need to create a circular dependency, see commonJsStrictGlobal.js
-//
-// Defines a module "returnExportsGlobal" that depends another module called
-// "b". Note that the name of the module is implied by the file name. It is
-// best if the file name and the exported global have matching names.
-//
-// If the 'b' module also uses this type of boilerplate, then
-// in the browser, it will create a global .b that is used below.
-//
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define({{#if amdModuleId}}'{{amdModuleId}}', {{/if}}[{{{amdDependencies}}}], function () {
-      return (root.returnExportsGlobal = factory({{{amdDependencies}}}));
-    });
-  } else if (typeof exports === 'object') {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like enviroments that support module.exports,
-    // like Node.
-    module.exports = factory({{{cjsDependencies}}});
-  } else {
-    {{#if globalAlias}}root['{{{globalAlias}}}'] = {{else}}{{#if objectToExport}}root['{{{objectToExport}}}'] = {{/if}}{{/if}}factory({{{globalDependencies}}});
-  }
-}(this, function ({{dependencies}}) {
-
-
-{{{code}}}
-{{#if objectToExport}}
-{{indent}}return {{{objectToExport}}};
-{{/if}}
-
-
-}));
\ No newline at end of file
diff --git a/src/utils.js b/src/utils.js
deleted file mode 100644
index cfe9ddc..0000000
--- a/src/utils.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * utils.js
- *
- * Independent helper methods (cross browser, etc..)
- *
- */
-
-
-define(function () {
-
-
-// Define module
-var utils = {};
-
-// Useragent info for keycode handling
-var uAgent = (typeof navigator !== 'undefined') ? navigator.userAgent : null;
-
-//
-// Shallow copy properties from n objects to destObj
-//
-utils.extend = function (destObj) {
-  for (var i = 1; i < arguments.length; i++) {
-    for (var key in arguments[i]) {
-      destObj[key] = arguments[i][key];
-    }
-  }
-  return destObj;
-};
-
-//
-// Add a given character to a string at a defined pos
-//
-utils.addChars = function (str, chars, pos) {
-  return str.substr(0, pos) + chars + str.substr(pos, str.length);
-};
-
-//
-// Remove a span of characters
-//
-utils.removeChars = function (str, start, end) {
-  return str.substr(0, start) + str.substr(end, str.length);
-};
-
-//
-// Return true/false is num false between bounds
-//
-utils.isBetween = function (num, bounds) {
-  bounds.sort(function(a,b) { return a-b; });
-  return (num > bounds[0] && num < bounds[1]);
-};
-
-//
-// Helper method for cross browser event listeners
-//
-utils.addListener = function (el, evt, handler) {
-  return (typeof el.addEventListener !== 'undefined')
-    ? el.addEventListener(evt, handler, false)
-    : el.attachEvent('on' + evt, handler);
-};
-
-//
-// Helper method for cross browser implementation of preventDefault
-//
-utils.preventDefault = function (evt) {
-  return (evt.preventDefault) ? evt.preventDefault() : (evt.returnValue = false);
-};
-
-//
-// Helper method for cross browser implementation for grabbing
-// clipboard data
-//
-utils.getClip = function (evt) {
-  if (evt.clipboardData) { return evt.clipboardData.getData('Text'); }
-  if (window.clipboardData) { return window.clipboardData.getData('Text'); }
-};
-
-//
-// Loop over object and checking for matching properties
-//
-utils.getMatchingKey = function (which, keyCode, keys) {
-  // Loop over and return if matched.
-  for (var k in keys) {
-    var key = keys[k];
-    if (which === key.which && keyCode === key.keyCode) {
-      return k;
-    }
-  }
-};
-
-//
-// Returns true/false if k is a del keyDown
-//
-utils.isDelKeyDown = function (which, keyCode) {
-  var keys = {
-    'backspace': { 'which': 8, 'keyCode': 8 },
-    'delete': { 'which': 46, 'keyCode': 46 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-//
-// Returns true/false if k is a del keyPress
-//
-utils.isDelKeyPress = function (which, keyCode) {
-  var keys = {
-    'backspace': { 'which': 8, 'keyCode': 8, 'shiftKey': false },
-    'delete': { 'which': 0, 'keyCode': 46 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-// //
-// // Determine if keydown relates to specialKey
-// //
-// utils.isSpecialKeyDown = function (which, keyCode) {
-//   var keys = {
-//     'tab': { 'which': 9, 'keyCode': 9 },
-//     'enter': { 'which': 13, 'keyCode': 13 },
-//     'end': { 'which': 35, 'keyCode': 35 },
-//     'home': { 'which': 36, 'keyCode': 36 },
-//     'leftarrow': { 'which': 37, 'keyCode': 37 },
-//     'uparrow': { 'which': 38, 'keyCode': 38 },
-//     'rightarrow': { 'which': 39, 'keyCode': 39 },
-//     'downarrow': { 'which': 40, 'keyCode': 40 },
-//     'F5': { 'which': 116, 'keyCode': 116 }
-//   };
-
-//   return utils.getMatchingKey(which, keyCode, keys);
-// };
-
-//
-// Determine if keypress relates to specialKey
-//
-utils.isSpecialKeyPress = function (which, keyCode) {
-  var keys = {
-    'tab': { 'which': 0, 'keyCode': 9 },
-    'enter': { 'which': 13, 'keyCode': 13 },
-    'end': { 'which': 0, 'keyCode': 35 },
-    'home': { 'which': 0, 'keyCode': 36 },
-    'leftarrow': { 'which': 0, 'keyCode': 37 },
-    'uparrow': { 'which': 0, 'keyCode': 38 },
-    'rightarrow': { 'which': 0, 'keyCode': 39 },
-    'downarrow': { 'which': 0, 'keyCode': 40 },
-    'F5': { 'which': 116, 'keyCode': 116 }
-  };
-
-  return utils.getMatchingKey(which, keyCode, keys);
-};
-
-//
-// Returns true/false if modifier key is held down
-//
-utils.isModifier = function (evt) {
-  return evt.ctrlKey || evt.altKey || evt.metaKey;
-};
-
-//
-// Iterates over each property of object or array.
-//
-utils.forEach = function (collection, callback, thisArg) {
-  if (collection.hasOwnProperty('length')) {
-    for (var index = 0, len = collection.length; index < len; index++) {
-      if (callback.call(thisArg, collection[index], index, collection) === false) {
-        break;
-      }
-    }
-  } else {
-    for (var key in collection) {
-      if (collection.hasOwnProperty(key)) {
-        if (callback.call(thisArg, collection[key], key, collection) === false) {
-          break;
-        }
-      }
-    }
-  }
-};
-
-
-// Expose
-return utils;
-
-
-});
\ No newline at end of file
diff --git a/docs/stylesheets/pygment_trac.css b/stylesheets/pygment_trac.css
similarity index 100%
rename from docs/stylesheets/pygment_trac.css
rename to stylesheets/pygment_trac.css
diff --git a/docs/stylesheets/styles.css b/stylesheets/styles.css
similarity index 100%
rename from docs/stylesheets/styles.css
rename to stylesheets/styles.css
diff --git a/test/_runner.html b/test/_runner.html
deleted file mode 100644
index 6364ef3..0000000
--- a/test/_runner.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <!-- meta -->
-    <meta charset="utf-8" />
-    <title>formatter.js</title>
-
-    <!-- styles -->
-    <link rel="stylesheet" href="../node_modules/mocha/mocha.css" />
-  </head>
-
-  <body>
-    <!-- content -->
-    <div id="workboard"></div>
-    <div id="mocha"></div>
-
-    <!-- templates -->
-    <script id="tmpl-input-text" type="text/tmpl">
-      <input type="text">
-    </script>
-
-    <!-- tests -->
-    <script src="../bower_components/requirejs/require.js"></script>
-    <script src="../bower_components/easy-amdtest/dist/easy-amdtest.js"></script>
-    <script>
-      var testSuite = new EasyAMDTest({
-        baseUrl: '../src',
-        urlArgs: 'bust=' + (new Date()).getTime(),
-        paths: {
-          'proclaim' : '/node_modules/proclaim/lib/proclaim',
-          'sinon'    : '/node_modules/sinon/pkg/sinon',
-          "jquery"   : '/bower_components/jquery/dist/jquery',
-          'mocha'    : '/node_modules/mocha/mocha',
-          'fakey'    : '/bower_components/fakey/dist/fakey'
-        },
-        shim: {
-          'sinon': {
-            exports: 'sinon'
-          }
-        }
-      }).run({
-        name: 'mocha',
-        tests: [
-          './utils.js',
-          './pattern.js',
-          './pattern-matcher.js',
-          './formatter.js'
-        ]
-      });
-    </script>
-  </body>
-</html>
\ No newline at end of file
diff --git a/test/formatter.js b/test/formatter.js
deleted file mode 100644
index c1aab30..0000000
--- a/test/formatter.js
+++ /dev/null
@@ -1,412 +0,0 @@
-/*!
- * test/formatter.js
- * 
- * Copyright (c) 2014 First Opinion
- */
-
-
-define([
-  'jquery',
-  'proclaim',
-  'sinon',
-  'fakey',
-  'formatter',
-  'inpt-sel',
-  'pattern-matcher',
-  'pattern',
-  'utils'
-], function ($, assert, sinon, fakey, Formatter, inptSel, utils) {
-
-
-//
-// formatter.js tests
-//
-describe('formatter.js', function () {
-
-  // Global vars
-  var $workboard = $('#workboard');
-
-  // Test vars
-  var formatted, $el, el;
-
-  // Define new inptType
-  Formatter.addInptType('D', /[A-Za-z0-9.]/);
-
-  // Add fresh element
-  beforeEach(function () {
-    var html = $('#tmpl-input-text').html();
-    $el = $(html);
-    el = $el[0];
-
-    $('#workboard').append($el);
-  });
-
-  // Remove element
-  afterEach(function () {
-    $el.remove();
-  });
-
-  //
-  // Formatter global tests
-  //
-  describe('global', function () {
-
-    // Create new instance
-    var createInstance = function (str) {
-      formatted = new Formatter($el[0], {
-        pattern: str,
-        persistent: true
-      });
-    };
-
-    it('Should set init values and merge defaults', function () {
-      createInstance('({{999}}) {{999}}-{{9999}}');
-
-      // Check opts
-      assert.equal(formatted.opts.patterns[0]['*'], '({{999}}) {{999}}-{{9999}}');
-      assert.isTrue(formatted.opts.persistent);
-      // Check pattern
-      assert.isObject(formatted.chars);
-      assert.isObject(formatted.inpts);
-      assert.isNumber(formatted.mLength);
-      // Check init values
-      assert.isObject(formatted.hldrs);
-      assert.isNumber(formatted.focus);
-    });
-
-    it('Should natively handle home, end, and arrow keys', function (done) {
-      createInstance('({{999}}) {{999}}-{{9999}}');
-
-      sinon.spy(Formatter.prototype, '_processKey');
-
-      fakey.seq(el, [
-        { key: 'leftarrow' },
-        { key: 'rightarrow' },
-        { key: 'uparrow' },
-        { key: 'downarrow' },
-        { key: 'home' },
-        { key: 'end' },
-        { key: 'enter' },
-        { key: 'tab' }
-      ], function () {
-        assert.ok(Formatter.prototype._processKey.notCalled);
-        Formatter.prototype._processKey.restore();
-        done();
-      });      
-    });
-
-    it('Should be capable of containg a period in the pattern', function (done) {
-      createInstance('http://www.{{DDDDDDDD}}');
-
-      fakey.seq(el, [
-        { str: 'abcd' },
-        { key: '.' },
-        { str: 'com'}
-      ], function () {
-        assert.equal(formatted.el.value, 'http://www.abcd.com');
-        done();
-      });      
-    });
-
-    it('Should update value when resetPattern method is called', function (done) {
-      createInstance('({{999}}) {{999}}-{{9999}}');
-
-      fakey.str(el, '24567890', function () {
-        formatted.resetPattern('{{999}}.{{999}}.{{9999}}');
-        assert.equal(formatted.el.value, '245.678.90  ');
-        done();
-      });
-    });
-
-    it('Should focus to the next available inpt position', function (done) {
-      createInstance('({{999}}) {{999}}-{{9999}}');
-
-      fakey.str(el, '1237890', function () {
-        assert.equal(formatted.focus, 11);
-        done();
-      });
-    });
-
-    it('Should not focus on a formatted char', function (done) {
-      createInstance('({{999}}) {{999}}-{{9999}}');
-
-      fakey.str(el, '123', function () {
-        assert.equal(formatted.focus, 6);
-        done();
-      });
-    });
-
-    it('Should enforce pattern maxLength', function (done) {
-      createInstance('({{999}}) {{999}}-{{9999}}');
-      
-      fakey.str(el, '12345678901', function () {
-        assert.equal(formatted.el.value, '(123) 456-7890');
-        done();
-      });
-    });
-
-    it('Should add regex inpts', function (done) {
-      Formatter.addInptType('L', /[A-Z]/);
-      createInstance('{{LLL}}');
-
-      fakey.str(el, 'AaAaA', function () {
-        assert.equal(formatted.el.value, 'AAA');
-        done();
-      });
-    });
-
-  });
-
-  //
-  // Formatter with value dependent patterns
-  //
-  describe('value dependent patterns', function () {
-
-    it('Should apply the default format', function (done) {
-      formatted = new Formatter(el, {
-        patterns: [
-          { '*': '!{{9}}' }
-        ]
-      });
-
-      fakey.key(el, '1', function () {
-        assert.equal(formatted.el.value, '!1');
-        done();
-      });
-    });
-
-    it('Should apply appropriate format based on current value', function (done) {
-      formatted = new Formatter(el, {
-        patterns: [
-          { '^0': '!{{9999}}' },
-          {  '*': '{{9999}}' }
-        ]
-      });
-
-      fakey.str(el, '0123', function () {
-        assert.equal(formatted.el.value, '!0123');
-        done();
-      });
-    });
-
-    it('Should apply the first appropriate format that matches the current value', function (done) {
-      formatted = new Formatter(el, {
-        patterns: [
-          {  '^0': 'first:{{9999}}' },
-          { '^00': 'second:{{9999}}' }
-        ]
-      });
-
-      fakey.str(el, '00', function () {
-        assert.equal(formatted.el.value, 'first:00');
-        done();
-      });
-    });
-  });
-
-  //
-  // Formatter with persistence
-  //
-  describe('persistent: true', function () {
-
-    beforeEach(function () {
-      formatted = new Formatter(el, {
-        pattern: '({{999}}) {{999}}-{{9999}}',
-        persistent: true
-      });
-    });
-
-    it('Should format chars as they are entered', function (done) {
-      fakey.str(el, '1237890', function () {
-        assert.equal(formatted.el.value, '(123) 789-0   ');
-        done();
-      });
-    });
-
-    it('Should fromat chars entered mid str', function (done) {
-      fakey.str(el, '1237890', function () {
-        inptSel.set(el, 6);
-        fakey.str(el, '456', function () {
-          assert.equal(formatted.el.value, '(123) 456-7890');
-          done();
-        });
-      });
-    });
-
-    it('Should delete chars when highlighted', function (done) {
-      fakey.str(el, '1234567890', function () {
-        inptSel.set(el, { begin: 2, end: 8 });
-        fakey.key(el, 'backspace', function () {
-          assert.equal(formatted.el.value, '(167) 890-    ');
-          done();
-        });
-      });
-    });
-
-    // it('Should handle pasting multiple characters', function (done) {
-    //   user.keySeq('167890', function () {
-    //     sel = { begin: 2, end: 2 };
-    //     user.paste('2345', function () {
-    //       assert.equal(formatted.el.value, '(123) 456-7890');
-    //       done();
-    //     });
-    //   });
-    // });
-
-    it('Should remove previous character on backspace key', function (done) {
-      fakey.str(el, '1234567890', function () {
-        inptSel.set(el, 2);
-        fakey.key(el, 'backspace', function () {
-          assert.equal(formatted.el.value, '(234) 567-890 ');
-          done();
-        });
-      });
-    });
-
-    it('Should remove characters in correct order when backspacing over a formatted character.', function (done) {
-      fakey.str(el, '1234567890', function () {
-        fakey.key(el, 'backspace', 6, function () {
-          assert.equal(formatted.el.value, '(123) 45 -    ');
-          done();
-        });
-      });
-    });
-
-    it('Should remove next character on delete key', function (done) {
-      fakey.str(el, '234567890', function () {
-        inptSel.set(el, 2);
-        fakey.key(el, 'delete', function () {
-          assert.equal(formatted.el.value, '(245) 678-90  ');
-          done();
-        });
-      });
-    });
-
-  });
-
-  //
-  // Formatter without persistence
-  //
-  describe('persistent: false', function () {
-
-    beforeEach(function () {
-      formatted = new Formatter(el, {
-        pattern: '({{999}}) {{999}}-{{9999}}'
-      });
-    });
-
-    it('Should format chars as they are entered', function (done) {
-      fakey.str(el, '1237890', function () {
-        assert.equal(formatted.el.value, '(123) 789-0');
-        done();
-      });
-    });
-
-    it('Should fromat chars entered mid str', function (done) {
-      fakey.str(el, '1237890', function () {
-        inptSel.set(el, 6);
-        fakey.str(el, '456', function () {
-          assert.equal(formatted.el.value, '(123) 456-7890');
-          done();
-        });
-      });
-    });
-
-    it('Should delete chars when highlighted', function (done) {
-      fakey.str(el, '1234567890', function () {
-        inptSel.set(el, { begin: 2, end: 8 });
-        fakey.key(el, 'backspace', function () {
-          assert.equal(formatted.el.value, '(167) 890');
-          done();
-        });
-      });
-    });
-
-    // it('Should handle pasting multiple characters', function (done) {
-    //   fakey.str(el, '167890', function () {
-    //     inptSel.set(el, 2);
-    //     user.paste('2345', function () {
-    //       assert.equal(formatted.el.value, '(123) 456-7890');
-    //       done();
-    //     });
-    //   });
-    // });
-
-    it('Should remove previous character on backspace key', function (done) {
-      fakey.str(el, '1234567890', function () {
-        inptSel.set(el, 2);
-        fakey.key(el, 'backspace', function () {
-          assert.equal(formatted.el.value, '(234) 567-890');
-          done();
-        });
-      });
-    });
-
-    it('Should remove a format character when it is the last character on backspace key', function (done) {
-      fakey.str(el, '123', function () {
-        fakey.key(el, 'backspace', function () {
-          assert.equal(formatted.el.value, '(123');
-          done();
-        });
-      });
-    });
-
-    it('Should completely empty field', function (done) {
-      fakey.key(el, '1', function () {
-        fakey.key(el, 'backspace', function () {
-          assert.equal(formatted.el.value, '');
-          done();
-        });
-      });
-    });
-
-    it('Should not add chars past focus location if deleting', function (done) {
-      fakey.str(el, '1234567', function () {
-        fakey.key(el, 'backspace', function () {
-          assert.equal(formatted.el.value, '(123) 456');
-          done();
-        });
-      });
-    });
-
-    it('Should remove next character on delete key', function (done) {
-      fakey.str(el, '234567890', function () {
-        inptSel.set(el, 2);
-        fakey.key(el, 'delete', function () {
-          assert.equal(formatted.el.value, '(245) 678-90');
-          done();
-        });
-      });
-    });
-
-    it('Should update value when resetPattern method is called', function (done) {
-      fakey.str(el, '24567890', function () {
-        formatted.resetPattern('{{999}}.{{999}}.{{9999}}');
-        assert.equal(formatted.el.value, '245.678.90');
-        done();
-      });
-    });
-
-    it('Should update value when resetPattern method is called without changing pattern', function (done) {
-      fakey.str(el, '2456789013', function () {
-        formatted.resetPattern();
-        assert.equal(formatted.el.value, '(245) 678-9013');
-        done();
-      });
-    });
-
-    it('Should not reset caret position on format', function (done) {
-      fakey.str(el, '24567890', function () {
-        formatted.resetPattern();
-        assert.equal(formatted.el.value, '(245) 678-90');
-        assert.deepEqual({ begin: 12, end: 12 }, inptSel.get(el));
-        done();
-      });
-    });
-
-  });
-
-});
-
-
-});
\ No newline at end of file
diff --git a/test/pattern-matcher.js b/test/pattern-matcher.js
deleted file mode 100644
index 54a376f..0000000
--- a/test/pattern-matcher.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*!
- * test/pattern-matcher.js
- * 
- * Copyright (c) 2014 First Opinion
- */
-
-
-define([
-  'proclaim',
-  'pattern-matcher',
-  'pattern'
-], function (assert, patternMatcher, pattern) {
-
-
-//
-// pattern-matcher.js tests
-//
-describe('pattern-matcher.js', function () {
-
-  // Pattern Strings
-  var patternStringA = '!{{*}}{{*}}',
-      patternStringB = '@{{*}}{{*}}';
-
-  // Parsed Patterns
-  var patternA = pattern.parse(patternStringA),
-      patternB = pattern.parse(patternStringB);
-
-  it('Should parse each matcher as a regex', function () {
-    var myPatternMatcher = patternMatcher([
-      { '^abc$': '{{*}}-{{*}}-{{*}}' }
-    ]);
-
-    assert.isTrue(myPatternMatcher.matchers[0].test('abc'));
-    assert.isFalse(myPatternMatcher.matchers[0].test('xyz'));
-  });
-
-  it('Should parse each pattern as a pattern', function () {
-    var myPatternMatcher = patternMatcher([
-      { '^abc$': '{{***}}' }
-    ]);
-
-    assert.deepEqual(myPatternMatcher.patterns[0], pattern.parse('{{***}}'));
-  });
-
-  describe('getPattern', function  () {
-
-    it('Should return the appropriate pattern for the input', function () {
-      var myPatternMatcher = patternMatcher([
-        { '^a': patternStringA },
-        { '^b': patternStringB }
-      ]);
-
-      assert.deepEqual(myPatternMatcher.getPattern('a'), patternA);
-      assert.deepEqual(myPatternMatcher.getPattern('abc'), patternA);
-      assert.deepEqual(myPatternMatcher.getPattern('bac'), patternB);
-    });
-
-    it('Should return the first matching pattern', function () {
-      var myPatternMatcher = patternMatcher([
-        { '^a': patternStringA },
-        { '.*': patternStringB }
-      ]);
-
-      assert.deepEqual(myPatternMatcher.getPattern('a'), patternA);
-      assert.deepEqual(myPatternMatcher.getPattern('aa'), patternA);
-    });
-
-    it('Should return the wildcard pattern "*" if no other matches', function () {
-      var myPatternMatcher = patternMatcher([
-        { 'wont-match': patternStringA },
-        { '*': patternStringB }
-      ]);
-
-      assert.deepEqual(myPatternMatcher.getPattern('a'), patternB);
-    });
-
-    it('Should return null if no pattern matches', function () {
-      var myPatternMatcher = patternMatcher([
-        { 'wont-match': patternStringA },
-        { '*': patternStringB }
-      ]);
-
-      assert.deepEqual(myPatternMatcher.getPattern('a'), patternB);
-    });
-
-  });
-
-});
-
-
-});
\ No newline at end of file
diff --git a/test/pattern.js b/test/pattern.js
deleted file mode 100644
index 8a6d81e..0000000
--- a/test/pattern.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*!
- * test/pattern.js
- * 
- * Copyright (c) 2014 First Opinion
- */
-
-
-define([
-  'proclaim',
-  'pattern'
-], function (assert, pattern) {
-
-
-//
-// pattern.js tests
-//
-describe('pattern.js', function () {
-
-  // pattern.parse
-  // Create an object holding all formatted characters
-  // with corresponding positions
-  describe('parse', function () {
-
-    it('Should return an obj with pattern info', function () {
-      var result = pattern.parse('({{9A*}}) {{9A*}}-{{AAAA}}');
-      assert.deepEqual(result.chars, {
-        '0': '(',
-        '4': ')',
-        '5': ' ',
-        '9': '-'
-      });
-      assert.deepEqual(result.inpts, {
-        '0': '9',
-        '1': 'A',
-        '2': '*',
-        '3': '9',
-        '4': 'A',
-        '5': '*',
-        '6': 'A',
-        '7': 'A',
-        '8': 'A',
-        '9': 'A'
-      });
-      assert.equal(result.mLength, 14);
-    });
-
-    describe('edge cases', function () {
-
-      it('Should parse a pattern with a leading char', function () {
-        var result = pattern.parse('_{{**}}');
-
-        assert.deepEqual(result.chars, {
-          '0': '_'
-        });
-        assert.deepEqual(result.inpts, {
-          '0': '*',
-          '1': '*'
-        });
-        assert.equal(result.mLength, 3);
-      });
-
-      it('Should parse a pattern with a trailing char', function () {
-        var result = pattern.parse('{{**}}_');
-
-        assert.deepEqual(result.chars, {
-          '2': '_'
-        });
-        assert.deepEqual(result.inpts, {
-          '0': '*',
-          '1': '*'
-        });
-        assert.equal(result.mLength, 3);
-      });
-
-    });
-    
-  });
-
-});
-
-
-});
\ No newline at end of file
diff --git a/test/utils.js b/test/utils.js
deleted file mode 100644
index 7edebc9..0000000
--- a/test/utils.js
+++ /dev/null
@@ -1,167 +0,0 @@
-/*!
- * test/utils.js
- * 
- * Copyright (c) 2014 First Opinion
- */
-
-
-define([
-  'proclaim',
-  'utils'
-], function (assert, utils) {
-
-
-//
-// utils.js tests
-//
-describe('utils.js', function () {
-
-  // utils.extend
-  // Shallow copy properties from n objects to destObj
-  describe('extend', function () {
-
-    it('Should return an obj with merged props', function () {
-      // Setup Data
-      var defaults, opts;
-      defaults = {
-        'extend'   : 'should',
-        'overwrite': 'all'
-      };
-      opts = {
-        'overwrite': 'default',
-        'values'   : 'to',
-        'the'      : 'destObj'
-      };
-
-      // Run extend
-      var result = utils.extend({}, defaults, opts);
-      // Check results
-      assert.deepEqual(result, {
-        'extend'   : 'should',
-        'overwrite': 'default',
-        'values'   : 'to',
-        'the'      : 'destObj'
-      });
-      // Make sure defaults & opts were not changed
-      assert.deepEqual({
-        'extend'   : 'should',
-        'overwrite': 'all'
-      }, defaults);
-      assert.deepEqual({
-        'overwrite': 'default',
-        'values'   : 'to',
-        'the'      : 'destObj'
-      }, opts);
-    });
-
-  });
-
-  // utils.addChars
-  // Add a given character to a string at a defined pos
-  describe('addChars', function () {
-
-    it('Should add chars to str starting at pos', function () {
-      var result = utils.addChars('add the str', 'inbetween ', 4);
-      assert.equal(result, 'add inbetween the str');
-    });
-
-  });
-
-  // utils.removeChars
-  // Remove a span of characters
-  describe('removeChars', function () {
-
-    it('Should remove span of chars', function () {
-    var result = utils.removeChars('remove uneccesary chars', 6, 17);
-      assert.equal(result, 'remove chars');
-    });
-
-  });
-
-  // utils.isBetween
-  // Return true/false is num false between bounds
-  describe('removeChars', function () {
-
-    it('Should return true when between range', function () {
-      var result = utils.isBetween(2, [1, 3]);
-      assert.isTrue(result);
-    });
-
-    it('Should return true regardless of order', function () {
-      var result = utils.isBetween(2, [3, 1]);
-      assert.isTrue(result);
-    });
-
-    it('Should return false when not between range', function () {
-      var result = utils.isBetween(4, [1, 3]);
-      assert.isFalse(result);
-    });
-
-  });
-
-
-  // utils.forEach
-  // Iterate over a collection
-  describe('forEach', function () {
-
-    it('Should iterate over an array', function () {
-      var result = [];
-      utils.forEach(['a','b','c'], function (val, key) {
-        result.push(key);
-        result.push(val);
-      });
-
-      assert.deepEqual(result, [0,'a',1,'b',2,'c']);
-    });
-
-    it('Should iterate over an object', function () {
-      var result = [];
-      utils.forEach({ 'first': 'a', second: 'b' }, function (val, key) {
-        result.push(key);
-        result.push(val);
-      });
-
-      assert.deepEqual(result, ['first', 'a', 'second', 'b']);
-    });
-
-    it('Should ignore prototypically inherited properties', function () {
-      var Parent = function () {
-        this.property = 'property';
-      };
-      Parent.prototype = { protoProperty: 'protoProperty' } ;
-
-      var result = [];
-      utils.forEach(new Parent(), function (val) {
-        result.push(val);
-      });
-
-      assert.deepEqual(result, ['property']);
-    });
-
-    it('Should stop short when callback returns false', function () {
-      var result = [];
-      utils.forEach(['a','b','c'], function (val, key) {
-        result.push(key);
-        result.push(val);
-        return false;
-      });
-
-      assert.deepEqual(result, [0,'a']);
-    });
-
-    it('Should bind the callback to the given thisArg', function () {
-      var result = [];
-      utils.forEach(['a','b','c'], function (val, key) {
-        this.push(key);
-        this.push(val);
-      }, result);
-
-      assert.deepEqual(result, [0,'a',1,'b',2,'c']);
-    });
-
-  });
-
-});
-
-
-});
\ No newline at end of file
