/*
  From scriptaculous' treasure chest
  Some with slight mods to make work correctly.
*/

Effect.Transitions.slowstop = function(pos) {
  return 1-Math.pow(0.5,20*pos);
}


Effect.Transitions.exponential = function(pos) {
  return 1-Math.pow(1-pos,2);
}

Effect.Unfold = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  element.makeClipping();
  return new Effect.Scale(element, 100, Object.extend({   
    scaleContent: false,
    scaleY: false,
    scaleFrom: 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    afterSetup: function(effect) {
      effect.element.makeClipping();
      effect.element.setStyle({width: '1px', height: '5%'}).show();
/*      effect.element.makeClipping().setStyle({width: '1px', height: '1px'}).show(); */
    },
    afterFinishInternal: function(effect) {
      new Effect.Scale(element, 100, {
        scaleContent: false, 
        scaleX: false,
        scaleFrom: 5,
        scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
        restoreAfterFinish: true,
        afterSetup: function(effect) {
          effect.element.makeClipping();
          effect.element.setStyle({height: '1px'}).show(); 
/*          effect.element.makeClipping().setStyle({height: '1px'}).show(); */
        },  
        afterFinishInternal: function(effect) {
          effect.element.undoClipping().setStyle(oldStyle);
        }
      });
    }
  }, arguments[1] || {}));
};


Effect.Bounce = Class.create();
Object.extend(Object.extend(Effect.Bounce.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      x:0, y:200,
      acceleration: 9.81,
      transition: Effect.Transitions.linear,
      mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    Element.makePositioned(this.element);
    this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
    this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || '0');
    if(this.options.mode == 'absolute') {
      this.options.x = this.options.x - this.originalLeft;
    }
  },
  mytransition: function(pos){
    var temp = (pos < 0.5 ? 0.5-pos : 0.5+(1-pos)); 
    return (pos < 0.5 ? this.options.acceleration/2*temp*temp : this.options.acceleration/2*(1-temp)*(1-temp) ) *8 /this.options.acceleration - 1;
  },
  update: function(position) {
    Element.setStyle(this.element, {
      left: this.options.x  * position + this.originalLeft + 'px',
      top:  this.originalTop + this.options.y * this.mytransition(position)   + 'px'
    });
  }
});


Effect.Center = function(element) {
  try {
    element = $(element);
  } catch(e) {
    return;
  }

  var my_width  = 0;
  var my_height = 0;

  if ( typeof( window.innerWidth ) == 'number' ) { 
    my_width  = window.innerWidth;
    my_height = window.innerHeight;
  } else if ( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { 
    my_width  = document.documentElement.clientWidth;
    my_height = document.documentElement.clientHeight;
  } else if ( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { 
    my_width  = document.body.clientWidth;
    my_height = document.body.clientHeight;
  }

  element.style.position = 'absolute';
  element.style.display  = 'block';
  element.style.zIndex   = 99;

  var scrollY = 0;

  if ( document.documentElement && document.documentElement.scrollTop ) {
    scrollY = document.documentElement.scrollTop;
  } else if ( document.body && document.body.scrollTop ) {
    scrollY = document.body.scrollTop;
  } else if ( window.pageYOffset ) {
    scrollY = window.pageYOffset;
  } else if ( window.scrollY ) {
    scrollY = window.scrollY;
  }

  var elementDimensions = Element.getDimensions(element);

  var setX = ( my_width  - elementDimensions.width  ) / 2;
  var setY = ( my_height - elementDimensions.height ) / 2 + scrollY;

  setX = ( setX < 0 ) ? 0 : setX;
  setY = ( setY < 0 ) ? 0 : setY;

  element.style.left = setX + "px";
  element.style.top  = setY + "px";
}

Effect.DropIn = function(element) {
  element = $(element);
  var oldTop = element.style.top;
  var oldLeft = element.style.left;
  var pos = Position.cumulativeOffset(element);
  return new Effect.Parallel( [ 
      new Effect.MoveBy(element, 100, 0, { sync: true }), 
      new Effect.Opacity(element, { sync: true, from:0.0, to: 1.0 }) 
    ],
    Object.extend( { 
      duration: 0.5,
      beforeSetup: function(effect) { 
        Element.makePositioned(effect.effects[0].element); 
        Element.setOpacity(element, 0);
        element.style.position = 'absolute'; 
        element.style.top = (pos[1]-100) + 'px'; 
      }
    }, arguments[1] || {})
  );
}

Effect.ShakeVertical = function(element) {
  element = $(element);
  var oldStyle = {
    top: Element.getStyle(element, 'top'),
    left: Element.getStyle(element, 'left') };
  return new Effect.Move(element, 
    { x:  0, y: 20, duration: 0.05, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
    { x: 0, y: -40, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
    { x:  0, y: 40, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
    { x: 0, y: -40, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
    { x:  0, y: 40, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
    { x: 0, y: -20, duration: 0.05, afterFinishInternal: function(effect) { with(Element) {
    undoPositioned(effect.element);
    setStyle(effect.element, oldStyle);
  }}}) }}) }}) }}) }}) }});
}





