var stream_name="metarobert";
var stream_url="http://32hours.com";
var interval=15000; // refresh interval in milliseconds
var default_source='twitter';
var default_since=1; // starting message, gets set as the timestamp of the last msg
var max_messages=50; // max number of messages to show on web page
var limit=20; //number of messages to request per page
var logged_in_twitter=false;
var refresh_count=0;
var following = new Array();  //to store the accounts we're following

$(document).ready(function(){

	// show an activity indicator during ajax activity so the visitor isn't wondering whats happening
	monitor_ajax_transactions();
	
	// get the list of ID's we're following
	$following=get_following();
	// start with toolbar in logged out state
	$("#login_twitter_control").html('<a href="#" onclick="login_twitter();return false">Twitter Login</a>');
	// get message list and setup the heartbeat to poll for new
	// fetch initial list (following only) then again to populate replies
	get_messages(default_source,1);
	get_messages(default_source,10);
	hb = setInterval('heartbeat()', interval);
	// show name of the stream on the home page 
	$(".stream_name").text(stream_name);
	
	// if the browser has both a username and password stored...
	if (get_cookie('username_twitter') && get_cookie('password_twitter')) {
		authenticate_twitter(get_cookie('username_twitter'),get_cookie('password_twitter'),true);
	}
	
	$(".twitter_send").dialog({
		modal: true,
		position: 'center',
		title: "Twitter",
		resizable:false,
		draggable:false,
		autoOpen: false
	});	
	$("#sent_twitter").dialog({
		autoOpen: false,
		position: 'center',
		modal:true,
		resizable:false,
		draggable:false,
		title:"Twitter"
	});
	
}); 

//** MONITOR_AJAX_TRANSACTIONS - start/stop refresh icon
	function monitor_ajax_transactions(){
		$("#throbber").ajaxStart(function(){
			$(this).fadeIn(3000);
		});
		$("#throbber").ajaxStop(function(){
			$(this).fadeOut(3000);			
		});
		$("#throbber").ajaxError(function(){
			$(this).fadeOut(3000);		
		});
	}
function clicked_send_twitter(){
	message_text = $('#send_text_twitter').val();
	$('#send_text_twitter').val('');
	send_twitter(message_text);
}

function get_following(){
		// retrieve list of accounts we're
	$.ajax({
		type: "get",
		url: "api/",
		data: "req=get_following",
		cache: false,
		dataType: 'json',
		success: function(data){
			var test = "";
			if(!data.error){
				following = data;
			}else{
				// server comm failed
			}
		},
		error: function(data){
			//alert("Server communication error. Sorry!  Please try again in a minute or two.");
		}
	});
}
function send_twitter(text){
		// retrieve messages for the timeline
	$.ajax({
		type: "get",
		url: "api/",
		data: "req=send_twitter&message_text="+encodeURIcomponent(text)+"&username="+username+"&password="+password,
		cache: false,
		dataType: 'json',
		success: function(data){
			if(!data.error){
				//alert("username: "+data.username+", password: "+data.password);
				$(".twitter_send").dialog('close');
				// todo: succesful send dialog
				$("#sent_twitter").dialog('open');
			}else{
				logout_twitter();
				alert("Sorry, Twitter authentication failed...");
			}
		},
		error: function(data){
			//alert("Server communication error. Sorry!  Please try again in a minute or two.");
		}
	});
}

function reply_twitter(text,message_id){
	
	
}

function retweet_twitter(text){
	
	
}

function heartbeat(){
	get_messages(default_source,default_since);
}

function login_twitter(){
	$("#login_twitter_dialog").dialog('open');
}
function login_success_twitter(data){
	set_cookie('username_twitter', data.username,90);
	set_cookie('password_twitter', data.password,90);
	$("#login_twitter_control").html("Welcome, "+data.username+" <a href='#' onclick='logout_twitter();return false;'>(logout)</a>");
	logged_in_twitter=true;
}
function logout_twitter(){
	set_cookie('username_twitter',null,-999);
	set_cookie('password_twitter',null,-999);
	$("#login_twitter_control").html('<a href="#" onclick="login_twitter();return false">Twitter Login</a>');
	logged_in_twitter=false;
}
function authenticate_twitter(username,password,enc){
	// retrieve messages for the timeline
	$.ajax({
		type: "get",
		url: "api/",
		data: "req=authenticate_twitter&username="+username+"&password="+password+"&enc="+enc,
		cache: false,
		dataType: 'json',
		success: function(data){
			if(!data.error){
				//alert("username: "+data.username+", password: "+data.password);
				login_success_twitter(data);
			}else{
				logout_twitter();
				alert("Sorry, Twitter authentication failed...");
			}
		},
		error: function(data){
			//alert("Server communication error. Sorry!  Please try again in a minute or two.");
		}
	});	
}

function get_messages(source,since,page,limit){
	// retrieve messages for the timeline
	$.ajax({
		type: "get",
		url: "api/",
		data: "req=get_messages&source="+source+"&since="+since,
		cache: false,
		dataType: 'json',
		success: function(data){
			if(!data.error){
				insert_messages(data);
			}else{
			}
		},
		error: function(data){
			//alert("Server communication error. Sorry!  Please try again in a minute or two.");
		}
	});	
}

function insert_messages(data){
	//iterate through an array of msgs and insert int0 message_list
	data=data.reverse();
	for (var msg in data){
		if(data[msg].sender_id in following){
			message=format_message(data[msg]);
			$("#message_list").prepend(message);
			$("#message_list > li:first").fadeIn('slow');
			
			mlist = $("#message_list > li");
			list_len = mlist.length;
			if (list_len >= max_messages){
				// remove the oldest tweet if the list is over 15 long
				$("#message_list > li:last").remove();
			}
		}else{
			message=format_reply(data[msg]);
			//alert(data[msg].in_reply_to);
			$("#"+ data[msg].in_reply_to +"_replies").prepend(message);
			//$("#"+ data[msg].in_reply_to +"_replies > li:first").fadeIn('slow');
			count=$("#"+ data[msg].in_reply_to +"_reply_count").text();
			count=parseInt(count)+1;
			$("#"+ data[msg].in_reply_to +"_reply_count").text(count);
		}
		if(default_since==1){
			// set since == 2.  on the first request, only tweeters we
			// follow are returned to preload the timeline.  aftert that,
			// it becomes a free for all!!!!
			default_since=10;
			//get_messages(default_source,default_since,1,limit);
		}else{
			if(data[msg].timestamp>default_since){
				default_since=data[msg].timestamp;
			}
		}
	}
	//alert(data[msg].sender_id);
}

function format_message(data){
	// format a message for insert into message_list
	if (data.avatar == null) {
		data.avatar = "http://s.twimg.com/a/1253141863/images/default_profile_4_normal.png";
	}
	if (data.service=="twitter"){
		sender_link="http://twitter.com/"+data.sender;
	}else{
		sender_link=data.url;
	}
	ret=	"<li class='following_li' style='display:none'"+
				"onmouseover='show_msg_controls("+data.message_id+");return false;' "+
					"onmouseout='hide_msg_controls("+data.message_id+");return false;'>"+
				"<div style='background-image:url("+data.avatar+")' class='msg_avatar avatar'>"+
				"</div>"+
				"<em><b><a href='"+sender_link+"' target='_blank'>"+data.sender+"</a></b> | "+
				format_time(data.timestamp)+					
				"</em><br>"+create_links(data.message_text)+
				"<br><span id='replies_control' class='message_controls'>"+
					"<a href='#' onclick=\'$(\"#"+ data.message_id +"_replies\").toggle();return false;\'>"+
						"Replies (<span id='"+data.message_id+"_reply_count' class='reply_count'>0</span>)</a>"+
				"</span>"+
				"&nbsp;<span id='message_"+data.message_id+"_controls' class='message_controls' style='display:none;'>"+
					" | <a href='#' onclick=\"$(\'#send_twitter_dialog\').dialog(\'open\');return false;\">reply</a>"+
					" | <a href='#' onclick='return false;'>retweet</a>"+
				"</span>"+
				"<ul id='"+data.message_id+"_replies' class='replies_list' style='display:none;'></ul>"+
			"</li>";
	return (ret);
}

function format_reply(data){
	// format a message for insert into message_list as a REPLY to someone we follow
	if (data.avatar == null) {
		data.avatar = "http://s.twimg.com/a/1253141863/images/default_profile_4_normal.png";
	}
	if (data.service=="twitter"){
		sender_link="http://twitter.com/"+data.sender;
	}else{
		sender_link=data.url;
	}
	ret=	"<li id='"+data.message_id+"_reply_li' class='replies_li'"+
				"onmouseover='show_msg_controls("+data.message_id+");return false;' "+
					"onmouseout='hide_msg_controls("+data.message_id+");return false;'>"+
				"<div style='background-image:url("+data.avatar+")' class='msg_avatar avatar'>"+
				"</div>"+
				"<em><b><a href='"+sender_link+"' target='_blank'>"+data.sender+"</a></b> | "+
				format_time(data.timestamp)+					
				"</em><br>"+create_links(data.message_text)+
				"<br><span id='replies_control' class='message_controls'>"+
					"<a href='#' onclick=\'$(\"."+ data.message_id +"_replies_list > li\").toggle();return false;\'>"+
				"</span>"+
				"&nbsp;<span id='message_"+data.message_id+"_controls' class='message_controls' style='display:none;'>"+
					"<a href='#' onclick=\"$(\'#send_twitter_dialog\').dialog(\'open\');return false;\">reply</a>"+
					" | <a href='#' onclick='return false;'>retweet</a>"+
				"</span>"+
				"<ul id='"+data.message_id+"_replies' class='"+data.message_id+"_replies_list'></ul>"+
			"</li>";
	return (ret);
}

function show_msg_controls(id){
	if (logged_in_twitter == true) {
		$("#message_" + id + "_controls").show();
	}
}
function hide_msg_controls(id){
	$("#message_"+id+"_controls").hide();	
}

function format_time(timestamp){
	// given a unix timestamp, return a pretty one
		ampm="am";
		var date = new Date(timestamp * 1000);
		hour = date.getHours();
		if(hour==12){
			ampm='pm';
		}
		if(hour>12){
			hour=hour-12;
			ampm="pm";
		}
		minute = date.getMinutes();
		if(minute<10){
			minute="0"+minute;
		}
		dayArr = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu','Fri','Sat');
		day = date.getDay();
		day = dayArr[day];
		monthArr = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'July', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
		month = date.getMonth();
		month = monthArr[month];
		mDay=date.getDate();
		year = date.getFullYear();
		ret = hour+":"+minute+" "+ampm+" "+day+ " " +month+" "+mDay+", "+year;
		return(ret);
}

//
// UTILS
//
	
// CREATELINKS
function create_links(messageText){
		// create links of URLs
	var pattern = /(((ht|f)tp(s?))\:\/\/{1}[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/ig;
	urlArray = messageText.match(pattern);
	var linkVal = "";
	if(urlArray){
		$.each(urlArray, function(key, val){
			//shorten links for disply
			//if(val.length>20){
			//	linkVal =val.slice(0,16);
			//	linkVal+="...";
			//}else{
				linkVal=val;
			//}
			messageText=messageText.replace(val, "<a href=\""+val+"\" target=\"_blank\" title=\""+val+"\">"+linkVal+"</a>");
		});
	}
	//create links of @ references
	pattern = /@{1}[-a-zA-Z0-9%_\+~&\/\/=]+/ig;				
	atArray = messageText.match(pattern);
	if(atArray){
		$.each(atArray, function(key, val){
			shortVal = val.replace(/@/,"");
			messageText=messageText.replace(val, "<a href=\"http://twitter.com/"+shortVal+"\" target=\"_blank\"  title=\"http://twitter.com/"+shortVal+"\">"+val+"</a>");
		});
	}
	//create links of # references
	pattern = /#{1}[-a-zA-Z0-9%_\+~&\/\/=]+/ig;				
	hashArray = messageText.match(pattern);
	if(hashArray){
		$.each(hashArray, function(key, val){
			//shortVal = val.replace(/#/,"");
			messageText=messageText.replace(val, "<a href=\"http://search.twitter.com/search?q="+encodeURIComponent(val)+"\" target=\"_blank\" title=\"Search Twitter for "+val+"\">"+val+"</a>");
		});
	}
	return(messageText);
}


//** SET_COOKIE
	function set_cookie(c_name,value,expiredays){
		var exdate=new Date();
		exdate.setDate(exdate.getDate()+expiredays);
		document.cookie=c_name+ "=" +escape(value)+
		((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
	}

// GET_COOKIE
	function get_cookie(c_name){
		if (document.cookie.length>0){
			c_start=document.cookie.indexOf(c_name + "=");
			if (c_start!=-1)
			{ 
				c_start=c_start + c_name.length+1; 
				c_end=document.cookie.indexOf(";",c_start);
				if (c_end==-1) c_end=document.cookie.length;
				return unescape(document.cookie.substring(c_start,c_end));
			} 
		}
		return "";
	}

