	
	function url_encode(str)
	{
		
	}
	
	function url_decode(str)
	{
		str = decodeURIComponent(str);
		
		return str;
	}
	
	
	function rating_hover(tweet_id, rating)
	{
		for(var i = 1; i <= 5; i++)
		{
			var star = $('t' + tweet_id + '_r' + i);
			star.removeClassName('avg');
			
			if(i <= rating)
				star.addClassName('active');
			else
				star.removeClassName('active');
		}
	}
	
	function rating_reset(tweet_id, rating, is_avg)
	{
		var rating_attr = $('t' + tweet_id + '_r').readAttribute('rating');
		
		if(rating_attr != null && rating_attr != rating)
			rating = rating_attr;
			
		for(var i = 1; i <= 5; i++)
		{
			var star = $('t' + tweet_id + '_r' + i);
			
			if(is_avg && rating_attr == null)
				star.addClassName('avg');
			
			if(i <= rating)
				star.addClassName('active');
			else
				star.removeClassName('active');
		}
	}
	
	function rate_tweet(tweet_id, rating)
	{
		$('t' + tweet_id + '_r').setAttribute('rating', rating);
		
		new Ajax.Request('/tweets/rate/' + tweet_id + '/' + rating,
		{
			method: 'get',
			onSuccess: function(t) {
				var response = t.responseText.evalJSON();
				
				if(response.result == true)
				{
					$('user_rating_count').innerHTML = response.rating_count;
					$('global_rating_count').innerHTML = response.global_rating_count;
					set_tweet_status(tweet_id, 'Thank you for your rating!', 5);
				}
				else if(response.error)
				{
					set_tweet_status(tweet_id, response.error, 5);
				}
			},
			onFailure: function() {
				alert('General failure.');
			}
		});
	}
	
	function update_char_count(textbox, tweet_id)
	{
		var chars_left = 140 - textbox.value.length;
		var char_div = $('t' + tweet_id + '_chars');
		
		char_div.innerHTML = chars_left;
		char_div.removeClassName('plenty');
		char_div.removeClassName('low');
		char_div.removeClassName('exceeded');
		
		if(chars_left <= 0)
			char_div.addClassName('exceeded');
		else if(chars_left < 20)
			char_div.addClassName('low');
		else
			char_div.addClassName('plenty');
	}
	
	function retweet_toggle(tweet_id, user_name, text)
	{
		var id = 't' + tweet_id + '_';
		var form = $(id + 'form');
		var tweet = $(id + 'input');
		var count_div = $(id + 'chars_container');
		var rt_btn = $(id + 'btn_retweet');
		var rpl_btn = $(id + 'btn_reply');
		var com_btn = $(id + 'btn_comment');
		var com_list = $(id + 'comments');
		var com_name = $(id + 'name');
		var com_name_div = $(id + 'name_div');

		text = unescape(text);
		
		if(!form.visible())
		{
			tweet.value = 'RT @' + user_name + ' ' + text;
			update_char_count(tweet, tweet_id);
			
			rt_btn.show();
			rpl_btn.hide();
			com_btn.hide();
			com_list.hide();
			count_div.show();
			
			Effect.BlindDown(form.id, {duration: 0.25});
			focus_textarea_with_id(tweet.id, 0.25);
		}
		else if(rpl_btn.visible() || com_btn.visible())
		{
			tweet.value = 'RT @' + user_name + ' ' + text;
			update_char_count(tweet, tweet_id);
			
			rt_btn.show();
			rpl_btn.hide();
			com_btn.hide();
			com_list.hide();
			count_div.show();
			
			focus_textarea_with_id(tweet.id);
		}
		else
		{
			Effect.BlindUp(form.id, {duration: 0.25});
			tweet.value = '';
		}
	}
	
	function reply_toggle(tweet_id, user_name)
	{
		var id = 't' + tweet_id + '_';
		var form = $(id + 'form');
		var tweet = $(id + 'input');
		var count_div = $(id + 'chars_container');
		var rt_btn = $(id + 'btn_retweet');
		var rpl_btn = $(id + 'btn_reply');
		var com_btn = $(id + 'btn_comment');
		var com_list = $(id + 'comments');
		var com_name = $(id + 'name');
		var com_name_div = $(id + 'name_div');
		
		if(!form.visible())
		{
			tweet.value = '@' + user_name + ' ';
			update_char_count(tweet, tweet_id);
			
			rpl_btn.show();
			rt_btn.hide();
			com_btn.hide();
			com_list.hide();
			count_div.show();
			
			Effect.BlindDown(form.id, {duration: 0.25});
			focus_textarea_with_id(tweet.id, 0.25);
		}
		else if(rt_btn.visible() || com_btn.visible())
		{
			tweet.value = '@' + user_name + ' ';
			update_char_count(tweet, tweet_id);

			rpl_btn.show();
			rt_btn.hide();
			com_btn.hide();
			com_list.hide();
			count_div.show();

			focus_textarea_with_id(tweet.id);
		}
		else
		{
			Effect.BlindUp(form.id, {duration: 0.25});
			tweet.value = '';
		}
	}
	
	function comments_toggle(tweet_id, logged_in)
	{
		var id = 't' + tweet_id + '_';
		var form = $(id + 'form');
		var tweet = $(id + 'input');
		var count_div = $(id + 'chars_container');
		var rt_btn = $(id + 'btn_retweet');
		var rpl_btn = $(id + 'btn_reply');
		var com_btn = $(id + 'btn_comment');
		var com_list = $(id + 'comments');
		var com_name = $(id + 'name');
		var com_name_div = $(id + 'name_div');
		
		if(!form.visible())
		{
			tweet.value = '';
			update_char_count(tweet, tweet_id);
			
			if(!logged_in)
				com_name_div.show();
			
			com_list.show();
			com_btn.show();
			rpl_btn.hide();
			rt_btn.hide();
			count_div.hide();
			
			Effect.BlindDown(form.id, {duration: 0.25});
			focus_textarea_with_id(tweet.id, 0.25);
		}
		else if(rt_btn.visible() || rpl_btn.visible())
		{
			tweet.value = '';
			update_char_count(tweet, tweet_id);

			if(!logged_in)
				com_name_div.show();
			
			com_list.show();
			com_btn.show();
			rpl_btn.hide();
			rt_btn.hide();
			count_div.hide();
			
			focus_textarea_with_id(tweet.id);
		}
		else
		{
			com_list.hide();
			Effect.BlindUp(form.id, {duration: 0.25});
			tweet.value = '';
		}
	}

	function comment_post(tweet_id)
	{
		var input = $('t' + tweet_id + '_input');
		var name_input = $('t' + tweet_id + '_name');
		
		var text = encodeURIComponent(input.value);
		var name = encodeURIComponent(name_input.value);
		
		new Ajax.Request('/tweets/comment/' + tweet_id,
		{
			method: 'post',
			postBody: 'text=' + text + '&name=' + name,
			onSuccess: function(t)
			{
				var response = t.responseText.evalJSON();
				if(response && response.result == true)
				{
					input.value = '';
					name_input.value = '';

					if($('user_comment_count'))
						$('user_comment_count').innerHTML = response.comment_count;
					
					$('t' + tweet_id + '_comments').insert({
						bottom: '<div class="comment"><img src="' + response.user_image + '" /><p><strong>' + response.user_name + '</strong>: ' + response.user_text + '</p></div>'
					});
					
					set_tweet_status(tweet_id, 'Thank you for your comment.');
				}
				else if(response.error)
				{
					alert('Could not post your comment: ' + response.error);
					return false;
				}
				else
				{
					alert('Sorry, we experienced an error posting your comment. Please try again in 5 minutes.');
					return false;
				}
			}
		});
	}
	
	
	function retweet_post(tweet_id)
	{
		var input = $('t' + tweet_id + '_input');
		if(input.value.length > 140)
		{
			alert('Your tweet cannot exceed 140 characters.');
			return false;
		}
		
		var text = encodeURIComponent(input.value);
		
		new Ajax.Request('/twitter/retweet/' + tweet_id,
		{
			method: 'post',
			postBody: 'text=' + text,
			onSuccess: function(t)
			{
				var response = t.responseText.evalJSON();
				if(response && response.result == true)
				{
					input.value = '';
					$('user_retweet_count').innerHTML = response.retweet_count;
					$('user_reply_count').innerHTML = response.reply_count;

					set_tweet_status(tweet_id, 'Your retweet has been posted.');
					Effect.BlindUp('t' + tweet_id + '_form', {duration: 0.25});
				}
				else if(!response.error)
				{
					alert('Twitter is experiencing problems. Please try posting again.');
					return false;
				}
				else
				{
					alert('An error occurred while posting your reply: ' + response.error);
					return false;
				}
			}
		});
	}
	
	function reply_post(tweet_id)
	{
		var input = $('t' + tweet_id + '_input');
		if(input.value.length > 140)
		{
			alert('Your tweet cannot exceed 140 characters.');
			return false;
		}
		
		var text = encodeURIComponent(input.value);
		
		new Ajax.Request('/twitter/reply/' + tweet_id,
		{
			method: 'post',
			postBody: 'text=' + text,
			onSuccess: function(t)
			{
				var response = t.responseText.evalJSON();
				if(response && response.result == true)
				{
					input.value = '';
					$('user_retweet_count').innerHTML = response.retweet_count;
					$('user_reply_count').innerHTML = response.reply_count;

					set_tweet_status(tweet_id, 'Your reply has been posted.');
					Effect.BlindUp('t' + tweet_id + '_form', {duration: 0.25});
				}
				else if(!response.error)
				{
					alert('Twitter is experiencing problems. Please try posting again.');
					return false;
				}
				else
				{
					alert('An error occurred while posting your reply: ' + response.error);
					return false;
				}
			}
		});
	}
	
	function set_tweet_status(tweet_id, text, duration)
	{
		var status = $('t' + tweet_id + '_status');
		status.innerHTML = text;
		
		Effect.Appear(status.id, {duration: 0.25});
		
		if(!duration)
			duration = 3000;
		else
			duration *= 1000;
		
		setTimeout("Effect.BlindUp('" + status.id + "', {duration: 0.25})", duration);
	}
	
	function focus_textarea_with_id(element_id, duration)
	{
		if(duration)
		{
			setTimeout("focus_textarea_with_id('" + element_id + "')", duration * 1000);
			return;
		}
		
		var element = $(element_id);
		element.focus();
		
		if(element.createTextRange)
		{
			var range = element.createTextRange();
			range.move('character', element.value.length);
			range.select();
		}
		else if(element.selectionStart)
		{
			element.setSelectionRange(element.value.length, element.value.length);
		}
	}
	
	function alert_need_login_retweet(tweet_id)
	{
		set_tweet_status(tweet_id, 'Sorry, but you must be <a href="/twitter/authorize">logged in</a> ' +
			'before you can post a retweet.', 5);
	}
	
	function alert_need_login_reply(tweet_id)
	{
		set_tweet_status(tweet_id, 'Sorry, but you must be <a href="/twitter/authorize">logged in</a> ' +
			'before you can post a reply.', 5);
	}
	
	function alert_need_login_rate(tweet_id)
	{
		set_tweet_status(tweet_id, 'Sorry, but you must be <a href="/twitter/authorize">logged in</a> ' +
			'before you can rate tweets.', 5);
	}
	
	
