function initializeSlider(sliderName, barName, resIndex, zoomLevels) {
    var slider = getElementById(sliderName);		
    var bar    = getElementById(barName);		

    // Attach slider bar image to slider
    slider.bar = bar;

    // Attach out of range zoom box to slider
    slider.box = getElementById("mouseoutbox"); 

    // hardcode for now
    bar.style.width = "5px";

    // Attach usable slider width
    slider.xPix = 50 - parseInt(bar.style.width) - 2;

    // Number of zoom levels
    slider.max = zoomLevels;

    // Zoom stepsize in pixels
    slider.zoomDelta  = slider.xPix/slider.max;

    // Set initial zoom level to slider
    slider.resIndex = resIndex;

    // Useful to undo changes
    slider.prevZoomLevel = resIndex;

    slider.sliderDrag = false;

    moveSlider(slider);
}

function moveSlider(slider) {  // Set the bar to a discrete position
  slider.bar.style.left = Math.floor(slider.resIndex * slider.zoomDelta) + "px";  
}

function sliderEvent(sliderName, e) {
    var slider = getElementById(sliderName);	
    var posX   = (e.offsetX ? e.offsetX : e.layerX);
    var bar    = slider.bar;
    var obj    = eventTarget(e);
    var undefined;
    var newZoomLevel;

    // Sanity check when IE returns "undefined"
    if(posX == undefined) {
	posX = 0;
    }

    // Compute the true offset no matter what we clicked on
    posX += posXwrtParent(obj, slider.box) - posXwrtParent(slider, slider.box);

    // eliminate extreme drags
    if(posX < 0 || posX > slider.xPix + parseInt(bar.style.width)) { 
       return false; 
    }

    if(e.type == "mousedown") {   // User is starting zoom
        slider.sliderDrag = true;
    }
    else if(e.type == "mouseup") { // User finished zoom

        slider.sliderDrag = false;

        if(slider.prevZoomLevel != slider.resIndex) {
	   slider.prevZoomLevel = slider.resIndex;
           sliderZoom(3, 'modeStatus', slider.resIndex);	
           buttonOverOutEvent(20, 'modeStatus', e);
           moveSlider(slider);
           rescaleMap(slider.resIndex);		   
	}
	return false;  
     }

     if(slider.sliderDrag == false) { // Ignore mere mouse pans
	return false; 
     }

     newZoomLevel = Math.floor(posX / slider.zoomDelta);

     // Do we need to shift the slider?
     if(newZoomLevel != slider.resIndex) {
        slider.resIndex = newZoomLevel;
        buttonOverOutEvent(20, 'modeStatus', e);
        sliderZoom(2, 'modeStatus', slider.resIndex);	
     }

     moveSlider(slider);
     return false;
}

function sliderButtonEvent(sliderName, e) {
    var slider = getElementById(sliderName);	
    var posX   = (e.offsetX ? e.offsetX : e.layerX);
    var val    = slider.val;
    var bar    = slider.bar;
    var obj    = eventTarget(e);
    var undefined;
    var newZoomLevel;

    if(e.type == "mousedown") {
       if(obj.id == "minus") { // User clicked minus
	   if(slider.resIndex > 0) {
	      slider.resIndex--;
	      moveSlider(slider);
	      slider.prevZoomLevel = slider.resIndex;
	      sliderZoom(0, 'modeStatus', slider.resIndex);	
              buttonOverOutEvent(20, 'modeStatus', e);
              rescaleMap(slider.resIndex);
           }
	   return false;
       }
       else if(obj.id == "plus") { // User clicked plus
           if(slider.resIndex < slider.max) {
	      slider.resIndex++;
	      moveSlider(slider);
	      slider.prevZoomLevel = slider.resIndex;
	      sliderZoom(1, 'modeStatus', slider.resIndex);	
              buttonOverOutEvent(20, 'modeStatus', e);
              rescaleMap(slider.resIndex);
           }
	   return false; 
       }
    }
}

function overSliderElement(e) {
    var obj = eventTarget(e);

    if(e.type == "mouseout") {
       obj.style.border = "solid #000000 1px";
       buttonOverOutEvent(panSelectZoom, 'modeStatus', e);
    }
    else { 
       obj.style.border = "solid #0000ff 1px";
       if(obj.id == "plus") {
	   buttonOverOutEvent(19, 'modeStatus', e);
       }
       else if(obj.id == "minus") {
	   buttonOverOutEvent(18, 'modeStatus', e);
       }
       else {
	   buttonOverOutEvent(20, 'modeStatus', e);
       }
    }

   return false; 
}
