/**
 * This javascript file offers additional features for script aculo us sliders
 * LiveUpdate.js includes calls of this methods. 
 * 
 * -> code as comment can be removed!!
 */


if(!window.SliderManager)
{

var sliders = new Array();
var SliderManager = Class.create({

	/**
	 * Constructor of Slider Manager
	 * @param question_id - (int) id of slider question
	 */
  initialize: function(question_id) {
    this.sliders = new Array();
    this.question_id = question_id;
    this.nochange=0;
    this.firstSlider=0; // id of first slider
    this.secondSlider=0; // id of second slider
    this.min=0;
    this.max=0;
    this.doubleSlider=false;
    
    this.minSpan=0;
  },
  
  /**
   * Setter of minimal spacing for double sliders
   */
  setMinSpan: function(minSpan){
  	this.minSpan = minSpan;
  	
  /**
   * Setter for information of double slider question (Call this method twice for double slider question)
   * @param id - id of slider question OR id+"_2"
   * @param slider - reference of slider (twice the same)
   * @param value - preselected value (twice the same)
   * @param text - dom reference to value label (difference references)
   * @param data - dom reference to hidden field (difference references)
   */
  	
  },addDoubleSlider: function(id,slider,value,text,data) {
  	
  	this.doubleSlider=true;
  	this.addSlider(id,slider,value,text,data);
  },
  
  /**
   * Setter for information of single slider question
   * @param id - id of slider question
   * @param slider - reference of slider manager
   * @param value - preselected value
   * @param text - dom reference to value label
   * @param data - dom reference to hidden field
   */
  addSlider: function(id,slider,value,text,data) {
  
  	if(this.firstSlider == 0){
  		this.min=slider.minimum;
  		this.max=slider.maximum;
  		this.firstSlider = id;
  		sliders[sliders.length]=this;
  	}
  	else
  		this.secondSlider = id;
  		
  	this.sliders[id] = new Array();
  	this.sliders[id]['ref']=slider;
  	this.sliders[id]['text']=text; // reference to slider text
  	this.sliders[id]['value']=value; // (start) value
  	this.sliders[id]['data']=data; // (start) value
  	this.sliders[id]['startvalue']=value;
  },
  
  /**
   * Method to handle change event of slider
   */
  onChange: function(id,value){
  	this.changeSlider(id,value);
  	
  	// nochange is set to 0, if triggers are handled (setSingleSlider or setDoubleSlider) and to further LU.update is required
  	if(this.nochange==0 && window.isLivePreview){
  		if(window.LU)
  			LU.update(this,'slider',{qid:this.question_id}); // updates intermediate result
  	}
  	this.nochange=0;
  },
  
  /**
   * Method to handle slider event (moving slider handle)
   */
   onSlide: function(id,value){
  	this.changeSlider(id,value); // update slider design
  },
  /**
   * Set slider to start value
   * !! Not used anymore !!
   */
 /* reset: function(){
  	this.nochange=1;
  	
  	if(this.doubleSlider){
  		
  		this.sliders[this.firstSlider]['ref'].setValue(this.sliders[this.firstSlider]['startvalue'],0);
  		this.sliders[this.firstSlider]['ref'].setValue(this.sliders[this.secondSlider]['startvalue'],1);
		this.sliders[this.firstSlider]['ref'].setValue(this.sliders[this.firstSlider]['startvalue'],0);
  		
  	}else{
  		this.sliders[this.firstSlider]['ref'].setValue(this.sliders[this.firstSlider]['startvalue']);
  		if(this.secondSlider != 0)
  			this.sliders[this.secondSlider]['ref'].setValue(this.sliders[this.secondSlider]['startvalue']);
  	}
  },*/
  
  /**
   * update hidden fields and value label of slider
   * 
   */
  changeSlider: function(id,value){
  
  	var minSpacer = this.minSpan;
  	
  	if(this.doubleSlider){ // double slider

		var handle_id = this.sliders[this.firstSlider]['ref'].activeHandle.id;
		var value1 = value[0];
	  	var value2 = value[1];
		
	  	// get active handle: 0 -> first handle; 1 -> second handle
	  	var moved=0;
		if(handle_id.match(/_2$/g)){
				moved=1;
		}
		
   		if(value2<value1+minSpacer && this.nochange==0){ // minSpace not fulfilled
  			var newValue = value[moved==1?0:1]+(minSpacer*((moved==1)?1:-1));
  			this.sliders[this.firstSlider]['ref'].setValue(newValue,moved); // correct active slider handle
  		}else{ 
		
	  		this.sliders[this.firstSlider]['data'].value=value[0];
	  		this.sliders[this.secondSlider]['data'].value=value[1];
	  	    this.sliders[this.firstSlider]['value'].value=value[0];
	  		this.sliders[this.secondSlider]['value'].value=value[1];
	  		
	  		this.sliders[this.firstSlider]['text'].innerHTML=niceNumber(value[0]);
	  		this.sliders[this.secondSlider]['text'].innerHTML=niceNumber(value[1]);
		}

  	}else{ // single slider
  		this.sliders[id]['data'].value=value;
  		this.sliders[id]['value']=value;
  		
  		//if(this.firstSlider == id && value <= this.max-minSpacer){ // first Slider
	  		this.sliders[id]['text'].innerHTML=niceNumber(value);
	  	
  		//}else if(this.secondSlider == id && value >= this.min+minSpacer){ // second Slider
 	  	//	this.sliders[id]['text'].innerHTML=niceNumber(value);
  		//}
  	}
  	
  	
  	/*
  	 
  	CODE NOT USED OR?? 
  	
  	if(this.doubleSlider || this.secondSlider == 0)
  		return;
  	
  
  	
  	var value1 = this.sliders[this.firstSlider]['value'];
  	var value2 = this.sliders[this.secondSlider]['value'];
  	
  	var otherSlider = 0;

   	if(value2<value1+minSpacer){
  		this.nochange=1;
  		if(this.firstSlider == id)
  			this.sliders[this.secondSlider]['ref'].setValue(value+minSpacer);
  		else
  			this.sliders[this.firstSlider]['ref'].setValue(value-minSpacer);
  	} 	
  	*/

   	
   	/**
   	 * Set value of single slider
   	 */
 },setSingleSlider: function(value){

	 	// change all values and fields
   		this.sliders[this.firstSlider]['data'].value=value;
  		this.sliders[this.firstSlider]['value']=value;
	  	this.sliders[this.firstSlider]['text'].innerHTML=niceNumber(value);
	  	this.nochange=1;
 		this.sliders[this.firstSlider]['ref'].setValue(value);
 },
 	/**
 	 * Set value of double slider
 	 */
 setDoubleSlider: function(value_min, value_max){
	 
	 	var currentHighValue = this.sliders[this.secondSlider]['value'];
	 	
	 	// check current values, before change to new values:
	 	// If current high value is lower than new lower value -> firstly, change second slider 
	 	if(currentHighValue < value_min){ // new high value is lower than old min value -> change second slider first
	 		
	 		if(typeof value_max !== "undefined"){ // check, because double slider trigger must have just one value
		 		// second slider
				this.sliders[this.secondSlider]['data'].value=value_max;
				this.sliders[this.secondSlider]['value']=value_max;
				this.sliders[this.secondSlider]['text'].innerHTML=niceNumber(value_max,0);
				this.nochange=1;
				this.sliders[this.firstSlider]['ref'].setValue(value_max,1);
		 	}
	 		if(typeof value_min !== "undefined"){
				// first slider
				this.sliders[this.firstSlider]['data'].value=value_min;
				this.sliders[this.firstSlider]['value']=value_min;
				this.sliders[this.firstSlider]['text'].innerHTML=niceNumber(value_min);
				this.nochange=1;
				this.sliders[this.firstSlider]['ref'].setValue(value_min);
		 	}
	 		
	 	}else { // DEFAULT -> change first slider first
	 		
	 		
	 		if(typeof value_min !== "undefined"){
				// first slider
				this.sliders[this.firstSlider]['data'].value=value_min;
				this.sliders[this.firstSlider]['value']=value_min;
				this.sliders[this.firstSlider]['text'].innerHTML=niceNumber(value_min);
				this.nochange=1;
				this.sliders[this.firstSlider]['ref'].setValue(value_min);
		 	}
	 		
	 		if(typeof value_max !== "undefined"){
		 		// second slider
				this.sliders[this.secondSlider]['data'].value=value_max;
				this.sliders[this.secondSlider]['value']=value_max;
				this.sliders[this.secondSlider]['text'].innerHTML=niceNumber(value_max,0);
				this.nochange=1;
				this.sliders[this.firstSlider]['ref'].setValue(value_max,1);
		 	}
	 	}
 }
 
});
}

/**
 * Replace points(.) with commas (,)
 */
function niceNumber(number){
	return (number+"").replace(/\./,",");
}

