var barHeight = 5;
var cursorLowerHeight = 9; // 15
var cursorLowerWidth = 17; // 27 
var deltaLeft = -3;
if (browser.ieversion < 8) deltaLeft=(11+17); // si IE 6 a 7 : margin left ou right auto
var deltaTop = 0;
//if (browser.ieversion < 7) deltaTop=(-17); // si IE6

/* 
* moveSliderLower 
* 
* @param ( slider object ) slider object 
* @param 
* 
* @return none 
*/ 
function moveSliderLower( slider, value ) { 
	var value_min = Math.round(slider.node_lower.getAttribute("aria-valuemin")); 
	var value_max = Math.round(slider.node_higher.getAttribute("aria-valuemax")); 
	var value_range = value_max - value_min; 
	var value_higher = Math.round(slider.node_higher.getAttribute("aria-valuenow")); 
	value = Math.round(value);

	if (null != value) {
		if(value > value_higher) 
			value = value_higher; 
		if(value < value_min) 
			value = value_min; 
		slider.node_lower.setAttribute("aria-valuenow", value );   
		slider.node_higher.setAttribute("aria-valuemin", value );   
	}  // endif   

	var top  = browser.calculateOffsetTop( slider.node ); 
	var left = browser.calculateOffsetLeft( slider.node ); 
	var width = slider.node.clientWidth; 
	var widthLower = slider.node_lower.clientWidth / 2;
	
	/*if (null != slider.cache_slider_node_position) {
		top  = slider.cache_slider_node_position[1]; 
		left = slider.cache_slider_node_position[0]
	}*/
	

	//alert('moveSliderLower top='+top+',left='+left+',width='+width);
	cursorLowerWidth = Math.round(slider.node_lower.offsetWidth);
	cursorLowerHeight = Math.round(slider.node_lower.offsetHeight);

	top -= cursorLowerHeight - deltaTop; 
	var value_rangenow = slider.node_lower.getAttribute("aria-valuenow").valueOf() - value_min;
	if (0 == value || value_rangenow < 0) {
		delta_valuenow=0;
	} else {
		delta_valuenow = (value_rangenow * width) / value_range;
	}
	left = left - cursorLowerWidth + deltaLeft + delta_valuenow; 
	left = left + widthLower + 3;

	slider.node_lower.style.position = "absolute"; 
	slider.node_lower.style.top  = top + "px"; 
	slider.node_lower.style.left = left + "px"; 

	//if (0 == value) alert('top='+top+', left='+left+', delta_valuenow='+delta_valuenow+', value_rangenow='+value_rangenow+', value_min='+value_min+', aria-valuenow='+slider.node_lower.getAttribute("aria-valuenow").valueOf());

	setTextContentOfNode(slider.node_lower_text, value); 
	//slider.node_lower_text.style.position = "absolute"; 
	//slider.node_lower_text.style.top  = top + 80 + "px"; 
	//slider.node_lower_text.style.left = left + "px"; 

	PutInputValue(slider);
} 

/* 
* moveSliderHigher 
* 
* @param ( id ) id of text to style 
* 
* @return none 
*/ 

function moveSliderHigher( slider, value ) {  
	var value_min    =  Math.round(slider.node_lower.getAttribute("aria-valuemin")); 
	var value_max    =  Math.round(slider.node_higher.getAttribute("aria-valuemax")); 
	var value_range  = value_max - value_min; 

	var value_lower  = Math.round(slider.node_lower.getAttribute("aria-valuenow"));

	if (null != value) { 
		if(value < value_lower) 
			value = value_lower; 
		if(value > value_max) 
			value = value_max; 
		slider.node_higher.setAttribute("aria-valuenow", value );   
		slider.node_lower.setAttribute( "aria-valuemax", value );   
	}  // endif 

	var top  = browser.calculateOffsetTop( slider.node ); 
	var left = browser.calculateOffsetLeft( slider.node ); 
	var width = slider.node.clientWidth; 

	top -= -barHeight - deltaTop; 
	left = left + deltaLeft + (( slider.node_higher.getAttribute("aria-valuenow").valueOf() - value_min ) * width) / value_range; 
	var widthHigher = slider.node_higher.clientWidth / 2;
	left = left - widthHigher + 3;

	slider.node_higher.style.position = "absolute"; 
	slider.node_higher.style.top = top + "px"; 
	slider.node_higher.style.left = left + "px"; 

	setTextContentOfNode(slider.node_higher_text, value); 

	//slider.node_higher_text.style.position = "absolute"; 
	//slider.node_higher_text.style.top  = top + 80 + "px"; 
	//slider.node_higher_text.style.left = left + "px"; 

	PutInputValue(slider);
} 

/* 
* SliderRange Object 
* 
* @param ( id ) id of text to style 
* 
* @return none 
*/ 

function SliderRange( id, id_lower, id_higher, id_input_lower,  id_input_higher) { 

  this.id = id; 
  this.id_lower  = id_lower; 
  this.id_higher = id_higher 
  this.id_lower_text  = id_lower + "_text"; 
  this.id_higher_text = id_higher + "_text"; 
  this.id_input_lower = id_input_lower;
  this.id_input_higher = id_input_higher;
   
  this.mouse_down = false; 
  
  this.OutCallBack = null;
  this.cache_slider_node_position = null;
} 

/* change les valeurs des inputs */
function PutInputValue(slider)
{
	var value_min    = slider.node_lower.getAttribute("aria-valuenow");
	var value_max    = slider.node_higher.getAttribute("aria-valuenow"); 
	
	slider.node_input_lower.value = value_min;
	slider.node_input_higher.value = value_max;
}


/* set the callback for */
SliderRange.prototype.SetOutCallBack = function (fCallBack)
{
	this.OutCallBack = fCallBack;
}


SliderRange.prototype.isInitialized = function() { 
  if(true == this.initialized) {
	return true;
  } else {
	return false;
  }
}
/* 
* Init 
* 
* @member SliderRange 
* @param ( id ) id of text to style 
* 
* @return none 
*/ 

SliderRange.prototype.init = function() { 
  this.initialized = true;
  this.node        = document.getElementById(this.id); 
  this.node_lower  = document.getElementById(this.id_lower); 
  this.node_higher = document.getElementById(this.id_higher); 
  this.node_lower_text  = document.getElementById(this.id_lower_text); 
  this.node_higher_text = document.getElementById(this.id_higher_text); 
  
  this.node_input_lower = document.getElementById(this.id_input_lower); 
  this.node_input_higher = document.getElementById(this.id_input_higher); 

  this.value_min = this.node_lower.getAttribute("aria-valuemin"); 
  this.value_max = this.node_higher.getAttribute("aria-valuemax"); 
  this.value_range = this.value_max - this.value_min; 

  // Initialize position of the pointers 
  moveSliderLower( this, this.node_lower.getAttribute("aria-valuenow") ); 
  moveSliderHigher( this, this.node_higher.getAttribute("aria-valuenow") ); 

  var obj1 = this.node_lower; 
  var obj2 = this.node_higher;  

  this.resetCache();
  
  // add focus and blur event handlers 
  //browser.addEvent(this.node_lower,  "focus", function(event) {handleSliderFocusEvent(event, obj1 );}, false); 
  //browser.addEvent(this.node_lower,  "blur",  function(event) {handleSliderBlurEvent(event, obj1 );}, false); 

  //browser.addEvent(this.node_higher, "focus", function(event) {handleSliderFocusEvent(event, obj2 );}, false); 
  //browser.addEvent(this.node_higher, "blur", function(event) {handleSliderBlurEvent(event, obj2 );}, false); 

  var obj = this; 

  // add keyboard event handlers 
  browser.addEvent(this.node_lower,  "keydown", function(event) {handleLowerSliderKeyDownEvent(event, obj );}, false); 
  browser.addEvent(this.node_higher, "keydown", function(event) {handleHigherSliderKeyDownEvent(event, obj );}, false); 

  // add mouse event handlers 
  browser.addEvent(this.node_lower,  "mousedown", function(event) {handleLowerSliderMouseDownEvent(event, obj );}, false); 
  browser.addEvent(this.node_higher, "mousedown", function(event) {handleHigherSliderMouseDownEvent(event, obj );}, false); 


} 

/* 
* resetCache 
* @member SliderRange 
* @param ( id ) id of text to style 
* @return none 
*/ 
SliderRange.prototype.resetCache = function() { 
	this.cache_slider_node_position = browser.getNodePosition(this.node);
	//alert('resetCache cache_slider_node_position='+this.cache_slider_node_position);
}
	
/* 
* Reset 
* @member SliderRange 
* @param ( id ) id of text to style 
* @return none 
*/ 
SliderRange.prototype.reset = function() { 
	if (!this.isInitialized()) 
		this.init();
	else {
		//alert('lower valuenow='+this.node_lower.getAttribute("aria-valuenow"));
		moveSliderLower( this, this.node_lower.getAttribute("aria-valuenow") ); 
		moveSliderHigher( this, this.node_higher.getAttribute("aria-valuenow") ); 
	}
} 

// handleSliderKeyDownEvent 
// 
function handleLowerSliderKeyDownEvent(event, slider ) { 
    var e = event || window.event; 

    if( e.ctrlKey || e.shiftKey || e.altKey ) 
      return true; 

    switch( e.keyCode ) { 
     
      case KEY_END: 
           var value = new Number(slider.node_higher.getAttribute("aria-valuenow")); 
           moveSliderLower( slider, value ); 
		  try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
           break; 

      case KEY_HOME: 
           var value = new Number(slider.node_lower.getAttribute("aria-valuemin")); 
           moveSliderLower( slider, value ); 
		  try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
           break; 

      case KEY_PAGEUP: 
           var value = new Number(slider.node_lower.getAttribute("aria-valuenow")) + 10; 
           moveSliderLower( slider, value ); 
		  try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
           break; 
       
    case KEY_PAGEDOWN: 
           var value = new Number(slider.node_lower.getAttribute("aria-valuenow")) - 10; 
           moveSliderLower( slider, value ); 
		  try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 

    case KEY_UP: 
    case KEY_RIGHT: 
           var value = new Number(slider.node_lower.getAttribute("aria-valuenow")) + 1; 
           moveSliderLower( slider, value ); 
		  try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 
       
    case KEY_DOWN: 
    case KEY_LEFT: 
           var value = new Number(slider.node_lower.getAttribute("aria-valuenow")) - 1; 
           moveSliderLower( slider, value ); 
		   try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 

    } // end switch 
       
  return true; 
   
} 


// handleSliderKeyDownEvent 
// 
function handleHigherSliderKeyDownEvent(event, slider ) { 
  var e = event || window.event; 

  if( e.ctrlKey || e.shiftKey || e.altKey ) 
    return true; 

  switch( e.keyCode ) { 
     
      case KEY_END: 
           var value = new Number(slider.node_higher.getAttribute("aria-valuemax")); 
           moveSliderHigher( slider, value ); 
		   try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
           break; 

      case KEY_HOME: 
           var value = new Number(slider.node_lower.getAttribute("aria-valuenow")); 
           moveSliderHigher( slider, value ); 
		   try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 

      case KEY_PAGEUP: 
           var value = new Number(slider.node_higher.getAttribute("aria-valuenow")) + 10; 
           moveSliderHigher( slider, value ); 
		   try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 
       
      case KEY_PAGEDOWN: 
           var value = new Number(slider.node_higher.getAttribute("aria-valuenow")) - 10; 
           moveSliderHigher( slider, value ); 
		   try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 

      case KEY_UP: 
      case KEY_RIGHT: 
           var value = new Number(slider.node_higher.getAttribute("aria-valuenow")) + 1; 
           moveSliderHigher( slider, value ); 
		   try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 
       
      case KEY_DOWN: 
      case KEY_LEFT: 
           var value = new Number(slider.node_higher.getAttribute("aria-valuenow")) - 1; 
           moveSliderHigher( slider, value ); 
		   try{slider.OutCallBack();}catch(err){}
           return browser.stopPropagation( event); 
       break; 

    } // end switch 
       
  return true; 
   
} 



// handleLowerSliderMouseDownEvent 
// 
function handleLowerSliderMouseDownEvent(event, slider ) { 
  var e = event || window.event; 

  //slider.node_lower.src = "images/slider2.gif"; 
  //slider.node_lower.focus(); // sous IE7 cela deplace l'ecran

  slider.mouse_down = true; 
  slider.move_function = function( event ) { handleLowerSliderMouseMoveEvent(event, slider ); }; 
  slider.up_function = function( event ) { handleLowerSliderMouseUpEvent(event, slider ); }; 

  browser.setMouseCapture( slider.node_lower, null, null, slider.move_function, slider.up_function ); 

  return browser.stopPropagation( e ); 

} 

// handleLowerSliderMouseDownEvent 
// 
function handleLowerSliderMouseMoveEvent(event, slider ) { 
	var e = event || window.event; 

	if (e.type == "mousemove" && slider.mouse_down)  { 
		pointer_page_x = Math.round( browser.pageX(e) ); 
		var widthLower = slider.node_lower.clientWidth / 2;
		//slider_page_x = Math.round(browser.calculateOffsetLeft( slider.node ) + widthLower); 
		slider_page_x = Math.round(slider.cache_slider_node_position[0] ); // + widthLower // to be compatible with no absolute parent block
		//alert("pointer_page_x="+browser.pageX(e)+',slider_page_x='+slider_page_x);
		diff = pointer_page_x - slider_page_x ; // + widthLower

		if( diff > 0 ) { 
			value_min   = Math.round(slider.node_lower.getAttribute("aria-valuemin"));   
			value_max   = Math.round(slider.node_lower.getAttribute("aria-valuemax"));   
			slider_max  = Math.round(slider.node_higher.getAttribute("aria-valuemax"));   
			value_size = slider_max - value_min; 

			// calculate the percentage of the slider bar where the user clicked 
			value_now = value_min + Math.round(( diff * value_size )/ slider.node.offsetWidth); 

			if( value_now > value_max ) 
				value_now = value_max; 

		} else { 
			value_now =  slider.node_lower.getAttribute("aria-valuemin");    
		} 

		moveSliderLower( slider, value_now ); 
		return browser.stopPropagation( e ); 
	}  //endif 

	return browser.stopPropagation( e ); 
} 

// handleLowerSliderMouseUpEvent 
// 
function handleLowerSliderMouseUpEvent(event, slider ) { 
  var e = event || window.event; 

  //slider.node_lower.src = "/theme_front/theme_front_1/image/sitebonsplans/slider2/slider_gauche.gif"; 

  slider.mouse_down = false; 
  browser.releaseMouseCapture( slider.node_lower, null, null, slider.move_function, slider.up_function ); 

  try{slider.OutCallBack();}catch(err){alert('err='+err);}
  
  return browser.stopPropagation( e ); 

} 


// handleHigherSliderMouseDownEvent 
// 
function handleHigherSliderMouseDownEvent(event, slider ) { 
  var e = event || window.event; 

  // Update impage to show focus is on slider 
  //slider.node_higher.src = "images/slider2.gif"; 
  // Move keyboard focus to slider 
  //slider.node_higher.focus(); // sous IE7 cela deplace l'ecran

  slider.mouse_down = true; 
  slider.move_function = function( event ) { handleHigherSliderMouseMoveEvent(event, slider ); }; 
  slider.up_function = function( event ) { handleHigherSliderMouseUpEvent(event, slider ); }; 

  browser.setMouseCapture( slider.node_higher, null, null, slider.move_function, slider.up_function ); 

  return browser.stopPropagation( e ); 

} 

// handleHigherSliderMouseDownEvent 
// 
function handleHigherSliderMouseMoveEvent(event, slider ) { 
	var e = event || window.event; 

	if (e.type == "mousemove" && slider.mouse_down)  { 
		pointer_page_x = Math.round( browser.pageX(e) ); 
		var widthHigher = slider.node_higher.clientWidth / 2;
		//slider_page_x = Math.round(browser.calculateOffsetLeft( slider.node ) - widthHigher); 
		slider_page_x = Math.round(slider.cache_slider_node_position[0]); // + widthHigher // to be compatible with no absolute parent block
		diff = pointer_page_x - slider_page_x ;  // - widthHigher
		//alert('pointer_page_x='+pointer_page_x+',slider_page_x='+slider_page_x);

		if( diff > 0 ) { 
			value_min   = Math.round(slider.node_higher.getAttribute("aria-valuemin"));   
			value_max   = Math.round(slider.node_higher.getAttribute("aria-valuemax"));   
			slider_min  = Math.round(slider.node_lower.getAttribute("aria-valuemin"));   
			value_size = value_max - slider_min; 

			// calculate the percentage of the slider bar where the user clicked 
			value_now = slider_min + Math.round(( diff * value_size )/ slider.node.offsetWidth); 

			if( value_now < value_min ) 
				value_now = value_min; 

		} else { 
			value_now =  slider.node_higher.getAttribute("aria-valuemin");    
		} 

		moveSliderHigher( slider, value_now ); 

		return browser.stopPropagation( e ); 
	}  //endif 
	return browser.stopPropagation( e ); 
} 

// handleHigherSliderMouseUpEvent 
// 
function handleHigherSliderMouseUpEvent(event, slider ) { 
  var e = event || window.event; 

  //slider.node_higher.src = "/theme_front/theme_front_1/image/sitebonsplans/slider2/slider_droit.gif"; 

  slider.mouse_down = false; 
  browser.releaseMouseCapture( slider.node_higher, null, null, slider.move_function, slider.up_function ); 

  try{slider.OutCallBack();}catch(err){alert('err='+err);}
  return browser.stopPropagation( e ); 

} 


// handleSliderFocusEvent 
// 
function handleSliderFocusEvent(event, node ) { 
  var e = event || window.event; 

  //node.src = "images/slider2.gif"; 
   
  return browser.stopPropagation( e ); 

} 


// handleSliderBlurEvent 
// 
function handleSliderBlurEvent(event, node ) { 
  var e = event || window.event; 

 // node.src = "images/slider2a.gif"; 
   
  return browser.stopPropagation( e ); 

} 
