/**
 * @author Iris Associates Ltd.
 * @version 1.0
 */
 
var NewsTicker = Class.create({
	elem: null,
	paused: false,
	currentEffect: null,
	
	options: {
		showControls: true,
		typewriterTime: 6,
		typewriterPause: 7,
		controlPreviousImage: "../images/button-newsticker-previous.png",
		controlNextImage: "../images/button-newsticker-next.png",
		controlPauseImage: "../images/button-newsticker-pause.png",
		controlPlayImage: "../images/button-newsticker-play.png"
	},
	
	initialize: function(elem, options)
	{
		this.elem = $(elem);
		if(!this.elem)
		{
			throw "Unable to bind to element";
		}
		
		this.elem.addClassName("scripted");
		this.elem.childElements().invoke("hide").first().show().addClassName("showing");
		this.elem.insert({bottom: "<li class=\"revealer control\">_</li>"});
		
		this.options = Object.extend(this.options, options);
		
		this.buildControls();
		this.trigger();
	},
	
	trigger: function()
	{
		if(!this.paused)
		{
			var s = this.elem.getWidth();
			var e = (s - this.elem.down(".showing").getWidth());
			
			this.currentEffect = new Effect.Tween(this.elem.down(".revealer").show(), s, e, {
				duration: this.options.typewriterTime,
				transition: Effect.Transitions.linear,
				afterFinish: function() { this.reload() }.bind(this)
			}, function(p) {
				this.setStyle({"width": p+"px"});
			});
		}
	},
	
	reload: function()
	{
		if(!this.paused)
		{
			var revealer = this.elem.down(".revealer").hide();
			var showing = this.elem.down(".showing");
			var next = showing.next();
			next = (!next || next.hasClassName("control")) ? showing.siblings().first() : next;
			
			this.currentEffect = Effect.SlideUp(showing, {
				delay: this.options.typewriterPause,
				afterFinish: function(showing, next, effect) {
					revealer.setStyle({"width": "960px"});
	
					next.addClassName("showing").show().
						siblings().reject(function(s) { return s.hasClassName("control"); }).
						invoke("removeClassName", "showing").invoke("hide");
					
					/*pull*/this.trigger();
				}.bind(this, showing, next)
			});
		}
	},
	
	pause: function(evt)
	{
		if(evt)
		{
			evt.stop();
		}
		
		if(!this.paused)
		{
			this.paused = true;
			this.elem.down(".revealer").hide();
			this.elem.down(".pauseControl").writeAttribute({src: this.options.controlPlayImage});
			
			if(this.currentEffect)
			{
				this.currentEffect.cancel();
				this.currentEffect = null;
			}
		}
		else
		{
			this.paused = false;
			this.elem.down(".pauseControl").writeAttribute({src: this.options.controlPauseImage});
			this.reload();
		}
	},
	
	next: function(evt)
	{
		if(evt)
		{
			evt.stop();
			
			if(!this.paused)
			{
				this.pause();
			}
		}
		
		var s = this.elem.down(".showing");
		var n = s.next();
		n = (!n || n.hasClassName("control")) ? s.siblings().first() : n;
		
		s.hide().removeClassName("showing"); n.show().addClassName("showing");
	},
	
	previous: function(evt)
	{
		evt.stop();
		if(!this.paused)
		{
			this.pause();
		}
		
		var s = this.elem.down(".showing");
		var p = s.previous();
		p = (!p) ? s.siblings().reject(function(s) { return s.hasClassName("control"); }).last() : p;
		
		s.hide().removeClassName("showing"); p.show().addClassName("showing");
	},
	
	buildControls: function()
	{
		var pauseElem = $(document.createElement("img")).addClassName("pauseControl").
			observe("click", this.pause.bindAsEventListener(this)).writeAttribute({src: this.options.controlPauseImage});
		
		var previousElem = $(document.createElement("img")).addClassName("previousControl").
			observe("click", this.previous.bindAsEventListener(this)).writeAttribute({src: this.options.controlPreviousImage});
		
		var nextElem = $(document.createElement("img")).addClassName("nextControl").
			observe("click", this.next.bindAsEventListener(this)).writeAttribute({src: this.options.controlNextImage});
		
		var liElem = $(document.createElement("li")).addClassName("control").
			insert({top: pauseElem}).insert(previousElem).insert(nextElem);
		
		this.elem.insert({bottom: liElem});
	}
});

new NewsTicker("newsTicker");