/**
 * Effect.Spiral spiral.js v1.0.1
 *
 * Copyright (c) 2008 Dan Dorman (http://underwhelm.net)
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

Effect.Spiral = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      arc: Math.PI / 2,
      direction: 'clockwise',
      x: 0,
      y: 0,
      mode: 'relative'
    }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop = parseFloat(this.element.getStyle('top') || '0');
    if (this.options.mode == 'absolute') {
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
	  this.hypotenuse = Math.sqrt(Math.pow(this.options.x, 2) + Math.pow(this.options.y, 2));
    } else {
	  this.hypotenuse = Math.sqrt(Math.pow(this.options.x - this.originalLeft, 2) + Math.pow(this.options.y - this.originalTop, 2));
	}
    this.finalAngle = Math.acos(this.options.x / this.hypotenuse);
    this.finalAngle = this.options.y < 0 ? -this.finalAngle : this.finalAngle;
    this.startAngle = this.options.direction == 'clockwise' ? this.finalAngle - this.options.arc : this.finalAngle + this.options.arc;
  },
  update: function(position) {
    var angle = this.options.direction == 'clockwise' ? this.startAngle + position * this.options.arc : this.startAngle - position * this.options.arc;
    this.element.setStyle({
      left: (Math.cos(angle) * position * this.hypotenuse + this.originalLeft).round() + 'px',
      top: (Math.sin(angle) * position * this.hypotenuse + this.originalTop).round() + 'px'
    });
  }
});

Number.prototype.toRadians = function() {
  return this * Math.PI / 180;
}

