Ozein.Suspender = Class.create();
Ozein.Suspender.prototype = {
  initialize: function(node, options) {
    this.setOptions(options);
    this.node = node;
    if (this.options.trigger == 'auto') {
      this.doSuspend();
    } else {
      Event.observe(node, this.options.trigger, this.doSuspend.bindAsEventListener(this));
    }
  },
  setOptions: function(options) {
    this.options = {
      trigger: 'auto',
      entity: 'msg',
      offsetX: 0,
      offsetY: 0,
      duration: 1.0
    }
    Object.extend(this.options, options || {});
  },
  doSuspend: function() {
    var op = this.options;
    switch (op.entity) {
    case 'msg':
      var entity = document.createElement('div');
      entity.innerHTML = op.msg;
      break;
    case 'element':
      var entity = $(op.element).cloneNode(true);
      entity.id = '';
      break;
    case 'image':
      var entity = document.createElement('div');
      var img = document.createElement('img');
      img.src = op.image;
      entity.appendChild(img);
      break;
    defaut:
      return;
      break;
    }
    if (op.className) {
      Element.addClassName(entity, op.className);
    }
    
    document.body.appendChild(entity);
    var pos = Position.cumulativeOffset(this.node);
    var nodeX = pos.shift();
    var nodeY = pos.shift();
    var offsetX = op.offsetX;
    var offsetY = Element.getHeight(entity) * -1 + op.offsetY;
    var x = nodeX + offsetX;
    var y = nodeY + offsetY;
    
    Element.setStyle(entity, {
      left: x + 'px',
      top: y + 'px',
      position: 'absolute',
      display: 'block'
    });
    
    new Effect.Suspend(entity, {duration: op.duration, afterFinish: this.afterFinish.bind(this, entity)});
  },
  afterFinish: function(entity) {
    Element.remove(entity);
  }
}
