var globalTweets;

function postedTweets(wedgeID, displayCount, pages_array, callback){
	this.tweets = new Array();
	this.callback = callback;
	this.displayCount = displayCount;
	this.numUsernames = 0;
	this.userImage = "";
	this.retrievedUsernames = 0;
	this.wedgeID = wedgeID;
	this.addTweets = function(newTweets){
		this.tweets = this.tweets.concat(newTweets);
	};
	this.sortTweets = function(){
		this.tweets = this.tweets.sort(compareTweets);
	}
	this.pages_array = pages_array;
	
}

function Tweet(id, author, username, displayName, userImage, text, source, createdAt, replyToUsername, replyToUserID){
	var linkStrings = [
			/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,
			/\@([a-z0-9]+)/ig, 
			/\#([a-z0-9]+)/ig];
	var linkReplace = [
			'<a href="$1" target="_blank">$1</a>',
			'<a href="http://twitter.com/$1" target="_blank">@$1</a>', 
			'<a href="http://search.twitter.com/search?q=%23$1">#$1</a>'];
		
	this.id = id;
	this.author = author;
	this.username = username;
	this.displayName = displayName;
	this.userImage = userImage;
	this.text = text;
	for(i=0; i < linkStrings.length; i++){
		this.text = this.text.replace(linkStrings[i], linkReplace[i]);
	}
	this.source = source;
	this.createdAt = createdAt;
	this.replyToUsername = replyToUsername;
	this.replyToUserID = replyToUserID;
	
	this.created = twCreatedAtToDate(createdAt);
	this.humanTimeDiff = relTime(this.createdAt);
	if((replyToUsername == null) || (replyToUserID == null)){
		this.isReply = 0;
	} else {
		this.isReply = 1;
	}
}
function compareTweets(a, b){
	return b.created - a.created;
}

function getTweets(usernames, wedgeID, count, pages_array, displayNameAs, includeReplies, callback){
	count = (typeof count == 'undefined') ?
		3 : count;
	displayNameAs = (typeof displayNameAs == 'undefined') ?
		'username' : displayNameAs;
	includeReplies = (typeof includeReplies == 'undefined') ?
		0 : includeReplies;
		
	globalTweets = new postedTweets(wedgeID, count, pages_array, callback);
	for(i in usernames){
		if($.trim(usernames[i]) != ''){
			globalTweets.numUsernames++;
			var feedURL = 'http://twitter.com/status/user_timeline/' + $.trim(usernames[i]) + '.json';
			$.ajax({
				url: feedURL,
				dataType: 'jsonp',
				success: processTweets
			});
		}
	}
}

function processTweets(responses) {
	var tweets = new Array();
	var tweet_row = 0;
	for(j in responses){
		if(responses[j].id != null
		   && (includeReplies 
		      || (responses[j].in_reply_to_user_id == null && responses[j].in_reply_to_status_id == null)
		      || $.inArray(responses[j].in_reply_to_screen_name.toLowerCase(), usernames) > -1)
		){
			if(displayNameAs == 'username'){
				displayName = responses[j].user.screen_name;
			} else {
				displayName = responses[j].user.name;
			}
			tweets[tweet_row] = new Tweet(
				responses[j].id,
				responses[j].user.name,
				responses[j].user.screen_name,
				displayName,
				responses[j].user.profile_image_url,
				responses[j].text,
				responses[j].source,
				responses[j].created_at,
				responses[j].in_reply_to_screen_name,
				responses[j].in_reply_to_user_id_str
			);
			tweet_row++;
		}
	}
	globalTweets.addTweets(tweets);
	globalTweets.retrievedUsernames++;
	if(globalTweets.retrievedUsernames == globalTweets.numUsernames){
		globalTweets.sortTweets();
		globalTweets.tweets = globalTweets.tweets.splice(0, globalTweets.displayCount);
		if(globalTweets.numUsernames == 1 && globalTweets.tweets.length > 0){
			globalTweets.userImage = globalTweets.tweets[0].userImage;
			globalTweets.username = globalTweets.tweets[0].username;
		}
		positionOnPage = 1;
		for(i in globalTweets.tweets){
			globalTweets.tweets[i].even_odd = positionOnPage % 2?"odd":"even";
			if(globalTweets.pages_array[i].last){
				positionOnPage = 1;
			} else {
				positionOnPage++;
			}
		}
		$("#twitter_wedge_"+globalTweets.wedgeID ).html($( "#twitter_header_template_"+globalTweets.wedgeID ).tmpl(globalTweets));
		globalTweets.callback();
	}
}

function twCreatedAtToDate(time_value) {
	time_value = time_value.replace(/(\+[0-9]{4}\s)/ig,"");
	return Date.parse(time_value);
}

// convert the time passed from Twitter into a human readable time length ("1 minute ago")
function relTime(time_value) {
	time_value = time_value.replace(/(\+[0-9]{4}\s)/ig,"");
	var parsed_date = Date.parse(time_value);
	var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
	var timeago = parseInt((relative_to.getTime() - parsed_date) / 1000);
	if (timeago < 60) return 'less than a minute ago';
	else if(timeago < 120) return 'about a minute ago';
	else if(timeago < (45*60)) return (parseInt(timeago / 60)).toString() + ' minutes ago';
	else if(timeago < (90*60)) return 'about an hour ago';
	else if(timeago < (24*60*60)) return 'about ' + (parseInt(timeago / 3600)).toString() + ' hours ago';
	else if(timeago < (48*60*60)) return '1 day ago';
	else return (parseInt(timeago / 86400)).toString() + ' days ago';
}

