(function(n){typeof define=="function"&&define.amd?define(["jquery"],n):n(window.jQuery)})(function(n){n.fn.numeric=function(t,i){typeof t=="boolean"&&(t={decimal:t,negative:!0,decimalPlaces:-1}),t=t||{},typeof t.negative=="undefined"&&(t.negative=!0);var r=t.decimal===!1?"":t.decimal||".",u=t.negative===!0?!0:!1,f=typeof t.decimalPlaces=="undefined"?-1:t.decimalPlaces;return i=typeof i=="function"?i:function(){},this.data("numeric.decimal",r).data("numeric.negative",u).data("numeric.callback",i).data("numeric.decimalPlaces",f).keypress(n.fn.numeric.keypress).keyup(n.fn.numeric.keyup).blur(n.fn.numeric.blur)},n.fn.numeric.keypress=function(t){var u=n.data(this,"numeric.decimal"),h=n.data(this,"numeric.negative"),o=n.data(this,"numeric.decimalPlaces"),i=t.charCode?t.charCode:t.keyCode?t.keyCode:0,r,f;if(i==13&&this.nodeName.toLowerCase()=="input")return!0;if(i==13||i==35||i==36||i==37)return!1;if((r=!1,t.ctrlKey&&i==97||t.ctrlKey&&i==65)||t.ctrlKey&&i==120||t.ctrlKey&&i==88||t.ctrlKey&&i==99||t.ctrlKey&&i==67||t.ctrlKey&&i==122||t.ctrlKey&&i==90||t.ctrlKey&&i==118||t.ctrlKey&&i==86||t.shiftKey&&i==45)return!0;if(i<48||i>57){if(f=n(this).val(),n.inArray("-",f.split(""))!==0&&h&&i==45&&(f.length===0||parseInt(n.fn.getSelectionStart(this),10)===0))return!0;u&&i==u.charCodeAt(0)&&n.inArray(u,f.split(""))!=-1&&(r=!1),i!=8&&i!=9&&i!=13&&i!=35&&i!=36&&i!=37&&i!=39&&i!=46?r=!1:typeof t.charCode!="undefined"&&(t.keyCode==t.which&&t.which!==0?(r=!0,t.which==46&&(r=!1)):t.keyCode!==0&&t.charCode===0&&t.which===0&&(r=!0)),u&&i==u.charCodeAt(0)&&(r=n.inArray(u,f.split(""))==-1?!0:!1)}else if(r=!0,u&&o>0){var s=n.fn.getSelectionStart(this),c=n.fn.getSelectionEnd(this),e=n.inArray(u,n(this).val().split(""));s===c&&e>=0&&s>e&&n(this).val().length>e+o&&(r=!1)}return r},n.fn.numeric.keyup=function(){var i=n(this).val(),l,a,r,s,v,h,y,f,w,e;if(i&&i.length>0){var c=n.fn.getSelectionStart(this),o=n.fn.getSelectionEnd(this),u=n.data(this,"numeric.decimal"),b=n.data(this,"numeric.negative"),p=n.data(this,"numeric.decimalPlaces");for(u!==""&&u!==null&&(e=n.inArray(u,i.split("")),e===0&&(this.value="0"+i,c++,o++),e==1&&i.charAt(0)=="-"&&(this.value="-0"+i.substring(1),c++,o++),i=this.value),l=[0,1,2,3,4,5,6,7,8,9,"-",u],a=i.length,r=a-1;r>=0;r--){for(s=i.charAt(r),r!==0&&s=="-"?i=i.substring(0,r)+i.substring(r+1):r!==0||b||s!="-"||(i=i.substring(1)),v=!1,h=0;h<l.length;h++)if(s==l[h]){v=!0;break}v&&s!=" "||(i=i.substring(0,r)+i.substring(r+1))}if(y=n.inArray(u,i.split("")),y>0)for(f=a-1;f>y;f--)w=i.charAt(f),w==u&&(i=i.substring(0,f)+i.substring(f+1));u&&p>0&&(e=n.inArray(u,i.split("")),e>=0&&(i=i.substring(0,e+p+1),o=Math.min(i.length,o))),this.value=i,n.fn.setSelection(this,[c,o])}},n.fn.numeric.blur=function(){var u=n.data(this,"numeric.decimal"),f=n.data(this,"numeric.callback"),t=n.data(this,"numeric.negative"),i=this.value,r;i!==""&&(r=new RegExp("^"+(t?"-?":"")+"\\d+$|^"+(t?"-?":"")+"\\d*"+u+"\\d+$"),r.exec(i)||f.apply(this))},n.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",n.fn.numeric.keypress).unbind("keyup",n.fn.numeric.keyup).unbind("blur",n.fn.numeric.blur)},n.fn.getSelectionStart=function(n){if(n.type==="number")return undefined;if(n.createTextRange&&document.selection){var t=document.selection.createRange().duplicate();return(t.moveEnd("character",n.value.length),t.text=="")?n.value.length:Math.max(0,n.value.lastIndexOf(t.text))}try{return n.selectionStart}catch(i){return 0}},n.fn.getSelectionEnd=function(n){if(n.type==="number")return undefined;if(n.createTextRange&&document.selection){var t=document.selection.createRange().duplicate();return t.moveStart("character",-n.value.length),t.text.length}return n.selectionEnd},n.fn.setSelection=function(n,t){if(typeof t=="number"&&(t=[t,t]),t&&t.constructor==Array&&t.length==2)if(n.type==="number")n.focus();else if(n.createTextRange){var i=n.createTextRange();i.collapse(!0),i.moveStart("character",t[0]),i.moveEnd("character",t[1]-t[0]),i.select()}else{n.focus();try{n.setSelectionRange&&n.setSelectionRange(t[0],t[1])}catch(r){}}}})