(function($) {

  var convertToFloat = function(s) {
    return parseFloat(s.toString().replace(/[,\$]/g, ''));
  };

  var addDollarSignAndCommas = function(f) {
    var dollarsAndCents = f.toFixed(2).split('.')
    var dollars = dollarsAndCents[0];
    var cents = dollarsAndCents[1];
    var startIndex = dollars.length % 3;
    var out = dollars.slice(0, startIndex);
    for (var i = startIndex; i < dollars.length; i++) {
      if (((i - startIndex) % 3 == 0) && (out.length > 0)) {
        out += ',';
      }
      out += dollars.charAt(i);
    }
    return '$' + out + '.' + cents;
  };

  var formatCurrency = function(bucks) {
    if (bucks === null) {
      return bucks;
    }
    var val = convertToFloat(bucks);
    if (isNaN(val)) {
      return bucks;
    }
    return addDollarSignAndCommas(val);
  };

  $.fn.currencyValue = function() {
    var v = convertToFloat(this.val());
    return isNaN(v) ? null : v;
  };

  $.fn.formatAsCurrency = function() {
    this.each(function() {
      $(this).val(formatCurrency($(this).currencyValue()));
    })
  };

})(jQuery);
