MINI Sh3ll
function getGroup ( $Spectrum, mode, values, stepped ) {
// Use the range.
if ( mode === 'range' || mode === 'steps' ) {
return $Spectrum.xVal;
}
if ( mode === 'count' ) {
// Divide 0 - 100 in 'count' parts.
var spread = ( 100 / (values-1) ), v, i = 0;
values = [];
// List these parts and have them handled as 'positions'.
while ((v=i++*spread) <= 100 ) {
values.push(v);
}
mode = 'positions';
}
if ( mode === 'positions' ) {
// Map all percentages to on-range values.
return $.map(values, function( value ){
return $Spectrum.fromStepping( stepped ? $Spectrum.getStep( value ) : value );
});
}
if ( mode === 'values' ) {
// If the value must be stepped, it needs to be converted to a percentage first.
if ( stepped ) {
return $.map(values, function( value ){
// Convert to percentage, apply step, return to value.
return $Spectrum.fromStepping( $Spectrum.getStep( $Spectrum.toStepping( value ) ) );
});
}
// Otherwise, we can simply use the values.
return values;
}
}
function generateSpread ( $Spectrum, density, mode, group ) {
var originalSpectrumDirection = $Spectrum.direction,
indexes = {},
firstInRange = $Spectrum.xVal[0],
lastInRange = $Spectrum.xVal[$Spectrum.xVal.length-1],
ignoreFirst = false,
ignoreLast = false,
prevPct = 0;
// This function loops the spectrum in an ltr linear fashion,
// while the toStepping method is direction aware. Trick it into
// believing it is ltr.
$Spectrum.direction = 0;
// Create a copy of the group, sort it and filter away all duplicates.
group = unique(group.slice().sort(function(a, b){ return a - b; }));
// Make sure the range starts with the first element.
if ( group[0] !== firstInRange ) {
group.unshift(firstInRange);
ignoreFirst = true;
}
// Likewise for the last one.
if ( group[group.length - 1] !== lastInRange ) {
group.push(lastInRange);
ignoreLast = true;
}
$.each(group, function ( index ) {
// Get the current step and the lower + upper positions.
var step, i, q,
low = group[index],
high = group[index+1],
newPct, pctDifference, pctPos, type,
steps, realSteps, stepsize;
// When using 'steps' mode, use the provided steps.
// Otherwise, we'll step on to the next subrange.
if ( mode === 'steps' ) {
step = $Spectrum.xNumSteps[ index ];
}
// Default to a 'full' step.
if ( !step ) {
step = high-low;
}
// Low can be 0, so test for false. If high is undefined,
// we are at the last subrange. Index 0 is already handled.
if ( low === false || high === undefined ) {
return;
}
// Find all steps in the subrange.
for ( i = low; i <= high; i += step ) {
// Get the percentage value for the current step,
// calculate the size for the subrange.
newPct = $Spectrum.toStepping( i );
pctDifference = newPct - prevPct;
steps = pctDifference / density;
realSteps = Math.round(steps);
// This ratio represents the ammount of percentage-space a point indicates.
// For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-devided.
// Round the percentage offset to an even number, then divide by two
// to spread the offset on both sides of the range.
stepsize = pctDifference/realSteps;
// Divide all points evenly, adding the correct number to this subrange.
// Run up to <= so that 100% gets a point, event if ignoreLast is set.
for ( q = 1; q <= realSteps; q += 1 ) {
// The ratio between the rounded value and the actual size might be ~1% off.
// Correct the percentage offset by the number of points
// per subrange. density = 1 will result in 100 points on the
// full range, 2 for 50, 4 for 25, etc.
pctPos = prevPct + ( q * stepsize );
indexes[pctPos.toFixed(5)] = ['x', 0];
}
// Determine the point type.
type = ($.inArray(i, group) > -1) ? 1 : ( mode === 'steps' ? 2 : 0 );
// Enforce the 'ignoreFirst' option by overwriting the type for 0.
if ( !index && ignoreFirst ) {
type = 0;
}
if ( !(i === high && ignoreLast)) {
// Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.
indexes[newPct.toFixed(5)] = [i, type];
}
// Update the percentage count.
prevPct = newPct;
}
});
// Reset the spectrum.
$Spectrum.direction = originalSpectrumDirection;
return indexes;
}
function addMarking ( CSSstyle, orientation, direction, spread, filterFunc, formatter ) {
var style = ['horizontal', 'vertical'][orientation],
element = $('<div/>');
element.addClass('noUi-pips noUi-pips-'+style);
function getSize( type, value ){
return [ '-normal', '-large', '-sub' ][type];
}
function getTags( offset, source, values ) {
return 'class="' + source + ' ' +
source + '-' + style + ' ' +
source + getSize(values[1], values[0]) +
'" style="' + CSSstyle + ': ' + offset + '%"';
}
function addSpread ( offset, values ){
if ( direction ) {
offset = 100 - offset;
}
// Apply the filter function, if it is set.
values[1] = (values[1] && filterFunc) ? filterFunc(values[0], values[1]) : values[1];
// Add a marker for every point
element.append('<div ' + getTags(offset, 'noUi-marker', values) + '></div>');
// Values are only appended for points marked '1' or '2'.
if ( values[1] ) {
element.append('<div '+getTags(offset, 'noUi-value', values)+'>' + formatter.to(values[0]) + '</div>');
}
}
// Append all points.
$.each(spread, addSpread);
return element;
}
$.fn.noUiSlider_pips = function ( grid ) {
var mode = grid.mode,
density = grid.density || 1,
filter = grid.filter || false,
values = grid.values || false,
format = grid.format || {
to: Math.round
},
stepped = grid.stepped || false;
return this.each(function(){
var info = this.getInfo(),
group = getGroup( info[0], mode, values, stepped ),
spread = generateSpread( info[0], density, mode, group );
return $(this).append(addMarking(
info[1],
info[2],
info[0].direction,
spread,
filter,
format
));
});
};
OHA YOOOO