(function($){
    $.fn.extend({
        spin: function(opt){
            return this.each(function(){
                opt = $.extend({
                    imageBasePath: '/media/images/',
                    spinBtnImage: 'spin-button.gif',
                    spinUpImage: 'spin-up.gif',
                    spinDownImage: 'spin-down.gif',
                    interval: 1,
                    max: 10000,
                    min: 0,
                    timeInterval: 500,
                    timeBlink: 200
                }, opt ||
                {});
                
                var txt = $(this);
                
                var spinBtnImage = opt.imageBasePath + opt.spinBtnImage;
                var btnSpin = new Image();
                btnSpin.src = spinBtnImage;
                var spinUpImage = opt.imageBasePath + opt.spinUpImage;
                var btnSpinUp = new Image();
                btnSpinUp.src = spinUpImage;
                var spinDownImage = opt.imageBasePath + opt.spinDownImage;
                var btnSpinDown = new Image();
                btnSpinDown.src = spinDownImage;
                
                var btn = $(document.createElement('img'));
                btn.attr('src', spinBtnImage);
                btn.css({
                    cursor: 'pointer',
                    verticalAlign: 'top',
                    padding: 0,
                    margin: 0,
                    width: 10,
                    height: 18,
                    border:'none'
                });
                txt.after(btn);
                txt.css({
                    marginRight: 0,
                    paddingRight: 0
                });
                
                function spin(vector){
                    var val = txt.val();
                    if (isNaN(val) || (val==''))
                        val = '0';
                    val = parseFloat(val) + (vector * opt.interval);
                    if (isNaN(val)){
                        val = '0';
                        txt.val(val);
                    }
                    if (opt.min != null && val < opt.min) 
                        val = opt.min;
                    if (opt.min != null && val > opt.max) 
                        val = opt.max;
                    if (val != txt.val()) {
                        txt.val(val);
                        txt.change();
                    }
                }
                
                btn.mousedown(function(e){
                    var pos = e.pageY - btn.offset().top;
                    var vector = (btn.height() / 2 > pos ? 1 : -1);
                    (function(){
                        spin(vector);
                    })();
                    return false;
                });
            });
        }
    });
})(jQuery);
