/*
 Masked Input plugin for jQuery
 Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
 Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
 Version: 1.2.2 (03/09/2009 22:39:06)
 */
(function(a) {
  var c = (a.browser.msie ? "paste" : "input") + ".mask";
  var b = (window.orientation != undefined);
  a.mask = {definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};
  a.fn.extend({caret:function(e, f) {
    if (this.length == 0) {
      return
    }
    if (typeof e == "number") {
      f = (typeof f == "number") ? f : e;
      return this.each(function() {
        if (this.setSelectionRange) {
          this.focus();
          this.setSelectionRange(e, f)
        }
        else {
          if (this.createTextRange) {
            var g = this.createTextRange();
            g.collapse(true);
            g.moveEnd("character", f);
            g.moveStart("character", e);
            g.select()
          }
        }
      })
    }
    else {
      if (this[0].setSelectionRange) {
        e = this[0].selectionStart;
        f = this[0].selectionEnd
      }
      else {
        if (document.selection && document.selection.createRange) {
          var d = document.selection.createRange();
          e = 0 - d.duplicate().moveStart("character", -100000);
          f = e + d.text.length
        }
      }
      return{begin:e,end:f}
    }
  },unmask:function() {
    return this.trigger("unmask")
  },mask:function(j, d) {
    if (!j && this.length > 0) {
      var f = a(this[0]);
      var g = f.data("tests");
      return a.map(f.data("buffer"),
       function(l, m) {
         return g[m] ? l : null
       }).join("")
    }
    d = a.extend({placeholder:"_",completed:null}, d);
    var k = a.mask.definitions;
    var g = [];
    var e = j.length;
    var i = null;
    var h = j.length;
    a.each(j.split(""), function(m, l) {
      if (l == "?") {
        h--;
        e = m
      }
      else {
        if (k[l]) {
          g.push(new RegExp(k[l]));
          if (i == null) {
            i = g.length - 1
          }
        }
        else {
          g.push(null)
        }
      }
    });
    return this.each(function() {
      var r = a(this);
      var m = a.map(j.split(""), function(x, y) {
        if (x != "?") {
          return k[x] ? d.placeholder : x
        }
      });
      var n = false;
      var q = r.val();
      r.data("buffer", m).data("tests", g);
      function v(x) {
        while (++x <= h && !g[x]) {
        }
        return x
      }

      function t(x) {
        while (!g[x] && --x >= 0) {
        }
        for (var y = x; y < h; y++) {
          if (g[y]) {
            m[y] = d.placeholder;
            var z = v(y);
            if (z < h && g[y].test(m[z])) {
              m[y] = m[z]
            }
            else {
              break
            }
          }
        }
        s();
        r.caret(Math.max(i, x))
      }

      function u(y) {
        for (var A = y,z = d.placeholder; A < h; A++) {
          if (g[A]) {
            var B = v(A);
            var x = m[A];
            m[A] = z;
            if (B < h && g[B].test(x)) {
              z = x
            }
            else {
              break
            }
          }
        }
      }

      function l(y) {
        var x = a(this).caret();
        var z = y.keyCode;
        n = (z < 16 || (z > 16 && z < 32) || (z > 32 && z < 41));
        if ((x.begin - x.end) != 0 && (!n || z == 8 || z == 46)) {
          w(x.begin, x.end)
        }
        if (z == 8 || z == 46 || (b && z == 127)) {
          t(x.begin + (z == 46 ? 0 : -1));
          return false
        }
        else {
          if (z == 27) {
            r.val(q);
            r.caret(0, p());
            return false
          }
        }
      }

      function o(B) {
        if (n) {
          n = false;
          return(B.keyCode == 8) ? false : null
        }
        B = B || window.event;
        var C = B.charCode || B.keyCode || B.which;
        var z = a(this).caret();
        if (B.ctrlKey || B.altKey || B.metaKey) {
          return true
        }
        else {
          if ((C >= 32 && C <= 125) || C > 186) {
            var x = v(z.begin - 1);
            if (x < h) {
              var A = String.fromCharCode(C);
              if (g[x].test(A)) {
                u(x);
                m[x] = A;
                s();
                var y = v(x);
                a(this).caret(y);
                if (d.completed && y == h) {
                  d.completed.call(r)
                }
              }
            }
          }
        }
        return false
      }

      function w(x, y) {
        for (var z = x; z < y && z < h; z++) {
          if (g[z]) {
            m[z] = d.placeholder
          }
        }
      }

      function s() {
        return r.val(m.join("")).val()
      }

      function p(y) {
        var z = r.val();
        var C = -1;
        for (var B = 0,x = 0; B < h; B++) {
          if (g[B]) {
            m[B] = d.placeholder;
            while (x++ < z.length) {
              var A = z.charAt(x - 1);
              if (g[B].test(A)) {
                m[B] = A;
                C = B;
                break
              }
            }
            if (x > z.length) {
              break
            }
          }
          else {
            if (m[B] == z[x] && B != e) {
              x++;
              C = B
            }
          }
        }
        if (!y && C + 1 < e) {
          r.val("");
          w(0, h)
        }
        else {
          if (y || C + 1 >= e) {
            s();
            if (!y) {
              r.val(r.val().substring(0, C + 1))
            }
          }
        }
        return(e ? B : i)
      }

      if (!r.attr("readonly")) {
        r.one("unmask",
         function() {
           r.unbind(".mask").removeData("buffer").removeData("tests")
         }).bind("focus.mask",
         function() {
           q = r.val();
           var x = p();
           s();
           setTimeout(function() {
             if (x == j.length) {
               r.caret(0, x)
             }
             else {
               r.caret(x)
             }
           }, 0)
         }).bind("blur.mask",
         function() {
           p();
           if (r.val() != q) {
             r.change()
           }
         }).bind("keydown.mask", l).bind("keypress.mask", o).bind(c, function() {
          setTimeout(function() {
            r.caret(p(true))
          }, 0)
        })
      }
      p()
    })
  }})
})(jQuery);
