282 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<html>
 | 
						|
<head>
 | 
						|
<title>Graphical ARIA Slider</title>
 | 
						|
<script type="text/javascript">
 | 
						|
/* ****** Variables to be set ****** */
 | 
						|
var sliderSize = 300;  //Width of slider in pixels
 | 
						|
var moveValue = 10;  //Value to change the slider on any action.
 | 
						|
 | 
						|
function displaySlider(slider)
 | 
						|
{
 | 
						|
  var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
 | 
						|
  var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
 | 
						|
  var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
 | 
						|
 | 
						|
  var barWidth = slider.firstChild.scrollWidth;
 | 
						|
  var grade = sliderSize/valueMax;
 | 
						|
 | 
						|
  //Set the left padding.
 | 
						|
  var leftPad  = valueNow*grade-barWidth/2;
 | 
						|
  // if it is less then the min width.
 | 
						|
  if(leftPad < valueMin*grade){
 | 
						|
    leftPad = valueMin*grade;
 | 
						|
  }
 | 
						|
  // if it is greater than the max width
 | 
						|
  if(leftPad > valueMax*grade-barWidth){
 | 
						|
    leftPad = valueMax*grade-barWidth;
 | 
						|
  }
 | 
						|
  //The deferance between max and the current value, were going to use it like the valueMin was
 | 
						|
  var valueDown = valueMax-valueNow;
 | 
						|
  //Set the right padding
 | 
						|
  var rightPad  = valueDown*grade-barWidth/2;
 | 
						|
  //If it is less than zero
 | 
						|
  if(rightPad < 0){
 | 
						|
    rightPad = 0;
 | 
						|
  }
 | 
						|
  //If it is too big
 | 
						|
  if(rightPad > valueMax*grade-barWidth-valueMin*grade){
 | 
						|
    rightPad = valueMax*grade-barWidth-valueMin*grade;
 | 
						|
  }
 | 
						|
 | 
						|
  //Remove cases where *.5 is involved, this can cause the width to change by 1px if we don't fix it
 | 
						|
  if(rightPad >= leftPad){
 | 
						|
  var rightNew = Math.round(rightPad);
 | 
						|
   if(rightNew != rightPad){
 | 
						|
    rightPad = rightNew;
 | 
						|
    leftPad = leftPad-0.5;
 | 
						|
     }
 | 
						|
  }
 | 
						|
  if(leftPad >= rightPad){
 | 
						|
  var leftNew = Math.round(leftPad);
 | 
						|
   if(leftNew != leftPad){
 | 
						|
    leftPad = leftNew;
 | 
						|
    rightPad = rightPad-0.5;
 | 
						|
   }
 | 
						|
  }
 | 
						|
 | 
						|
  //set the padding
 | 
						|
  slider.style.paddingRight  = rightPad+'px';
 | 
						|
  slider.style.paddingLeft  = leftPad+'px';
 | 
						|
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
function handleSliderKey(slider, event)
 | 
						|
{
 | 
						|
  var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
 | 
						|
  var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
 | 
						|
  var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
 | 
						|
 | 
						|
  // Find the key press and respond to it
 | 
						|
  var delta = 0;
 | 
						|
  var delta = 0;
 | 
						|
  var kLeft = 37;
 | 
						|
  var kRight = 39;
 | 
						|
  var kHome = 36;
 | 
						|
  var kEnd = 35;
 | 
						|
  if (event.keyCode == kLeft) {
 | 
						|
    delta = -moveValue/2;
 | 
						|
  }
 | 
						|
  else if (event.keyCode == kRight) {
 | 
						|
    delta = moveValue/2;
 | 
						|
  }
 | 
						|
  else if (event.keyCode == kHome) {
 | 
						|
    delta = -( valueNow - valueMin );
 | 
						|
  }
 | 
						|
  else if (event.keyCode == kEnd) {
 | 
						|
    delta = valueMax - valueNow
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  // Stop the values going over the max and min
 | 
						|
  valueNow += delta;
 | 
						|
  if (valueNow < valueMin) {
 | 
						|
    valueNow = valueMin;
 | 
						|
  }
 | 
						|
  if (valueNow > valueMax) {
 | 
						|
    valueNow = valueMax;
 | 
						|
  }
 | 
						|
 | 
						|
  // Set the value and move the slider
 | 
						|
  slider.setAttribute("aria-valuenow", valueNow);
 | 
						|
  slider.setAttribute("aria-valuetext", "$" + valueNow + ".00" );
 | 
						|
  displaySlider(slider);
 | 
						|
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
function sliderButton(event, where, id)
 | 
						|
{
 | 
						|
  var slider = document.getElementById(id);
 | 
						|
 | 
						|
  var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
 | 
						|
  var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
 | 
						|
  var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
 | 
						|
 | 
						|
  if (where == 'after') {
 | 
						|
    var value = -moveValue;
 | 
						|
  } else {
 | 
						|
    var value = moveValue;
 | 
						|
  }
 | 
						|
 | 
						|
  // Enter was pressed or mouse clicked on the button
 | 
						|
  if (event.keyCode == 13 || event.button == 0){
 | 
						|
    // Calculate new value
 | 
						|
    var valueNow = valueNow + value;
 | 
						|
 | 
						|
    // Stop the values going over the max and min
 | 
						|
      if (valueNow < valueMin) {
 | 
						|
        valueNow = valueMin;
 | 
						|
    } else if(valueNow > valueMax) {
 | 
						|
        valueNow = valueMax;
 | 
						|
    }
 | 
						|
 | 
						|
    // Set the value and move the slider
 | 
						|
    slider.setAttribute("aria-valuenow", valueNow);
 | 
						|
    slider.setAttribute("aria-valuetext", "$" + valueNow + ".00" );
 | 
						|
    displaySlider(slider);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function barMouseDown(event, bar)
 | 
						|
{
 | 
						|
  if (event.preventDefault) {
 | 
						|
    event.preventDefault();
 | 
						|
  }
 | 
						|
 | 
						|
  bar.id = 'active';
 | 
						|
  try {
 | 
						|
    document.addEventListener('mousemove',mouseMove, true);
 | 
						|
    document.addEventListener('mouseup',barMouseUp, true);
 | 
						|
  } catch(ex) {  // IE
 | 
						|
    document.attachEvent('onmousemove',mouseMove,true);
 | 
						|
    document.attachEvent('onmouseup',barMouseUp,true);
 | 
						|
  }
 | 
						|
 | 
						|
  return false
 | 
						|
}
 | 
						|
 | 
						|
function barMouseUp()
 | 
						|
{
 | 
						|
  var bar = document.getElementById('active');
 | 
						|
  bar.removeAttribute('id');
 | 
						|
 | 
						|
  try {
 | 
						|
   document.removeEventListener('mousemove', mouseMove, true);
 | 
						|
   document.removeEventListener('mouseup', barMouseUp, true);
 | 
						|
  }
 | 
						|
  catch (ex) { // IE
 | 
						|
  document.detachEvent('onmousemove', mouseMove, true);
 | 
						|
  document.detachEvent('onmouseup', barMouseUp, true);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function mouseMove(event)
 | 
						|
{
 | 
						|
  //Get the slider we are moveing
 | 
						|
  var slider = document.getElementById('active').parentNode;
 | 
						|
  var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
 | 
						|
  var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
 | 
						|
  var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
 | 
						|
 | 
						|
  var grade = sliderSize/valueMax;
 | 
						|
 | 
						|
  // Find what the new value should be and round it.
 | 
						|
  valueNow =  event.clientX/grade-slider.offsetLeft/grade;
 | 
						|
  valueNow = Math.round(valueNow);
 | 
						|
 | 
						|
  //Stop the values going over the max and min
 | 
						|
  if (valueNow < valueMin) {
 | 
						|
    valueNow = valueMin;
 | 
						|
  }
 | 
						|
  if (valueNow > valueMax) {
 | 
						|
    valueNow = valueMax;
 | 
						|
  }
 | 
						|
   //set the value and move the slider
 | 
						|
  slider.setAttribute("aria-valuenow", valueNow);
 | 
						|
  displaySlider(slider);
 | 
						|
}
 | 
						|
 | 
						|
function sliderMouseDown(slider,event)
 | 
						|
{
 | 
						|
 | 
						|
  var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
 | 
						|
  var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
 | 
						|
  var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
 | 
						|
 | 
						|
 var grade = sliderSize/valueMax;
 | 
						|
 | 
						|
  // Find where was clicked, and were the bar is.
 | 
						|
  clickPos =  event.clientX-slider.offsetLeft;
 | 
						|
  var barWidth = slider.firstChild.scrollWidth;
 | 
						|
  var barPos =  slider.firstChild.offsetLeft-slider.offsetLeft;
 | 
						|
 | 
						|
  // Change the value
 | 
						|
  if (clickPos > barPos && clickPos < barPos+barWidth) {
 | 
						|
    return true;
 | 
						|
  } else if(clickPos > barPos) {
 | 
						|
    var valueNow = valueNow+moveValue;
 | 
						|
    if(valueNow > clickPos/grade){
 | 
						|
      valueNow = clickPos/grade;
 | 
						|
    }
 | 
						|
  } else if(clickPos < barPos+barWidth) {
 | 
						|
    var valueNow = valueNow-moveValue;
 | 
						|
    if(valueNow < clickPos/grade){
 | 
						|
      valueNow = clickPos/grade;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  // Set the value and move the slider
 | 
						|
  slider.setAttribute("aria-valuenow", valueNow);
 | 
						|
  displaySlider(slider);
 | 
						|
 | 
						|
  if (event.preventDefault) {
 | 
						|
   event.preventDefault();
 | 
						|
  }
 | 
						|
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
//--><!]]>
 | 
						|
</script>
 | 
						|
 | 
						|
<style type="text/css">
 | 
						|
<!--
 | 
						|
span.right {
 | 
						|
  background:url('right.png') no-repeat;
 | 
						|
  width:17px;
 | 
						|
}
 | 
						|
span.left {
 | 
						|
  background:url('left.png') no-repeat;
 | 
						|
  width:17px;
 | 
						|
}
 | 
						|
#slider1 {
 | 
						|
  background:url('back.png') repeat-x;
 | 
						|
  height:17px;
 | 
						|
}
 | 
						|
.bar {
 | 
						|
  background:url('slider.png') no-repeat;
 | 
						|
  height:17px;
 | 
						|
  width:17px;
 | 
						|
}
 | 
						|
.slider  span {
 | 
						|
  display:table-cell;
 | 
						|
}
 | 
						|
-->
 | 
						|
</style>
 | 
						|
<style type="text/css"></style></head>
 | 
						|
 | 
						|
<body onload="displaySlider(document.getElementById('slider1'));">
 | 
						|
  <div class="slider">
 | 
						|
  <span>0</span>
 | 
						|
  <span role="button" title="Move slider left" class="left" onclick="sliderButton(event, 'after', 'slider1');" onkeypress="sliderButton(event, 'after', 'slider1');"></span>
 | 
						|
  <span title="My slider" tabindex="0" id="slider1" role="slider" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100" aria-valuetext="10%" onmousedown="sliderMouseDown(this,event);" onkeydown="return handleSliderKey(this, event);" style="padding-right: 262px; padding-left: 21px;"><span class="bar" onmousedown="barMouseDown(event,this)"></span>
 | 
						|
  </span>
 | 
						|
  <span title="Move slider right" role="button" class="right" onclick="sliderButton(event, 'before', 'slider1');" onkeypress="sliderButton(event, 'before', 'slider1');"></span>
 | 
						|
  <span>100</span>
 | 
						|
  </div>
 | 
						|
</body>
 | 
						|
</html>
 |