$(document).ready(function() {
	activate_stream_actions();
	
	$(".subscribe-stream-button").each(function() {
		var action = $(this).attr('action');
		var stream = $(this).attr('stream');
		$(this).click(function() {
			subscribe_stream(action, stream, $(this));
		});
	});
	
	$(".search-lists").each(function() {
		var query = $(this).attr('q');
		$(this).click(function() {
			$(this).addClass('selected');
			if (selectedSearchList != null)
				selectedSearchList.removeClass('selected');
			selectedSearchList = $(this);
			$('#list-search-loading').show();
			$('#list-search-more-link').attr('href',server_data['root_path']+'list_search?q='+query);
			search_lists(query);
			return false;
		});
		if (selectedSearchFirst == null) {
			$(this).click();
			selectedSearchFirst = true;
		}
	});
	
	$(".search-form .search-input").focus(function (e) {
		var defaultSearchText = $(this).attr('default');
		if ($(this).attr("value") == defaultSearchText) {
			$(this).attr("value", "");
			$(this).addClass("active");
		}
	});
	$(".search-form .search-input").blur(function (e) {
		var defaultSearchText = $(this).attr('default');
		if ($(this).attr("value") == "") {
			$(this).attr("value", defaultSearchText);
			$(this).removeClass("active");
		}
	});
	
	if (server_data['stream_params']) {
		mozzler_stream_poll_start();
		var now = new Date();
		var now = (now.getTime() / 1000);
		utcOffset = server_data['stream_params']['utctime'] - now;
	}
	
	if (server_data['popup_status']) {
		$('#popup-status').click();
	}
});

function activate_stream_actions() {
	$('a[rel*=facebox]').each(function (i) {
		$(this).facebox();
	});

	$(".status-button").each(function() {
		var status = $(this).attr('status');
		var cursorStart = $(this).attr('cursorStart');
		var twitterDM = $(this).attr('twitterDM');
		var topText = $(this).attr('topText');
		$(this).click(function() {
			set_status(status, (cursorStart == 'true'));
			bind_facebox_buttons();
			if (twitterDM) {
				$("#facebox .buttons .update-status").val("Send DM");
				$("#facebox .status-input .text").html("Send Direct Message to "+twitterDM);
				$("#facebox .shorten-urls input").attr('checked',false);
				$("#facebox .shorten-urls").hide();
				$("#facebox .networks").hide();
				$("#facebox .update-type").val("twitterDM");
				$("#facebox .twitter-dm").val(twitterDM);
			}
			if (topText)
				$("#facebox .status-input .text").html(topText);
		});
	});
	
	$(".retweet-button").each(function() {
		var tweetId = $(this).attr('tweetId');
		$(this).click(function() {
			retweet(tweetId);
		});
	});
	
	$(".fb-comment-reply-button").each(function() {
		var fbId = $(this).attr('fbStatusId');
		$(this).click(function() {
			$("#fb-comment-"+fbId).show();
		});
	});
	
	$("#stream .new-item").mouseover(function() {
		$(this).removeClass('new-item');
		update_unread_count();
	});
	
	$(".fb-comment-button input").each(function() {
		var fbId = $(this).attr('fbStatusId');
		$(this).click(function() {
			facebook_post_comment(fbId);
		});
	});
}

var selectedSearchList = null;
var selectedSearchFirst = null;

function set_status(status, cursorStart) {
	var ta = $("#facebox .status-input .textarea");
	if (cursorStart) {
		ta.val(status);
		ta.focus();
	}
	else {
		ta.focus();
		ta.val(status);
	}
	update_status_count(cursorStart);
}

function retweet(tweet_id) {
	if (server_data['loggedIn'] == '0') {
		ajax_error("You need to login before retweeting");
		return;
	}
	
	var params = {
		action: 'retweet',
		tweet_id: tweet_id
	};
	$.post(server_data['ajax_server'], params, function(data,status) {
		if (status == 'success') {
			if (data['success'] == '1')
				ajax_msg("Retweet complete");
			else
				ajax_msg("Server error occurred while retweeting ("+data['msg']+")");
		}
		else {
			ajax_error("Server error occurred while retweeting");
		}
	}, 'json');
}

function subscribe_stream(action, stream, btn) {
	if (server_data['loggedIn'] == '0') {
		ajax_error("You need to be <a href=\""+server_data['root_path']+"login\">logged in</a> to Mozzler or <a href=\""+server_data['root_path']+"signup\">signup</a> to subscribe");
		return;
	}
	if (typeof(server_data['twitter_user']) == 'undefined') {
		ajax_error("You must connect a twitter account to create this subscribtion<br /><a href=\""+server_data['root_path']+"accounts\">Connect Twitter &raquo;</a>");
		return;
	}
	
	var params = {
		action: action+'-stream',
		stream: stream
	};
	$.post(server_data['ajax_server'], params, function(data,status) {
		if (status == 'success') {
			if (data['success'] == '1') {
				ajax_msg("Subscription request successfully completed");
				if (btn.html() == 'Subscribe') {
					btn.html('Unsubscribe');
					btn.attr('action','unsubscribe');
				}
				else {
					btn.html('Subscribe');
					btn.attr('action','subscribe');
				}
			}
			else
				ajax_msg("Server error occurred while subscribing("+data['msg']+")");
		}
		else {
			ajax_error("Server error occurred while subscribing");
		}
	}, 'json');
}
var urlRegex = new RegExp("((http:\\/\\/|www)([\\S]+))\\s","gim");
var urlRegex2 = new RegExp("((http:\\/\\/|www)([\\S]+))$","gim");
var minUrlLength = 25;
function update_status_count(cursorStart) {
	var v = $("#facebox .status-input .textarea").val();
	var r = 140 - v.length;
	var cc = $("#facebox .char-count");
	cc.html(r);
	if (r < 0)
		cc.addClass("negative");
	else
		cc.removeClass("negative");
	
	shorten_urls(v,cursorStart);
}

function shorten_urls(status,cursorStart) {
	if ($("#facebox .status-shorten-urls").is(":checked")) {
		var matches = urlRegex.exec(status);
		if (!matches)
			matches = urlRegex2.exec(status);
		if (matches) {
			var url = matches[1];
			var newUrl = wrapUrl(url, server_data['twitter_user']);
			if (url.length > minUrlLength) {
				compressURL(newUrl,function(shortUrl) {
					var statusElm = $("#facebox .status-input .textarea");
					var status = statusElm.val();
					status = status.replace(url, shortUrl);
					if (cursorStart) {
						statusElm.val(status);
						statusElm.focus();
					}
					else {
						statusElm.focus();
						statusElm.val(status);
					}
				});
			}
		}
	}
}

function invite_mozzler(screen_name) {
	if (confirm("Invite "+screen_name+" to Mozzler?")) {
		var params = {};
		params['action'] = 'invite';
		params['screen_name'] = screen_name;
		$.post(server_data['ajax_server'], params, function(data,status) {
		if (status == 'success') {
			if (data['success'] == '1')
				ajax_msg("You have invited "+screen_name+" to Mozzler");
			else
				ajax_error("Server error occurred while updating status ("+data['msg']+")");
		}
		else {
			ajax_error("Server error occurred while updating status");
		}
	}, 'json');
	}
}

function post_status(newStatus, params) {
	params['action'] = 'updateStatus';
	params['status'] = newStatus;
	$.post(server_data['ajax_server'], params, function(data,status) {
		if (status == 'success') {
			if (data['success'] == '1')
				ajax_msg("Your status has been updated");
			else
				ajax_error("Server error occurred while updating status ("+data['msg']+")");
		}
		else {
			ajax_error("Server error occurred while updating status");
		}
	}, 'json');
}

function send_DM(msg, screen_name) {
	var params = {};
	params['action'] = 'twitter-dm';
	params['msg'] = msg;
	params['screen_name'] = screen_name;
	$.post(server_data['ajax_server'], params, function(data,status) {
		if (status == 'success') {
			if (data['success'] == '1')
				ajax_msg("Direct Message sent to "+screen_name);
			else
				ajax_error("Server error occurred while updating status ("+data['msg']+")");
		}
		else {
			ajax_error("Server error occurred while updating status");
		}
	}, 'json');
}

var ajax_msg_timeout = null;
var ajax_msg_delay = 3000;
function ajax_msg(msg) {
	clearTimeout(ajax_msg_timeout);
	$('#notice-msg').html(msg);
	$('#notice').css("top",$(window).scrollTop()+40);
	$('#notice').fadeIn(1000, function(e) { ajax_msg_timeout = setTimeout(ajax_msg_clear, ajax_msg_delay) });
}

function ajax_msg_clear() {
	$('#notice').fadeOut(1000);
}

var ajax_error_timeout = null;
function ajax_error(msg) {
	clearTimeout(ajax_error_timeout);
	$('#error-msg').html(msg);
	$('#error').css("top",$(window).scrollTop()+40);
	$('#error').fadeIn(1000, function(e) { ajax_error_timeout = setTimeout(ajax_error_clear, ajax_msg_delay) });
}

function ajax_error_clear() {
	$('#error').fadeOut(1000);
}

function bind_facebox_buttons() {
	$("#facebox .update-status").click(function() {
		var newStatus = $("#facebox .status-input .textarea").val();
		var twitter = '0';
		var facebook = '0';
		if ($("#facebox .status-update-twitter").is(":checked")) {
			twitter = '1';
		}
		if ($("#facebox .status-update-facebook").is(":checked")) {
			facebook = '1';
		}
		var params = {
			twitter: twitter,
			facebook: facebook
		}
		var updateType = $("#facebox .update-type").val();
		if (updateType == 'status')
			post_status(newStatus, params);
		if (updateType == 'twitterDM') {
			var screen_name = $("#facebox .twitter-dm").val();
			send_DM(newStatus, screen_name);
		}
		$(document).trigger('close.facebox');
	});
	$("#facebox .close-status").click(function() { $(document).trigger('close.facebox'); });
	$("#facebox #status-update .textarea").keyup(function() { update_status_count(); });
}

function compressURL(url,success) {
	var link = 'http://to.ly/api.php?json=1&longurl=' + encodeURIComponent(url) + '&callback=?';
	$.getJSON(link, function(data){
		success && success(data.shorturl);
	});
}

function wrapUrl(url,user) {
	var sdLength = server_data['root_path'].length;
	if (url.substring(0,sdLength) == server_data['root_path'])
		return url;
		
	var link = server_data['root_path']+'w?';
	if (user)
		link += 'u='+user+'&';
	link += 'l='+link;
	return link;
}

function hideNetworkMessage(network) {
	$("#highlight-box").hide();
	var params = {};
	params['action'] = 'hideNetwork';
	params['network'] = network;
	$.post(server_data['ajax_server'], params, function(data, status) {
		if (status != 'success' || data['success'] != '1') {
			ajax_error("Server error occurred");
		}
	}, 'json');
}

/* Facebook */
function facebook_connect() {
	window.open('http://www.facebook.com/login.php?api_key='+server_data['facebook_key']+'&display=popup&extern=1&fbconnect=1&req_perms=publish_stream,read_stream,offline_access,read_mailbox&return_session=1&v=1.0&next='+
		server_data['root_path']+'facebook_callback&fb_connect=1&cancel_url='+server_data['root_path']+'facebook_callback/cancel', 
		'_blank', 'top=442,width=480,height=460,resizable=yes', true);
}

function facebook_post_comment(statusId) {
	var params = {};
	params['action'] = 'postFBComment';
	params['statusId'] = statusId;
	
	var comment = $("#fb-comment-text-"+statusId).val();
	params['comment'] = comment;
	
	$.post(server_data['ajax_server'], params, function(data,status) {
		if (status == 'success') {
			if (data['success'] == '1') {
				$("#fb-comment-"+statusId+" .comment-text").html(data['comment']);
				$("#fb-comment-"+statusId).append("<div class=\"comment-time\">Moments ago</div>");
				$("#fb-comment-"+statusId+" .fb-comment-button").html("");
			}
			else {
				ajax_error("Server error occurred while updating status ("+data['msg']+")");
			}
		}
		else {
			ajax_error("Server error occurred while updating status");
		}
	}, 'json');
	$('#fb-comment-'+statusId+' .fb-comment-button').html("<img src=\""+server_data['root_path']+"img/spinner.gif\" />");
}

/* List search */
function search_lists(query) {
	var params = {};
	params['action'] = 'searchListsHTML';
	params['q'] = query;
	$.post(server_data['ajax_server'], params, function(data, status) {
		if (status == 'success') {
			$('#list-search-loading').hide();
			$('#list-search-result-container').html(data);
		}
		else {
			ajax_error("Server error occurred while fetching data");
		}
	});
}

/* Stream polling */
var utcOffset = 0;
function mozzler_stream_poll_start() {
	var params = server_data['stream_params'];
	params['action'] = 'update-stream';
	
	poll_manager({
		url: server_data['ajax_server'],
		params: params,
		interval: 35000,	// 60 seconds
		type: "POST",
		success: function (data) {
			if (data) {
				var stuff = data.split(" ",2);
				server_data['stream_params']['last_time'] = stuff[0];
				data = data.substring(stuff[0].length+1,data.length);
				$("#stream").prepend(data);
				var children = $("#stream").children();
				while (children.length > 20) {
					$(children[20]).remove();
					children = $("#stream").children();
				}
				update_stream_times();
				activate_stream_actions();
				update_unread_count();
				$('#stream>div:hidden').slideDown(2000);
				
			}
		},
		postCall: function() {
			update_stream_times();
		}
	});
}

function update_stream_times() {
	// update time values
	var utctime = new Date();
	utctime = (utctime.getTime() / 1000) + utcOffset;
	$("#stream>div").each(function () {
		var inserted = $(this).attr("inserted");
		$(".time", this).html(get_age_string(utctime, inserted));
	});
}

function update_unread_count() {
	// provide total of unread items in title bar
	var total = 0;
	$("#stream .new-item").each(function() {
		total++;
	});
	set_new_items_title(total);
}

var titleRe = new RegExp('( \\([0-9]+\\))$');
function set_new_items_title(total) {
	if (document.title.match(titleRe)) {
		if (total == 0) {
			document.title = document.title.replace(titleRe, '');
		}
		else {
			document.title = document.title.replace(titleRe, ' ('+total+')');
		}
	}
	else {
		if (total != 0) {
			document.title += ' ('+total+')';
		}
	}
}

function poll_manager(opts){
	setTimeout(update, opts.interval);
	opts.params['last_time'] = server_data['stream_params']['last_time'];
	function update(){
		if (opts.preCall)
			opts.preCall();
		$.ajax({
			type: opts.type,
			url: opts.url,
			success: opts.success,
			data: opts.params
		});
		if (opts.postCall)
			opts.postCall();
		setTimeout(update, opts.interval);
	};
};

function mozzler_popout() {
	var loc = window.location;
	loc += "";
	if (loc.indexOf('?') == -1)
		loc += "?";
	else
		loc += "&";
	loc += "popout=1";
	var config = "status=1,toolbar=0,location=0,menubar=0,directories=0,resizable=1,scrollbars=1,height=700,width=400";
	window.open(loc,document.title, config);
}

function get_age_string(utctime, seconds) {
	seconds = utctime - seconds;
	if (seconds < 60) {
		return "Moments ago";
	}
	else if (seconds < 3600) {
		age = seconds / 60;
		period = 'minute';
	}
	else if (seconds < 86400) {
		age = seconds / 3600;
		period = 'hour';
	}
	else {
		age = seconds / 86400;
		period = 'day';
	}
	age = parseInt(age);
	if (age > 1) {
		period += 's';
	}
	return age+" "+period+" ago";
}
