var api_url = 'api/index.php';
var proxy_url = 'p.php';
var timeline = new Object(); // hold timeline info

in_reply = false;  // is the current tweet being composed as a reply?

timeline.friends_timeline = new Object();
timeline.mentions = new Object();
timeline.direct_messages = new Object();
timeline.favorites = new Object();
timeline.public_timeline = new Object();

var heartbeat = new Object();

timeline.current = "friends_timeline";
timeline.current_page=1;
timeline.max_length=20;
timeline.refresh_interval = 60000;

timeline.friends_timeline.message_oldest=1;
timeline.friends_timeline.message_newest=1;
timeline.friends_timeline.current_length=0;

timeline.mentions.message_oldest=1;
timeline.mentions.message_newest=1;
timeline.mentions.current_length=0;

timeline.direct_messages.message_oldest=1;
timeline.direct_messages.message_newest=1;
timeline.direct_messages.current_length=0;

timeline.favorites.message_oldest=1;
timeline.favorites.message_newest=1;
timeline.favorites.current_length=0;

timeline.public_timeline.message_oldest=1;
timeline.public_timeline.message_newest=1;
timeline.public_timeline.current_length=0;

	

$(document).ready(function(){
	// hide all of the timelines until "set_timeline" runs
	// BUG: IE will not apply font styles to the containers
	// if they are hidden when I fill them in.... BAH!
	//$(".timeline_container").hide();
	//preload the friends and mentions timelines.
	//get_timeline('friends_timeline', 1, 1);
	//get_timeline('mentions', 1, 1);
	//get_timeline('favorites', 1, 1);
	//get_timeline('direct_messages', 1, 1);
	
	if(get_cookie('timeline.current')){
		timeline.current=get_cookie('timeline.current');
	}else{
		set_cookie('timeline.current', 'friends_timeline', 90);
	}
	/*
	if(get_cookie('zusername')&&get_cookie('zpassword')){
		$("#user_name").text(get_cookie('zusername'));
		$("#user_name").attr("href","http://twitter.com/"+get_cookie('zusername'));
		set_timeline(timeline.current,timeline.current_page);
	}else{
		$(".logged_in").hide();
		$('#login_div').show();
	}
	*/
	$("#page_number").text(timeline.current_page);
	/*
	#s_textarea:focus,#s_textarea:hover,#s_textarea:active{
		rows:3;
		height:3.5em;
	}
	*/
}); 

function set_timeline(tl,page){
	$(".settings_container").hide();
	if(page=="next"){
		if(timeline.current_page>9){
			timeline.current_page=10;
		}else{
			// we're not fetching page 1, clear out the timeline
			while(timeline[tl].current_length > 0){
				timeline[tl].current_length-=1;
				$("#"+tl +" > div:last").remove();
			}
			timeline.current_page=timeline.current_page+1;
			timeline[timeline.current].message_newest=1; // wipe out the since vars, we need entire timelines
			timeline[timeline.current].message_oldest=1;
		}
	}else if (page=="previous"){
		if(timeline.current_page<1){
			timeline.current_page=1;
		}else{
			while(timeline[tl].current_length > 0){
				timeline[tl].current_length-=1;
				$("#"+tl +" > div:last").remove();
			}// we're not fetching page one, so clear the timeline
			timeline.current_page=timeline.current_page-1;
			timeline[timeline.current].message_newest=1; // wipe out the since vars, we need entire timelines
			timeline[timeline.current].message_oldest=1;
		}
	}else{
		timeline.current_page=page; // we're requesting a simple refresh, not a page change
	}
	
	if(tl!=timeline.current){
		timeline.current = tl;
		divs = $("#"+timeline.current+" > div");
		timeline[timeline.current].current_length=divs.length;
	}

	set_cookie('timeline.current', tl, 90);
	
	//$("#"+timeline.current).html("");
	var refresh_interval=timeline.refresh_interval;
	clearInterval(heartbeat.timeline);
	get_timeline(timeline.current,timeline[timeline.current].message_newest,timeline.current_page);
	if(page!=1){
		refresh_interval=240000; // give use 4 minutes before reset when they are paging
		setTimeout('timeline.current_page=1;timeline[timeline.current].message_newest=1;timeline[timeline.current].message_oldest=1;',240000-3000);
	}
	heartbeat.timeline = setInterval('get_timeline(timeline.current,timeline[timeline.current].message_newest,timeline[timeline.current].page)', refresh_interval);
	$(".timeline_container").hide();
	$("#"+timeline.current).show();
	// set unselected tabs
	$(".menu_item").css("background-color", "#e7e8e9");
	$(".menu_item a").css("color", "grey");
	//set selected tab
	$("#"+timeline.current+"_menu_item").css("background-color", "white");
	$("#"+timeline.current+"_menu_item a").css("color", "black"); //css("color", "#264D00");
}

function get_timeline(tl,since,page){
	if(tl=="favorites"){
		parms = "url="+encodeURIComponent("http://twitter.com/favorites/"+get_cookie('zusername')+".json?since_id="+since+"&page="+page+"&rpp=20");
	}else if(tl=="direct_messages"){
		parms = "url="+encodeURIComponent("http://twitter.com/direct_messages.json?since_id="+since+"&page="+page+"&rpp=20");
	}else{
		parms = "url="+encodeURIComponent("http://twitter.com/statuses/"+tl+".json?since_id="+since+"&page="+page+"&rpp=20");
	}
	$.ajax({
		url: proxy_url,
		data: parms,
		//data: "req="+tl+"&since_id="+since+"&page="+page+"&username="+get_cookie('zusername')+"&password="+encodeURIComponent(get_cookie('zpassword')),
		dataType: 'json',
		cache: false,
		timeout:4000,
		success: function(data){
			populate_list_messages(data,tl);
			$("#page_number").text(timeline.current_page);
			if(timeline.current_page<2) {
				$("#link_previous_page").hide();
			}else{
				$("#link_previous_page").show();
			}
		},		
		failure: function(data){
			$("#notifier").text("error :(").css("color","red").fadeIn(5000).fadeOut(5000);
		}
	});
	set_relative_times();
}

function populate_list_messages(data,tl){
	data.reverse();
	for (var i in data){
		//alert(i+": "+data[i].id);
		//if(tl=='direct_messages'){
		//	msg=format_direct_message(data[i]);
		//}else{
			msg=format_message(data[i]);
		//}
		
		$("#"+tl).prepend(msg);
		$("#"+tl+" div:first").show();//fadeIn(3000);
		timeline[tl].current_length+=1;
		while(timeline[tl].current_length > timeline.max_length){
			timeline[tl].current_length-=1;
			$("#"+tl +" > div:last").remove();
		}
		if(data[i].id > timeline[tl].message_newest){
			timeline[tl].message_newest = data[i].id;
		}		
		
		// add the qtip onhover
		$(".avatar_"+data[i].id).qtip({
			content: $(".message_"+data[i].id+"_tip").html(),
	      	style:{
				border: {
					width: 2,
		         	radius: 3,
		         	color: '#e7e8e9'
			 	}
			},
			position: {
		      corner: {
		         target: 'topLeft',
		         tooltip: 'topLeft'
		      }
			},
			show: 'mouseover',
			hide: { when: 'mouseout', fixed: true }
		});
	}
}
function format_message(msg){
	msg_text = create_links(msg.text);
	controls="";
	if(msg.sender){ // direct message
		profile_image_url=msg.sender.profile_image_url;
		screen_name = msg.sender.screen_name;
		url=msg.sender.url;
		controls = "<a href='#' class='dm_link_"+msg.id+" link_control' title='direct message' onclick=\'direct(\""+screen_name+"\");return false;\'>dm</a>";
		if(get_cookie('zusername')==screen_name){
			// are we the sender?  Then we get a delete button.
			controls +="<a href='#' id='delete_link' class='link_control' title='delete' onclick='delete_message("+msg.id+");return false;'>X</a>";
		}
	}else{// regular tweet
		profile_image_url=msg.user.profile_image_url;	
		screen_name = msg.user.screen_name;
		url = msg.user.url;
		// set the class for the favoriting link, and set the action taken when it's clicked
		if(msg.favorited==true){
			favorited = "favorited";
			favorite_action = "destroy";
		}else{
			favorited = "not_favorited";
			favorite_action = "create";
		}
		in_reply_to_screen_name = msg.in_reply_to_screen_name;
		controls = "<a href='#' class='reply_link_"+msg.id+" link_control' title='reply' onclick=\'reply("+msg.id+",\""+screen_name+"\");return false;\'>@</a>"+
				"<a href='#' class='retweet_link_"+msg.id+" link_control' title='retweet' onclick=\'retweet(\""+screen_name+"\",\""+escape(msg.text)+"\");return false;\'>rt</a>" +
				"<a href='#' class='dm_link_"+msg.id+" link_control' title='direct message' onclick=\'direct(\""+screen_name+"\");return false;\'>dm</a>" +
			"<a href='#' class='favorite_link_"+msg.id+" link_favorite link_control "+favorited+"' title='favorite' onclick=\'toggle_favorite(\""+msg.id+"\", \""+favorite_action+"\")\'>*</a>";
		if(get_cookie('zusername')==screen_name){
			// are we the sender?  Then we get a delete button.
			controls +="<a href='#' id='delete_link' class='link_control' title='delete' onclick='delete_message("+msg.id+");return false;'>X</a>";
		}
	}
	ctrls=controls;  // Why is controls getting blanked out before use, here????
	ret_msg = "<div class='message_"+msg.id+" message_item' style='display:none;' "+
						"onmouseover=\"$(\'.message_heading_"+msg.id+"\').hide();$(\'.message_controls_"+msg.id+"\').show();\""+
						"onmouseout=\"$(\'.message_heading_"+msg.id+"\').show();$(\'.message_controls_"+msg.id+"\').hide();\""+
						">"+
					format_avatar_segment(msg)+
					"<span class='message_head'>"+
						"<a href='http://twitter.com/"+screen_name+"' target='_blank'>"+screen_name+"</a>"+
						"<span class='timestamp message_heading_"+msg.id+"'> | "+format_date(msg.created_at)+"</span>"+
						"<span class='message_controls_"+msg.id+"' style='display:none'> | "+ ctrls +"</span>"+
					"</span>"+
					"<br><span class='message_text'>"+msg_text+"</span>"+
				"</div>";
	return(ret_msg);
}

function format_direct_message(msg){
	msg_text = create_links(msg.text);
	ret_msg = "<div class='message_"+msg.id+" message_item' style='display:none;' "+
						//"onmouseover=\"$(\'.message_heading_"+msg.id+"\').hide();$(\'.message_controls_"+msg.id+"\').show();\""+
						//"onmouseout=\"$(\'.message_heading_"+msg.id+"\').show();$(\'.message_controls_"+msg.id+"\').hide();\""+
						">"+
					format_avatar_segment(msg)+
					"<span class='message_head'>"+
						"<a href='http://twitter.com/"+msg.sender_screen_name+"' target='_blank'>"+msg.sender_screen_name+"</a>"+
						"<span class='timestamp message_heading_"+msg.id+"'> | "+format_date(msg.created_at)+"</span>"+
						"<span class='message_controls_"+msg.id+"' style='display:none'> | "+controls+"</span>"+
					"</span>"+
					"<br>"+msg_text+
				"</div>";
	return(ret_msg);
}

function format_avatar_segment(msg){
	controls="";
	if(msg.sender){ // direct message
		profile_image_url=msg.sender.profile_image_url;
		screen_name = msg.sender.screen_name;
		url=msg.sender.url;
	}else{// regular tweet
		profile_image_url=msg.user.profile_image_url;	
		screen_name = msg.user.screen_name;
		url = msg.user.url;
		in_reply_to_screen_name = msg.in_reply_to_screen_name;
	}

	avatar_segment="<img src='"+profile_image_url+"' class='avatar avatar_"+msg.id+"'/>"+
					"<div class='message_"+msg.id+"_tip' style='display:none'>"+
					"<img src='"+profile_image_url+"' class='avatar_qtip avatar_"+msg.id+"'/><br>"+
					"<a href='http://twitter.com/"+screen_name+"' title=\""+screen_name+"\'s twitter page\" target='_blank'>"+
						screen_name+
					"</a><br>"+
					"<a href='"+url+"' title=\""+screen_name+"\'s URL\" target='_blank'>URL</a><br>";
					if(msg.user){
						avatar_segment+="followers: "+msg.user.followers_count+"<br>"+
										"friends: "+msg.user.friends_count+"<br>";
					}
					if(msg.in_reply_to_status_id){
						avatar_segment+="<a href='http://twitter.com/"+in_reply_to_screen_name+"/statuses/"+msg.in_reply_to_status_id+"' target='_blank'>in reply to</a><br>";
					}
					avatar_segment+="</div>";
	return(avatar_segment);
}

function format_date(time_value){
	// convert a twitter formatted timestamp to local time (WORKS IN IE)
	var values = time_value.split(" ");
	time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3] + " " + values[4];

	var timestamp = Date.parse(time_value);
	
	var ts = new Date(timestamp);
	//alert(ts);
	ampm="am";
	hours=ts.getHours();
	if(hours>12){
		hours=hours-12;
		if(hours==12){
			ampm="am"
		}else{
			ampm="pm";
		}
	}
	minutes=ts.getMinutes();
	if(minutes<10){
		minutes="0"+minutes;
	}
	month_array=new Array("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec");
	month=month_array[ts.getMonth()];
	date=ts.getDate();
	tsnew = month+" "+date+", "+hours+":"+minutes+ampm;
	return(tsnew);
}

function delete_message(msg_id){
	$.ajax({
		//url: api_url,
		url: proxy_url,
		data: "url="+encodeURIComponent("http://twitter.com/statuses/destroy/"+msg_id+".json")+"&post=true",
		//data: "req=delete_message&message_id="+msg_id+"&username="+get_cookie('zusername')+"&password="+encodeURIComponent(get_cookie('zpassword')),
		dataType: 'json',
		cache: false,
		success: function(data){
			if(data.id){
				$(".message_"+msg_id).remove();
			}else{
				//
				$("#notifier").text("error :(").css("color","red").fadeIn(5000).fadeOut(5000);
			}
		},		
		failure: function(data){
			$("#notifier").text("error :(").css("color","red").fadeIn(5000).fadeOut(5000);
		}
	});
}

function reply(msg_id,sender){
	in_reply = msg_id;
	$("#link_send").text("@");
	$("#s_textarea").val("@"+sender+" ");
	$("#s_textarea").focus();
	update_char_counter();
}
function direct(sender){
	$("#s_textarea").val("D "+sender+" ");
	$("#s_textarea").focus();
	update_char_counter();
}
function retweet(sender,text){
	$("#s_textarea").val("RT @"+sender+": "+unescape(text));
	$("#s_textarea").focus();
	update_char_counter();
}

function toggle_favorite(msg_id,status){
    if(status=="create"){
        turl="http://twitter.com/favorites/create/"+msg_id+".json";
    }else{
        turl="http://twitter.com/favorites/destroy/"+msg_id+".json";
    }
	$.ajax({
		url: proxy_url,
		data: "url="+encodeURIComponent(turl)+"&post=true",  
		//url: api_url,
		//data: "req=toggle_favorite&msg_id="+msg_id+"&status="+status+"&username="+get_cookie('zusername')+"&password="+encodeURIComponent(get_cookie('zpassword')),
		dataType: 'json',
		cache: false,
		success: function(data){
			if(data.id){
				// set the favorite link color appropriately
				if(status=='create'){
					$(".favorite_link_"+msg_id).css("color","yellow");
					//alert("should be yellow now");
				}else{
					$(".favorite_link_"+msg_id).css("color","grey");
					//alert("should be grey now");
				}
				// delete from favorites timeline
				$("#favorites > .message_"+msg_id).remove();
				// change the favorite toggle "status" variable
				if(status=='create'){
					status='destroy';
				}else{
					status='create';
				}
				//clear out the click binding (they pile on)
				$(".favorite_link_"+msg_id).unbind("click");
				//now add the appropriate one
				$(".favorite_link_"+msg_id).click(function(){
													toggle_favorite(msg_id,status);
													return false;
												});
			}else{
				//
				$("#notifier").text("error :(").css("color","red").fadeIn(5000).fadeOut(5000);
			}
		},		
		failure: function(data){
			$("#notifier").text("error :(").css("color","red").fadeIn(5000).fadeOut(5000);
		}
	});
}

function show_settings(){
	$(".timeline_container").hide();
	$(".settings_container").fadeIn(2000);
}

function login(username,password){
	set_cookie('zusername',username,90);
	set_cookie('zpassword',password,90);
	$.ajax({
		url: proxy_url,
		//data: "req=verify_credentials&username="+username+"&password="+encodeURIComponent(password),
		data: "url="+encodeURIComponent("http://twitter.com/account/verify_credentials.json"),
		dataType: 'json',
		cache: false,
		success: function(data){
			if(data.screen_name){
				//alert(data.username+" "+data.password);
				$("#username").val("");
				$("#password").val("");
				window.location.reload();
			}else{
				alert("Twitter Login Failed");
				set_cookie('zusername','',90);
				set_cookie('zpassword','',90);
			}
		},		
		failure: function(data){
			alert(data.error);
		}
	});

}
function logout(){
	set_cookie('zusername','',-999);
	set_cookie('zpassword','',-999);
	window.location.reload();
}


function set_relative_times(){
}

function send_message(text){
	if(in_reply==false){
		in_reply_to_status_id=null;
	}else{
		in_reply_to_status_id=in_reply;
	}
		
	username = get_cookie('zusername');
	password = encodeURIComponent(get_cookie('zpassword'));
	turl = "http://twitter.com/statuses/update.json?status="+encodeURIComponent(text)+"&in_reply_to_status_id="+in_reply_to_status_id;
	$.ajax({
		//url: api_url,
		//data: "req=send_message&text="+encodeURIComponent(text)+"&in_reply_to_status_id="+in_reply_to_status_id+"&username="+username+"&password="+password,
		url:proxy_url,
		data: "url="+encodeURIComponent(turl)+"&post=true", 
		dataType: 'json',
		cache: false,
		success: function(data){
			if(data.id){
				$("#s_textarea").val("");
				$("#notifier").text("sent!").css("color","grey").fadeIn(5000).fadeOut(5000);
				set_timeline(timeline.current,timeline[timeline.current].page);
			}else{
				$("#notifier").text("error :(").css("color","red").fadeIn(5000).fadeOut(5000);
			}
		},		
		failure: function(data){
			$("#notifier").text("error :(").css("color","red").fadeIn(5000).fadeOut(5000);
		}
	});
}
// CREATELINKS
	function create_links(messageText){
		srv_url = "http://twitter.com";
		// 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){
				//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=\""+srv_url+"/"+shortVal+"\" target=\"_blank\"  title=\""+srv_url+"/"+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);
	}

function update_char_counter(){
	//** COUNTDOWN monitors textarea and updates "characters left" count
	var value = $("#s_textarea").val();
	if (value.length==0){
		in_reply=false;
		$("#link_send").text(">");
	}
	$("#notifier").html(140 - value.length);
	if (value.length > 130) {
		$("#notifier").css("color", '#5c0002');
	} else if (value.length > 120) {
		$("#notifier").css("color", '#a7a9ac');
	} else {
		$("#notifier").css("color", '#aaaaaa');
	}

}

//** 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 "";
}
// SET TEXTAREA FOCUS TO END OF TEXT
function set_end (TB){
	if (TB.createTextRange)
	{
		var FieldRange = TB.createTextRange();
		FieldRange.moveStart('character', TB.value.length);
		FieldRange.collapse();
		FieldRange.select();
	}
}

