if (typeof common == 'undefined') common = {};

/**
 * Class common.diashow
 */
common.diashow = Class.create({
  _element: null,
  _position_element: null,
  _pause_element: null,

  _delay: 15,

  _timer: null,
  _isAnimating: false,
  _play: false,

  _items: new Array(),
  _curItem: 0,

  initialize: function(element)
  {
    this._element = $(element);
    if (!this._element) {
      throw('Diashow: element not found!');
    }

    this._position_element = this._element.select('.diashow-position').reduce();
    this._pause_element = this._element.select('.diashow-pause').reduce();

    this._items = this._element.select('.diashow_item');

    if (this._items.length > 1) {
      this._setupControls();

      if (this._pause_element) {
        this._togglePausePlay();
      }
    }
  },

  _setupControls: function()
  {

    this._element.select('.diashow-zurueck').invoke('observe', 'mousedown', function(e) {
      this._event_previous(e)

      this._element.select('.diashow-zurueck').first().removeClassName('aktiv');
    }.bind(this));

    this._element.select('.diashow-vorwaerts').invoke('observe', 'mousedown', function(e) {
      this._event_next(e);

      this._element.select('.diashow-vorwaerts').first().removeClassName('aktiv');
    }.bind(this));

    this._element.select('.diashow-zurueck').invoke('observe', 'mouseup', function() {
        this._element.select('.diashow-zurueck').first().addClassName('aktiv');
    }.bind(this));

    this._element.select('.diashow-vorwaerts').invoke('observe', 'mouseup', function() {
        this._element.select('.diashow-vorwaerts').first().addClassName('aktiv');
    }.bind(this));

    this._element.select('.diashow-zurueck').invoke('observe', 'mouseover', function() {
        this._element.select('.diashow-zurueck').first().addClassName('aktiv');
    }.bind(this));

    this._element.select('.diashow-vorwaerts').invoke('observe', 'mouseover', function() {
        this._element.select('.diashow-vorwaerts').first().addClassName('aktiv');
    }.bind(this));

    this._element.select('.diashow-zurueck').invoke('observe', 'mouseout', function() {
        this._element.select('.diashow-zurueck').first().removeClassName('aktiv');
    }.bind(this));

    this._element.select('.diashow-vorwaerts').invoke('observe', 'mouseout', function() {
        this._element.select('.diashow-vorwaerts').first().removeClassName('aktiv');
    }.bind(this));

    if (this._pause_element) {
        this._pause_element.observe('click', this._event_togglePausePlay.bindAsEventListener(this));

        this._pause_element.observe('mouseover', function() {
          this._pause_element.addClassName('hover');
      }.bind(this));

        this._pause_element.observe('mouseout', function() {
          this._pause_element.removeClassName('hover');
      }.bind(this));
    }
  },

  _event_togglePausePlay: function(e)
  {
    e.stop();
    e.target.blur();
    this._togglePausePlay();

    if (this._pause_element) {
      this._pause_element.toggleClassName('aktiv');
    }
  },

  _togglePausePlay: function()
  {
    if (this._play) {
      this._play = false;

      if (this._timer != null) {
        window.clearTimeout(this._timer);
        this._timer = null;
      }
    }
    else {
      this._play = true;
      this._timer = window.setTimeout(
        this._next.bind(this),
        this._delay * 500
      );
    }
  },

  _event_next: function(e)
  {
    if (typeof _briTracker != 'undefined') {
      _briTracker.track({additional_tracking_info: 'diashow_clickNext'});
    }
    e.stop();
    e.target.blur();
    this._next();

  },

  _event_previous: function(e)
  {
    if (typeof _briTracker != 'undefined') {
      _briTracker.track({additional_tracking_info: 'diashow_clickPrevious'});
    }

    e.stop();
    e.target.blur();
    this._previous();
  },

  _next: function()
  {
    var pos = ((this._curItem + 1) >= this._items.length) ? 0 : (this._curItem + 1);
    this._flipTo(pos);

  },

  _previous: function()
  {
    var pos = ((this._curItem - 1) < 0) ? (this._items.length - 1) : (this._curItem - 1);
    this._flipTo(pos);

  },

  _flipTo: function(item_num)
  {
    if (this._isAnimating) {
      return;
    }
    this._isAnimating = true;

    if (this._timer != null) {
      window.clearTimeout(this._timer);
      this._timer = null;
    }

    new Effect.Opacity(this._items[this._curItem], {
      from: 1.0, to: 0.0, duration: 0.5,
      afterFinish: function(effect) {
        effect.element.hide();
        this._curItem = item_num;

        new Effect.Opacity(this._items[this._curItem], {
          from: 0.0, to: 1.0, duration: 0.5,
          beforeStart: function(effect) {
            effect.element.setOpacity(0.0).show();
            if (this._position_element) {
              this._position_element.update((this._curItem + 1)+' / '+this._items.length);
            }

            this._isAnimating = false;

            if (this._play) {
              this._timer = window.setTimeout(
                this._next.bind(this),
                this._delay * 500
              );
            }
          }.bind(this)
        });
      }.bind(this)
    });
  }
});
