var DEFAULT_DISTANCE = 100;
var DEFAULT_ORIENTATION = 'horizontal';
var DEFAULT_DECIMALS = 0;

window.onload = function(){

  sliders = getElementsByClass("slider");
  
  for(i = 0; i < sliders.length; i++){
  
    slider = sliders[i];
    
    slider.onmousedown = slide;
    
        displayId = slider.getAttribute('display');
        display = document.getElementById(displayId);
        display.sliderId = slider.id;
        display.onfocus = focusDisplay;

        distance = parseInt(slider.getAttribute('distance'));
        slider.distance = (distance ? distance : DEFAULT_DISTANCE);

        orientation = slider.getAttribute('orientation');
        orientation = ((orientation == 'horizontal' || orientation == 'vertical') ? orientation : DEFAULT_ORIENTATION);

        decimals = parseInt(display.getAttribute('decimals'));
        display.decimals = (decimals ? decimals : DEFAULT_DECIMALS);

        valuecount = parseInt(display.getAttribute('valuecount'));
        display.valuecount = (valuecount ? valuecount : slider.distance+1);

        from = parseFloat(display.getAttribute('from'));
        from = (from ? from : 0);

        to = parseFloat(display.getAttribute('to'));
        to = (to ? to : slider.distance);
        
        value = parseFloat(display.getAttribute('value'));
        value = (value ? value : 0);

        slider.scale = (to-from)/slider.distance;

        if(orientation == 'vertical'){

            slider.from = to;
            slider.xMax = 0;
            slider.yMax = slider.distance;
            slider.scale = -slider.scale;
            topPosition(slider.id, value);
        }

        else{

            slider.from = from;
            slider.xMax = slider.distance;
            slider.yMax = 0;
            leftPosition(slider.id, value);
        }
  }
  
  specifySelects = getElementsByClass("specify");
  numSelects = specifySelects.length;
  
  for(i = 0; i < numSelects; i++){
  
    select = specifySelects[i];
    select.onchange = displaySpecifyBox;
    
    display = (select.value == "Other (please specify)" ? "inline" : "none");
          
    specifyBox = document.getElementById(select.id+"Specify");
    specifyBox.style.display = display;
  }
  
  conditionalQuestions = getElementsByClass("conditional");
  numQuestions = conditionalQuestions.length;
  
  for(i = 0; i < numQuestions; i++){
  
    select = conditionalQuestions[i];
    select.onchange = displayConditionalQuestion;
    
    noConditional = document.getElementById(select.id+"NoConditional");
    if(noConditional != null) noConditional.style.display = (select.value == "No" ? "block" : "none");
    
    yesConditional = document.getElementById(select.id+"YesConditional");
    if(yesConditional != null) yesConditional.style.display = (select.value == "Yes" ? "block" : "none");
  }
}

function getElementsByClass(className){

    var elements = document.getElementsByTagName("*");
    var numElements = elements.length;
    var pattern = new RegExp("\\b"+className+"\\b");

    var classElements = new Array();
    var numClassElements = 0;

    for(i = 0, j = 0; i < numElements; i++){

        if(pattern.test(elements[i].className)) classElements[numClassElements++] = elements[i];
    }

    return classElements;
}

function displaySpecifyBox(event){

    if(!event) event = window.event;

    select = (event.target ? event.target : event.srcElement);

    display = (select.value == "Other (please specify)" ? "block" : "none");

    specifyBox = document.getElementById(select.id+"Specify");
    specifyBox.style.display = display;

    return false;
}

function displayConditionalQuestion(event){

    if(!event) event = window.event;

    select = (event.target ? event.target : event.srcElement);

    noConditional = document.getElementById(select.id+"NoConditional");
    if(noConditional != null) noConditional.style.display = (select.value == "No" ? "block" : "none");
    
    yesConditional = document.getElementById(select.id+"YesConditional");
    if(yesConditional != null) yesConditional.style.display = (select.value == "Yes" ? "block" : "none");
  
    return false;
}

function slide(event){

    if(!event) event = window.event;

    slider = (event.target ? event.target : event.srcElement);
    displayId = slider.getAttribute('display');
    display = document.getElementById(displayId);

    slider.startOffsetX = leftPosition(slider.id)-event.screenX;
    slider.startOffsetY = topPosition(slider.id)-event.screenY;

    mouseover = true;

    document.onmousemove = moveSlider;
    document.onmouseup = sliderMouseUp;

    return false;
}

function focusDisplay(event){

    if(!event) event = window.event;
    display = (event.target ? event.target : event.srcElement);

    lock = display.getAttribute('typelock');
    if(lock == 'on') display.blur();

    return;
}

function leftPosition(element, position){

  if(!(element = document.getElementById(element))) return 0;
  
  if(element.style && (typeof(element.style.left) == 'string')){
  
    if(typeof(position) == 'number') element.style.left = position+'px';
    
    else{
    
      position = parseInt(element.style.left);
      if(isNaN(position)) position = 0;
    }
  }
  
  else if(element.style && element.style.pixelLeft){
  
    if(typeof(position) == 'number') element.style.pixelLeft = position;
    else position = element.style.pixelLeft;
  }
  
  return position;
}

function topPosition(element, position) {

  if(!(element = document.getElementById(element))) return 0;
  
  if(element.style && (typeof(element.style.top) == 'string')){
  
    if(typeof(position) == 'number') element.style.top = position+'px';
    
    else{
    
      position = parseInt(element.style.top);
      if(isNaN(position)) position = 0;
    }
    
  }
  
  else if(element.style && element.style.pixelTop){
  
    if(typeof(position) == 'number') element.style.pixelTop = position;
    else position = element.style.pixelTop;
  }
  
  return position;
}

function moveSlider(event){

  var event = (!event) ? window.event : event;
  
  if(mouseover){
  
    x = slider.startOffsetX+event.screenX;
    y = slider.startOffsetY+event.screenY;
    
    if(x > slider.xMax) x = slider.xMax;
    if(x < 0) x = 0;
    
    if(y > slider.yMax) y = slider.yMax;
    if(y < 0) y = 0;
    
    leftPosition(slider.id, x);
    topPosition(slider.id, y);
    
    sliderVal = x+y;
    sliderPos = (slider.distance/display.valuecount) * Math.round(display.valuecount*sliderVal/slider.distance);
    v = Math.round((sliderPos * slider.scale + slider.from) * Math.pow(10, display.decimals)) / Math.pow(10, display.decimals);
    display.value = v;
    
    return false;
  }
  
  return;
}

function sliderMouseUp(){

  if(mouseover){
  
    v = (display.value ? display.value : 0);
    position = (v-slider.from)/(slider.scale);
    
    if (slider.yMax == 0) {
    
      position = (position > slider.xMax ? slider.xMax : position);
      position = (position < 0 ? 0 : position);
      leftPosition(slider.id, position);
    }
    
    if(slider.xMax == 0){
    
      position = (position > slider.yMax ? slider.yMax : position);
      position = (position < 0 ? 0 : position);
      topPosition(slider.id, position);
    }
    
    if(document.removeEventListener){
    
      document.removeEventListener('mousemove', moveSlider, false);
      document.removeEventListener('mouseup', sliderMouseUp, false);
    }
    
    else if(document.detachEvent){
    
      document.detachEvent('onmousemove', moveSlider);
      document.detachEvent('onmouseup', sliderMouseUp);
    }
  }
  
  mouseover = false;
}

function popup(mylink, windowname){

    if(!window.focus) return true;
    
    var href;
    if(typeof(mylink) == 'string') href = mylink;
    else href = mylink.href;
    
    window.open(href, windowname, 'width=500, height=300, scrollbars=yes');
    
    return false;
}
