vpn.email
Version:
vpn.email client
512 lines (427 loc) • 16.6 kB
JavaScript
$.widget("metro.slider", {
version: "3.0.14",
options: {
position: 0,
buffer: 0,
accuracy: 0,
color: 'default',
completeColor: 'default',
bufferColor: 'default',
markerColor: 'default',
colors: false,
showHint: false,
permanentHint: false,
hintPosition: 'top',
vertical: false,
min: 0,
max: 100,
animate: false,
minValue: 0,
maxValue: 100,
currValue: 0,
returnType: 'value',
target: false,
onStartChange: function(){},
onChange: function(value, slider){},
onChanged: function(value, slider){},
onBufferChange: function(value, slider){},
_slider : {
vertical: false,
offset: 0,
length: 0,
marker: 0,
ppp: 0,
start: 0,
stop: 0
}
},
_create: function(){
var that = this,
element = this.element;
var o = this.options,
s = o._slider;
$.each(element.data(), function(key, value){
if (key in o) {
try {
o[key] = $.parseJSON(value);
} catch (e) {
o[key] = value;
}
}
});
element.data('internal_id', uniqueId());
//console.log(element.data('internal_id'));
o.accuracy = o.accuracy < 0 ? 0 : o.accuracy;
o.min = o.min < 0 ? 0 : o.min;
o.min = o.min > o.max ? o.max : o.min;
o.max = o.max > 100 ? 100 : o.max;
o.max = o.max < o.min ? o.min : o.max;
o.position = this._correctValue(element.data('position') > o.min ? (element.data('position') > o.max ? o.max : element.data('position')) : o.min);
o.buffer = this._correctValue(element.data('buffer') > o.min ? (element.data('buffer') > o.max ? o.max : element.data('buffer')) : o.min);
o.colors = o.colors ? o.colors.split(",") : false;
s.vertical = o.vertical;
if (o.vertical && !element.hasClass('vertical')) {
element.addClass('vertical');
}
if (o.permanentHint && !element.hasClass('permanent-hint')) {
element.addClass('permanent-hint');
}
if (!o.vertical && o.hintPosition === 'bottom') {
element.addClass('hint-bottom');
}
if (o.vertical && o.hintPosition === 'left') {
element.addClass('hint-left');
}
this._createSlider();
this._initPoints();
this._placeMarker(o.position);
this._showBuffer(o.buffer);
var event_down = isTouchDevice() ? 'touchstart' : 'mousedown';
if (o.target && $(o.target)[0].tagName == 'INPUT') {
$(o.target).on('keyup', function(){
var input_value = this.value !== undefined ? this.value : 0;
var new_value = Math.min(input_value, o.maxValue);
that._placeMarker(that._realValueToValue(new_value));
//console.log(that._realValueToValue(this.value));
});
}
element.children('.marker').on(event_down, function (e) {
that._startMoveMarker(e);
if (typeof o.onStartChange === 'function') {
o.onStartChange();
} else {
if (typeof window[o.onStartChange] === 'function') {
window[o.onStartChange]();
} else {
var result = eval("(function(){"+o.onStartChange+"})");
result.call();
}
}
e.preventDefault();
e.stopPropagation();
});
element.on(event_down, function (e) {
e.preventDefault();
that._startMoveMarker(e);
});
element.data('slider', this);
},
_startMoveMarker: function(e){
var element = this.element, o = this.options, that = this, hint = element.children('.slider-hint');
var returnedValue;
var event_move = isTouchDevice() ? 'touchmove' : 'mousemove';
var event_up = isTouchDevice() ? 'touchend' : 'mouseup mouseleave';
$(document).on(event_move, function (event) {
that._movingMarker(event);
if (!element.hasClass('permanent-hint')) {
hint.css('display', 'block');
}
});
$(document).on(event_up, function () {
$(document).off(event_move);
$(document).off(event_up);
element.data('value', o.position);
element.trigger('changed', o.position);
element.trigger('change', o.position);
returnedValue = o.returnType === 'value' ? that._valueToRealValue(o.position) : o.position;
if (!element.hasClass('permanent-hint')) {
hint.css('display', 'none');
}
if (typeof o.onChanged === 'function') {
o.onChanged(returnedValue, element);
} else {
if (typeof window[o.onChanged] === 'function') {
window[o.onChanged](returnedValue, element);
} else {
var result = eval("(function(){"+o.onChanged+"})");
result.call(returnedValue, element);
}
}
});
this._initPoints();
this._movingMarker(e);
},
_movingMarker: function (ev) {
var element = this.element, o = this.options;
var cursorPos,
percents,
valuePix,
vertical = o._slider.vertical,
sliderOffset = o._slider.offset,
sliderStart = o._slider.start,
sliderEnd = o._slider.stop,
sliderLength = o._slider.length,
markerSize = o._slider.marker;
var event = !isTouchDevice() ? ev.originalEvent : ev.originalEvent.touches[0];
//console.log(event);
if (vertical) {
cursorPos = event.pageY - sliderOffset;
} else {
cursorPos = event.pageX - sliderOffset;
}
if (cursorPos < sliderStart) {
cursorPos = sliderStart;
} else if (cursorPos > sliderEnd) {
cursorPos = sliderEnd;
}
if (vertical) {
valuePix = sliderLength - cursorPos - markerSize / 2;
} else {
valuePix = cursorPos - markerSize / 2;
}
percents = this._pixToPerc(valuePix);
this._placeMarker(percents);
o.currValue = this._valueToRealValue(percents);
o.position = percents;
var returnedValue = o.returnType === 'value' ? this._valueToRealValue(o.position) : o.position;
if (o.target) {
if ($(o.target)[0].tagName == 'INPUT') {
$(o.target).val(returnedValue);
} else {
$(o.target).html(returnedValue);
}
$(o.target).trigger('change', returnedValue);
}
if (typeof o.onChange === 'function') {
o.onChange(returnedValue, element);
} else {
if (typeof window[o.onChange] === 'function') {
window[o.onChange](returnedValue, element);
} else {
var result = eval("(function(){"+o.onChange+"})");
result.call(returnedValue, element);
}
}
},
_placeMarker: function (value) {
var size, size2, o = this.options, colorParts, colorIndex = 0, colorDelta, element = this.element,
marker = this.element.children('.marker'),
complete = this.element.children('.complete'),
hint = this.element.children('.slider-hint'), hintValue,
oldPos = this._percToPix(o.position);
colorParts = o.colors.length;
colorDelta = o._slider.length / colorParts;
if (o._slider.vertical) {
var oldSize = this._percToPix(o.position) + o._slider.marker,
oldSize2 = o._slider.length - oldSize;
size = this._percToPix(value) + o._slider.marker / 2;
size2 = o._slider.length - size;
this._animate(marker.css('top', oldSize2),{top: size2});
this._animate(complete.css('height', oldSize),{height: size});
if (colorParts) {
colorIndex = Math.round(size / colorDelta)-1;
complete.css('background-color', o.colors[colorIndex<0?0:colorIndex]);
}
if (o.showHint) {
hintValue = this._valueToRealValue(value);
hint.html(hintValue).css('top', size2 - marker.height()/2 - hint.height()/4);
}
} else {
size = this._percToPix(value);
this._animate(marker.css('left', oldPos),{left: size});
this._animate(complete.css('width', oldPos),{width: size});
if (colorParts) {
colorIndex = Math.round(size / colorDelta)-1;
complete.css('background-color', o.colors[colorIndex<0?0:colorIndex]);
}
if (o.showHint) {
hintValue = this._valueToRealValue(value);
hint.html(hintValue).css('left', size - marker.width()/2);
}
}
},
_valueToRealValue: function(value){
var o = this.options;
var real_value;
var percent_value = (o.maxValue - o.minValue) / 100;
real_value = value * percent_value + o.minValue;
return Math.round(real_value);
},
_realValueToValue: function(value){
var o = this.options, val_val;
var percent_value = (o.maxValue - o.minValue) / 100;
val_val = value / percent_value + o.minValue;
return Math.round(val_val);
},
_animate: function (obj, val) {
var o = this.options;
//console.log(obj, val);
if(o.animate) {
obj.stop(true).animate(val);
} else {
obj.css(val);
}
},
_pixToPerc: function (valuePix) {
var valuePerc;
valuePerc = (valuePix < 0 ? 0 : valuePix )* this.options._slider.ppp;
return Math.round(this._correctValue(valuePerc));
},
_percToPix: function (value) {
///console.log(this.options._slider.ppp, value);
if (this.options._slider.ppp === 0) {
return 0;
}
return Math.round(value / this.options._slider.ppp);
},
_correctValue: function (value) {
var o = this.options;
var accuracy = o.accuracy;
var max = o.max;
var min = o.min;
if (accuracy === 0) {
return value;
}
if (value === max) {
return max;
}
if (value === min) {
return min;
}
value = Math.floor(value / accuracy) * accuracy + Math.round(value % accuracy / accuracy) * accuracy;
if (value > max) {
return max;
}
if (value < min) {
return min;
}
return value;
},
_initPoints: function(){
var o = this.options, s = o._slider, element = this.element;
if (s.vertical) {
s.offset = element.offset().top;
s.length = element.height();
s.marker = element.children('.marker').height();
} else {
s.offset = element.offset().left;
s.length = element.width();
s.marker = element.children('.marker').width();
}
s.ppp = o.max / (s.length - s.marker);
s.start = s.marker / 2;
s.stop = s.length - s.marker / 2;
},
_createSlider: function(){
var element = this.element,
o = this.options,
complete, marker, hint, buffer, back;
element.html('');
back = $("<div/>").addClass("slider-backside").appendTo(element);
complete = $("<div/>").addClass("complete").appendTo(element);
buffer = $("<div/>").addClass("buffer").appendTo(element);
marker = $("<a/>").addClass("marker").appendTo(element);
if (o.showHint) {
hint = $("<span/>").addClass("slider-hint").appendTo(element);
}
if (o.color !== 'default') {
if (o.color.isColor()) {
back.css('background-color', o.color);
} else {
back.addClass(o.color);
}
}
if (o.completeColor !== 'default') {
if (o.completeColor.isColor()) {
complete.css('background-color', o.completeColor);
} else {
complete.addClass(o.completeColor);
}
}
if (o.bufferColor !== 'default') {
if (o.bufferColor.isColor()) {
buffer.css('background-color', o.bufferColor);
} else {
buffer.addClass(o.bufferColor);
}
}
if (o.markerColor !== 'default') {
if (o.markerColor.isColor()) {
marker.css('background-color', o.markerColor);
} else {
marker.addClass(o.markerColor);
}
}
},
value: function (value) {
var element = this.element, o = this.options, returnedValue;
if (typeof value !== 'undefined') {
value = value > o.max ? o.max : value;
value = value < o.min ? o.min : value;
this._placeMarker(parseInt(value));
o.position = parseInt(value);
returnedValue = o.returnType === 'value' ? this._valueToRealValue(o.position) : o.position;
if (o.target) {
if ($(o.target)[0].tagName == 'INPUT') {
$(o.target).val(returnedValue);
} else {
$(o.target).html(returnedValue);
}
$(o.target).trigger('change', returnedValue);
}
if (typeof o.onChange === 'function') {
o.onChange(returnedValue, element);
} else {
if (typeof window[o.onChange] === 'function') {
window[o.onChange](returnedValue, element);
} else {
var result = eval("(function(){"+o.onChange+"})");
result.call(returnedValue, element);
}
}
//if (typeof o.onChanged === 'function') {
// o.onChanged(returnedValue, element);
//} else {
// if (typeof window[o.onChanged] === 'function') {
// window[o.onChanged](returnedValue, element);
// } else {
// var result = eval("(function(){"+o.onChanged+"})");
// result.call(returnedValue, element);
// }
//}
return this;
} else {
returnedValue = o.returnType === 'value' ? this._valueToRealValue(o.position) : o.position;
return returnedValue;
}
},
_showBuffer: function(value){
var size, oldSize, o = this.options, element = this.element,
buffer = this.element.children('.buffer');
oldSize = o.buffer;
size = value == 100 ? 99.9 : value;
if (o._slider.vertical) {
this._animate(buffer.css('height', oldSize+'%'),{height: size+'%'});
} else {
this._animate(buffer.css('width', oldSize+'%'),{width: size+'%'});
}
},
buffer: function (value) {
var element = this.element, o = this.options, returnedValue;
if (typeof value !== 'undefined') {
value = value > 100 ? 100 : value;
value = value < 0 ? 0 : value;
this._showBuffer(parseInt(value));
o.buffer = parseInt(value);
returnedValue = o.buffer;
if (typeof o.onBufferChange === 'function') {
o.onBufferChange(returnedValue, element);
} else {
if (typeof window[o.onBufferChange] === 'function') {
window[o.onBufferChange](returnedValue, element);
} else {
var result = eval("(function(){"+o.onBufferChange+"})");
result.call(returnedValue, element);
}
}
return this;
} else {
returnedValue = o.buffer;
return returnedValue;
}
},
_destroy: function(){},
_setOption: function(key, value){
this._super('_setOption', key, value);
}
});