
function ITTI_TickerTape(container_div) {

	if (ITTI_TickerTape.Instances==undefined) {
		ITTI_TickerTape.Instances = [];
	}
	
	this.id = ITTI_TickerTape.Instances.length;
	ITTI_TickerTape.Instances[this.id] = this;
	
	this.test = 'test';
	
	// the container DIV element
	this.container = container_div;
	
	// items (jQuery object)
	this.items = jQuery(this.container).find("div.ticker_item");
	this.current_index = undefined;
	
	
	// playback control images
	this.img_pause    = jQuery(this.container).find("img.ticker_pause").get(0);
	this.img_play     = jQuery(this.container).find("img.ticker_play").get(0);
	this.img_backward = jQuery(this.container).find("img.ticker_backward").get(0);
	this.img_forward  = jQuery(this.container).find("img.ticker_forward").get(0);
	
	// playback state
	this.playback_stopped = true; // will get "false" once we set up the timers
	this.playback_suspended = false; // true when mouse is over the ticker
	

	this.play_pause = function (event) {
		// event.data <=> this
		
		// playback is already paused because the mouse is over the ticker
		// because of this, we neither pause nor resume the timer
		event.data.playback_stopped = (!event.data.playback_stopped);
		
		if (event.data.playback_stopped) {
			jQuery(event.data.img_pause).hide();
			jQuery(event.data.img_play).show();
		} else {
			jQuery(event.data.img_pause).show();
			jQuery(event.data.img_play).hide();
		}
	};
	
	jQuery(this.img_pause).bind('click', this, this.play_pause);
	jQuery(this.img_play).bind('click', this, this.play_pause);

	
	jQuery(this.img_backward).bind('click', this, function(event){
		// event.data <=> this
		event.data.backward();
	});

	jQuery(this.img_forward).bind('click', this, function(event){
		// event.data <=> this
		event.data.forward();
	});
	
	
	jQuery(this.container).bind('mouseover', this, function(event){
		// event.data <=> this
		event.data.playback_suspended = true;
		event.data.timer.pause();
	});
	
	jQuery(this.container).bind('mouseout', this, function(event){
		// event.data <=> this
		event.data.playback_suspended = false;
		if (!event.data.playback_stopped) {
			event.data.timer.resume();
		}
	});

	
	this.backward = function () {
		this.activateItem(this.getPrevIndex(this.current_index));

		// reset timer
		this.timer.stop(); 
	}

	this.forward = function () {
		this.activateItem(this.getNextIndex(this.current_index));
		
		// reset timer
		this.timer.stop(); 
	}
	
	
	this.getNextIndex = function (index) {
		if (index+1 >= this.items.length) {
			return 0;
		} else {
			return index + 1;
		}
	}


	this.getPrevIndex = function (index) {
		if (index==0) {
			return this.items.length - 1;
		} else {
			return index - 1;
		}
	}

	
	this.rotate = function() {
		this.activateItem(this.getNextIndex(this.current_index));
	}
	
	
	this.activateItem = function (index) {
		// does all the work on hiding the last item and showing the requested one
		
		if (this.current_index != undefined) {
			jQuery(this.items[this.current_index]).hide();
		}
		
		if (this.items[index]!=undefined) {
			this.current_index = index;
			jQuery(this.items[this.current_index]).fadeIn('slow');
		}
	}
	

	//INIT - set up timers and start playback
	this.activateItem(0);
	this.timer = new ITTI_Timer(this, this.rotate, 10000);
	this.playback_stopped = false;
	this.timer.start();
	
};
