var Rounded = Class.create();
Rounded.prototype =
{
  /**
   *
   */
  initialize: function (el)
  {
    this._el = $(el);

    if (this._el)
    {
      this._opts = Object.extend(
      {
        radius:        10,
        selectorPrefix: 'rounded-',
        contentClasses: [],
        corners: { tl: true, tr: true, bl: true, br: true }
      }, arguments[1] || {});

      this._opts.contentClasses[this._opts.contentClasses.length] = this._opts.selectorPrefix + 'content';
      this._round();
    }
  },

  // makes the rounding effect
  _round: function ()
  {
    var content = this._createContent();
    this._el.appendChild(this._createHeaderOrFooter('header'));
    this._el.appendChild(content);
    this._el.appendChild(this._createHeaderOrFooter('footer'));
  },

  // creates the content area of the element
  _createContent: function ()
  {
    var classStr = this._opts.contentClasses.join(' ');

    var content = new Element('div', { className: classStr }).setStyle({
      borderWidth: '0 1px'
    });

    this._el.cleanWhitespace();

    while (this._el.firstChild)
      content.appendChild(this._el.firstChild);

    return content;
  },

  // calculates the distance from the current point of the radius to the
  // circulus (?)
  _calculateDistance: function (arg)
  {
    return -(Math.sqrt(1 - (arg * arg)) - 1);
  },

  // creates the header or the footer element, depending of the argument
  _createHeaderOrFooter: function (headerOrFooter)
  {
    var el = new Element('b');
    var prevMargin = this._opts.radius;
    var header = (headerOrFooter == 'header');
    var rows = [];
    var left = header ? this._opts.corners.tl : this._opts.corners.bl;
    var right = header ? this._opts.corners.tr: this._opts.corners.br;
    var hfCls = (header ? 'header' : 'footer');
    var radius = (left || right) ? this._opts.radius : 1;

    // create the rows
    for (var i = 0; i < radius; i++)
    {
      // overall styles for the row
      var margin = Math.round(this._calculateDistance((radius - i) / radius) * radius);
      var cls  = this._opts.selectorPrefix + (i === 0 ? 'border' : hfCls);
      var borderWidth = prevMargin - margin === 0 ? 1 : prevMargin - margin;

      var row = new Element('b', { className: cls }).setStyle(
      {
        display: 'block',
        fontSize: '1px',
        overflow: 'hidden',
        height: '1px',
        margin: '0 ' + (right ? margin + 'px' : '0') + ' 0 ' + (left ? margin + 'px' : '0'),
        borderStyle: 'solid',
        borderWidth: (i === 0 ? '0' : ('0 ' + (right ? borderWidth : '1')
          + 'px 0 ' + (left ? borderWidth : '1') + 'px'))
      });

      rows.push(row);
      prevMargin = margin;
    }

    if (!header)
      rows.reverse();

    rows.each(function (item) { el.appendChild(item); });
    return el;
  }
};
