/**
 * Plugin: jquery.nrTwitterFeed
 * 
 * Version: 0.9.1 (c) Copyright 2010, Netresearch GmbH & Co KG
 * 
 * Description: jQuery plugin for display of Twitter tweets (Based on
 * zTwitterFeed by Zazar Ltd)
 * 
 * 
 */

var nr_jtwitter_running = false;
var nr_jtwitter_element = null;
var nr_jtwitter_timer = null;

function nr_jtwitter_timeout() {
	$(".tweet", nr_jtwitter_element).html(LLL_error);
	nr_jtwitter_running = false;
	window.clearTimeout(nr_jtwitter_timer);
}

(function($) {

	$.widget("ui.twitter",
	{
		options : {
			limit : 10,
			page : 1
		},
		
		running : false,

		_create : function(options) {
			var self = this;

			// Functions
			return this.element.each(function(i, e) {
				var $e = $(e);
				e.htmlTemplateTweet = $(".tweet", e).html();
				e.htmlTemplateStart = $(".start", ".browse", e).html();
				e.htmlTemplateBack = $(".back", ".browse", e).html();
				e.htmlTemplateNext = $(".next", ".browse", e).html();
				e.twitter = self;

				// Add feed class to user div
				if (!$e.hasClass('twitterFeed')) {
					$e.addClass('twitterFeed');
				}

				// Check for valid user name
				if (self.options.user == null) {
					return false;
				}

				// Define Twitter feed request
				e.url = 'http://twitter.com/statuses/user_timeline/'
					+ self.options.user + '.json';

				$(".start", ".browse", e).click(function() { 
					self.start(e);
				});
				$(".back", ".browse", e).click(function() {
					self.back(e);
				});
				$(".next", ".browse", e).click(function() {
					self.next(e);
				});
				self.doQuery(e);
			});
		},

		doQuery : function(e) { // Send request
			if (nr_jtwitter_running === true) {
				return;
			}
			
			params = {};

			$(".tweet", e).html(LLL_loading);
			$(".start", ".browse", e).html('');
			$(".back", ".browse", e).html('');
			$(".next", ".browse", e).html('');
            // show list
            $(".tweet", e).css("visibility", "visible");

			params.count = this.options.limit;
			params.page = this.options.page;
			
			nr_jtwitter_running = true;
			nr_jtwitter_timer = window.setTimeout('nr_jtwitter_timeout()', 10000);
			
			jQuery.ajax({
				url : e.url,
				timeout : 500,
				data : params,
				dataType : 'jsonp',
				success : function(data) {
					e.twitter._success(e, data);
				},
				error : function() {
					e.twitter._error(e);
				}
			});
		},

		// Callback function to create HTML error message
		_error : function(e) {
			$(".tweet", e).html(LLL_error);
			nr_jtwitter_running = false;
			window.clearTimeout(nr_jtwitter_timer);
		},

		// Callback function to create HTML result
		_success : function(e, feeds) {
			nr_jtwitter_running = false;
			window.clearTimeout(nr_jtwitter_timer);
			
			if (!feeds) {
				return false;
			}

			var html = '';
			var row = 'odd';

			// Add feeds
			for ( var i = 0; i < feeds.length; i++) {

				// Get individual feed
				var tweet = feeds[i];

				tweet.time = this.getFormatedTime(
					tweet.created_at, this.options.tweettimeFormat
                );
				tweet.date = this.getFormatedDate(
					tweet.created_at, this.options.tweetdateFormat
                );

				// Get tweet text and add links (by Yusuke
				// Horie)
				tweet.text = tweet.text
					.replace(
						/(https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/,
						function(u) {
							var shortUrl = (u.length > 30) 
								? u.substr(0, 30) + '...' : u;
							return '<a href="' + u
								+ '" title="Click to view this link">'
								+ shortUrl + '</a>';
						})
					.replace(/@([a-zA-Z0-9_]+)/g,
						'@<a href="http://twitter.com/$1" title="Click to view $1 on Twitter">$1</a>')
					.replace(
						/(?:^|\s)#([^\s\.\+:!]+)/g,
						function(a, u) {
							return ' <a href="http://twitter.com/search?q='
								+ encodeURIComponent(u)
								+ '" title="Click to view this on Twitter">#'
								+ u + '</a>';
						});

				// Alternate row classes
				if (row == 'odd') {
					row = 'even';
				} else {
					row = 'odd';
				}

				html += e.htmlTemplateTweet
					.replace(/##text##/g, tweet.text)
					.replace(/##name##/g, tweet.user.name)
					.replace(/##user##/g, tweet.user.screen_name)
					.replace(/##icon##/g, tweet.user.profile_image_url)
					.replace(/##time##/g, tweet.time)
                    .replace(/##date##/g, tweet.date);
			}
			
			var self = this;
			
			if (this.options.page > 1) {
				$(".start", ".browse", e).html(e.htmlTemplateStart);
				$(".back", ".browse", e).html(e.htmlTemplateBack);
			}
			
			if (this.options.limit != feeds.length) {
				// less results than requested
				html += LLL_no_more_entries;
				$(".next", ".browse", e).html('');
			} else if (html === '') {
				// no results at all ...
				if (this.options.page > 1) {
					// ... on following pages
					html = LLL_no_entries;
				} else {
					// ... on first page
					html = LLL_no_more_entries;
				}
				$(".next", ".browse", e).html('');
			} else {
				$(".next", ".browse", e).html(e.htmlTemplateNext);
			}

			$(".tweet", e).html(html);
		},

		start : function(e) {
			this.options.page = 1;
			this.doQuery(e);
		},

		next : function(e) {
			this.options.page++;
			this.doQuery(e);
		},

		back : function(e) {
			this.options.page--;
			if (this.options.page < 1) {
				this.options.page = 1;
			}
			this.doQuery(e);
		},

		getFormatedTime : function(strDate, dateFormat) {
			// Format a number, with leading zero if necessary
			var formatNumber = function(value, len) {
				var num = '' + value;
				while (num.length < len) {
					num = '0' + num;
				}
				return num;
			};

			// Reformat Twitter date so that IE can convert
			strDate = Date.parse(strDate.replace(
				/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
			date = new Date(strDate);

			strTime = formatNumber(date.getHours(), 2);
			strTime += ':';
			strTime += formatNumber(date.getMinutes(), 2);

			return strTime;
		},

		getFormatedDate : function(strDate, dateFormat) {
			// Format a number, with leading zero if necessary
			var formatNumber = function(value, len) {
				var num = '' + value;
				while (num.length < len) {
					num = '0' + num;
				}
				return num;
			};

			// Reformat Twitter date so that IE can convert
			strDate = strDate.replace(
				/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3');

			date = new Date(strDate);

			strDate = formatNumber(date.getDate(), 2);
			strDate += '.';
			strDate += formatNumber(date.getMonth() + 1, 2);
			strDate += '.';
			strDate += date.getFullYear();

			return strDate;
        }
	});

})(jQuery);