var EFF = new function() {
}

EFF.Loop = function() {};

EFF.Loop.prototype.init = function(objOptions) {
  for(var option in objOptions) {
    this[option] = objOptions[option];
  }
  this.step = 0;
  this.Timeout = true;
}

EFF.Loop.prototype.run = function() {
  this.step++;
  if(this.onStep && typeof this.onStep == 'function') {
    this.onStep(this);
  }
  if(this.maxSteps > this.step) {
    var me = this;
    if (!this.canceled) {
      this.Timeout = setTimeout(function() { me.run() }, this.delay);
    }
  } else if(this.onDone && typeof this.onDone == 'function') {
    this.onDone(this);
  }
}

EFF.Loop.prototype.cancel = function() {
  this.canceled = true;
  clearTimeout(this.Timeout);
  if(this.onCancel) {
    this.onCancel();
  }
}

EFF.slideUp = function(element, options) {
  var curHeight = DOM.getSize(element).h;
  DOM.setHeight(element, options.startHeight);
  var loop = new EFF.Loop()
  var maxSteps = (options.totalTime / options.timeStep);
  var stepValue = Math.ceil((options.startHeight - options.endHeight) / maxSteps);
  loop.init({
      onStep: function(loop) {
          curHeight -= stepValue;
          DOM.setHeight(element, curHeight);
          if(options.onStep) {
            options.onStep(loop);
          }
      },
      onDone: function(loop) {
          DOM.setHeight(element, options.endHeight);
          if(options.onDone) {
            options.onDone(loop);
          }
          //DOM.setStyle(element, {visibility: 'hidden'});
      }
  });
  loop.maxSteps = maxSteps;
  loop.delay = options.timeStep;
  if (loop.maxSteps > 0) {
      loop.run();
    }
  return loop;
}

EFF.slideDown = function(element, options) {
  var curHeight = DOM.getSize(element).h;
  DOM.setHeight(element, options.startHeight);
  var loop = new EFF.Loop()
  var maxSteps = (options.totalTime / options.timeStep);
  var stepValue = Math.ceil((options.endHeight - options.startHeight) / maxSteps);
  loop.init({
      onStep: function(loop) {
          curHeight += stepValue;
          DOM.setHeight(element, curHeight);
          if(options.onStep) {
            options.onStep(loop);
          }
      },
      onDone: function(loop) {
          DOM.setHeight(element, options.endHeight);
          if(options.onDone) {
            options.onDone(loop);
          }
      }
  });
  loop.maxSteps = maxSteps;
  loop.delay = options.timeStep;
  if (loop.maxSteps > 0) {
      loop.run();
    }
  return loop;
}
