/*******************************************************************************
 * Objecte que gestiona barres d'scroll
 ******************************************************************************/

// array d'objectes (necessari per gestionar els events i dirigir-los a
// l'objecte correcte)
var scrollBars = new Array();
var scIndex;

function scrollEvent(e) {
var generador;

  // recollir event
	if (!e) var e = window.event;                            // For IE

  // determinar qui l'ha generat
	if (e.target) generador = e.target;                      // For Mozilla
	else if (e.srcElement) generador = e.srcElement;         // For IE
	if (generador.nodeType == 3) // defeat Safari bug
		generador = generador.parentNode;

  // obtenir índex de l'objecte on s'inicia l'scroll
  // es fa en minúscules perque Mozilla ho fa
  var i = 0;
  while (generador.attributes[i]) {
    if (generador.attributes[i].name.toLowerCase() == "scrollindex") {
      scIndex = generador.attributes[i].value;
      break;
    }
    i++;
  }

  if (e.type == 'mousedown') {
    // executar el mčtode que inicia l'scroll
    scrollBars[scIndex].inici(e);
  } if (e.type == 'mousemove') {
    // executar el mčtode que realitza l'scroll
    scrollBars[scIndex].moviment(e);
  } if (e.type == 'mouseup') {
    // executar el mčtode que finalitza l'scroll
    scrollBars[scIndex].fi(e);
  }

  return false;
}

function scbInici(e) {
  // guardar valors inicials

  this.scBox.onDragStart(parseInt(this.scBox.style.right), parseInt(this.scBox.style.top));

  this.actualY = e.clientY
  this.actualTop = parseInt(this.scBox.style.top);

  // capturar events
  document.onmousemove = scrollEvent;
  document.onmouseup = scrollEvent;
  return false;
}

function scbMoviment(e) {
  
  // calcular nova posició
  this.actualTop = this.actualTop - (this.actualY - e.clientY);
  this.actualY = e.clientY;
  
  // realitzar moviment
  if (this.actualTop > 0 && this.actualTop < this.maxTop) {
    this.scBox.style.top = this.actualTop + "px";
  }
  if (this.actualTop <= 0) {
    this.scBox.style.top = "0px";
  }
  if (this.actualTop >= this.maxTop) {
    this.scBox.style.top = this.maxTop + "px";
  }

  this.scBox.onDrag(this.scBox.style.right, this.scBox.style.top);

//  status = "Max: " + this.maxTop + " Top: " + this.scBox.style.top

  return false;
}

function scbFi() {
  // alliberar events
  document.onmousemove = null;
  document.onmouseup = null;

  this.scBox.onDragEnd(this.scBox.style.right, this.scBox.style.top);
 
  return false;
}

function scbMoure(x) {
  var scrollY;
  var docY;
  if (this.AlcadaContingut - 10 > this.AlcadaContenidor) {
    scrollY = parseInt(this.scBox.style.top) - x;
    if (scrollY < 0) scrollY = 0;
    if (scrollY > this.maxTop) scrollY = this.maxTop;
    this.scBox.style.top = scrollY + "px";
    docY = 0 - (scrollY * (this.AlcadaContingut - this.AlcadaContenidor) / this.maxTop);
    this.contingut.style.top = docY + 'px';
  }

  return false;
}

function scbRoda(e) {
    var delta = 0;
    if (!e) e = window.event;         // For IE
    if (e.wheelDelta)                 // IE case
      delta = e.wheelDelta;
    else if (e.detail)                // Mozilla case
      delta = -e.detail;              // Mozilla and IE deltas differ in sign
    if (delta)
      delta = delta < 0? -1 : +1;
    if (delta) {
      if (delta > 0)
        this.mou(6);                  // Code for rolling down
      else
        this.mou(-6);                 // ...and up
    }

  return false;
}

function objScrollBar(scBar, scBox, contenidor, contingut, i) {
  /*****************************************************************************
   * propietats
   ****************************************************************************/
  // identificador de l'objecte (cal que sigui únic)
  this.index = i;
  // barra d'scroll
  this.scBar = document.getElementById(scBar);
  // contingut de la barra d'scroll
  this.scBox = document.getElementById(scBox);
  // contenidor de l'area que fa scroll
  this.contenidor = document.getElementById(contenidor);
  // area que fa scroll
  this.contingut = document.getElementById(contingut);
  // valor mŕxim que pot tenir la propietat 'top' de l'element scBox 
  this.maxTop = 0;
  // conserva el valor de la propietat 'top' de l'element scBox
  this.actualTop = 0;
  // coordenada vertical del ratoli
  this.actualY = 0;
  // alçada dels diferents elements
  this.AlcadaContingut = this.contingut.offsetHeight + 10;
  this.AlcadaContenidor = this.contenidor.offsetHeight;
  this.AlcadaBarra = this.scBar.offsetHeight;
  this.AlcadaBox = 0;

  /*****************************************************************************
   * mčtodes
   ****************************************************************************/
  this.inici = scbInici;        // inici del moviment de la barra
  this.moviment = scbMoviment;  // moviment de la barra
  this.fi = scbFi;              // fi del moviment de la barra
  this.mou = scbMoure;          // moviment determinat
  this.roda = scbRoda;          // moviment de la roda del ratoli
  
  /*****************************************************************************
   * inicialització
   ****************************************************************************/
  // assignar l'scroll a un element de l'array
  scrollBars[this.index] = this;

  // desactivar drag and drop
  this.scBox.onDragStart = new Function();
  this.scBox.onDragEnd = new Function();
  this.scBox.onDrag = new Function();

  // calcular alçada de l'scroll box
  if (this.AlcadaContingut > this.AlcadaContenidor) {
    this.AlcadaBox = (this.AlcadaContenidor * this.AlcadaBarra) / this.AlcadaContingut;
  } else {
    this.AlcadaBox = this.AlcadaContenidor - 2;
  }
  this.scBox.style.height = Math.round(this.AlcadaBox) + 'px';

  // calcular mŕxim que pot tenir la propietat 'top' de l'element scBox
  this.maxTop = this.AlcadaBarra - this.AlcadaBox - 2;
  if (isNaN(parseInt(this.scBox.style.top))) {this.scBox.style.top = '0px'};
  this.actualTop = parseInt(this.scBox.style.top);

  //add ondrag function
  this.scBox.onDrag = function (x,y) {
    var scrollY = parseInt(scrollBars[scIndex].scBox.style.top);
    var docY = 0 - (scrollY * (scrollBars[scIndex].AlcadaContingut - scrollBars[scIndex].AlcadaContenidor) / scrollBars[scIndex].maxTop);
    if (scrollBars[scIndex].AlcadaContingut - 10 > scrollBars[scIndex].AlcadaContenidor) {
      scrollBars[scIndex].contingut.style.top = docY + 'px';
    }
    return false;
  }

  // capturar l'event onmousedown
  this.scBox.onmousedown = scrollEvent;
}
