survey/jquery/number/build/wan-spinner.js
2023-03-14 14:47:50 +01:00

114 lines
4.1 KiB
JavaScript

;
(function($, window, document, undefined) {
'use strict';
var output = function(msg) {
window.console && console.log(msg);
};
var WanSpinner = function(element, options) {
this.defaults = {
maxValue: 999,
minValue: -999,
step: 1,
start: 1,
inputWidth: 40,
plusClick: function(element, val) {
return true;
},
minusClick: function(element, val) {
return true;
},
exceptionFun: function(element, exp) {
return true;
},
valueChanged: function(element, val) {
return true;
}
};
this.options = $.extend({}, this.defaults, options);
this.options.stepLength = ((+this.options.step).toString().split('.')[1] || '').length;
this.options.stepFloat = parseInt(1 * Math.pow(10, this.options.stepLength) / this.options.step) || 1;
this.element = $(element);
this.options.exceptionFunEnable = (typeof(this.options.exceptionFun) === 'function');
this.options.plusClickEnable = (typeof(this.options.plusClick) === 'function');
this.options.minusClickEnable = (typeof(this.options.minusClick) === 'function');
this.options.valueChangedEnable = (typeof(this.options.valueChanged) === 'function');
this.element.each(function(index, dt) {
var input = $(dt).children('input');
var initValue = input.val() || this.options.start;
input.val(initValue);
});
this.element.children('input').css('width', this.options.inputWidth);
this.EXCEPTION = {
TOO_LARGE: 1,
NORMAL: 0,
TOO_SMALL: -1
};
};
WanSpinner.prototype.bind = function() {
var self = this;
$(self.element).delegate('.minus', 'click', function() {
var val;
var input = $(this).siblings('input');
if (self.options.stepFloat > 1) {
val = (+input.val() || 0) * self.options.stepFloat - self.options.step * self.options.stepFloat;
val = Math.round(val) / self.options.stepFloat;
} else {
val = (+input.val() || 0) - self.options.step;
}
val = val.toFixed(self.options.stepLength);
if (val < self.options.minValue) {
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_SMALL);
} else {
input.val(val);
self.options.minusClickEnable && self.options.minusClick($(this).parent(), val);
self.options.valueChangedEnable && self.options.valueChanged($(this).parent(), val);
}
return false;
}).delegate('.plus', 'click', function() {
var val;
var input = $(this).siblings('input');
if (self.options.stepFloat > 1) {
val = (+input.val() || 0) * self.options.stepFloat + self.options.step * self.options.stepFloat;
val = Math.round(val) / self.options.stepFloat;
} else {
val = (+input.val() || 0) + self.options.step;
}
val = val.toFixed(self.options.stepLength);
if (val > self.options.maxValue) {
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_LARGE);
} else {
input.val(val);
self.options.plusClickEnable && self.options.plusClick($(this).parent(), val);
self.options.valueChangedEnable && self.options.valueChanged($(this).parent(), val);
}
return false;
}).delegate('input', 'change', function() {
var val = +$(this).val() || 0;
if (val > self.options.maxValue) {
val = self.options.maxValue;
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_LARGE);
} else if (val < self.options.minValue) {
val = self.options.minValue;
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_SMALL);
}
$(this).val(val);
self.options.valueChangedEnable && self.options.valueChanged($(this).parent(), val);
});
}
$.fn.WanSpinner = function(options) {
var wanSpinner = new WanSpinner(this, options);
wanSpinner.bind();
return this;
};
})(jQuery, window, document);