870 lines
24 KiB
HTML
870 lines
24 KiB
HTML
|
<html>
|
||
|
<head>
|
||
|
<style type="text/css">
|
||
|
.label {
|
||
|
margin: 0;
|
||
|
padding: 0;
|
||
|
margin-top: 2em;
|
||
|
margin-bottom: .5em;
|
||
|
clear: both;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
|
||
|
div.hslider {
|
||
|
margin: 50px;
|
||
|
padding: 0;
|
||
|
width: 540px;
|
||
|
height: 20px;
|
||
|
background-color: #eef;
|
||
|
border: 2px solid black;
|
||
|
}
|
||
|
|
||
|
.hsliderHandle {
|
||
|
margin: 0;
|
||
|
padding: 7px 2px;
|
||
|
width: 24px;
|
||
|
height: 12px;
|
||
|
background-color: #808080;
|
||
|
|
||
|
position: absolute;
|
||
|
left: -300em;
|
||
|
top: -30em;
|
||
|
z-index: 10;
|
||
|
|
||
|
border: 1px solid black;
|
||
|
-webkit-border-radius: 5px; /* Safari and Chrome rounded corners */
|
||
|
-moz-border-radius: 5px; /* Firefox rounded corners */
|
||
|
border-radius: 5px; /* Opera rounded corners */
|
||
|
|
||
|
}
|
||
|
|
||
|
.hsliderValue {
|
||
|
margin: 24px 0 0 0;
|
||
|
padding: 5px;
|
||
|
width: 30px;
|
||
|
height: 15px;
|
||
|
text-align: center;
|
||
|
font-weight: bold;
|
||
|
|
||
|
position: absolute;
|
||
|
left: -30em;
|
||
|
top: -30em;
|
||
|
z-index: 10;
|
||
|
}
|
||
|
|
||
|
div.vslider {
|
||
|
margin: 50px;
|
||
|
padding: 0;
|
||
|
height: 540px;
|
||
|
width: 20px;
|
||
|
background-color: #eef;
|
||
|
border: 2px solid black;
|
||
|
}
|
||
|
|
||
|
.vsliderHandle {
|
||
|
margin: 0;
|
||
|
padding: 2px 7px;
|
||
|
width: 12px;
|
||
|
height: 24px;
|
||
|
background-color: #808080;
|
||
|
|
||
|
position: absolute;
|
||
|
left: -300em;
|
||
|
top: -30em;
|
||
|
z-index: 10;
|
||
|
|
||
|
border: 1px solid black;
|
||
|
-webkit-border-radius: 5px; /* Safari and Chrome rounded corners */
|
||
|
-moz-border-radius: 5px; /* Firefox rounded corners */
|
||
|
border-radius: 5px; /* Opera rounded corners */
|
||
|
}
|
||
|
|
||
|
.vsliderValue {
|
||
|
margin: 0 0 0 30px;
|
||
|
padding: 5px;
|
||
|
width: 30px;
|
||
|
height: 15px;
|
||
|
text-align: center;
|
||
|
font-weight: bold;
|
||
|
|
||
|
position: absolute;
|
||
|
left: -30em;
|
||
|
top: -30em;
|
||
|
z-index: 10;
|
||
|
}
|
||
|
|
||
|
div.sliderRange {
|
||
|
margin: 2px;
|
||
|
padding: 0;
|
||
|
width: 1px;
|
||
|
height: 1px;
|
||
|
background-color: #00f;
|
||
|
|
||
|
position: absolute;
|
||
|
left: -300em;
|
||
|
top: -30em;
|
||
|
z-index: 0;
|
||
|
}
|
||
|
|
||
|
.hidden {
|
||
|
position: absolute;
|
||
|
top: -20em;
|
||
|
left: -200em;
|
||
|
}
|
||
|
|
||
|
.focus {
|
||
|
background-color: #eee !important;
|
||
|
}
|
||
|
</style>
|
||
|
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
|
||
|
<script type="text/javascript">
|
||
|
$(document).ready(function() {
|
||
|
|
||
|
// slider1 is a horizontal slider
|
||
|
var slider1 = new slider('sr1', false, 0, 100, 5, 10, true, false, 30);
|
||
|
|
||
|
// slider2 is a horizontal range slider
|
||
|
var slider2 = new slider('sr2', false, 1900, 2008, 1, 10, true, true, 1950, 2000);
|
||
|
|
||
|
// slider3 is a vertical range slider
|
||
|
//var slider3 = new slider('sr3', true, 0, 100, 1, true, false, 25);
|
||
|
var slider3 = new slider('sr3', true, 1900, 2008, 1, 10, true, true, 1950, 2000);
|
||
|
}); // end document ready
|
||
|
|
||
|
|
||
|
//
|
||
|
// function keyCodes() is an object to contain key code values for the application
|
||
|
//
|
||
|
function keyCodes() {
|
||
|
// Define values for keycodes
|
||
|
this.backspace = 8;
|
||
|
this.tab = 9;
|
||
|
this.enter = 13;
|
||
|
this.esc = 27;
|
||
|
|
||
|
this.space = 32;
|
||
|
this.pageup = 33;
|
||
|
this.pagedown = 34;
|
||
|
this.end = 35;
|
||
|
this.home = 36;
|
||
|
|
||
|
this.left = 37;
|
||
|
this.up = 38;
|
||
|
this.right = 39;
|
||
|
this.down = 40;
|
||
|
|
||
|
} // end keyCodes
|
||
|
|
||
|
////////////////////////////////////////////////////
|
||
|
//
|
||
|
// function slider() is a class to define an ARIA-enabled slider widget. The class
|
||
|
// will create needed handles and define ARIA attributes for the slider
|
||
|
//
|
||
|
// @param(container_id string) container_id is the containing div for the slider
|
||
|
//
|
||
|
// @param(vert boolean) vert is true if the slider is vertical; false if horizontal
|
||
|
//
|
||
|
// @param(inc integer) inc is the increment value for the slider
|
||
|
//
|
||
|
// @param(jump integer) jump is the large increment value for the slider (pgUp/pgDown keys)
|
||
|
//
|
||
|
// @param(showVals boolean) showVals is true if the slider should display the value of the handles
|
||
|
//
|
||
|
// @param(range boolean) range is true if the slider is a range slider
|
||
|
//
|
||
|
// @param(val1 integer) val1 specifies the initial value of the slider or of the first
|
||
|
// slide handle if this is a range slider. Must be >= min.
|
||
|
//
|
||
|
// @param(val2 integer) val2 specifies the initial value of the second slide handle.
|
||
|
// Ignored if range is false (i.e. not a range slider). Must be <= max.
|
||
|
//
|
||
|
// @return N/A
|
||
|
//
|
||
|
function slider(container_id, vert, min, max, inc, jump, showVals, range, val1, val2) {
|
||
|
|
||
|
// define slider object properties
|
||
|
this.keys = new keyCodes();
|
||
|
|
||
|
this.id = container_id;
|
||
|
this.$container = $('#' + container_id);
|
||
|
this.vert = vert;
|
||
|
this.range = range;
|
||
|
this.showVals = showVals;
|
||
|
|
||
|
// Store the size of the slider
|
||
|
this.width = this.$container.outerWidth();
|
||
|
this.height = this.$container.outerHeight();
|
||
|
|
||
|
// Store the page position of the slider
|
||
|
this.left = Math.round(this.$container.offset().left);
|
||
|
this.top = Math.round(this.$container.offset().top);
|
||
|
|
||
|
// Store the minimum and maximum and initial values
|
||
|
this.min = min;
|
||
|
this.max = max;
|
||
|
this.inc = inc;
|
||
|
this.jump = jump;
|
||
|
this.val1 = val1;
|
||
|
|
||
|
// If range is true, store the second value
|
||
|
if (range == true) {
|
||
|
this.val2 = val2;
|
||
|
}
|
||
|
|
||
|
/////////////// Create handles /////////////////
|
||
|
|
||
|
this.$handle1 = undefined;
|
||
|
this.$handle2 = undefined;
|
||
|
|
||
|
if ( range == false) {
|
||
|
// Create the handle
|
||
|
this.$handle1 = this.createHandle(val1);
|
||
|
}
|
||
|
else {
|
||
|
// create the range highlight div
|
||
|
this.createRangeDiv();
|
||
|
|
||
|
// Create the first handle
|
||
|
this.$handle1 = this.createHandle(val1, 1);
|
||
|
|
||
|
// create the second handle
|
||
|
this.$handle2 = this.createHandle(val2, 2);
|
||
|
}
|
||
|
|
||
|
} // end slider constructor
|
||
|
|
||
|
//
|
||
|
// function createHandle() creates a handle for the slider. It defines ARIA attributes for
|
||
|
// the handle and positions it at the specified value in the slider range. if showVals is true,
|
||
|
// create and position divs to display the handle value.
|
||
|
//
|
||
|
// @param (val integer) val is the initial value of the handle
|
||
|
//
|
||
|
// @param (num integer) num is the handle number. (optional)
|
||
|
//
|
||
|
// @return (object) returns the object pointer of the newly created handle
|
||
|
//
|
||
|
slider.prototype.createHandle = function(val, num) {
|
||
|
|
||
|
var id = this.id + '_handle' + (num == undefined ? '' : num);
|
||
|
var label = this.id + '_label' + (num == undefined ? '' : num);
|
||
|
var controls = this.id + '_text' + (num == undefined ? '' : num);
|
||
|
var $handle;
|
||
|
|
||
|
var handle = '<img id="' + id + '" class="' + (this.vert == true ? 'v':'h') +'sliderHandle" ' +
|
||
|
'src="slider_' + (this.vert == true ? 'v':'h') + '.png" ' + 'role="slider" ' +
|
||
|
'aria-valuemin="' + this.min +
|
||
|
'" aria-valuemax="' + this.max +
|
||
|
'" aria-valuenow="' + (val == undefined ? this.min : val) +
|
||
|
'" aria-labeledby="' + label +
|
||
|
'" aria-controls="' + controls + '" tabindex="0"></img>';
|
||
|
|
||
|
// Create the handle
|
||
|
this.$container.append(handle);
|
||
|
|
||
|
// store the handle object
|
||
|
$handle = $('#' + id);
|
||
|
|
||
|
if (this.showVals == true) {
|
||
|
var valContainer = '<div id="' + id + '_val" class="' + (this.vert == true ? 'v':'h') + 'sliderValue" role="presentation"></div>'
|
||
|
|
||
|
// Create the container.
|
||
|
this.$container.append(valContainer);
|
||
|
}
|
||
|
|
||
|
// store the value object
|
||
|
$handle = $('#' + id);
|
||
|
|
||
|
// position handle
|
||
|
this.positionHandle($handle, val);
|
||
|
|
||
|
// bind handlers
|
||
|
this.bindHandlers($handle);
|
||
|
|
||
|
return $handle;
|
||
|
|
||
|
} // end createHandle()
|
||
|
|
||
|
//
|
||
|
// function createRangeDiv() creates a div for the highlight of a range slider. It sets the initial top or left position
|
||
|
// to match that of the slider container.
|
||
|
//
|
||
|
// @return N/A
|
||
|
//
|
||
|
slider.prototype.createRangeDiv = function() {
|
||
|
|
||
|
var id = this.id + '_range';
|
||
|
|
||
|
var range = '<div id="' + id + '" class="sliderRange"></div>';
|
||
|
|
||
|
// Create the range div
|
||
|
this.$container.append(range);
|
||
|
|
||
|
// Store the div object
|
||
|
this.$rangeDiv = $('#' + id);
|
||
|
|
||
|
if (this.vert == false) { // horizontal slider
|
||
|
this.$rangeDiv.css('top', this.top + 'px');
|
||
|
this.$rangeDiv.css('height', this.$container.height() + 'px');
|
||
|
}
|
||
|
else { // vertical slider
|
||
|
this.$rangeDiv.css('left', this.left + 'px');
|
||
|
this.$rangeDiv.css('width', this.$container.width() + 'px');
|
||
|
}
|
||
|
|
||
|
} // end createRangeDiv()
|
||
|
|
||
|
//
|
||
|
// function positionHandle() is a member function to position a handle at the specified value for the
|
||
|
// slider. If showVal is true, it also positions and updates the displayed value container.
|
||
|
//
|
||
|
// @param($handle object) $handle is a pointer to the handle jQuery object to manipulate
|
||
|
//
|
||
|
// @param (val integer) val is the new value of the slider
|
||
|
//
|
||
|
// @return N/A
|
||
|
//
|
||
|
slider.prototype.positionHandle = function($handle, val) {
|
||
|
|
||
|
var handleHeight = $handle.outerHeight(); // the total height of the handle
|
||
|
var handleWidth = $handle.outerWidth(); // the total width of the handle
|
||
|
var handleOffset; // the distance from the value position for centering the handle
|
||
|
var xPos; // calculated horizontal position of the handle;
|
||
|
var yPos; // calculated vertical position of the handle;
|
||
|
var valPos; //calculated new pixel position for the value;
|
||
|
|
||
|
if (this.vert == false) {
|
||
|
// horizontal slider
|
||
|
|
||
|
// calculate the horizontal pixel position of the specified value
|
||
|
valPos = ((val - this.min) / (this.max - this.min)) * this.width + this.left;
|
||
|
|
||
|
xPos = Math.round(valPos - (handleWidth / 2));
|
||
|
yPos = Math.round(this.top + (this.height / 2) - (handleHeight / 2));
|
||
|
}
|
||
|
else {
|
||
|
// vertical slider
|
||
|
|
||
|
// calculate the vertical pixel position of the specified value
|
||
|
valPos = ( (val - this.min) / (this.max - this.min) ) * this.height + this.top;
|
||
|
|
||
|
xPos = Math.round(this.left + (this.width / 2) - (handleWidth / 2));
|
||
|
yPos = Math.round(valPos - (handleHeight / 2));
|
||
|
}
|
||
|
|
||
|
// Set the position of the handle
|
||
|
$handle.css('top', yPos + 'px');
|
||
|
$handle.css('left', xPos + 'px');
|
||
|
|
||
|
// Set the aria-valuenow position of the handle
|
||
|
$handle.attr('aria-valuenow', val);
|
||
|
|
||
|
// Update the stored handle values
|
||
|
if (/1$/.test($handle.attr('id')) == true) {
|
||
|
// first handle
|
||
|
this.val1 = val;
|
||
|
}
|
||
|
else {
|
||
|
// second handle
|
||
|
this.val2 = val;
|
||
|
}
|
||
|
|
||
|
// if range is true, set the position of the range div
|
||
|
if (this.range == true) {
|
||
|
this.positionRangeDiv();
|
||
|
}
|
||
|
|
||
|
// if showVal is true, update the value container
|
||
|
if (this.showVals == true) {
|
||
|
this.updateValBox($handle, Math.round(valPos));
|
||
|
}
|
||
|
|
||
|
} // end positionHandle()
|
||
|
|
||
|
//
|
||
|
// function positionRangeDiv() is a member function to reposition the range div when a handle is moved
|
||
|
//
|
||
|
// @return N/A
|
||
|
//
|
||
|
slider.prototype.positionRangeDiv = function() {
|
||
|
|
||
|
var pos; //calculated new range start position;
|
||
|
var size; //calculated new range size;
|
||
|
|
||
|
if (this.vert == false) { // Horizontal slider
|
||
|
|
||
|
// calculate the range start position
|
||
|
pos = Math.round( ((this.val1 - this.min) / (this.max - this.min)) * this.width) + this.left;
|
||
|
|
||
|
// calculate the new range width
|
||
|
size = Math.round( ((this.val2 - this.min) / (this.max - this.min)) * this.width) + this.left - pos;
|
||
|
|
||
|
// set the new range position
|
||
|
this.$rangeDiv.css('left', pos + 'px');
|
||
|
|
||
|
// set the new range width
|
||
|
this.$rangeDiv.css('width', size + 'px');
|
||
|
}
|
||
|
else {
|
||
|
// calculate the range start position
|
||
|
pos = Math.round(( (this.val1 - this.min) / (this.max - this.min)) * this.height)+ this.top;
|
||
|
|
||
|
// calculate the new range width
|
||
|
size = Math.round(( (this.val2 - this.min) / (this.max - this.min) ) * this.height) + this.top - pos;
|
||
|
|
||
|
// set the new range position
|
||
|
this.$rangeDiv.css('top', pos + 'px');
|
||
|
|
||
|
// set the new range width
|
||
|
this.$rangeDiv.css('height', size + 'px');
|
||
|
}
|
||
|
|
||
|
} // end positionRangeDiv()
|
||
|
|
||
|
//
|
||
|
// function updateValBox() is a member function to reposition a handle value box and update its contents
|
||
|
//
|
||
|
// @param ($handle object) $handle is the jQuery object of the handle that was moved
|
||
|
//
|
||
|
// @param (valPos integer) is the pixel position of the slider value
|
||
|
//
|
||
|
// @return N/A
|
||
|
//
|
||
|
slider.prototype.updateValBox = function($handle, valPos) {
|
||
|
|
||
|
var $valBox = $('#' + $handle.attr('id') + '_val');
|
||
|
|
||
|
var xPos; // horizontal pixel position of the box
|
||
|
var yPos; // vertical pixel position of the box
|
||
|
|
||
|
// Set the position of the handle
|
||
|
if (this.vert == false) {
|
||
|
var boxWidth = $valBox.outerWidth();
|
||
|
|
||
|
yPos = $handle.css('top');
|
||
|
|
||
|
// Adjust the horizontal position to center the value box on the value position
|
||
|
xPos = Math.round(valPos - (boxWidth / 2)) + 'px';
|
||
|
|
||
|
}
|
||
|
else {
|
||
|
var boxHeight = $valBox.outerHeight();
|
||
|
|
||
|
xPos = $handle.css('left');
|
||
|
|
||
|
// Adjust the vertical position to center the value box on the value position
|
||
|
yPos = Math.round(valPos - (boxHeight / 2)) + 'px';
|
||
|
}
|
||
|
|
||
|
// Set the position of the value box
|
||
|
$valBox.css('top', yPos);
|
||
|
$valBox.css('left', xPos);
|
||
|
|
||
|
// Set the text in the box to the handle value
|
||
|
$valBox.text($handle.attr('aria-valuenow'));
|
||
|
|
||
|
} // end updateValBox()
|
||
|
|
||
|
//
|
||
|
// function bindHandlers() is a member function to bind event handlers to a slider handle
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object pointer of the handle to bind handlers to
|
||
|
//
|
||
|
// @return N/A
|
||
|
slider.prototype.bindHandlers = function($handle) {
|
||
|
|
||
|
var thisObj = this; // store the this pointer
|
||
|
|
||
|
$handle.keydown(function(e) {
|
||
|
return thisObj.handleKeyDown($handle, e);
|
||
|
});
|
||
|
|
||
|
$handle.keypress(function(e) {
|
||
|
return thisObj.handleKeyPress($handle, e);
|
||
|
});
|
||
|
|
||
|
$handle.focus(function(e) {
|
||
|
return thisObj.handleFocus($handle, e);
|
||
|
});
|
||
|
|
||
|
$handle.blur(function(e) {
|
||
|
return thisObj.handleBlur($handle, e);
|
||
|
});
|
||
|
|
||
|
$handle.mousedown(function(e) {
|
||
|
return thisObj.handleMouseDown($handle, e);
|
||
|
});
|
||
|
|
||
|
} // end bindHandlers()
|
||
|
|
||
|
//
|
||
|
// function handleKeyDown() is a member function to process keydown events for a slider handle
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object associated with the event
|
||
|
//
|
||
|
// @parem (evt object) evt is the event object associated witthe the event
|
||
|
//
|
||
|
// @return (boolean) true if propagating; false if consuming event
|
||
|
//
|
||
|
slider.prototype.handleKeyDown = function($handle, evt) {
|
||
|
|
||
|
if (evt.ctrlKey || evt.shiftKey || evt.altKey) {
|
||
|
// Do nothing
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
switch (evt.keyCode) {
|
||
|
case this.keys.home: {
|
||
|
// move the handle to the slider minimum
|
||
|
if (this.range == false) {
|
||
|
this.positionHandle($handle, this.min);
|
||
|
}
|
||
|
else {
|
||
|
if (/1$/.test($handle.attr('id')) == true) {
|
||
|
// handle 1 - move to the min value
|
||
|
this.positionHandle($handle, this.min);
|
||
|
}
|
||
|
else {
|
||
|
// handle 2 - move to the position of handle 1
|
||
|
this.positionHandle($handle, this.val1);
|
||
|
}
|
||
|
}
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
case this.keys.end: {
|
||
|
if (this.range == false) {
|
||
|
// move the handle to the slider maximum
|
||
|
this.positionHandle($handle, this.max);
|
||
|
}
|
||
|
else {
|
||
|
if (/1$/.test($handle.attr('id')) == true) {
|
||
|
// handle 1 - move to the position of handle 2
|
||
|
this.positionHandle($handle, this.val2);
|
||
|
}
|
||
|
else {
|
||
|
// handle 2 - move to the max value
|
||
|
this.positionHandle($handle, this.max);
|
||
|
}
|
||
|
}
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
case this.keys.pageup: {
|
||
|
|
||
|
// Decrease by jump value
|
||
|
|
||
|
var newVal = $handle.attr('aria-valuenow') - this.jump;
|
||
|
var stopVal = this.min; // where to stop moving
|
||
|
|
||
|
if (this.range == true) {
|
||
|
// if this is handle 2, stop when we reach the value
|
||
|
// for handle 1
|
||
|
if (/2$/.test($handle.attr('id')) == true) {
|
||
|
stopVal = this.val1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// move the handle one jump increment toward the slider minimum
|
||
|
// If value is less than stopVal, set at stopVal instead
|
||
|
this.positionHandle($handle, (newVal > stopVal ? newVal : stopVal));
|
||
|
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
case this.keys.pagedown: {
|
||
|
|
||
|
// Increase by jump value
|
||
|
|
||
|
var newVal = parseInt($handle.attr('aria-valuenow')) + this.jump;
|
||
|
var stopVal = this.max; // where to stop moving
|
||
|
|
||
|
if (this.range == true) {
|
||
|
// if this is handle 1, stop when we reach the value
|
||
|
// for handle 2
|
||
|
if (/1$/.test($handle.attr('id')) == true) {
|
||
|
stopVal = this.val2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// move the handle one jump increment toward the slider maximum
|
||
|
// If value is greater than maximum, set at maximum instead
|
||
|
this.positionHandle($handle, (newVal < stopVal ? newVal : stopVal));
|
||
|
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
case this.keys.left:
|
||
|
case this.keys.up: {
|
||
|
|
||
|
var newVal = $handle.attr('aria-valuenow') - this.inc;
|
||
|
var stopVal = this.min; // where to stop moving
|
||
|
|
||
|
if (this.range == true) {
|
||
|
// if this is handle 2, stop when we reach the value
|
||
|
// for handle 1
|
||
|
if (/2$/.test($handle.attr('id')) == true) {
|
||
|
stopVal = this.val1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// move the handle one jump increment toward the stopVal
|
||
|
// If value is less than stopVal, set at stopVal instead
|
||
|
this.positionHandle($handle, (newVal > stopVal ? newVal : stopVal));
|
||
|
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
case this.keys.right:
|
||
|
case this.keys.down: {
|
||
|
|
||
|
var newVal = parseInt($handle.attr('aria-valuenow')) + this.inc;
|
||
|
var stopVal = this.max; // where to stop moving
|
||
|
|
||
|
if (this.range == true) {
|
||
|
// if this is handle 1, stop when we reach the value
|
||
|
// for handle 2
|
||
|
if (/1$/.test($handle.attr('id')) == true) {
|
||
|
stopVal = this.val2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// move the handle one increment toward the slider maximum
|
||
|
// If value is greater than maximum, set at maximum instead
|
||
|
this.positionHandle($handle, (newVal < stopVal ? newVal : stopVal));
|
||
|
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
} // end switch
|
||
|
|
||
|
return true;
|
||
|
|
||
|
} // end handleKeyDown
|
||
|
|
||
|
//
|
||
|
// function handleKeyPress() is a member function to process keypress events for a slider handle. Needed for
|
||
|
// browsers that perform window scrolling on keypress rather than keydown events.
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object associated with the event
|
||
|
//
|
||
|
// @parem (evt object) evt is the event object associated witthe the event
|
||
|
//
|
||
|
// @return (boolean) true if propagating; false if consuming event
|
||
|
//
|
||
|
slider.prototype.handleKeyPress = function($handle, evt) {
|
||
|
|
||
|
if (evt.ctrlKey || evt.shiftKey || evt.altKey) {
|
||
|
// Do nothing
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
switch (evt.keyCode) {
|
||
|
case this.keys.home:
|
||
|
case this.keys.pageup:
|
||
|
case this.keys.end:
|
||
|
case this.keys.pagedown:
|
||
|
case this.keys.left:
|
||
|
case this.keys.up:
|
||
|
case this.keys.right:
|
||
|
case this.keys.down: {
|
||
|
|
||
|
// Consume the event
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
} // end switch
|
||
|
|
||
|
return true;
|
||
|
|
||
|
} // end handleKeyDown
|
||
|
|
||
|
//
|
||
|
// function handleFocus() is a member function to process focus events for a slider handle
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object associated with the event
|
||
|
//
|
||
|
// @parem (evt object) evt is the event object associated witthe the event
|
||
|
//
|
||
|
// @return (boolean) true if propagating; false if consuming event
|
||
|
//
|
||
|
slider.prototype.handleFocus = function($handle, evt) {
|
||
|
|
||
|
$handle.attr('src', 'slider_' + (this.vert == true ? 'v' : 'h') + '-focus.png');
|
||
|
$handle.addClass('focus');
|
||
|
$handle.css('z-index', '20');
|
||
|
|
||
|
return true;
|
||
|
|
||
|
} // end handleFocus()
|
||
|
|
||
|
//
|
||
|
// function handleBlur() is a member function to process blur events for a slider handle
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object associated with the event
|
||
|
//
|
||
|
// @parem (evt object) evt is the event object associated witthe the event
|
||
|
//
|
||
|
// @return (boolean) true if propagating; false if consuming event
|
||
|
//
|
||
|
slider.prototype.handleBlur = function($handle, evt) {
|
||
|
|
||
|
$handle.attr('src', 'slider_' + (this.vert == true ? 'v' : 'h') + '.png');
|
||
|
$handle.removeClass('focus');
|
||
|
$handle.css('z-index', '10');
|
||
|
|
||
|
return true;
|
||
|
|
||
|
} // end handleBlur()
|
||
|
|
||
|
//
|
||
|
// function handleMouseDown() is a member function to process mousedown events for a slider handle. The function
|
||
|
// binds a mousemove handler
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object associated with the event
|
||
|
//
|
||
|
// @parem (evt object) evt is the event object associated witthe the event
|
||
|
//
|
||
|
// @return (boolean) true if propagating; false if consuming event
|
||
|
//
|
||
|
slider.prototype.handleMouseDown = function($handle, evt) {
|
||
|
|
||
|
var thisObj = this; // store the this pointer
|
||
|
|
||
|
// remove focus highlight from all other slider handles on the page
|
||
|
$('.hsliderHandle').attr('src', 'slider_h.png').removeClass('focus').css('z-index', '10');
|
||
|
$('.vsliderHandle').attr('src', 'slider_v.png').removeClass('focus').css('z-index', '10');
|
||
|
|
||
|
// Set focus to the clicked handle
|
||
|
$handle.focus();
|
||
|
|
||
|
// bind a mousemove event handler to the document to capture the mouse
|
||
|
$(document).mousemove(function(e) {
|
||
|
thisObj.handleMouseMove($handle, e);
|
||
|
});
|
||
|
|
||
|
//bind a mouseup event handler to the document to capture the mouse
|
||
|
$(document).mouseup(function(e) {
|
||
|
return thisObj.handleMouseUp($handle, e);
|
||
|
});
|
||
|
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
|
||
|
} // end handleMouseDown()
|
||
|
|
||
|
//
|
||
|
// function handleMouseUp() is a member function to process mouseup events for a slider handle. The function
|
||
|
// unbinds the mousemove handler
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object associated with the event
|
||
|
//
|
||
|
// @parem (evt object) evt is the event object associated witthe the event
|
||
|
//
|
||
|
// @return (boolean) true if propagating; false if consuming event
|
||
|
//
|
||
|
slider.prototype.handleMouseUp = function($handle, evt) {
|
||
|
|
||
|
// unbind the event listeners to release the mouse
|
||
|
$(document).unbind('mousemove');
|
||
|
$(document).unbind('mouseup');
|
||
|
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
|
||
|
} // end handleMouseUp()
|
||
|
|
||
|
//
|
||
|
// function handleMouseMove() is a member function to process mousemove events for a slider handle.
|
||
|
//
|
||
|
// @param ($handle object) $handle is the object associated with the event
|
||
|
//
|
||
|
// @parem (evt object) evt is the event object associated witthe the event
|
||
|
//
|
||
|
// @return (boolean) true if propagating; false if consuming event
|
||
|
//
|
||
|
slider.prototype.handleMouseMove = function($handle, evt) {
|
||
|
|
||
|
var curVal = parseInt($handle.attr('aria-valuenow'));
|
||
|
var newVal;
|
||
|
var startVal = this.min;
|
||
|
var stopVal = this.max;
|
||
|
|
||
|
if (this.range == true) {
|
||
|
// if this is handle 1, set stopVal to be the value
|
||
|
// for handle 2
|
||
|
if (/1$/.test($handle.attr('id')) == true) {
|
||
|
stopVal = this.val2;
|
||
|
}
|
||
|
else {
|
||
|
// This is handle 2: Set startVal to be the value
|
||
|
// for handle 1
|
||
|
startVal = this.val1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (this.vert == false) {
|
||
|
// horizontal slider
|
||
|
|
||
|
// Calculate the new slider value based on the horizontal pixel position of the mouse
|
||
|
newVal = Math.round((evt.pageX - this.left) / this.width * (this.max - this.min)) + this.min;
|
||
|
}
|
||
|
else {
|
||
|
// vertical slider
|
||
|
|
||
|
// Calculate the new slider value based on the vertical pixel position of the mouse
|
||
|
newVal = Math.round((evt.pageY - this.top) / this.height * (this.max - this.min)) + this.min;
|
||
|
}
|
||
|
|
||
|
if (newVal >= startVal && newVal <= stopVal) {
|
||
|
|
||
|
// Do not move handle unless new value is a slider increment
|
||
|
if (newVal%this.inc == 0) {
|
||
|
this.positionHandle($handle, newVal);
|
||
|
}
|
||
|
}
|
||
|
else if (newVal < startVal) {
|
||
|
|
||
|
// value is less than minimum for slider - set handle to min
|
||
|
this.positionHandle($handle, startVal);
|
||
|
}
|
||
|
else if (newVal > stopVal) {
|
||
|
|
||
|
// value is greater than maximum for slider - set handle to max
|
||
|
this.positionHandle($handle, stopVal);
|
||
|
}
|
||
|
|
||
|
evt.stopPropagation;
|
||
|
return false;
|
||
|
|
||
|
} // end handleMouseMove
|
||
|
</script>
|
||
|
<body>
|
||
|
<div role="application">
|
||
|
|
||
|
<h3>Slider Example 1: A Simple Slider</h3>
|
||
|
|
||
|
<div id="sr1_label" class="hidden">Example 1 Slider</div>
|
||
|
<div class="hslider" id="sr1"></div>
|
||
|
|
||
|
<h3>Slider Example 2: A Range Slider</h3>
|
||
|
|
||
|
<div id="sr2_label1" class="hidden">Example 2 Slider Low</div>
|
||
|
<div id="sr2_label2" class="hidden">Example 2 Slider High</div>
|
||
|
<div class="hslider" id="sr2"></div>
|
||
|
|
||
|
<h3>Slider Example 3: A Vertical Slider</h3>
|
||
|
|
||
|
<div id="sr3_label" class="hidden">Example 3 Slider</div>
|
||
|
<div class="vslider" id="sr3"></div>
|
||
|
</div>
|
||
|
</body>
|
||
|
</html>
|