/*
* @Copyright (c) 2008 Aurélio 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);