diff --git a/src/definitions/modules/range.js b/src/definitions/modules/range.js
index ce61fd6cb..03ac7417c 100644
--- a/src/definitions/modules/range.js
+++ b/src/definitions/modules/range.js
@@ -27,6 +27,7 @@ $.fn.range = function(parameters) {
query = arguments[0],
methodInvoked = (typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
+
alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
SINGLE_STEP = 1,
@@ -49,7 +50,6 @@ $.fn.range = function(parameters) {
className = settings.className,
metadata = settings.metadata,
namespace = settings.namespace,
- input = settings.input,
error = settings.error,
keys = settings.keys,
@@ -58,7 +58,9 @@ $.fn.range = function(parameters) {
moduleNamespace = 'module-' + namespace,
$module = $(this),
+ $currThumb,
$thumb,
+ $secondThumb,
$track,
$trackFill,
$labels,
@@ -68,6 +70,7 @@ $.fn.range = function(parameters) {
value,
position,
+ secondPos,
offset,
precision,
isTouch,
@@ -81,11 +84,15 @@ $.fn.range = function(parameters) {
module.debug('Initializing range slider', settings);
isTouch = module.setup.testOutTouch();
module.setup.layout();
+
if(!module.is.disabled())
module.bind.events();
+
module.read.metadata();
module.read.settings();
+
module.instantiate();
+ settings.onChange.call(element, value);
},
instantiate: function() {
@@ -113,7 +120,13 @@ $.fn.range = function(parameters) {
if($module.find('.inner').length == 0)
$module.append("
");
precision = module.get.precision();
- $thumb = $module.find('.thumb');
+ $thumb = $module.find('.thumb:not(.second)');
+ $currThumb = $thumb;
+ if(module.is.doubled()) {
+ if($module.find('.thumb.second').length == 0)
+ $module.find('.inner').append("");
+ $secondThumb = $module.find('.thumb.second');
+ }
$track = $module.find('.track');
$trackFill = $module.find('.track-fill');
offset = $thumb.width()/2;
@@ -257,6 +270,13 @@ $.fn.range = function(parameters) {
event: {
down: function(event, originalEvent) {
event.preventDefault();
+ if(module.is.doubled()) {
+ var
+ eventPos = module.determine.eventPos(event, originalEvent),
+ newPos = module.determine.pos(eventPos)
+ ;
+ $currThumb = module.determine.closestThumb(newPos);
+ }
if(!module.is.disabled())
module.bind.slidingEvents();
},
@@ -267,7 +287,7 @@ $.fn.range = function(parameters) {
newPos = module.determine.pos(eventPos)
;
if (eventPos >= module.get.trackOffset() && eventPos <= module.get.trackOffset() + module.get.trackLength()) {
- module.set.valueBasedPosition(newPos);
+ module.set.position(newPos);
}
},
up: function(event, originalEvent) {
@@ -277,7 +297,7 @@ $.fn.range = function(parameters) {
newPos = module.determine.pos(eventPos)
;
if(eventPos >= module.get.trackOffset() && eventPos <= module.get.trackOffset() + module.get.trackLength()) {
- module.set.valueMoveToValueBasedPosition(newPos);
+ module.set.value(module.determine.value(newPos));
}
module.unbind.slidingEvents();
},
@@ -319,25 +339,28 @@ $.fn.range = function(parameters) {
var
multiplier = multiplier != undefined ? multiplier : 1,
step = module.get.step(),
- currValue = module.get.value()
+ currValue = module.get.currentThumbValue()
;
module.verbose('Taking a step');
if(step > 0)
- module.set.positionBasedValue(currValue + step * multiplier);
+ module.set.value(currValue + step * multiplier);
},
backStep: function(multiplier) {
var
multiplier = multiplier != undefined ? multiplier : 1,
step = module.get.step(),
- currValue = module.get.value()
+ currValue = module.get.currentThumbValue()
;
module.verbose('Going back a step');
if(step > 0)
- module.set.positionBasedValue(currValue - step * multiplier);
+ module.set.value(currValue - step * multiplier);
},
is: {
+ doubled: function() {
+ return $module.hasClass(settings.className.doubled);
+ },
hover: function() {
return isHover;
},
@@ -437,33 +460,88 @@ $.fn.range = function(parameters) {
return value;
}
},
- trackPos: function() {
- if(module.is.vertical()) {
- return module.is.reversed() ? module.get.trackLength() - ($trackFill.position().top + $trackFill.height()) : $trackFill.position().top;
- } else {
- return module.is.reversed() ? module.get.trackLength() - ($trackFill.position().left + $trackFill.width()) : $trackFill.position().left;
- }
- },
value: function() {
return value;
},
+ currentThumbValue: function() {
+ if($currThumb.hasClass('second'))
+ return module.secondThumbVal;
+ return module.thumbVal;
+ },
+ thumbValue: function(which) {
+ switch(which) {
+ case 'first':
+ return module.thumbVal;
+ case 'second':
+ if(module.is.doubled())
+ return module.secondThumbVal;
+ else {
+ module.error(error.notdouble);
+ break;
+ }
+ default:
+ return module.thumbVal;
+ }
+ },
multiplier: function() {
return settings.pageMultiplier;
- }
+ },
+ thumbPosition: function(which) {
+ switch(which) {
+ case 'first':
+ return position;
+ case 'second':
+ if(module.is.doubled())
+ return secondThumbPosition;
+ else {
+ module.error(error.notdouble);
+ break;
+ }
+ default:
+ return position;
+ }
+ },
},
determine: {
pos: function(pagePos) {
return module.is.reversed() ? module.get.trackStartPos() - pagePos + module.get.trackOffset() : pagePos - module.get.trackOffset() - module.get.trackStartPos();
},
+ closestThumb: function(eventPos) {
+ var
+ thumbPos = parseFloat(module.determine.thumbPos($thumb)),
+ thumbDelta = Math.abs(eventPos - thumbPos),
+ secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),
+ secondThumbDelta = Math.abs(eventPos - secondThumbPos)
+ ;
+ return thumbDelta <= secondThumbDelta ? $thumb : $secondThumb;
+ },
+ closestThumbPos: function(eventPos) {
+ var
+ thumbPos = parseFloat(module.determine.thumbPos($thumb)),
+ thumbDelta = Math.abs(eventPos - thumbPos),
+ secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),
+ secondThumbDelta = Math.abs(eventPos - secondThumbPos)
+ ;
+ return thumbDelta <= secondThumbDelta ? thumbPos : secondThumbPos;
+ },
+ thumbPos: function($element) {
+ var pos =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? $element.css('bottom') : $element.css('top')
+ :
+ module.is.reversed() ? $element.css('right') : $element.css('left')
+ ;
+ return pos;
+ },
positionFromValue: function(value) {
var
min = module.get.min(),
max = module.get.max(),
trackLength = module.get.trackLength(),
ratio = (value - min) / (max - min),
- trackPos = module.get.trackPos(),
- position = Math.round(ratio * trackLength) + trackPos
+ position = Math.round(ratio * trackLength)
;
module.verbose('Determined position: ' + position + ' from value: ' + value);
return position;
@@ -471,9 +549,8 @@ $.fn.range = function(parameters) {
positionFromRatio: function(ratio) {
var
trackLength = module.get.trackLength(),
- trackPos = module.get.trackPos(),
step = module.get.step(),
- position = Math.round(ratio * trackLength) + trackPos,
+ position = Math.round(ratio * trackLength),
adjustedPos = (step == 0) ? position : Math.round(position / step) * step
;
return adjustedPos;
@@ -548,91 +625,126 @@ $.fn.range = function(parameters) {
}
},
+ handleNewValuePosition: function(val) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ newPos
+ ;
+ if(val >= min && val <= max) {
+ newPos = module.determine.positionFromValue(val);
+ } else if (val <= min) {
+ newPos = module.determine.positionFromValue(min);
+ val = min;
+ } else {
+ newPos = module.determine.positionFromValue(max);
+ val = max;
+ }
+ return newPos;
+ },
+
set: {
value: function(newValue) {
- if(input) {
- $(input).val(newValue);
- }
- value = newValue;
- settings.onChange.call(element, newValue);
- module.debug('Setting range value to ' + newValue);
+ module.update.value(newValue, function(value) {
+ settings.onChange.call(element, value);
+ });
},
- position: function(value) {
- if (module.is.vertical()) {
- if (module.is.reversed())
- $thumb.css({bottom: String(value - offset) + 'px'});
- else
- $thumb.css({top: String(value - offset) + 'px'});
- $trackFill.css({height: String(value) + 'px'});
+ valueDouble: function(first, second) {
+ if(module.is.doubled()) {
+ module.thumbVal = first;
+ module.secondThumbVal = second;
+ position = module.handleNewValuePosition(module.thumbVal);
+ module.set.position(position, $thumb)
+ secondPos = module.handleNewValuePosition(module.secondThumbVal);
+ module.set.position(secondPos, $secondThumb);
+ value = Math.abs(module.thumbVal - module.secondThumbVal);
} else {
- if (module.is.reversed())
- $thumb.css({right: String(value - offset) + 'px'});
- else
- $thumb.css({left: String(value - offset) + 'px'});
- $trackFill.css({width: String(value) + 'px'});
+ module.error(error.notdouble);
}
- position = value;
- module.debug('Setting range position to ' + value);
},
- positionBasedValue: function(value) {
- var
- min = module.get.min(),
- max = module.get.max(),
- position
- ;
- if(value >= min && value <= max) {
- position = module.determine.positionFromValue(value);
- } else if (value <= min) {
- position = module.determine.positionFromValue(min);
- value = min;
+ position: function(newPos, $element) {
+ var $targetThumb = $element != undefined ? $element : $currThumb;
+ if(module.is.doubled()) {
+ if(!$targetThumb.hasClass('second'))
+ position = newPos;
+ else
+ secondPos = newPos;
} else {
- position = module.determine.positionFromValue(max);
- value = max;
+ position = newPos;
}
- module.set.position(position);
- module.set.value(value);
- },
- valueMoveToValueBasedPosition: function(position) {
var
- value = module.determine.value(position),
- min = module.get.min(),
- max = module.get.max(),
- pos
+ bottomThumbValue,
+ trackPosValue,
+ trackFillWidth = module.is.doubled() ? Math.abs(position - secondPos) : newPos
;
- if (value <= min) {
- value = min;
- } else if (value >= max){
- value = max;
+ if (module.is.vertical()) {
+ if (module.is.reversed()) {
+ $targetThumb.css({bottom: String(newPos - offset) + 'px'});
+ if(module.is.doubled())
+ trackPosValue = {bottom: String(parseFloat(module.determine.closestThumbPos(0)) + offset) + 'px'};
+ }
+ else {
+ $targetThumb.css({top: String(newPos - offset) + 'px'});
+ if(module.is.doubled())
+ trackPosValue = {top: String(parseFloat(module.determine.closestThumbPos(0)) + offset) + 'px'};
+ }
+ $trackFill.css(Object.assign({height: String(trackFillWidth) + 'px'}, trackPosValue));
+ } else {
+ if (module.is.reversed()) {
+ $targetThumb.css({right: String(newPos - offset) + 'px'});
+ if(module.is.doubled())
+ trackPosValue = {right: String(parseFloat(module.determine.closestThumbPos(0)) + offset) + 'px'};
+ }
+ else {
+ $targetThumb.css({left: String(newPos - offset) + 'px'});
+ if(module.is.doubled())
+ trackPosValue = {left: String(parseFloat(module.determine.closestThumbPos(0)) + offset) + 'px'};
+ }
+ $trackFill.css(Object.assign({width: String(trackFillWidth) + 'px'}, trackPosValue));
}
- pos = module.determine.positionFromValue(value);
- module.set.value(value);
- module.set.position(pos);
+ module.debug('Setting range position to ' + newPos);
},
- valueBasedPosition: function(position) {
+ },
+
+ update: {
+ value: function(newValue, callback) {
var
- value = module.determine.value(position),
min = module.get.min(),
max = module.get.max()
;
- if(value >= min && value <= max) {
+ if (newValue <= min) {
+ newValue = min;
+ } else if(newValue >= max){
+ newValue = max;
+ }
+ if(!module.is.doubled()) {
+ position = module.handleNewValuePosition(newValue);
module.set.position(position);
- } else if (value <= min) {
- module.goto.min();
- value = min;
+ value = newValue;
+ module.thumbVal = value;
} else {
- module.goto.max();
- value = max;
+ var newPos = module.handleNewValuePosition(newValue);
+ if(!$currThumb.hasClass('second')) {
+ module.thumbVal = newValue;
+ }
+ else {
+ module.secondThumbVal = newValue;
+ }
+ module.set.position(newPos);
+ value = Math.abs(module.thumbVal - module.secondThumbVal);
}
- module.set.value(value);
- },
+ module.debug('Setting range value to ' + value);
+ if(typeof callback === 'function')
+ callback(value);
+ }
},
goto: {
max: function() {
- module.set.positionBasedValue(module.get.max());
+ module.set.value(module.get.max());
},
min: function() {
- module.set.positionBasedValue(module.get.min());
+ module.set.value(module.get.min());
},
},
@@ -640,19 +752,29 @@ $.fn.range = function(parameters) {
metadata: function() {
var
data = {
- value : $module.data(metadata.value)
+ thumbVal : $module.data(metadata.thumbVal),
+ secondThumbVal : $module.data(metadata.secondThumbVal),
}
;
- if(data.value) {
- module.debug('Current value set from metadata', data.value);
- module.set.value(data.value);
- module.set.positionBasedValue(data.value);
+ if(data.thumbVal) {
+ if(module.is.doubled() && data.secondThumbVal) {
+ module.debug('Current value set from metadata', data.thumbVal, data.secondThumbVal);
+ module.set.valueDouble(data.thumbVal, data.secondThumbVal);
+ } else {
+ module.debug('Current value set from metadata', data.thumbVal);
+ module.update.value(data.thumbVal);
+ }
}
},
settings: function() {
if(settings.start !== false) {
- module.debug('Start position set from settings', settings.start);
- module.set.positionBasedValue(settings.start);
+ if(module.is.doubled()) {
+ module.debug('Start position set from settings', settings.start, settings.doubleStart);
+ module.set.valueDouble(settings.start, settings.doubleStart);
+ } else {
+ module.debug('Start position set from settings', settings.start);
+ module.update.value(settings.start);
+ }
}
}
},
@@ -855,18 +977,20 @@ $.fn.range.settings = {
namespace : 'range',
error : {
- method : 'The method you called is not defined.',
+ method : 'The method you called is not defined.',
+ notdouble : 'This slider is not a double slider'
},
metadata: {
- value : 'value'
+ thumbVal : 'thumbVal',
+ secondThumbVal : 'secondThumbVal',
},
min : 0,
max : 20,
step : 1,
start : 0,
- input : false,
+ doubleStart : 1,
labelType : 'number',
//the decimal place to round to if step is undefined
@@ -879,7 +1003,8 @@ $.fn.range.settings = {
reversed : 'reversed',
disabled : 'disabled',
labeled : 'labeled',
- vertical : 'vertical'
+ vertical : 'vertical',
+ doubled : 'double',
},
keys : {