/**
 * Plugin: jquery.zTwitterFeed
 * 
 * Version: 1.0.1
 * (c) Copyright 2010, Zazar Ltd
 * 
 * Description: jQuery plugin for display of Twitter tweets
 *              (Based on original plugin twit by Yusuke Horie)
 * 
 * History:
 * 1.0.1 - Corrected issue with multiple instances
 *
 **/

(function($){
	
	$.fn.twitterfeed = function(username, options, callbackFnk) {	
		
		// Set pluign defaults
		var defaults = {
		    widgetId: 0,
		    siteAppName: '',
		    pageAlias: '',
		    page: 1,
			limit: 5,
			showFeedHeader: true,
			showUsername: true,
			showTimestamp: true,
			showAvatar: true,
			showNavigation: true,
			showFollowMe: true,
			followMeText: '',
			showSpinner: true,
			spinnerImage: ''
		};  

		var options = $.extend(defaults, options); 

        // show loading image		
		if (options.showSpinner && options.spinnerImage.length > 0 && options.page == 1)
		{
    		//$(this).html("<img src=\"" + options.spinnerImage + "\" />");
        }

		// Functions
		data = this.each(function(i, e) {
			var $e = $(e);

            $(e).delegate("#twitter-older-" + options.widgetId, "click", function(){
                options.page = options.page + 1;
                $(e).twitterfeed(username, options);
                return false;
            });

            $(e).delegate("#twitter-newer-" + options.widgetId, "click", function(){
                options.page = options.page - 1;
                $(e).twitterfeed(username, options);
                return false;
            });

			// Add feed class to user div
			if (!$e.hasClass('twitterFeed')) $e.addClass('twitterFeed');
			
			// Check for valid user name
			if(username == null) return false;

			// Define Twitter feed request
			var url = 'http://twitter.com/statuses/user_timeline/' + username + '.json';
			var params = {};

			params.page = options.page;
			params.count = options.limit;
			
			// Send request
			jQuery.ajax({
				url: url,
				data: params,
				dataType: 'jsonp',
				success: function (o) {
					_callback(e, o, options);
				}
			});
				
		});

        if(typeof callbackFnk == 'function'){            
            callbackFnk.call(this, data); 
        }
        else {
            return data;
        }
	};
	
	// Callback function to create HTML result
	var _callback = function(e, feeds, options) {

		if (!feeds) {
			return false;
		}
		var html = '';	
		var row = 'odd';
		var statusesCount = feeds[0].user.statuses_count;

		// Add header if required
		if (options.showFeedHeader)
		{
			var name = feeds[0].user.name;
			var screenname = feeds[0].user.screen_name;
			var icon = feeds[0].user.profile_image_url;
			var description = feeds[0].user.description;
			var userurl = '<a href="' + feeds[0].user.url + '/" title="" target="_blank">' + feeds[0].user.url + '</a>';
			var link = '<a href="http://twitter.com/' + screenname + '/" title="Visit '+ name +' on Twitter" target="_blank">';

			html +=	'<div class="twitter-feed-header">';
			html += '<div class="twitter-feed-image">';
			html += link + '<img src="'+ icon +'" alt="'+ name +'" /></a>'; 
			html += '</div>';
			html += '<div class="twitter-feed-user">';
			html += '<div class="twitter-feed-user-name">';
			html += name;
			html += '</div>';
			html += '<div class="twitter-feed-screen-name">';
			html += link + '@' + screenname + '</a>';
			html += '</div>';
			html += '<p class="twitter-feed-user-description">';
			html += description;
			html += '</p>';
			html += '<div class="twitter-feed-user-url">';
			html += userurl;
			html += '</div>';
			html += '</div>';
			html += '<div class="clearer"></div>';
			html += '</div>';
		}	

		// Add feed body
		html += '<div class="twitter-feed-body">' +
			'<ul class="twitter-status-list">';
		
		// Add feeds list items
		for (var i=0; i<feeds.length; i++) {
			

			// Get individual feed
			var tweet= feeds[i];
			var link = '<a href="http://twitter.com/' + tweet.user.screen_name + '/" title="Visit '+ tweet.user.name +' on Twitter" target="_blank">';


			// Add feed row
			html += '<li id="twitter-status-list-item-' + tweet.id + '" class="twitter-status-list-item list-item-row-'+row+'">';


            // Add tweet header
            html += '<div class="twitter-status-list-item-header">';


			// Add user icon if required
			if (options.showAvatar) {
				var icon = tweet.user.profile_image_url;

                html += '<div class="twitter-status-list-item-avatar">';

				html += link + '<img src="'+ icon +'" alt="'+ name +'" /></a>';
				
				html += '</div>';
			}

			html += '</div>';
			
			
            // add tweet content
            html += '<div class="twitter-status-list-item-content">';

			// Add user if required
			if (options.showUsername) {
				var name = tweet.user.name;

				html += '<div class="twitter-status-list-item-username">';

                html += link + name +'</a>'
				
				html += '</div>';
			}

            html += '<p class="twitter-status-list-item-text">' + getFeedText(tweet.text) + '</p>';

			// Add lapsed time if required
			if (options.showTimestamp) {
				var lapsedTime = getLapsedTime(tweet.created_at);		
				
                html += '<div class="twitter-status-list-item-timestamp">'
                
                html += '<a href="http://www.twitter.com/' + tweet.user.screen_name + '/statuses/' + tweet.id + '" target="_blank">' + lapsedTime + '</a>';
                
                html += '</div>';
			}

			html += '<div class="clearer"></div>';

			html += '</div>';
			
			html += '<div class="clearer"></div>';

			html += '</li>';
			
			// Alternate row classes
			if (row == 'odd') {
				row = 'even';
			} else {
				row = 'odd';
			}			
		}
		
		
		// end feed list items and body
		html += '</ul>' +
			'</div>'
		
        html += '<div class="twitter-feed-footer">';

        // show navigation
		if (options.showNavigation) {
		
            html += '<div class="twitter-status-list-navigation">';

            if (options.page == 1 && statusesCount > options.limit)
            {
                //options.page = options.page + 1;
                html += '<span class="twitter-status-list-navigation-older-link">';
                html += '<a href="#" id="twitter-older-' + options.widgetId + '" class="twitter-older">Older &gt;</a>';
                html += '</span>';
            }
            else
            {
                html += '<span class="twitter-status-list-navigation-newer-link">';
                html += '<a href="javascript:getTwitterPage(' + options.widgetId + ',' + options.page + ');" id="twitter-newer-' + options.widgetId + '" class="twitter-newer">&lt; Newer</a>';
                html += '</span>';
                if ((options.page * options.limit) < statusesCount)
                {
                    html += '<span class="twitter-status-list-navigation-older-link">';
                    html += '<a href="javascript:getTwitterPage(' + options.widgetId + ',' + options.page + ');" id="twitter-older-' + options.widgetId + '" class="twitter-older">Older &gt;</a>';
                    html += '</span>';
                }
            }

            html += '</div>';
                        
		}


        // show follow me
		if (options.showFollowMe) {
		
            html += '<div class="twitter-status-list-followme">';

            html += '<a href="http://www.twitter.com/' + feeds[0].user.screen_name + '" target="_blank">' + options.followMeText + feeds[0].user.screen_name + '</a>';

            html += '</div>';
            
		}

		html += '<div class="clearer"></div>';

		html += '</div>';

        //alert(html);

		$(e).html(html);
				
	};

    
    function getFeedText(strText)
    {
		// Get tweet text and add links (by Yusuke Horie)
		var text = strText
			.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>';
		});
		
		return text;
    }

	function getLapsedTime(strDate) {
		
		// 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'));

		// Define current time and format tweet date
		var todayDate = new Date();	
		var tweetDate = new Date(strDate)

		// Get lasped time in seconds
		var lapsedTime = Math.round((todayDate.getTime() - tweetDate.getTime())/1000)

		// Return lasped time in seconds, minutes, hours, days and weeks
		if (lapsedTime < 60) {
			return '< 1 minute ago';
		} else if (lapsedTime < (60*60)) {
		    var t = Math.round(lapsedTime / 60);
		    if (t == 1)
		    {
			    return t + ' minute ago';
			}
			else
			{
			    return t + ' minutes ago';
			}
		} else if (lapsedTime < (24*60*60)) {
		    var t = Math.round(lapsedTime / 3600);
		    if (t == 1)
		    {
			    return t + ' hour ago';
			}
			else
			{
			    return t + ' hours ago';
			}
		} else if (lapsedTime < (7*24*60*60)) {
		    var t = Math.round(lapsedTime / 86400);
		    if (t == 1)
		    {
			    return t + ' day ago';
			}
			else
			{
			    return t + ' days ago';
			}
		} else {
		    var t = Math.round(lapsedTime / 604800);
		    if (t == 1)
		    {
			    return t + ' week ago';
			}
			else
			{
			    return t + ' weeks ago';
			}
		}
	};
})(jQuery);
