(function($) { $.fn.extend({ spinit: function(options) { var settings = $.extend({ min: 0, max: 100, initValue: 0, callback: null, stepInc: 1, pageInc: 10, width: 50, height: 15, btnWidth: 10, mask: '' }, options); return this.each(function() { var UP = 38; var DOWN = 40; var PAGEUP = 33; var PAGEDOWN = 34; var mouseCaptured = false; var mouseIn = false; var interval; var direction = 'none'; var isPgeInc = false; var origValue; var elValue = parseFloat($(this).val()) || 0; var value = Math.max(elValue, settings.initValue, settings.min); var el = $(this).val(value).css('width', (settings.width) + 'px').css('height', settings.height + 'px').addClass('smartspinner'); raiseCallback(value); if (settings.mask != '') el.val(settings.mask); $.fn.reset = function(val) { if (isNaN(val)) val = 0; value = Math.max(val, settings.min); $(this).val(value); raiseCallback(value); }; function setDirection(dir) { direction = dir; isPgeInc = false; switch (dir) { case 'up': setClass('up'); break; case 'down': setClass('down'); break; case 'pup': isPgeInc = true; setClass('up'); break; case 'pdown': isPgeInc = true; setClass('down'); break; case 'none': setClass(''); break; } } el.focus(function() { origValue = el.val(); }); el.focusin(function() { el.val(value); }); el.click(function(e) { mouseCaptured = true; isPgeInc = false; clearInterval(interval); onValueChange(); }); el.mouseenter(function(e) { //el.val(value); value = el.val(); if ('' == value) { value = settings.min; } }); el.mousemove(function(e) { if (e.pageX > (el.offset().left + settings.width + parseInt(el.css('padding-right'))) - settings.btnWidth) { if (e.pageY < el.offset().top + settings.height / 2) setDirection('up'); else setDirection('down'); } else setDirection('none'); }); el.mousedown(function(e) { isPgeInc = false; clearInterval(interval); interval = setInterval(onValueChange, 250); }); el.mouseup(function(e) { mouseCaptured = false; isPgeInc = false; clearInterval(interval); }); el.mouseleave(function(e) { setDirection('none'); if (settings.mask != '') el.val(settings.mask); value = el.val(); }); el.keydown(function(e) { switch (e.which) { case UP: setDirection('up'); onValueChange(); break; // Arrow Up case DOWN: setDirection('down'); onValueChange(); break; // Arrow Down case PAGEUP: setDirection('pup'); onValueChange(); break; // Page Up case PAGEDOWN: setDirection('pdown'); onValueChange(); break; // Page Down default: setDirection('none'); break; } }); el.keyup(function(e) { setDirection('none'); if ('' == el.val() || 0 == el.val()) { value = settings.min; } else { while ('0' == el.val().substr(0, 1)) { el.val( el.val().substr(1) ); } } }); el.keypress(function(e) { if (el.val() == settings.mask) el.val(value); var sText = getSelectedText(); if (sText != '') { sText = el.val().replace(sText, ''); el.val(sText); } if (e.which >= 48 && e.which <= 57) { var temp = parseFloat(el.val() + (e.which - 48)); if (temp >= settings.min && temp <= settings.max) { value = temp; raiseCallback(value); } else { e.preventDefault(); } } }); el.blur(function() { if (settings.mask == '') { if (el.val() == '') el.val(settings.min); } else { el.val(settings.mask); } value = el.val(); if (value != origValue) { el.change(); } }); el.bind("mousewheel", function(e) { if (e.wheelDelta >= 120) { setDirection('down'); onValueChange(); } else if (e.wheelDelta <= -120) { setDirection('up'); onValueChange(); } e.preventDefault(); }); if (this.addEventListener) { this.addEventListener('DOMMouseScroll', function(e) { if (e.detail > 0) { setDirection('down'); onValueChange(); } else if (e.detail < 0) { setDirection('up'); onValueChange(); } e.preventDefault(); }, false); } function raiseCallback(val) { if (settings.callback != null) settings.callback(val); } function getSelectedText() { var startPos = el.get(0).selectionStart; var endPos = el.get(0).selectionEnd; var doc = document.selection; if (doc && doc.createRange().text.length != 0) { return doc.createRange().text; } else if (!doc && el.val().substring(startPos, endPos).length != 0) { return el.val().substring(startPos, endPos); } return ''; } function setValue(a, b) { if (a >= settings.min && a <= settings.max) { value = b; } el.val(value); } function onValueChange() { if (direction == 'up') { value = parseFloat(value) + parseFloat(settings.stepInc); if (value > settings.max) value = settings.max; setValue(parseFloat(el.val()), value); } if (direction == 'down') { value = parseFloat(value) - parseFloat(settings.stepInc); if (value < settings.min) value = settings.min; setValue(parseFloat(el.val()), value); } if (direction == 'pup') { value = parseFloat(value) + parseFloat(settings.pageInc); if (value > settings.max) value = settings.max; setValue(parseFloat(el.val()), value); } if (direction == 'pdown') { value = parseFloat(value) - parseFloat(settings.pageInc); if (value < settings.min) value = settings.min; setValue(parseFloat(el.val()), value); } raiseCallback(value); } function setClass(name) { el.removeClass('up').removeClass('down'); if (name != '') el.addClass(name); } }); } }); })(jQuery);