/*
* @Copyright (c) 2008 Aurelio Saraiva (aureliosaraiva@gmail.com)
* @Page http://inovaideia.com.br/maskInputMoney

* 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.
*/

/*
* @Version: 0.2
* @Release: 2008-07-25
*/
(function($) {
  $.fn.maskMoney = function(settings) {
    settings = $.extend({
      symbol: "US$",
      decimal: ".",
      precision: 2,
      thousands: ",",
      showSymbol:true
    }, settings);

    settings.symbol=settings.symbol+" ";

    return this.each(function() {
      var input=$(this);
      function money(e) {
        e=e||window.event;
        var k=e.charCode||e.keyCode||e.which;
        if (k == 8) { // tecla backspace
          preventDefault(e);
          var x = input.val().substring(0,input.val().length-1);
          input.val(maskValue(x));
          return false;
        } else if (k == 9) { // tecla tab
          return true;
        }
        if (k < 48 || k > 57) {
          preventDefault(e);
          return true;
        }
        var key = String.fromCharCode(k);  // Valor para o código da Chave
        preventDefault(e);
        input.val(maskValue(input.val()+key));
      }

      function preventDefault(e) {
        if (e.preventDefault) { //standart browsers
          e.preventDefault()
        } else { // internet explorer
          e.returnValue = false
        }
      }

      function maskValue(v) {
        v = v.replace(settings.symbol,"");
        var a = '';
        var strCheck = '0123456789';
        var len = v.length;
        var t = "";
        if (len== 0) {
          t = "0.00";
        }
        for (var i = 0; i < len; i++)
          if ((v.charAt(i) != '0') && (v.charAt(i) != settings.decimal))
            break;

        for (; i < len; i++) {
          if (strCheck.indexOf(v.charAt(i))!=-1) a+= v.charAt(i);
        }

        var n = parseFloat(a);
        n = isNaN(n) ? 0 : n/Math.pow(10, settings.precision);
        t = n.toFixed(settings.precision);

        var p, d = (t=t.split("."))[1].substr(0, settings.precision);
        for (p = (t=t[0]).length; (p-=3) >= 1;) {
          t = t.substr(0,p) + settings.thousands + t.substr(p);
        }
        return setSymbol(t+settings.decimal+d+Array(
          (settings.precision+1)-d.length).join(0));
      }

      function focusEvent() {
        if (input.val()=="") {
          input.val(setSymbol(getDefaultMask()));
        } else {
          input.val(setSymbol(input.val()));
        }
      }

      function blurEvent() {
        if (input.val()==setSymbol(getDefaultMask())) {
          input.val("");
        } else {
          input.val(input.val().replace(settings.symbol,""))
        }
      }

      function getDefaultMask() {
        var n = parseFloat("0")/Math.pow(10, settings.precision);
        return (n.toFixed(settings.precision)).replace(
          new RegExp("\\.", "g"), settings.decimal);
      }

      function setSymbol(v) {
        if (settings.showSymbol) {
          return settings.symbol+v;
        }
        return v;
      }

      input.bind("keypress",money);
      input.bind("blur",blurEvent);
      input.bind("focus",focusEvent);

      input.one("unmaskMoney",function() {
        input.unbind("focus",focusEvent);
        input.unbind("blur",blurEvent);
        input.unbind("keypress",money);
        if ($.browser.msie)
        this.onpaste= null;
        else if ($.browser.mozilla)
        this.removeEventListener('input',blurEvent,false);
      });
    });
  }

  $.fn.unmaskMoney=function() {
    return this.trigger("unmaskMoney");
  };
})(jQuery);