/*
 *	ccTwitter 1.0 - Plugin to show twitter posts on your site 
*/
function getTwitterRequestUrl(params) {

	var twitterURL = 'http://';

	if ((typeof params.hashtag != 'undefined') && (params.hashtag.length > 0)) {
		twitterURL += 'search.twitter.com/search.json?q=%23'
					  + params.hashtag
					  + '&callback=?';
	} else {
		twitterURL += 'twitter.com/status/user_timeline/'
					  + params.user_id
					  + ".json?count="
					  + params.per_page
					  + "&callback=?";
	}

	return twitterURL;
}

function replacePlainTextLinks(str) {
	var pattern = /(http\S+)/gi;
	return str.replace(pattern, '<a href="$1" target="_blank">$1</a>');
}

function replaceHashtags(str) {
	var pattern		= /(#\w+)/gi;
	var hashtags	= str.match(pattern);
	var resultStr	= str;

	if (hashtags != null) {

		for (var i = 0; i < hashtags.length; i++) {
			var hashtag = hashtags[i];

			var url	= '<a href="http://twitter.com/search?q='
					  + encodeURIComponent(hashtag)
					  + '" target="_blank">'
					  + hashtag
					  + '</a>';
			resultStr = resultStr.replace(hashtag, url);
		}
	}
	return resultStr;
}

function replaceUsers(str) {
	var pattern		= /(@\w+)/gi;
	var users		= str.match(pattern);
	var resultStr	= str;

	if (users != null) {

		for (var i = 0; i < users.length; i++) {
			var user		= users[i];
			var userLogin	= user.substr(1);

			var url	= '<a href="http://twitter.com/'
					  + userLogin
					  + '" target="_blank">'
					  + user
					  + '</a>';
			resultStr = resultStr.replace(user, url);
		}
	}
	return resultStr;
}

function replaceDate(str) {
	var cdate = new Date(str);
	return cdate.toGMTString();
}

function decodeHtml(val) {
	return $('<span>').html(val).text();
}

function processClientLink(val) {

	var pattern			= /(<a)/i;
	var processedLink	= decodeHtml(val);

	return processedLink.replace(pattern, '$1 target="_blank" ');
}

function processItem(val) {

	val.text		= replacePlainTextLinks(val.text);
	val.text		= replaceHashtags(val.text);
	val.text		= replaceUsers(val.text);
	val.source		= processClientLink(val.source);
	val.created_at	= replaceDate(val.created_at);

	return val;
}

function renderItemHelper(val) {

	return '<li><span class="text"><a href="http://twitter.com/'
		   + val.from_user
		   + '" target="_blank">'
		   + '@'+val.from_user
		   + '</a> '
		   + val.text
		   + '</span><span class="post-info">'
		   + val.created_at
		   + ' via '
		   + val.source
		   + '</span>';
}

(function($){
	$.fn.ccTwitter = function(Options){
		var options = $.extend({
			user_id: 'php_coder',
			per_page: 4
		}, Options);

		var targetElements	= $(this);
		var resultHTML		= '<ul>';

		$.getJSON(getTwitterRequestUrl(options), function(data) {

			$.each(data.results, function(i, item) {

				if (i >= options.per_page) {
					return;
				}

				var processedItem = processItem(item);

				resultHTML += renderItemHelper(processedItem);
			})

			resultHTML += '</ul>';

			return targetElements.each(function(){
				$(this).html(resultHTML);
			});
		})
	};
})(jQuery);
