var Ticker = new Class({
	Implements: [Options],

	options: {
		'direction':       'rtl',
		'pauseOnHover':    true,
		'startDelay':      1000,
		'delimiter':       '&nbsp;+++&nbsp;',
    'onlyOneMsgShown': false
	},

	tickerContainer:   null,
	tickerUL:          null,
	tickerElements:    [],
	tickerWidth:       0,
	firstElementWidth: 0,
	paused:            false,
	timer:             null,
	distance:          1,
	interval:          10,

	initialize: function(el, options) {
		this.tickerContainer = $(el);
    
    if (!this.tickerContainer) {
      return;
    }
    
		this.setOptions(options);

		this.tickerUL = this.tickerContainer.getElement('ul');
		this.tickerElements = this.tickerContainer.getElements('li');

		var tickerContainerWidth = this.tickerContainer.getSize().x;

		this.tickerWidth = 0;
		this.tickerElements.each(function(el, index){
			el.setStyle('position', 'absolute');
      if (!this.options.onlyOneMsgShown) {
        el.innerHTML = el.innerHTML + this.options.delimiter;
      }
			var tmpClone = el.clone().setStyles({'visibility': 'hidden', 'white-space': 'nowrap'}).inject(document.body);
      var realWidth = Browser.Engine.trident ? el.getSize().x : tmpClone.getSize().x;
      var elementWidth = this.options.onlyOneMsgShown ? tickerContainerWidth + realWidth : realWidth;
			if (index == 0) {
				this.firstElementWidth = realWidth;
			}
			tmpClone.destroy();
			el.store('realWidth', realWidth);
			el.setStyle('left', this.tickerWidth);
			this.tickerWidth += elementWidth;
		}.bind(this));

		if (this.tickerWidth < tickerContainerWidth + this.firstElementWidth) {
			var i = 0;
			while(this.tickerWidth < tickerContainerWidth + this.firstElementWidth) {
				var newTickerElement = this.tickerElements[i].clone();
				var elementWidth = this.tickerElements[i].retrieve('realWidth');
				newTickerElement.addClass('ticker_item');
				newTickerElement.setStyles({'left': this.tickerWidth, 'position': 'absolute'});
				newTickerElement.store('realWidth', elementWidth);
				newTickerElement.inject(this.tickerUL);
				this.tickerWidth += elementWidth;
				i++;
				if (i >= this.tickerElements.length) {
					i = 0;
				}
			}
			this.tickerElements = this.tickerContainer.getElements('li');
		}

		this.tickerUL.setStyle('width', this.tickerWidth);
		this.tickerUL.setStyle('position', 'relative');
		this.tickerUL.setStyle('left', 0);

		this.tickerContainer.addEvent('mouseenter', this.onMouseEnter.bindWithEvent(this));
		this.tickerContainer.addEvent('mouseleave', this.onMouseLeave.bindWithEvent(this));

		this.start.delay(this.options.startDelay, this);
	},

	start: function() {
		this.timer = this.move.periodical(this.interval, this);
	},

	move: function() {
		if (!this.paused) {
			this.tickerElements.each(function(el){
				var elementPosition = el.getStyle('left').toInt();
				var elementWidth = el.retrieve('realWidth');
				if (elementPosition < 0 - elementWidth) {
					el.setStyle('left', this.tickerWidth - elementWidth);
					return;
				}
				el.setStyle('left', elementPosition - this.distance);
			}.bind(this));
		}
	},

	pause: function() {
		this.paused = true;
	},

	resume: function() {
		this.paused = false;
	},

	onMouseEnter: function(evt) {
		if (this.options.pauseOnHover) {
			this.pause();
		}
	},

	onMouseLeave: function(evt) {
		if (this.options.pauseOnHover) {
			this.resume();
		}
	}
});

window.addEvent('domready', function(){
	ticker = new Ticker('ticker_container', {delimiter: '&nbsp;&nbsp;&nbsp;&nbsp;+++&nbsp;&nbsp;&nbsp;&nbsp;', onlyOneMsgShown: false});
});
