/* cbe_slide.js
 * CBE v4b10 : Cross-Browser DHTML API for IE, Gecko, Opera, Netscape, Konqueror and similar browsers. Download at cross-browser.com
 * Copyright (c) 2002 Michael Foster (mike@cross-browser.com)
 * This library is distributed under the terms of the GNU Lesser General Public License (gnu.org).
 * Time-based, parametric equation animation derived from algorithms by Aaron Boodman (youngpup.net), and Sebastien Chevrel (sebchevrel.com).
*/
CrossBrowserElement.prototype.slideBy = function(dX, dY, totalTime, endListener) {
  var targetX, targetY;
  dX = parseInt(dX);
  dY = parseInt(dY);
  targetX = this.left() + dX;
  targetY = this.top() + dY;
  this.slideTo(targetX, targetY, totalTime, endListener)
}
CrossBrowserElement.prototype.slideTo = function(x, y, totalTime, endListener) {
  if (this.onslidestart) cbeEval(this.onslidestart, this);
  this.xTarget = parseInt(x);
  this.yTarget = parseInt(y);
  this.slideTime = parseInt(totalTime);
  if (isNaN(this.xTarget)) {
    var outside=false;
    if (isNaN(this.yTarget)) {
      y = 0;
      outside = true;
    }
    this.cardinalPosition(x, y, outside);
    this.xTarget = this.x;
    this.yTarget = this.y;
  }
  if (endListener && window.cbeEventJsLoaded) {
    this.autoRemoveListener = true;
    this.addEventListener('slideend', endListener);
  }
  this.stop = false;
  // A = distance
  this.yA = this.yTarget - this.top();
  this.xA = this.xTarget - this.left();
  // B = period
  this.B = Math.PI / (2 * this.slideTime);
  // D = initial position
  this.yD = this.top();
  this.xD = this.left();
  if (this.slideRate == cbeSlideRateLinear) {
    this.B = 1/this.slideTime;
  }
  else if (this.slideRate == cbeSlideRateCosine) {
    this.yA = -this.yA;
    this.xA = -this.xA;
    this.yD = this.yTarget;
    this.xD = this.xTarget;
  }
  var d = new Date();
  this.C = d.getTime();
/*  
  alert(
    'xT: '+this.xTarget + '\n' +
    'yT: '+this.yTarget + '\n' +
    'yA: '+this.yA + '\n' +
    'xA: '+this.xA + '\n' +
    'B: '+this.B + '\n' +
    'yD: '+this.yD + '\n' +
    'xD: '+this.xD + '\n' +
    'C: '+this.C + '\n'
  );
*/  
  if (!this.moving) this.slide();
}
CrossBrowserElement.prototype.slide = function() {
  var now, s, t, newY, newX;
  now = new Date();
  t = now.getTime() - this.C;
  if (this.stop) { this.moving = false; }
  else if (t < this.slideTime) {
    setTimeout("window.cbeAll["+this.index+"].slide()", this.timeout);
    if (this.slideRate == cbeSlideRateLinear) s = this.B * t;
    else if (this.slideRate == cbeSlideRateSine) s = Math.sin(this.B * t);
    else s = Math.cos(this.B * t); // this.slideRate == cbeSlideRateCosine
    newX = Math.round(this.xA * s + this.xD);
    newY = Math.round(this.yA * s + this.yD);
    if (this.onslide) cbeEval(this.onslide, this, newX, newY, t);
    this.moveTo(newX, newY);
    this.moving = true;
  }  
  else {
    this.moveTo(this.xTarget, this.yTarget);
    this.moving = false;
    if (this.onslideend) {
      var tmp = this.onslideend;
      if (this.autoRemoveListener && window.cbeEventJsLoaded) {
        this.autoRemoveListener = false;
        this.removeEventListener('slideend');
      }
      cbeEval(tmp, this);
    }
  }  
}
CrossBrowserElement.prototype.ellipse = function(xRadius, yRadius, radiusInc, totalTime, startAngle, stopAngle, endListener) {
  if (this.onslidestart) cbeEval(this.onslidestart, this);
  this.stop = false;
  this.xA = parseInt(xRadius);
  this.yA = parseInt(yRadius);
  this.radiusInc = parseInt(radiusInc);
  this.slideTime = parseInt(totalTime);
  startAngle = cbeRadians(parseFloat(startAngle));
  stopAngle = cbeRadians(parseFloat(stopAngle));
  if (endListener && window.cbeEventJsLoaded) {
    this.autoRemoveListener = true;
    this.addEventListener('slideend', endListener);
  }
  var startTime = (startAngle * this.slideTime) / stopAngle;
  var stopTime = this.slideTime;
  this.B = stopAngle / this.slideTime;
  this.xD = this.left() - Math.round(this.xA * Math.cos(this.B * startTime)); // center point
  this.yD = this.top() - Math.round(this.yA * Math.sin(this.B * startTime)); 
  this.xTarget = Math.round(this.xA * Math.cos(this.B * stopTime) + this.xD); // end point
  this.yTarget = Math.round(this.yA * Math.sin(this.B * stopTime) + this.yD); 
  var d = new Date();
  this.C = d.getTime() - startTime;
  if (!this.moving) this.ellipse1();
}
CrossBrowserElement.prototype.ellipse1 = function() {
  var now, t, newY, newX;
  now = new Date();
  t = now.getTime() - this.C;
  if (this.stop) { this.moving = false; }
  else if (t < this.slideTime) {
    setTimeout("window.cbeAll["+this.index+"].ellipse1()", this.timeout);
    if (this.radiusInc) {
      this.xA += this.radiusInc;
      this.yA += this.radiusInc;
    }
    newX = Math.round(this.xA * Math.cos(this.B * t) + this.xD);
    newY = Math.round(this.yA * Math.sin(this.B * t) + this.yD);
    if (this.onslide) cbeEval(this.onslide, this, newX, newY, t);
    this.moveTo(newX, newY);
    this.moving = true;
  }  
  else {
    if (this.radiusInc) {
      this.xTarget = Math.round(this.xA * Math.cos(this.B * this.slideTime) + this.xD);
      this.yTarget = Math.round(this.yA * Math.sin(this.B * this.slideTime) + this.yD); 
    }
    this.moveTo(this.xTarget, this.yTarget);
    this.moving = false;
    if (this.onslideend) {
      var tmp = this.onslideend;
      if (this.autoRemoveListener && window.cbeEventJsLoaded) {
        this.autoRemoveListener = false;
        this.removeEventListener('slideend');
      }
      cbeEval(tmp, this);
    }
  }  
}
CrossBrowserElement.prototype.stopSlide = function() { this.stop = true; }
CrossBrowserElement.prototype.startSequence = function(uIndex) {
  if (!this.moving) {
    if (!uIndex) this.seqIndex = 0;
    else this.seqIndex = uIndex;
    this.addEventListener('slideEnd', cbeSlideSequence);
    cbeSlideSequence(this);
  }
}
CrossBrowserElement.prototype.stopSequence = function() {
  this.stop=true;
  this.removeEventListener('slideEnd', cbeSlideSequence);
}
function cbeSlideSequence(cbe) {
  var
    pw = cbe.parentNode.width(),
    ph = cbe.parentNode.height(),
    w = cbe.width(),
    h = cbe.height();
  if (cbe.seqIndex >= cbe.sequence.length) cbe.seqIndex = 0;
  eval('cbe.'+cbe.sequence[cbe.seqIndex++]);
}
var cbeSlideRateLinear=0, cbeSlideRateSine=1, cbeSlideRateCosine=2;
CrossBrowserElement.prototype.slideRate = cbeSlideRateSine;
CrossBrowserElement.prototype.seqIndex = 0;
CrossBrowserElement.prototype.radiusInc = 0;
CrossBrowserElement.prototype.t = 0;
CrossBrowserElement.prototype.xTarget = 0;     
CrossBrowserElement.prototype.yTarget = 0;     
CrossBrowserElement.prototype.slideTime = 1000;
CrossBrowserElement.prototype.xA = 0;
CrossBrowserElement.prototype.yA = 0;
CrossBrowserElement.prototype.xD = 0;
CrossBrowserElement.prototype.yD = 0;
CrossBrowserElement.prototype.B = 0;
CrossBrowserElement.prototype.C = 0;
CrossBrowserElement.prototype.moving = false;
CrossBrowserElement.prototype.stop = true;
CrossBrowserElement.prototype.timeout = 35;
CrossBrowserElement.prototype.autoRemoveListener = false;
CrossBrowserElement.prototype.onslidestart = null;
CrossBrowserElement.prototype.onslide = null;
CrossBrowserElement.prototype.onslideend = null;
var cbeSlideJsLoaded = true;
// End cbe_slide.js