var SliderControlIsMouseDown = false;

//notifies slider object that mouse button has been pressed
function SliderControlMouseDown(e)
{
   //stupid kludge because "this" is overwritten on events
   this.parent.isMouseDown=true;
   SliderControlIsMouseDown=true;
   //set the thumb to the current position
   this.parent.setThumb();
}

//notifies slider object that mouse button has been released
function SliderControlMouseUp(e)
{
   if (this.parent.isMouseDown && this.parent.bYUseTicks)
   {
      var percentY = this.parent.getPercentY();   
      var newPercentY = ( Math.round  (percentY / (1 / (this.parent.iYTickNumber-1)) ) ) * (1 / (this.parent.iYTickNumber-1));
      this.parent.setPercentY (newPercentY);  
      if (this.parent.onThumbMoved)    
        this.parent.onThumbMoved(newPercentY);
   }   


   //stupid kludge because "this" is overwritten on events
   this.parent.isMouseDown=false;
   SliderControlIsMouseDown=false;
}

function SliderControlMouseOut (e)
{
	if (e == undefined)
		return;
		
    var x = GetEventRelatedElement(e).className;
    if ((x != "sliderthumb") && (x != "") && (x != "slidertick"))
    {
      var percentY = this.parent.getPercentY();   
      var newPercentY = ( Math.round  (percentY / (1 / (this.parent.iYTickNumber-1)) ) ) * (1 / (this.parent.iYTickNumber-1));
      this.parent.setPercentY (newPercentY);  
      if (this.parent.onThumbMoved)    
        this.parent.onThumbMoved(newPercentY);
    }
}

//notifies slider object that mouse moved
function SliderControlMouseMove(e)
{
    try
    {
       //stupid kludge because "this" is overwritten on events
       var parent = this.parent;
       parent.mouseX = GetEventXNew (e) - GetAbsLayerLeft (parent.slider);
       parent.mouseY = GetEventYNew (e) - GetAbsLayerTop (parent.slider);       
       
       parent.setThumb();
    }
    catch (e)
    {
    }
}

function SliderControlMouseMoveOnThumb(e)
{
    try 
    {
       //stupid kludge because "this" is overwritten on events
       var parent = this.parent;
       parent.mouseX = GetEventXNew (e) - GetAbsLayerLeft (parent.slider);
       parent.mouseY = GetEventYNew (e) - GetAbsLayerTop (parent.slider);       
       
       parent.setThumb();       
       StopEventPropagation(e);
    }
    catch (e)
    {
    }
}

//check mouse button and position, then update as needed
function SliderControlSetThumb()
{
   if (  //if the mouse is outside the extents of the control or the mouse button is up...
    this.mouseX>this.width  ||
    this.mouseX<0  ||
    this.mouseY>this.height  ||
    this.mouseY<0 ||
    SliderControlIsMouseDown==false)
   {
      this.isMouseDown=false;
   }

   if (this.isMouseDown)
   {
      this.UpdateThumbPosition(true);
   }
}

//notifies control that mouse button was released anywhere on the document
function SliderControlDocMouseUp(e)
{
  SliderControlIsMouseDown = false;
}



function SliderTickOnMouseOver (pEvent)
{
//	try
//	{
//		var Src = GetEventSourceElement(pEvent);
//		var pDivElement = document.createElement ("div");
//		pDivElement.id = "hint";
        
//		pDivElement.style.top = (GetLayerY (pEvent) - 5) + "px";
//		pDivElement.style.left = (GetLayerX (pEvent) + 10) + "px";
//		Src.appendChild(pDivElement);
//		var pTextElement = document.createTextNode(Src.hinttext);
//		pDivElement.appendChild(pTextElement);
//	}
//	catch (e)
//	{
//	}
}

function SliderTickOnMouseOut (pEvent)
{
//	try
//	{
//		var Src = GetEventSourceElement(pEvent);
//		var b = document.getElementById("hint");
//		if (b != null)
//			Src.removeChild(b);
//	}
//	catch (e)
//	{
//	}
}

//resize the control
function SliderControlSetSize(w,h)
{
  this.width=w;
  this.height=h;
  this.slider.style.width=this.width+"px";
  this.slider.style.height=this.height+"px";
  this.UpdateThumbPosition(true);
  
   //set up main slider ticks
   var i = 0;
   var iStartIdxOfTickText = 0;
   for (i = 0; i < this.iYTickNumber; i++)
   {
       var slidertick = document.createElement('div');
       slidertick.className = "slidertick";
       slidertick.style.visibility = 'hidden';
       slidertick.style.zIndex = 6;
       slidertick.style.position = 'absolute';
       slidertick.style.fontSize = '0';       
       slidertick.tickpercent = i / (this.iYTickNumber-1);
       
       var newidx = this.TickTexts.indexOf(";", iStartIdxOfTickText);
       slidertick.hinttext = this.TickTexts.substr (iStartIdxOfTickText, newidx - iStartIdxOfTickText);
       iStartIdxOfTickText = newidx+1;
       
       slidertick.onmouseover=this.SliderTickOnMouseOverInternal;
       slidertick.onmouseout=this.SliderTickOnMouseOutInternal;
       slidertick.onmousedown = function (pEvent)
       {
          try 
          {
            StopEventPropagation(pEvent);
          }
          catch (e)
          {
          }
          return false;
       }
       slidertick.onclick = function ()
       {
           this.parentNode.parent.setPercentY (this.tickpercent); 
           if (this.parentNode.parent.onThumbMoved)    
               this.parentNode.parent.onThumbMoved(this.tickpercent);

       }
       this.slider.appendChild(slidertick);
       slidertick.style.top = Math.round(((this.height - GetLayerHeight(this.thumb)) / (this.iYTickNumber-1)) * i + GetLayerHeight(this.thumb)/2 - GetLayerHeight(slidertick)/2) +"px";   
       slidertick.style.left = Math.round(this.x+this.width/2-GetLayerWidth(slidertick)/2)+"px";
       slidertick.style.visibility = 'visible';
   }
}

//set control position
function SliderControlSetPosition(x,y)
{
  this.x=x;
  this.y=y;
  this.slider.style.left=this.x+"px";
  this.slider.style.top=this.y+"px";
  this.UpdateThumbPosition(true);
}

//set tracking
//true, false = horizontal slider
//false, true = vertical slider
//true, true  = x/y control
function SliderControlSetTracking(x,y)
{
  this.trackX=x;
  this.trackY=y;
  this.UpdateThumbPosition(true);
}

//callback on value change
function SliderControlNotify(x,y)
{
   //dummy callback, do nothing
}

//update the slider control position and optionally notify a listener
function SliderControlUpdateThumbPosition(notify)
{
   //check horizontal vs vertical vs xy
   if (this.trackX) {
      this.thumbWidth=this.thumbSize;
   }
   else
   {
      this.thumbWidth=this.width;
   }

   if (this.trackY) {
      this.thumbHeight=this.thumbSize;
   }
   else
   {
      this.thumbHeight=this.height;
   }

   this.thumb.style.width=this.thumbWidth+"px";
   this.thumb.style.height=this.thumbHeight+"px";

   //limit thumb movement
   if (this.mouseX>this.width-this.thumbWidth/2)
   {
      this.mouseX= Math.round(this.width-this.thumbWidth/2);
   }

   if (this.mouseY>this.height-this.thumbHeight/2)
   {
      this.mouseY=Math.round(this.height-this.thumbHeight/2);
   }

   if (this.mouseX<this.thumbWidth/2)
   {
      this.mouseX=Math.round(this.thumbWidth/2);
   }

   if (this.mouseY<this.thumbHeight/2)
   {
      this.mouseY=Math.round(this.thumbHeight/2);
   }

   if (!this.trackX)
   {
      this.mouseX=Math.round(this.width/2);
   }

   if (!this.trackY)
   {
      this.mouseY=Math.round(this.height/2);
   }

   //update x and y values (0..1)
   if (this.trackX) {
      this.xValue= Math.round(this.mouseX-this.thumbWidth/2)/(this.width-this.thumbWidth);
   }
   else
   {
      this.xValue=0;
   }

   if (this.trackY) {
      this.yValue= Math.round(this.mouseY-this.thumbHeight/2)/(this.height-this.thumbHeight);
   }
   else
   {
      this.yValue=0;
   }
//   this.thumb.style.left=(this.x+this.mouseX-this.thumbWidth/2)+"px";
//   this.thumb.style.top=(this.y+this.mouseY-this.thumbHeight/2)+"px";
   this.thumb.style.left=Math.round(this.mouseX-this.thumbWidth/2)+"px";
   this.thumb.style.top=Math.round(this.mouseY-this.thumbHeight/2)+"px";

   //notify listener
   if (notify)
   {
      if (this.trackY && this.trackX)
      {
         this.notify(this.xValue,this.yValue);
      }
      if (this.trackY && !this.trackX)
      {
         this.notify(this.yValue,this.yValue);
      }
      if (!this.trackY && this.trackX)
      {
         this.notify(this.xValue,this.xValue);
      }
   }
}

//set slider colors
function SliderControlSetColors(color,thumbColor)
{
   this.color=color;
   this.thumbColor=thumbColor;
   this.slider.style.backgroundColor=this.color;
   this.thumb.style.backgroundColor=this.thumbColor;
}

//set x and y values and optionally notify listener
function SliderControlSetValue(x,y,notify)
{
   this.xValue=x;
   this.yValue=y;
   if(x == undefined || isNaN(x))
   {
      x=0.5;
   }
   if (x>1)
   {
      x=1;
   }
   if (x<0)
   {
      x=0;
   }
   if(y == undefined || isNaN(y))
   {
      y=x;
   }
   if (this.trackX) {
      this.xValue=x;
      this.mouseX= Math.round((this.xValue*(this.width-this.thumbWidth))+this.thumbWidth/2);
   }
   if (this.trackY) {
      this.yValue=y;
      this.mouseY=Math.round((this.yValue*(this.height-this.thumbHeight))+this.thumbHeight/2);
   }
   if(notify == undefined)
   {
      notify = true;
   }
   this.UpdateThumbPosition(notify);
}

//set callback function
//function should have 2 parameters
//e.g. sliderMoved(x,y)
function SliderControlSetNotifier(func)
{
   if(typeof func == 'function')
   {
      this.notify=func;
   }
   else
   {
      alert('Notifier must be a function with 2 parameters');
   }
}

//set the thumb size
function SliderControlSetThumbSize(sz)
{
   this.thumbSize=sz;
   this.UpdateThumbPosition(true);
}


function SliderControlGetPercentY ()
{
   return this.yValue;
}

function SliderControlSetPercentY (value)
{  
	this.mouseY = Math.round(value * (this.height-this.thumbHeight) + this.thumbHeight/2);
   this.UpdateThumbPosition(true);
}

//constructor
function SliderControl(divParent)
{
   var me = this;
   
   //set a bunch of default values
   this.thumbWidth=17;
   this.thumbHeight=4;
   this.thumbSize=4;
   this.xValue=0;
   this.yValue=0;
   this.x=0;
   this.y=0;
   this.mouseX=0;
   this.mouseY=0;
   this.width=10;
   this.height=10;
   this.color='#FFFFFF';
   this.thumbColor='#000000';
   this.trackX=true;
   this.trackY=true;
   this.isMouseDown=false;
   this.iYTickNumber = 10;
   this.TickTexts = "";
   this.bYUseTicks = true;
   
   //set up main slider body
   this.slider = document.createElement('div');
   this.slider.className = "slider";
   this.slider.style.zIndex=6;
   this.slider.style.width=me.width+"px";
   this.slider.style.height=me.height+"px";
   this.slider.style.left=me.x+"px";
   this.slider.style.top=me.y+"px";
   this.slider.style.backgroundColor=me.color;   
   this.slider.style.visibility='visible';
   this.slider.style.position='relative';
   this.slider.style.fontSize='0';
   this.slider.parent=me;
   divParent.appendChild(me.slider);   
       
   //set up methods
   this.mouseDown=SliderControlMouseDown;
   this.setValue=SliderControlSetValue;
   this.setThumb=SliderControlSetThumb;
   this.setThumbSize=SliderControlSetThumbSize;
   this.setSize=SliderControlSetSize;
   this.setPosition=SliderControlSetPosition;
   this.setTracking=SliderControlSetTracking;
   this.setColors=SliderControlSetColors;
   this.setNotifier=SliderControlSetNotifier;
   this.setPercentY=SliderControlSetPercentY;
   this.getPercentY=SliderControlGetPercentY;
   this.UpdateThumbPosition=SliderControlUpdateThumbPosition;
   this.mouseUp=SliderControlMouseUp;
   this.mouseOut=SliderControlMouseOut;
   this.mouseMove=SliderControlMouseMove;
   this.notify=SliderControlNotify;
   this.onThumbMoved=null;
   
   this.slider.onmousedown=me.mouseDown;
   this.slider.onmouseup=me.mouseUp;
   this.slider.onmouseout=me.mouseOut;
   this.slider.onmousemove=me.mouseMove;
   
   
   //set up 'thumb' element
   this.thumb = document.createElement('div');
   this.thumb.className = "sliderthumb";
   this.thumb.style.zIndex=7;
   this.thumb.style.width=me.thumbWidth+"px";
   this.thumb.style.height=me.thumbHeight+"px";
   this.thumb.style.left=me.x+me.mouseX+"px";
   this.thumb.style.top=me.y+me.mouseY+"px";
   this.thumb.style.backgroundColor=me.thumbColor;
   this.thumb.style.visibility='visible';   
   this.thumb.style.position='absolute';
   this.thumb.style.fontSize='0';   
   this.slider.appendChild(me.thumb);
   this.thumb.onmousedown=me.mouseDown;
   this.thumb.onmouseup=me.mouseUp;
   this.thumb.onmousemove=SliderControlMouseMoveOnThumb;
   this.thumb.parent=me;   
   //set up 'hint' events
   this.SliderTickOnMouseOver = SliderTickOnMouseOver;
   this.SliderTickOnMouseOut = SliderTickOnMouseOut;
   this.SliderTickOnMouseOverInternal = function(pEvent) { if(me.SliderTickOnMouseOver) me.SliderTickOnMouseOver(pEvent);}
   this.SliderTickOnMouseOutInternal = function(pEvent) { if(me.SliderTickOnMouseOut) me.SliderTickOnMouseOut(pEvent);}
   this.GetTickDiv = function(iTick)
   {
			var i = 0;
			for(var div = me.slider.firstChild; div != null; div = div.nextSibling)
			{
				if(div.className != 'slidertick')
					continue;
				if(i==iTick)
					return div;
				i++;
			}
			return;
   }
   
   document.onmouseup=SliderControlDocMouseUp;
}
