The administration panel and web client for ParEdu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

255 lines
6.3 KiB

/*!
* jquery.spinner v0.2.1 (https://vsn4ik.github.io/jquery.spinner/)
* Copyright 2013-2016 xixilive
* Licensed under the MIT license
*/
'use strict';
(function(factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module
define(['jquery'], factory);
}
else if (typeof exports === 'object') {
// Node/CommonJS
module.exports = factory(require('jquery'));
}
else {
// Browser globals
factory(jQuery);
}
})(function($) {
var spinningTimer;
var Spinner;
var Spinning = function($element, options) {
this.$el = $element;
this.options = $.extend({}, Spinning.rules.defaults, Spinning.rules[options.rule] || {}, options);
this.min = Number(this.options.min) || 0;
this.max = Number(this.options.max) || 0;
this.$el.on({
'focus.spinner': $.proxy(function(e) {
e.preventDefault();
$(document).trigger('mouseup.spinner');
this.oldValue = this.value();
}, this),
'change.spinner': $.proxy(function(e) {
e.preventDefault();
this.value(this.$el.val());
}, this),
'keydown.spinner': $.proxy(function(e) {
var dir = {
38: 'up',
40: 'down'
}[e.which];
if (dir) {
e.preventDefault();
this.spin(dir);
}
}, this)
});
//init input value
this.oldValue = this.value();
this.value(this.$el.val());
return this;
};
Spinning.rules = {
defaults: { min: null, max: null, step: 1, precision: 0 },
currency: { min: 0.00, max: null, step: 0.01, precision: 2 },
quantity: { min: 1, max: 999, step: 1, precision: 0 },
percent: { min: 1, max: 100, step: 1, precision: 0 },
month: { min: 1, max: 12, step: 1, precision: 0 },
day: { min: 1, max: 31, step: 1, precision: 0 },
hour: { min: 0, max: 23, step: 1, precision: 0 },
minute: { min: 1, max: 59, step: 1, precision: 0 },
second: { min: 1, max: 59, step: 1, precision: 0 }
};
Spinning.prototype = {
spin: function(dir) {
if (this.$el.prop('disabled')) {
return;
}
this.oldValue = this.value();
var step = $.isFunction(this.options.step) ? this.options.step.call(this, dir) : this.options.step;
var multipler = dir === 'up' ? 1 : -1;
this.value(this.oldValue + Number(step) * multipler);
},
value: function(v) {
if (v === null || v === undefined) {
return this.numeric(this.$el.val());
}
v = this.numeric(v);
var valid = this.validate(v);
if (valid !== 0) {
v = (valid === -1) ? this.min : this.max;
}
this.$el.val(v.toFixed(this.options.precision));
if (this.oldValue !== this.value()) {
// changing.spinner
this.$el.trigger('changing.spinner', [this.value(), this.oldValue]);
// lazy changed.spinner
clearTimeout(spinningTimer);
spinningTimer = setTimeout($.proxy(function() {
this.$el.trigger('changed.spinner', [this.value(), this.oldValue]);
}, this), Spinner.delay);
}
},
numeric: function(v) {
v = this.options.precision > 0 ? parseFloat(v, 10) : parseInt(v, 10);
// If the variable is a number
if (isFinite(v)) {
return v;
}
return v || this.options.min || 0;
},
validate: function(val) {
if (this.options.min !== null && val < this.min) {
return -1;
}
if (this.options.max !== null && val > this.max) {
return 1;
}
return 0;
}
};
Spinner = function(element, options) {
this.$el = $(element);
this.$spinning = this.$el.find('[data-spin="spinner"]');
if (this.$spinning.length === 0) {
this.$spinning = this.$el.find(':input[type="text"]');
}
options = $.extend({}, options, this.$spinning.data());
this.spinning = new Spinning(this.$spinning, options);
this.$el
.on('click.spinner', '[data-spin="up"], [data-spin="down"]', $.proxy(this, 'spin'))
.on('mousedown.spinner', '[data-spin="up"], [data-spin="down"]', $.proxy(this, 'spin'));
$(document).on('mouseup.spinner', $.proxy(function() {
clearTimeout(this.spinTimeout);
clearInterval(this.spinInterval);
}, this));
if (options.delay) {
this.delay(options.delay);
}
if (options.changed) {
this.changed(options.changed);
}
if (options.changing) {
this.changing(options.changing);
}
};
Spinner.delay = 500;
Spinner.prototype = {
constructor: Spinner,
spin: function(e) {
var dir = $(e.currentTarget).data('spin');
switch (e.type) {
case 'click':
e.preventDefault();
this.spinning.spin(dir);
break;
case 'mousedown':
if (e.which === 1) {
this.spinTimeout = setTimeout($.proxy(this, 'beginSpin', dir), 300);
}
break;
}
},
delay: function(ms) {
var delay = Number(ms);
if (delay >= 0) {
this.constructor.delay = delay + 100;
}
},
value: function() {
return this.spinning.value();
},
changed: function(fn) {
this.bindHandler('changed.spinner', fn);
},
changing: function(fn) {
this.bindHandler('changing.spinner', fn);
},
bindHandler: function(t, fn) {
if ($.isFunction(fn)) {
this.$spinning.on(t, fn);
}
else {
this.$spinning.off(t);
}
},
beginSpin: function(dir) {
this.spinInterval = setInterval($.proxy(this.spinning, 'spin', dir), 100);
}
};
var old = $.fn.spinner;
$.fn.spinner = function(options, value) {
return this.each(function() {
var data = $.data(this, 'spinner');
if (!data) {
data = new Spinner(this, options);
$.data(this, 'spinner', data);
}
if (options === 'delay' || options === 'changed' || options === 'changing') {
data[options](value);
}
else if (options === 'step' && value) {
data.spinning.step = value;
}
else if (options === 'spin' && value) {
data.spinning.spin(value);
}
});
};
$.fn.spinner.Constructor = Spinner;
$.fn.spinner.noConflict = function() {
$.fn.spinner = old;
return this;
};
$(function() {
$('[data-trigger="spinner"]').spinner();
});
return $.fn.spinner;
});