// jQuery Ticker-Effects
// --------------------------------
// author: Julian Wundrak

// Ticker-Typen
// °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
// > up
// > down
// > left
// > right
// > fader
// > write (does not support html, only text!)
			
(function($) {
	var tickerData	={};
	
	$.fn.tickerInit=function(t_type,t_width,t_height,t_margin,t_easing){
		var tickerId=new Date().getTime();
		var id		=this.attr("id");
		
		tickerData[tickerId]={
			id						:id,
			isRunning		:false,
			itemMargin		:0,
			itemCount		:0,
			itemHeight		:0,
			itemWidth		:0,
			rollingTime		:0,
			viewingTime	:0,
			tickerEasing	:0,
			pxPerSec		:0,
			
			tickerLeft		:0,
			tickerTop			:0,
			tickerType		:0
		};
		
		var param=tickerData[tickerId];
		param.tickerType		=t_type;
		param.itemHeight		=t_height;
		param.itemWidth		=t_width;
		param.itemMargin		=t_margin;
		if(t_easing==0) param.tickerEasing='linear';
		else param.tickerEasing='swing';
		
		this.css("width", param.itemWidth);
		this.css("height", param.itemHeight);
		this.css("position", "relative");
		this.css("overflow", "hidden");
		this.attr("tickerId", tickerId);
		
		this.empty();

		var tickerContentDiv = $("<div/>").appendTo(this);
		tickerContentDiv.attr("id", tickerId);
		tickerContentDiv.css("position", "absolute");
		tickerContentDiv.css("left", "0");
		tickerContentDiv.css("top", "0");
		
		tickerContentDiv.hover(function() {	
			var param        	=tickerData[$(this).parent().attr("tickerId")];
			param.isRunning	=false;
			$(this).stop();
		},
		function() {
			$(this).parent().animateTicker();
		});

		return this;
};

$.fn.addTickerItem = function(html) {
	var tickerId=this.attr("tickerId");
	var param = tickerData[tickerId];
	if(param.isRunning) return false;
	
	var tickerContentDiv = $("#" + this.attr("tickerId"));
	param.itemCount++;		
	var tickerItem = null;
	
	if (param.tickerType == "up") {
		var tickerItem = $("<div class='item'/>").appendTo(tickerContentDiv);
		tickerItem.css('float','left');	
		tickerItem.css('clear','left');	
		tickerItem.css("margin-top", param.itemMargin/2);
		tickerItem.css("margin-bottom", param.itemMargin/2);
		tickerItem.css("width", param.itemWidth);
		tickerItem.html(html);
		if(param.itemCount==1) var oldHeight=0;
		else oldHeight=tickerContentDiv.height();
		tickerContentDiv.height(oldHeight+tickerItem.height()+param.itemMargin);
		tickerContentDiv.width(param.itemWidth);
		tickerContentDiv.css('top','0px');
	} else if (param.tickerType == "right") {
		var tickerItem = $("<div class='item'/>").appendTo(tickerContentDiv);
		tickerItem.css("float", "right");	
		tickerItem.css("margin-left", param.itemMargin/2);
		tickerItem.css("margin-right", param.itemMargin/2);
		tickerItem.css("height", param.itemHeight);
		tickerItem.html(html);
		if(param.itemCount==1) var oldWidth=0;
		else oldWidth=tickerContentDiv.width();
		tickerContentDiv.width(oldWidth+tickerItem.width()+param.itemMargin);
		tickerContentDiv.height(param.itemHeight);
		tickerContentDiv.css("left", 0-tickerContentDiv.width()+param.itemWidth);
	} else if (param.tickerType == "down") {
		tickerItem = $("<div class='item'/>").prependTo(tickerContentDiv);	
		tickerItem.css('float','left');	
		tickerItem.css('clear','left');	
		tickerItem.css("margin-top", param.itemMargin/2);
		tickerItem.css("margin-bottom", param.itemMargin/2);
		tickerItem.css("width", param.itemWidth);
		tickerItem.html(html);
		if(param.itemCount==1) var oldHeight=0;
		else oldHeight=tickerContentDiv.height();
		tickerContentDiv.height(oldHeight+tickerItem.height()+param.itemMargin);
		tickerContentDiv.width(param.itemWidth);
		tickerContentDiv.css('top',0-tickerContentDiv.height()+param.itemHeight);
	} else if (param.tickerType == "left") {
		var tickerItem = $("<div class='item'/>").appendTo(tickerContentDiv);
		tickerItem.css("float", "left");	
		tickerItem.css("margin-left", param.itemMargin/2);
		tickerItem.css("margin-right", param.itemMargin/2);
		tickerItem.html(html);
		tickerItem.css("height", param.itemHeight);
		if(param.itemCount==1) var oldWidth=0;
		else oldWidth=tickerContentDiv.width();
		tickerContentDiv.width(oldWidth+tickerItem.width()+param.itemMargin);
		tickerContentDiv.height(param.itemHeight);
		tickerContentDiv.css('left','0px');
	}	else if (param.tickerType == "writer") {
		var tickerItem = $("<div id='item_"+tickerId+'_'+param.itemCount+"'/>").appendTo(this);
		tickerItem.css("display", "none");
		tickerItem.html(html);
		tickerContentDiv.width(param.itemWidth);
		tickerContentDiv.height(param.itemHeight);
		param.pxPerSec+=tickerItem.text().length;
	} else if(param.tickerType == "fader") {
		var tickerItem = $("<div class='item' id='item_"+tickerId+'_'+param.itemCount+"'/>").appendTo(tickerContentDiv);
		tickerItem.css('position','absolute');
		tickerItem.css("top",0);	
		tickerItem.css("left",0);
		tickerItem.css('display','none');
		tickerItem.width(param.itemWidth);	
		tickerItem.height(param.itemHeight);	
		tickerItem.html(html);
	}
	
	tickerItem.css("overflow", "hidden");
	return this;
};

$.fn.removeTickerItem=function() {
	var param = tickerData[this.attr("tickerId")];
	var tickerContentDiv = $("#" + this.attr("tickerId"));
	
	if (param.tickerType == "up") {
		tickerContentDiv.height(tickerContentDiv.height()-$('.item:first').height()-param.itemMargin);
		$('.item:first').remove();
	} else if (param.tickerType == "right") {
		tickerContentDiv.width(tickerContentDiv.width()-$('.item:first').width()-param.itemMargin);
		$('.item:first').remove();
	} else if (param.tickerType == "down") {
		tickerContentDiv.height(tickerContentDiv.height()-$('.item:last').height()-param.itemMargin);
		$('.item:last').remove();
	} else if (param.tickerType == "left") {
		tickerContentDiv.width(tickerContentDiv.width()-$('.item:first').width()-param.itemMargin);
		$('.item:first').remove();
	}
	
	param.itemCount--;
	return true;
};
			
$.fn.animateTicker=function() {
	var tickerId=this.attr("tickerId")
	var param = tickerData[tickerId];
	var tickerContentDiv = $("#"+this.attr("tickerId"));
	
	var arrAnimation={};
	var time		=0;
	if (param.tickerType=="left") {
		var targetPos=0-$('.item:first').width()-param.itemMargin;
		if(param.isRunning==false) {
			param.isRunning=true; 
			time=param.pxPerSec*Math.abs( targetPos-parseFloat(tickerContentDiv.css('left')) );
		}
		else time=param.pxPerSec*($('.item:first').width()+param.itemMargin);
		
		arrAnimation={left: targetPos}; 
		tickerContentDiv.animate(arrAnimation,time,param.tickerEasing,function() {
			var parent=$(this).parent();
			var html=$('.item:first').html();
			var param=	tickerData[$(this).parent().attr("tickerId")];
									
			param.isRunning=false;
			parent.addTickerItem(html);
			parent.removeTickerItem();
			setTimeout(function() { 
				param.isRunning=true;
				parent.animateTicker();
			}, param.viewingTime);
		});
	} else if (param.tickerType=="right") {
		var targetPos=0-tickerContentDiv.width()+param.itemWidth+$('.item:first').width()+param.itemMargin;
		if(param.isRunning==false) {
			param.isRunning=true; 
			time=param.pxPerSec*Math.abs( targetPos-parseFloat(tickerContentDiv.css('left')) );
		}
		else time=param.pxPerSec*($('.item:first').width()+param.itemMargin);
		
		arrAnimation={left: targetPos}; 
		tickerContentDiv.animate(arrAnimation,time,param.tickerEasing,function() {
			var parent=$(this).parent();
			var html=$('.item:first').html();
			var tickerId=$(this).parent().attr("tickerId");
			var param=	tickerData[tickerId];
									
			param.isRunning=false;
			parent.addTickerItem(html);
			parent.removeTickerItem();
			setTimeout(function() { 
				param.isRunning=true;
				parent.animateTicker();
			}, param.viewingTime);
		});
	} else if (param.tickerType=="up") {
		var targetPos=0-$('.item:first').height()-param.itemMargin;
		if(param.isRunning==false) {
			param.isRunning=true; 
			time=param.pxPerSec*Math.abs( targetPos-parseFloat(tickerContentDiv.css('top')) );
		}
		else time=param.pxPerSec*($('.item:first').height()+param.itemMargin);
		
		arrAnimation={top: targetPos}; 
		tickerContentDiv.animate(arrAnimation,time,param.tickerEasing,function() {
			var parent=$(this).parent();
			var html=$('.item:first').html();
			var param=	tickerData[$(this).parent().attr("tickerId")];
									
			param.isRunning=false;
			parent.addTickerItem(html); 
			parent.removeTickerItem(); 
			setTimeout(function() { 
				param.isRunning=true;
				parent.animateTicker();
			}, param.viewingTime);
		});
	} else if (param.tickerType=="down") {
		var targetPos=0-tickerContentDiv.height()+param.itemHeight+$('.item:last').height()+param.itemMargin;
		if(param.isRunning==false) {
			param.isRunning=true; 
			time=param.pxPerSec*Math.abs( targetPos-parseFloat(tickerContentDiv.css('top')) );
		}
		else time=param.pxPerSec*($('.item:last').height()+param.itemMargin);
		
		arrAnimation={top: targetPos}; 
		tickerContentDiv.animate(arrAnimation,time,param.tickerEasing,function() {
			var parent=$(this).parent();
			var html=$('.item:last').html();
			var param=	tickerData[$(this).parent().attr("tickerId")];
									
			param.isRunning=false;
			parent.removeTickerItem();
			parent.addTickerItem(html); 
			setTimeout(function() { 
				param.isRunning=true;
				parent.animateTicker();
			}, param.viewingTime);
		});
	} else if (param.tickerType=="writer") {
		var nextId=tickerContentDiv.attr('nextId');
		var actItem=$('#item_'+tickerId+'_'+nextId);
		var i=tickerContentDiv.text().length;
		tickerContentDiv.text(tickerContentDiv.text()+actItem.text()[i]);
		if(i==actItem.text().length-1) {
			if(param.itemCount==nextId) tickerContentDiv.attr('nextId',1);
			else tickerContentDiv.attr('nextId',parseInt(nextId)+1);
			setTimeout('$("#'+param.id+'").animateTicker(); $("#'+tickerId+'").text("");',param.viewingTime);
		}
		else setTimeout('$("#'+param.id+'").animateTicker()',param.pxPerSec);
	} else if (param.tickerType=="fader") {
		var nextId=tickerContentDiv.attr('nextId');
		var actItem=$('#item_'+tickerId+'_'+nextId);
		
		actItem.fadeIn(param.pxPerSec/2);
		actItem.fadeTo(param.viewingTime,1);
		actItem.fadeOut(param.pxPerSec/2);
		
		if(nextId==param.itemCount) tickerContentDiv.attr('nextId',1);
		else tickerContentDiv.attr('nextId',parseInt(nextId)+1);
		
		setTimeout(function() { actItem.css('display','none'); },parseInt(param.pxPerSec)+parseInt(param.viewingTime));
		setTimeout('$("#'+param.id+'").animateTicker()',parseInt(param.pxPerSec)+parseInt(param.viewingTime));
	}
};

$.fn.startTicker = function(rollingTime,viewingTime) {
	var param = tickerData[this.attr("tickerId")];
	var tickerContentDiv = $("#"+this.attr("tickerId"));
	
	param.rollingTime	=rollingTime;
	param.viewingTime	=viewingTime;
	param.isRunning		=true;
	
	if(param.tickerType=='down' || param.tickerType=='up') param.pxPerSec=rollingTime/tickerContentDiv.height();
	else if(param.tickerType=='right' || param.tickerType=='left') param.pxPerSec=rollingTime/tickerContentDiv.width();
	else if(param.tickerType=='writer') {
		param.pxPerSec=rollingTime/param.pxPerSec;
		tickerContentDiv.attr('nextId',1);
	} else if(param.tickerType=='fader') {
		param.pxPerSec=rollingTime/param.itemCount;
		tickerContentDiv.attr('nextId',1);
	}
	
	this.animateTicker();
};
})(jQuery);