
/********************************** FMD SCROLLBAR **********************************/
/* Version: 1.0                                                                    */
/* Copyright (c) 2003 Flying Machine Development, All Rights Reserved              */
/* Contact: info@flyingmachinedevelopment.com                                      */
/***********************************************************************************/

/************************************** NOTES **************************************/
/* Currently supports only one scrolling area per page                             */
/* Currently supports only vertical orientation                                    */
/* Currently supports only fixed height - should grow to fit                       */
/* Currently does not support click on the "track" - just arrows and slider        */
/***********************************************************************************/


/************************************ scrollbar ************************************/


  function scrollbar()
  {
    this.top=0;
    this.left=0;
    this.height=0;
    this.width=0;
    this.topStop=15;
    this.bottomStop=85;
    this.scrollSpeed=10;
    this.scrollPosition=0;
    this.textIncrement=10;
    this.upArrowImage="";
    this.downArrowImage="";
    this.sliderImage="";
    this.sliderTrackImage=""
    this.divToScroll="scrl_text";
    this.orientation="vertical";
    this.show=showScrollBar;
    this.beginScroll=beginScroll;
    this.endScroll=endScroll;
    this.dragSlider=dragSlider;
    this.scrolling=false;
    this.scroll=scroll;
    this.scrollTo=scrollTo;
    this.scrollArea=new scrollarea();

    if(document.fmdWebFrame) // test for FMD Web Framework implementation
    {
      // add to webframe
      document.fmdWebFrame.scrollbar = this;
    }
    else
    {
      // else add to document for non-webframe applications
      document.scrollbar = this;
    }

    return this;
  }

  function beginScroll(dir)
  {
    this.scrolling=true;
    setTimeout((document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.scroll('+ dir+ ')',1)
  }

  function endScroll()
  {
    this.scrolling=false;
  }

  function scroll(dir)
  {
    if(!this.scrolling) return;

    var scrollMax=this.bottomStop-this.topStop; //number of possible increments

    // increment the position counter
    this.scrollPosition+=(dir>0?1:-1);
    if(this.scrollPosition>scrollMax) return;
    if(this.scrollPosition<0) return;

    // position the slider
    var e=findElement('scrl_slider');
    positionElement(e,getElementLeft(e),this.top+this.topStop+this.scrollPosition);

    // position the text
    var e=findElement(this.divToScroll);
    var textPos=(this.scrollPosition * this.textIncrement * -1);
    if(e.style)
    {
      positionElement(e,getElementLeft(e),textPos);
    }
    else // NS4 support
    {
      positionElement(e,this.scrollArea.left,textPos+this.scrollArea.top);
    }

    //window.status=this.scrollPosition;

    // reset the timer
    setTimeout((document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.scroll('+ dir+ ')',1)
  }
  
  function scrollTo(pos)
  {
    var scrollMax=this.bottomStop-this.topStop; //number of possible increments

    // set the position counter
    this.scrollPosition=pos;
    if(this.scrollPosition>scrollMax) return;
    if(this.scrollPosition<0) return;

    // position the slider
    var e=findElement('scrl_slider');
    positionElement(e,getElementLeft(e),this.top+this.topStop+this.scrollPosition);

    // position the text
    var e=findElement(this.divToScroll);
    var textPos=(this.scrollPosition * this.textIncrement * -1);
    if(e.style)
    {
      positionElement(e,getElementLeft(e),textPos);
    }
    else // NS4 support
    {
      positionElement(e,this.scrollArea.left,textPos+this.scrollArea.top);
    }

  }

  function showScrollBar()
  {
    var sBuf="";
    sBuf+='<div name="scrl_scrollbar" style="position:absolute;left:' + this.left + 'px;top:' + this.top + 'px;height:' + this.height + 'px;width:' + this.width + 'px">';
    sBuf+='<table cellpadding="0" cellspacing="0" border="0"><tr><td height="' + this.height + '" width="' + this.width + '">\n';
    sBuf+='<img onmousedown="' + (document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.beginScroll(-1)" onmouseup="' + (document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.endScroll()" onmouseout="' + (document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.endScroll()" src="' + this.upArrowImage + '" border="0"><br>';
    sBuf+='<img src="' + this.sliderTrackImage + '" border="0"><br>';
    sBuf+='<img onmousedown="' + (document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.beginScroll(1)" onmouseup="' + (document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.endScroll()" onmouseout="' + (document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.endScroll()" src="' + this.downArrowImage + '" border="0"><br>\n';
    sBuf+='</td></tr></table>\n';
    sBuf+='</div>\n';
    sBuf+='<div name="scrl_slider" id="scrl_slider" onmousedown="' + (document.fmdWebFrame?'document.fmdWebFrame.scrollbar':'document.scrollbar') + '.dragSlider(\'scrl_slider\',event)" style="left:' + this.left + 'px;top:' + (this.top+this.topStop) + 'px;position:absolute">\n';
    sBuf+='<img unselectable="on" src="' + this.sliderImage + '" border="0">\n';
    sBuf+='</div>\n';
    document.write(sBuf);
  }

  function dragSlider(n, event) 
  {
    var e=findElement(n);

    var dX = event.clientX - parseInt(e.style.left);
    var dY = event.clientY - parseInt(e.style.top);

    if (document.addEventListener) 
    {  
      document.addEventListener("mousemove", moveHandler, true);
	    document.addEventListener("mouseup", upHandler, true);
    }
    else if (document.attachEvent) 
    { 
      document.attachEvent("onmousemove", moveHandler);
    	document.attachEvent("onmouseup", upHandler);
    }
   else 
    {
  	  var oldmovehandler = document.onmousemove;
    	var olduphandler = document.onmouseup;
    	document.onmousemove = moveHandler;
    	document.onmouseup = upHandler;
    }

    if (event.stopPropagation) event.stopPropagation();
    else event.cancelBubble = true;                    

    if (event.preventDefault) event.preventDefault();
     else event.returnValue = false;                  

    // move the slider
    function moveHandler(ev) 
    {
  	  if (!ev) ev = window.event;
      var scrl=(document.fmdWebFrame?document.fmdWebFrame.scrollbar:document.scrollbar)

      // update the position counter
      scrl.scrollPosition=(ev.clientY - dY)-(scrl.topStop + scrl.top);
      
      var scrollMax=scrl.bottomStop-scrl.topStop; //number of possible increments
      if(scrl.scrollPosition<=scrollMax && scrl.scrollPosition>=0) 
      {
        // position the slider
        var e=findElement('scrl_slider');
        positionElement(e,getElementLeft(e),scrl.top+scrl.topStop+scrl.scrollPosition);

        // position the text
        var e=findElement(scrl.divToScroll);
        var textPos=(scrl.scrollPosition * scrl.textIncrement * -1);
        if(e.style)
        {
          positionElement(e,getElementLeft(e),textPos);
        }
        else // NS4 support
        {
          positionElement(e,scrl.scrollArea.left,textPos+scrl.scrollArea.top);
        }
      }

    	if (ev.stopPropagation) ev.stopPropagation(); 
  	  else ev.cancelBubble = true;                 
    }
  
    // stop moving the object
    function upHandler(ev) 
    {
  	  if (!ev) ev = window.event;
  
  	  if (document.removeEventListener) 
  	  {
  	    document.removeEventListener("mouseup", upHandler, true);
  	    document.removeEventListener("mousemove", moveHandler, true);
    	}
  	  else if (document.detachEvent) 
  	  {
  	    document.detachEvent("onmouseup", upHandler);
  	    document.detachEvent("onmousemove", moveHandler);
  	  }
  	  else 
  	  {
  	    document.onmouseup = olduphandler;
  	    document.onmousemove = oldmovehandler;
  	  }
  
    	if (ev.stopPropagation) ev.stopPropagation(); 
  	  else ev.cancelBubble = true;                 
    }
  
  }


/*********************************** scrollarea ************************************/

  function scrollarea()
  {
    this.top=0;
    this.left=0;
    this.height=0;
    this.width=0;
    this.writeBegin=beginScrollArea;    
    this.writeEnd=endScrollArea;    
    this.show=showScrollArea;
  }

  function beginScrollArea()
  {
    var sBuf="";
    sBuf+='<div id="scrl_container" class="scrl_container">\n';
    sBuf+='<div id="scrl_text" class="scrl_text">';
    document.write(sBuf);
  }

  function endScrollArea()
  {
    document.write("</div></div>");
  }

  function showScrollArea()
  {
    var e=findElement('scrl_container');
    positionElement(e,this.left,this.top);
    showElement(e);
    var e=findElement('scrl_text');
    showElement(e);
  }

/************************************ utilities ************************************/

  // (added for non-webframe support)

  function findElement(n, d) {
    var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
      d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
    if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
    for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=findElement(n,d.layers[i].document); 
    if(!x && document.getElementById) x=document.getElementById(n); return x;
  }

  function positionElement(e, x, y){if(e.moveToAbsolute){e.moveToAbsolute(x,y);}else{
    e.left=x;e.top=y;e.style.left=x;e.style.top=y}
  }   

  function getElementTop(e){
    if(e.offsetTop){var y=e.offsetTop;var p=e;while(p=p.offsetParent){
    y+=p.offsetTop}}else if(e.y){var y=e.y}else{y=0}return y;
  }

  function getElementLeft(e){
    if(e.offsetLeft){var x=e.offsetLeft;var p=e;while(p=p.offsetParent){
    x+=p.offsetLeft}}else if(e.x){var x=e.x;}else{x=0}return x;
  }

  function showElement(e){e.visibility='show';if(e.style)e.style.visibility='visible';}

