/*!
 * nTwitter jQuery plugin v 1.1
 * http://development.nedeco.de/
 *
 * Copyright 2011, nedeco GmbH
 * Licensed under the GPL Version 2 license.
 * Author e-Mail s.dohmen@nedeco.de
 */
(function($) {

	$.fn.nTwitter = function(options) {

		$.fn.nTwitter.settings = {
			userName: null,
			numTweets: 15,
			tick: false,
			tickDelay: 5,
			showRetweets: true,
			fx: "fade",
			fxDuration: 1500,
			showImage: true,
			TickHeight: 0,
			imgSize: 30,
			ssl: false,
			prefix: "EAU",
			showActions: true,
			showTimestamp: true,
			mouseoverStop: true,
			heading: null,			
			lang: {	reply: 'Reply',
					retweet: 'Retweet',
					favorite: 'Favorite',
					noData:'This User does not have any Tweets',
					less_than_a_minute_ago:'less than a minute ago',
					a_minute_ago:'about a minute ago',
					X_minutes_ago:'%%X%% minutes ago',
					a_hour_ago:'about an hour ago',
					X_hours_ago:'%%X%% hours ago',
					a_day_ago:'yesterday',
					X_days_ago:'%%X%% days ago'}
		};

		var settings = $.extend({}, $.fn.nTwitter.settings, options);
		
		
		return this.each(function() {
			var stopTick=0;
			var wrapper = $(this);
			wrapper.empty();
			
			if(settings.heading!= null){
				wrapper.append("<div id='tweetBoxHeading'><h2>"+settings.heading+"</h2></div>");
			}
			
			if(settings.ssl == true){
				var protocol = "https://";
			}else{
				var protocol = "http://";
			}	
			
			wrapper.append("<ul id='"+settings.prefix+"_tweetList'></ul>");
			
			var tList = $('#'+settings.prefix+'_tweetList');	
						
			if(settings.mouseoverStop == true){						
				tList.hover(
						function(){stopTick=1;},
						function(){stopTick=0;}
				);
			}
			
			tList.hide();

			function formatData(data) {		
				
				var arrayOut=[];
				
				 for (var i=0; i<data.length; i++){	
					 
					 if((typeof data[i].retweeted_status == "undefined" || settings.showRetweets==true )&& arrayOut.length < settings.numTweets){
						
						 var uName = data[i].user.screen_name;
						 if(settings.showImage){			 
							 
							 if(typeof data[i].retweeted_status != "undefined" ){
								 var uImg = data[i].retweeted_status.user.profile_image_url;
								 var uName_ = data[i].retweeted_status.user.screen_name;
							 }else{
								 var uImg = data[i].user.profile_image_url;
								 var uName_ = uName;
							 }
							 						
							 uImg = uImg.replace(/(http\:\/\/a2\.twimg\.com\/profile_images\/)/, function(url) {
							      return protocol+'s3.amazonaws.com/twitter_production/profile_images/';
							    });
							 uImg = uImg.replace(/(http\:\/\/a1\.twimg\.com\/profile_images\/)/, function(url) {
							      return protocol+'s3.amazonaws.com/twitter_production/profile_images/';
							    });
							 
							 uImg = '<img style="float:left;" width="'+settings.imgSize+'" src="'+uImg+'" alt="'+uName_+'" title="'+uName_+'" />';
							 var postStyle="style='margin-left:"+settings.imgSize+"px;'";
						 }else{
							 var uImg = "";
							 var postStyle=""; 
							 settings.imgSize = 0;
						 }	 
						 
						 if(typeof data[i].retweeted_status != "undefined"){
							 var tweetID = data[i].retweeted_status.id_str;
						 }else{
							 var tweetID = data[i].id_str;
						 }
						 
						 
						 var posted = timeToText(data[i].created_at);
						 var uState = data[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
						      return '<a href="'+url+'" target="_blank">'+url+'</a>';
						    }).replace(/\B@([_a-z0-9]+)/ig, function(doReply) {
						      return  doReply.charAt(0)+'<a href="'+protocol+'twitter.com/'+doReply.substring(1)+'">'+doReply.substring(1)+'</a>';
						    });
						 
						 
						if(settings.showActions==true){
							var actions__ = ' - <a href="'+protocol+'twitter.com/intent/tweet?in_reply_to='+tweetID+'" target="_blank">'+settings.lang.reply+'</a> - <a href="'+protocol+'twitter.com/intent/retweet?tweet_id='+tweetID+'" target="_blank">'+settings.lang.retweet+'</a> - <a href="'+protocol+'twitter.com/intent/favorite?tweet_id='+tweetID+'" target="_blank">'+settings.lang.favorite+'</a>';
						}else{
							var actions__ = '';		
						}
						 arrayOut.push('<li style="min-height:'+settings.imgSize+'px;" >'+uImg+'<p '+postStyle+'><a href="'+protocol+'twitter.com/'+uName+'" target="_blank">'+uName+' </a>'+uState+'<br/><span class="tweetFooter"><a href="'+protocol+'twitter.com/'+uName+'" target="_blank">'+posted+'</a>'+actions__+'</span></p></li>');
					 }	
				}
				 
				 return arrayOut;
			}
			

			
			function timeToText(time) {
				
				  var timeVals = time.split(" ");
				  time = timeVals[1] + " " + timeVals[2] + ", " + timeVals[5] + " " + timeVals[3];
				  var parsed_date = Date.parse(time);
				  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
				  var relTime = parseInt((relative_to.getTime() - parsed_date) / 1000);
				  relTime = relTime + (relative_to.getTimezoneOffset() * 60);

				  if (relTime < 60) {
					  	return settings.lang.less_than_a_minute_ago;
				  } else if(relTime < 120) {
					  	return settings.lang.about_a_minute_ago;
				  } else if(relTime < (60*60)) {					  
					  	var tempText = settings.lang.X_minutes_ago.split("%%X%%");					  
					  	return tempText[0] + (parseInt(relTime / 60)).toString() + tempText[1];
				  } else if(relTime < (120*60)) {
					  	return settings.lang.a_hour_ago;
				  } else if(relTime < (24*60*60)) {
					  	var tempText = settings.lang.X_hours_ago.split("%%X%%");					  
					  	return tempText[0] + (parseInt(relTime / 3600)).toString() + tempText[1];
				  } else if(relTime < (48*60*60)) {
					  	return settings.lang.yesterday;
				  } else {
					  	var tempText = settings.lang.X_days_ago.split("%%X%%");					  
					  	return tempText[0] + (parseInt(relTime / 86400)).toString() + tempText[1];
				  }
			}

			$.getJSON(protocol+"api.twitter.com/1/statuses/user_timeline.json?count="+((settings.numTweets)+10)+"&include_rts=1&screen_name="+settings.userName+"&callback=?", function(data) {

				
				var tweets = formatData(data);
							
				$('#twitterLoaderGif').remove();
				
				if(tweets.length <= 0){						
					tList.append(settings.lang.noData);
				}else{
					tList.append(tweets.join(""));
				}						
										

				if (settings.fx == 'fade') {

					tList.fadeIn(settings.fxDuration);

				}
				if (settings.fx == 'slide') {

					tList.slideDown(settings.fxDuration);

				}
				else {
					tList.show();
				}
				
				if(settings.tick == true){
					tList.css({"overflow":"hidden"});
					
					var posts = tList.children("li");
					var index=1;
					var tickHeight = parseFloat(settings.tickHeight);
					if(tickHeight>0)
						tList.css({"marginTop":"0","height":tickHeight});		
					else
						tList.css({"marginTop":"0","height":($(posts[0]).height() + parseFloat($(posts[0]).css('paddingTop')) + parseFloat($(posts[0]).css('paddingBottom')))});			
					
					var tlist_posts_totalHeight = 0;
					
					for(i=0;i<posts.length;i++){
						tlist_posts_totalHeight+= ($(posts[i]).height() + parseFloat($(posts[i]).css('paddingTop')) + parseFloat($(posts[i]).css('paddingBottom')));
					}
					
					setTimeout(function () {
						tick(index);
					}, (settings.tickDelay*1000));
					
					function tick(index){
						var tempHeight = 0;
						var lastTickPostPos = 0; 
						var indexC=0;
						for(indexC=0;indexC<index;indexC++){					
							tempHeight += ($(posts[indexC]).height() + parseFloat($(posts[indexC]).css('borderTopWidth')) + parseFloat($(posts[indexC]).css('borderBottomWidth')) + parseFloat($(posts[indexC]).css('paddingTop')) + parseFloat($(posts[indexC]).css('paddingBottom')));												
							if(indexC == index-2)
								lastTickPostPos = tempHeight;
						}
						if(settings.numTweets<=index || (tickHeight > 0 && (tlist_posts_totalHeight - lastTickPostPos) < tickHeight)){
							tempHeight=0;
							index=0;
						}					
						
						if(stopTick==0){
							tList.children(':first').animate({"marginTop":-1*tempHeight});
							if(tickHeight==0)
								tList.animate({"height":($(posts[index]).height() + parseFloat($(posts[index]).css('borderTopWidth')) + parseFloat($(posts[index]).css('borderBottomWidth')) + parseFloat($(posts[index]).css('paddingTop')) + parseFloat($(posts[index]).css('paddingBottom')))});																		
							index++;
						}
						setTimeout(function () {
							tick(index);
						}, (settings.tickDelay*1000));
					}
						
						
					
					
				}

			});
		});
	};
})(jQuery);
