var slider = new Slider();

var MaxSliderZ = 10000;
var MinSliderZ = 100;
var BumpZ = 10;
var StartSliderZ = 250;

var upBtnTimer = 0;
var downBtnTimer = 0;

var startDelay = 600;

var upBtnDelay = 0;
var downBtnDelay = 0;
var delayScale = 0.5;

function Slider() {
  this.z = 0;
  this.minZ = 0;
  
  this.init = 
    function() {
      this.setMinZ(MinSliderZ);
      this.setZ(StartSliderZ);
      
      var upBtn = document.getElementById('upBtn');
      upBtn.onmousedown = upBtnMouseDown;
      upBtn.onmouseup = upBtnMouseUp;
      upBtn.onmouseout = upBtnMouseOut;
      
      var downBtn = document.getElementById('downBtn');
      downBtn.onmousedown = downBtnMouseDown;
      downBtn.onmouseup = downBtnMouseUp;
      downBtn.onmouseout = downBtnMouseOut;
    } 
    
  this.show = 
    function() {
    }      
    
  this.setMinZ = 
    function(newMinZ) {
    
// set it     
      this.minZ = newMinZ;
      
// show it      
      var minZLbl = document.getElementById('minZLbl');
      minZLbl.innerHTML = this.minZ.toFixed(0) + 'm';
      
// see if we're over
      if (this.z < this.minZ) {
        this.setZ(this.minZ);
      }  
    }
    
  this.setZ = 
    function(newZ) {
      if (newZ < this.minZ) newZ = this.minZ
      else if (newZ > MaxSliderZ) newZ = MaxSliderZ;
    
      this.z = newZ;
      var zInput = document.getElementById('zInput');
      zInput.value = this.z.toFixed(0);
    }
    
  this.bumpZ = 
    function(bump) {
      var newZ = this.z + bump;
      this.setZ(newZ);
    }    
}

// up button
function upBtnAction() {
  slider.bumpZ(BumpZ);
  syncBeams();
  
  if (slider.z < MaxSliderZ) {
    upBtnTimer = setTimeout(upBtnAction, upBtnDelay);
    upBtnDelay = upBtnDelay * delayScale;
  }  
}

function upBtnMouseDown(sender) {
  upBtnDelay = startDelay;
  upBtnAction();
}

function upBtnMouseUp(sender) {
  if (upBtnTimer) clearTimeout(upBtnTimer);
}

function upBtnMouseOut(sender) {
  if (upBtnTimer) {
    clearTimeout(upBtnTimer);
  }  
}

// down button
function downBtnAction() {
  slider.bumpZ(-BumpZ);
  syncBeams(); 
  
  if (slider.z > slider.minZ) {
    downBtnTimer = setTimeout(downBtnAction, downBtnDelay);
    downBtnDelay = downBtnDelay * delayScale;
  }  
}

function downBtnMouseDown(sender) {
  downBtnDelay = startDelay;
  downBtnAction();
}

function downBtnMouseUp(sender) {
  if (downBtnTimer) clearTimeout(downBtnTimer);
}

function downBtnMouseOut(sender) {
  if (downBtnTimer) {
    clearTimeout(downBtnTimer);
  }  
}

function zInputChange(sender) {
  var zInput = document.getElementById('zInput');
  var z = parseFloat(zInput.value);
  if (isNaN(z)) {
    zInput.value = slider.z.toFixed(0);
  }  
  else {
    slider.setZ(z);
    syncBeams();
  }  
}

function holdit(btn, action, start, speedup) {
  var t;
  
  log(action);
  

  var repeat =
    function () {
      action();
      t = setTimeout(repeat, start);
      start = start / speedup;
    }

  btn.mousedown = 
    function(sender) {
      repeat();
    }

  btn.mouseup = 
    function () {
     clearTimeout(t);
    }
};