﻿jQuery.fn.twitterSearchFeed = function (query) {
	var target = this;
	var refreshURL = '';
	var naughtyRegEx = /fuck|\bass|shit|bitch|\bcock|\btit\b|tits|titties|\bdick|pussy|cunt|gay|lesbian/i
	
	jQuery.ajax({
		url: 'http://search.twitter.com/search.json',
		data: {
			q: query,
			result_type: 'recent',
			rpp: '10'
		},
		dataType: 'jsonp',
		success: initialLoad,
		error: onFail
	});
	
	function initialLoad(data) {
		var feedHTML = '';
		for (var i=0; i<data.results.length; i++) {
			if (!naughtyRegEx.test(data.results[i].text)) {
				feedHTML += "<div class='tweet'>" +
							"<div class='profilePic'><a href='http://www.twitter.com/" + data.results[i].from_user + "' target='_blank'><img src='" + data.results[i].profile_image_url + "' width='48' height='48' /></a></div>" +
							"<div class='body'>" +
							"<span class='author'><a href='http://www.twitter.com/" + data.results[i].from_user + "' target='_blank'>" + data.results[i].from_user + "</a></span>: " +
							linkText(data.results[i].text) +
							" <span class='relTime' title='" + data.results[i].created_at + "'>(" + relativeTime(data.results[i].created_at) + ")</span>" +
							"</div>" +
							"</div>";
			}
		}
		target.html(feedHTML);
		$('#feed').html(feedHTML);
		//alert(target.html());
		target.after('<div class="readMore"><a href="http://twitter.com/#!/oddcast" target="_blank">@oddcast</a></div>');
		
		//refreshURL = data.refresh_url;
		//setTimeout("jQuery(document).trigger('timedTweetRefresh')", 15000);
	}
	function onFail() {
		target.prepend("<div class='error'>Twitter does not seem to be responding at the moment</div>");
	}
	function getNewTweets() {
		jQuery.ajax({
			url: 'http://search.twitter.com/search.json' + refreshURL,
			dataType: 'jsonp',
			success: displayNewTweets,
			error: onFail
		});
	}
	jQuery(document).bind('timedTweetRefresh',getNewTweets)
	
	function displayNewTweets(data) {
		target.css('overflow', 'hidden');
		var tweetHTML = '';
		var tweetDOM = null;
		for (var i=data.results.length-1; i>=0; i--) {
			if (!naughtyRegEx.test(data.results[i].text)) {
				tweetHTML = jQuery(
							"<div class='tweet' style='display: none;'>" +
							"<div class='profilePic'><a href='http://www.twitter.com/" + data.results[i].from_user + "' target='_blank'><img src='" + data.results[i].profile_image_url + "' width='48' height='48' /></a></div>" +
							"<div class='body'>" +
							"<span class='author'><a href='http://www.twitter.com/" + data.results[i].from_user + "' target='_blank'>" + data.results[i].from_user + "</a></span>: " +
							linkText(data.results[i].text) +
							" <span class='relTime' title='" + data.results[i].created_at + "'>(" + relativeTime(data.results[i].created_at) + ")</span>" +
							"</div>" +
							"</div>"
							);
				target.prepend(tweetHTML);
				tweetHTML.slideDown('slow');
			}
		}
		jQuery(".relTime", target).each(function (index) {
			jQuery(this).text('(' + relativeTime(jQuery(this).attr('title')) + ')');
		});
		
		refreshURL = data.refresh_url;
		setTimeout("jQuery(document).trigger('timedTweetRefresh')", 15000);
	}
	
	
	function linkText(text) {
		// link urls
		regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
		text = text.replace(regexp,"<a href=\"$1\" target=\"_blank\">$1</a>");
		// link twitter user names
		var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
		text = text.replace(regexp,"<a href=\"http://twitter.com/$1\" target=\"_blank\">@$1</a>");
		// link hash tags
		regexp = / [\#]+([A-Za-z0-9-_]+)/gi;
		text = text.replace(regexp, ' <a href="http://twitter.com/search?q=$1" target="_blank">#$1</a>');
		
		return text;
	}
	
	function relativeTime(time_value) {
		var parsed_date = Date.parse(time_value);
		var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
		var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
		if(delta < 60) {
			return 'less than a minute ago';
		} else if(delta < 120) {
			return 'about a minute ago';
		} else if(delta < (45*60)) {
			return (parseInt(delta / 60)).toString() + ' minutes ago';
		} else if(delta < (90*60)) {
			return 'about an hour ago';
		} else if(delta < (24*60*60)) {
			return 'about ' + (Math.round(delta / 3600)).toString() + ' hours ago';
		} else if(delta < (48*60*60)) {
			return '1 day ago';
		} else {
			return (Math.round(delta / 86400)).toString() + ' days ago';
		}
	}

}
