(function() {
	var
	Y = YAHOO.util,
	Event = Y.Event,
	Dom = Y.Dom;
	
	function Marquee(el) {
		this.el = Dom.get(el);
		
		this.slide = Dom.getFirstChild(this.el);
		this.messages = Dom.getElementsBy(Marquee.All, 'a', this.slide, this.initMessages, this, this);
		
		this.repeat = (function(scope, fn) { return function() { fn.apply(scope); } })(this, this.go);
		
		this.width = Dom.getRegion(this.el).width;
		this.distance = -this.width;
		
		Dom.setStyle(this.slide, 'left', this.distance + 'px');
		Dom.setStyle(this.el, 'overflow', 'hidden');
		Dom.setStyle(this.slide, 'visibility', 'visible');
		
		Event.on(this.el, 'mouseover', this.stop, null, this);
		Event.on(this.el, 'mouseout', this.start, null, this);
		
		this.start();
	}
	
	Marquee.prototype = {
		length: 0,
		speed: 4,
		width: null,
		distance: null,
		interval: null,
		timestamp: null,
		initMessages: function(a) {
			Dom.setStyle(a, 'left', this.length + 'px');
			
			this.length += Dom.getRegion(a).width + 20;
		},
		start: function() {
			this.stop();
			
			this.timestamp = new Date();
			
			this.interval = setInterval(this.repeat, 1);
		},
		go: function() {
			this.distance += this.speed * (new Date() - this.timestamp) / 100;
			
			if(this.distance > this.length) {
				this.distance = -this.width;
			}
			
			Dom.setStyle(this.slide, 'left', -this.distance + 'px');
			
			this.timestamp = new Date();
		},
		stop: function() {
			if(this.interval) {
				clearTimeout(this.interval);
				
				this.interval = null;
			}
		}
	};
	
	Marquee.All = function() {
		return true;
	};
	
	function init(div) {
		new Marquee(div);
	}
	
	Event.onDOMReady(function() {
		Dom.getElementsByClassName('marquee', 'div', document, init);
	});
})();
