var tz = (new Date()).getTimezoneOffset();

function QueryStringFactory(query)
{
	var re = new RegExp("^([^ ]*?):(.*)")
	var match = re.exec(query.toLowerCase())
	
	query = encodeURIComponent(query)
		
	var commands = 	{
		twitter : { query : "http://search.twitter.com/search.json?q=[[query]]&callback=", type:"tw"},
		likes : { query : "http://friendfeed.com/api/feed/user/[[query]]/likes?callback=", type:"ff"},
		friends : { query : "http://friendfeed.com/api/feed/user/[[query]]/friends?callback=", type:"ff"},
		who: { query : "http://friendfeed.com/api/feed/user/[[query]]?callback=",type:"ff"},
		comments: { query : "http://friendfeed.com/api/feed/user/[[query]]/comments?callback=",type:"ff"},
		url: { query : "http://friendfeed.com/api/feed/url?url=[[query]]&callback=",type:"ff"},
		domain: { query : "http://friendfeed.com/api/feed/domain?domain=[[query]]&callback=", type:"ff"},
		room: { query : "http://friendfeed.com/api/feed/room/[[query]]?callback=",type:"ff"},
		discover: { query : "http://friendfeed.com/api/feed/user?nickname=[[query]]&callback=", type: "ff"},
		lists: {query: "/Lists", type:"fd"},
		list: {query: "/List?list=[[query]]&callback=", type:"ff"},
		reshare: { post: "/Reshare" },
		help: { help : "" },
		home: { query : "/Home?callback=", type:"ff"},
		say: { post : "/Say", type:"fd"},
		like: {post : "/Like", type:"fd"},
		unlike: {post : "/Unlike", type:"fd"},
		subscribe: {post : "http://www.frienddeck.com/Subscribe", type: "fd"}
		}
	
	if (match == null)
	{
		return { query : "http://friendfeed.com/api/feed/search?q=[[query]]&callback=".replace(/\[\[query\]\]/, query), type:"ff" }
	}
	else
	{
		var command = match[1]
		var q = match[2]
		
		if( commands[command] != null)
		{
			if(commands[command].query != null)
			{
				commands[command].query = commands[command].query.replace(/\[\[query\]\]/, q)
			}
			else
			{
				if(command == "say")
				{
					commands[command].query = {message : q}
				}
				else if (command == "reshare")
				{
					// We need to split the message down again
					var offset = q.indexOf(" ")
					
					var entry_id = q.slice(0, offset)
					var message = q.slice(offset + 1, q.length)
					commands[command].query = {entry_id : entry_id , message: message}
				}
				else
				{
					commands[command].query = {entry_id : q}
				}
			}
			
			return commands[command]
		}
		else
		{
			return query;
		}
	}
}

function prettyDate(time)
{		
	var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," "))

	var now = new Date(new Date().getTime() + (tz *60000))
	var diff = ((now.getTime() - date.getTime()) / 1000),
		day_diff = Math.floor(diff / 86400);
			
	if ( isNaN(day_diff) )
		return "just now."
	
	if ( day_diff < 0 )
		return "just now"
		
	if ( day_diff >= 31 )
		return "more than a month ago"
			
	return day_diff == 0 && (
			diff < 60 && "just now" ||
			diff < 120 && "1 minute ago" ||
			diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
			diff < 7200 && "1 hour ago" ||
			diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
		day_diff == 1 && "Yesterday" ||
		day_diff < 7 && day_diff + " days ago" ||
		day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
}

function createUrl(string)
{
	string = string.replace(/((http|https):\/\/([a-zA-Z0-9\.\/\-\_\=\?\&]+))/gi, '<a href="$1" target="_blank">$1</a> [<a href="#" title="url:$1" class="url">#</a>]')
	
	return string
}

function register_login_submit()
{
	var comments = $(".login_submit")
	var columns = comments.click(login_submit)
}

function register_focus()
{
	$("textarea").focus(
		function()
		{
			var item = $(this)
			item.addClass("selected")
			item = null
		}
	)
	
	$("textarea").blur(
		function()
		{
			var item = $(this)
			item.removeClass("selected")
			item = null
		}
	)
}

function comment_click()
{
	$(this).next(".comment-container").toggle()
}

function like_click()
{
	var title = this.title
	var query = QueryStringFactory(title)	
	$.post(query.post, query.query)	
	
	if(this.title.substr(0,2) == "li")
	{
		this.title = "un" + this.title
		this.textContent = "Un-like"
	}
	else
	{
		this.title = this.title.substr(2)
		this.textContent = "Like"
	}
	return false
}

function quick_column_click()
{
	var title = this.title
	if(title.substring(title.length -1) == ":")
	{
		title = title + currentUsername
	}
	
	add_column(title)	
	return false
}

function discover_click()
{
	var title = this.title
	var likeminded = $("#likeminded").val()
	add_discover_column(title, likeminded)	
	return false
}

function share_click()
{
	var title = this.title
	var query = QueryStringFactory(title)	
	$.post(query.post, query.query)
	return false
}

function reload_column(i, column_name)
{	
	var sanitizedfunc = column_name.replace(/[^a-zA-Z]/g,"")
	var col_name = column_name.replace(/[^a-zA-Z0-9]/g,"")
	var function_name = "function_" + sanitizedfunc			
	
	var query = QueryStringFactory(column_name)
			
	if(query.type == "ff")
	{
		//create a dynamic function to handle the results comming back
		window[function_name]= function(json){ Search_Load(json, col_name)}
	}
	else if(query.type == "tw")
	{
		window[function_name]= function(json){ Search_Twitter_Load(json, col_name)}
	}
	else
	{
		return //do nothing
	}	
	
	$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "\"/>")
	
					
	$("#" + sanitizedfunc ).everyTime(60000, function(i) {	
		var rand_no = Math.random();
		rand_no = rand_no * 100000;
		rand_no = Math.ceil(rand_no);
		var query = QueryStringFactory(column_name)
		var sanitizedfunc = column_name.replace(/[^a-zA-Z]/g,"")
		var function_name = "function_" + sanitizedfunc
		
		$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "&_id=" +  rand_no + "\"/>")
	});
}

function logout()
{
	$("#identity").show("fast")
	$("#loggedin").hide("fast")
	$("#loggedfailed").show("fast")
	
	currentUsername = ""
}

function add_column_from_query()
{
	var search = $("#search")
	
	add_column(search.val())
	
	search.val("")	
	search = null
}

function add_column(column_name)
{
	var container = $("#inner-container")	
	var sanitizedfunc = column_name.replace(/[^a-zA-Z0-9]/g,"")
	var function_name = "function_" + sanitizedfunc
	
	if (column_name == "")
	{
		return false;
	}
	
	//Dont add the column if it alreday exists.
	var columns = $("#" + sanitizedfunc)
	
	if (columns.length > 0)
	{
		columns.effect("highlight", {color: "#ccc"})
		return
	}
	
	var query = QueryStringFactory(column_name)
	
	if(query.type == "ff")
	{
		//create a dynamic function to handle the results comming back
		window[function_name]= function(json){ Search_Load(json, sanitizedfunc)}
	}
	else if(query.type == "tw")
	{
		window[function_name]= function(json){ Search_Twitter_Load(json, sanitizedfunc)}
	}	
		
	if( query.post == null)
	{	
		container.append(tmpl("column_template", {column_name:column_name, sanitizedfunc: sanitizedfunc}))
		$.get("/AddColumn", { column: column_name})	
		$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "\"/>")
		on_resize()
		
		$("#" + sanitizedfunc ).everyTime(60000, function(i) {	
			var query = QueryStringFactory(column_name)
			var function_name = "function_" + sanitizedfunc			
			
			var rand_no = Math.random();
			rand_no = rand_no * 100000;
			rand_no = Math.ceil(rand_no);
		
			$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "&_id=" +  rand_no + "\"/>")
		});		
	}
	else
	{
		$.post(query.post,query.query)
	}
	
	columns = null
}

function add_discover_column(column_name, likeminded)
{
	var container = $("#inner-container")	
	var sanitizedfunc = column_name.replace(/[^a-zA-Z0-9]/g,"")
	var function_name = "function_" + sanitizedfunc
	
	if (column_name == "")
	{
		return false;
	}
	
	//Dont add the column if it alreday exists.
	var columns = $("#" + sanitizedfunc)
	
	if (columns.length > 0)
	{
		columns.effect("highlight", {color: "#ccc"})
		return
	}
	
	var query = QueryStringFactory(column_name + likeminded)
	
	if(query.type == "ff")
	{
		//create a dynamic function to handle the results comming back
		window[function_name]= function(json){ Search_Load(json, sanitizedfunc)}
	}
	else if(query.type == "tw")
	{
		window[function_name]= function(json){ Search_Twitter_Load(json, sanitizedfunc)}
	}	
		
	if( query.post == null)
	{	
		container.append(tmpl("column_template", {column_name:column_name, sanitizedfunc: sanitizedfunc}))
		$.get("/AddColumn", { column: column_name})	
		$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "\"/>")
		on_resize()
		
		$("#" + sanitizedfunc ).everyTime(60000, function(i) {	
			var query = QueryStringFactory(column_name)
			var function_name = "function_" + sanitizedfunc			
			
			var rand_no = Math.random();
			rand_no = rand_no * 100000;
			rand_no = Math.ceil(rand_no);
		
			$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "&_id=" +  rand_no + "\"/>")
		});		
	}
	else
	{
		$.post(query.post,query.query)
	}
	
	columns = null
}


function reload_discover_column(column_name, likeminded)
{
	var container = $("#inner-container")	
	var sanitizedfunc = column_name.replace(/[^a-zA-Z0-9]/g,"")
	var function_name = "function_" + sanitizedfunc
	
	if (column_name == "")
	{
		return false;
	}
	
	//Dont add the column if it alreday exists.
	var columns = $("#" + sanitizedfunc)
	
	
	var query = QueryStringFactory(column_name + likeminded)
	
	if(query.type == "ff")
	{
		//create a dynamic function to handle the results comming back
		window[function_name]= function(json){ Search_Load(json, sanitizedfunc)}
	}	
	
	if( query.post == null)
	{	
		$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "\"/>")
		
		on_resize()
		
		$("#" + sanitizedfunc ).everyTime(60000, function(i) {	
			var query = QueryStringFactory(column_name)
			var function_name = "function_" + sanitizedfunc			
			
			var rand_no = Math.random();
			rand_no = rand_no * 100000;
			rand_no = Math.ceil(rand_no);
		
			$("head").append("<script type=\"text/javascript\" src=\"" + query.query + function_name + "&_id=" +  rand_no + "\"/>")
		});		
	}
	else
	{
		$.post(query.post,query.query)
	}
	
	columns = null
}


function remove_column(column_name)
{				
	// Synchronise the Columns in the backend			
	var column = $("#" + column_name)
	column.stopTime()
	
	//The function still exists but it does nothing.
	window["function_" + column_name] = function(json){}
	column.unbind()
	column.remove()
	column = null
	$.get("/DeleteColumn", {column : column_name})				
}

function on_resize()
{
	var windowHeight =  $(window).height()
	var windowWidth = $(window).width()
	var container = $("#container")
	var footer = $("#footer")
	var top = container.offset().top
	var sep = container.find(".head-seperator")
	var footer_height = footer.outerHeight(true)

	container.height(windowHeight - top - footer_height - 1)
		
	var columns = $(".column")
		
	columns.height( container.outerHeight() - 25)

	columns.each(function()
		{			
			var current = $(this)
			var scroll = current.find(".scroll")
			var innerHeight = container.outerHeight()
			var roomComment = current.find(".room-comment")
			
			var roomCommentHeight = 0
			if(roomComment.is(":visible"))
			{
				roomCommentHeight = roomComment.outerHeight()
				scroll.height( innerHeight - roomCommentHeight - 53)
			}
			else
			{
				scroll.height( innerHeight - roomCommentHeight - 53)
			}
			
						
		})
}	

function create_comment_String(entry)
{
	var currEntry = entry				
	var comment = undefined
	var commentStr = ""
	var comments = currEntry.comments
		
	for(var currentComment in comments)
	{
		var userStr = ""
		comment = comments[currentComment]
		if(comment.user.nickname == currentUsername)
		{
			userStr = "usercomment"
		}
		else
		{
			userStr = "comm"
		}
		
		commentStr += "<div class=\"" + userStr +"\"><h3><a href=\"/User/" + comment.user.nickname +".html\" target=\"_blank\">" + comment.user.name +"</a> [<a href=\"#\" class=\"likes\" title=\"likes:" + comment.user.nickname + "\"> l </a>] [<a href=\"#\" class=\"comments\" title=\"comments:" + comment.user.nickname + "\"> c </a>] [<a href=\"#\" class=\"friends\" title=\"friends:" + comment.user.nickname +"\"> f </a>]</h3><p>" + comment.body +"</p></div>"
	}
	
	
	commentStr = createUrl(commentStr)
	
	return commentStr
}

function create_comment_string_submit(message)
{
	return "<div class=\"usercomment\"><h3><a href=\"/User/" + currentUsername +".html\" target=\"_blank\">" + currentUsername +"</a></h3><p>" + message +"</p></div>"
}

function room_submit()
{	
	var form = $(this).parents("form")
	var comment = form.find(".comment_message")
	var room = form.find(".room_name")
	var curr = form.parents(".room-comment")
	var roomname = room.val().substring(5)
	
	$.post(form.attr("action"), {room : roomname, message : comment.val()}, function(data, textStatus)
		{
			curr.toggle(2, on_resize)
			comment.val("")
		})
	return false
}

function comment_submit()
{
	var form = $(this).parents("form")
	var comment = form.find(".comment_message")
	var entity = form.find(".comment_id")
	
	$.post(form.attr("action"), {entity_id : entity.val(), message : comment.val()}, function(data, textStatus)
		{
			//Add the comment into the page (until the page is refreshed)	
			var text = comment.val()
			form.before(create_comment_string_submit(text))

			comment.val("")
			form.show("fast")
		}
		)
	
	form.hide("fast")
	
	return false
}
function Search_Load(json, column_name)
{	
	var entries = json.entries
	
	var waiting = $("#" + column_name + " .data")
	
	if (entries == undefined)
		return
	
	for( var i = entries.length; i > 0; i--)
	{				
		var currEntry = entries[i - 1]
		var service = currEntry.service							
		var commentStr = create_comment_String(currEntry)
		var entry = waiting.find("#" + currEntry.id)
		var likeEntry = does_user_like_entry(currEntry)
		
		var type = "like"
		var text = "Like"
		
		if (likeEntry)
		{
			type = "unlike"
			text = "Un-like"
		}
		
		if (entry.length == 0)
		{		
			waiting.prepend(tmpl("entry_tmpl", { currentUser: currentUsername, currEntry: currEntry, commentStr:commentStr, type:type, text:text} ))
		}
		else
		{
			//We need to make sure that if the user was viewing the comment it is still open.
			var comment_container = entry.find(".comment-container")
			var comment_vis = comment_container.css("display")
			var comment_text = comment_container.find(".comment_message").val() 
			var is_selected = comment_container.find(".comment_message").hasClass("selected")
			
			if(is_selected == false)
			{
				// We are not updating elments that are being edited
				entry.replaceWith(tmpl("entry_tmpl", { currentUser: currentUsername, currEntry: currEntry, commentStr:commentStr, type:type, text:text} ))
		
				if(comment_vis == "block")
				{	
					var new_container = waiting.find("#" + currEntry.id).find(".comment-container")
					new_container.css("display", comment_vis)
					new_container.find(".comment_message").val(comment_text)
					
					new_container = null
				}
			}
		}
	}
	
	update_deck_count(waiting)
	register_focus()
}

function Search_Twitter_Load(json, column_name)
{					
	var entries = json.results
	var waiting = $("#" + column_name + " .data")
	for( var i = entries.length; i > 0; i--)
	{				
		var currEntry = entries[i - 1]						
		var entry = waiting.find("#" + currEntry.id)
				
		if (entry.length == 0)
		{					
			waiting.prepend("<div id=\"" + currEntry.id + "\"><h2><a href=\"http://www.twitter.com/" + currEntry.from_user +"\" target=\"_blank\">" + currEntry.from_user + "</a></h2><p title=\"\">" + currEntry.text +"</p><p class=\"date\">Created about " + prettyDate(currEntry.created_at) +"</p><div class=\"seperator\"></div></div>")
		}
		else
		{
			entry.replaceWith("<div id=\"" + currEntry.id + "\"><h2><a href=\"http://www.twitter.com/" + currEntry.from_user +"\" target=\"_blank\">" + currEntry.from_user + "</a></h2><p title=\"\">" + currEntry.text +"</p><p class=\"date\">Created about " + prettyDate(currEntry.created_at) +"</p><div class=\"seperator\"></div></div>")
		}
	}
	
	update_deck_count(waiting)
	//on_resize()
}

function login_submit()
{	
	var form = $(this).parents("form")
	
	var username = form.find("#username")
	var remote_key = form.find("#remote_key")
	
	$("#loggedfailed").hide("fast")
	$.get(form.attr("action"), {username : username.val(), remote_key : remote_key.val()}, function(data, textStatus)
		{
			//Add the comment into the page (until the page is refreshed)				
			var result = JSON.parse(data)
			
			if(result != undefined)
			{
				if(result.status == "ok")
				{
					$("#loggedin").show("fast")	
					$("#identity").hide("fast")
				
					currentUsername = result.username
				}
				else
				{
					$("#loggedfailed").show("fast")						
				}
			}
			else
			{
				$("#loggedfailed").show("fast")					
			}
			
		})
	
	return false
}

function update_deck_count(column)
{ 
	var counter = column.parents(".column").find(".count");
	counter.text(column.children().length)
	counter = null
}

function does_user_like_entry(entry)
{	
	for(var i in entry.likes)
	{
		var like = entry.likes[i]
		if(like.user.nickname == currentUsername)
		{
			return true;
		}
	}
	
	return false;
}

function discover(json)
{
	var userCounts = {}
	var users = {}
	
	
	
	var entries = json.entries
	for(var item_idx in entries)
	{
		var item = entries[item_idx]
		var likes = item.likes
		for(var like_idx in likes)
		{
			var like = likes[like_idx]
			if(currentUsername == like.user.nickname)
				continue
			
			if ( userCounts[like.user.nickname] == null )
			{
				userCounts[like.user.nickname] = 0
			}
			users[like.user.nickname] = like.user.name
			userCounts[like.user.nickname]++
		}
	}
	
	var userArray = new Array()
	for(var item_idx in users)
	{
		userArray.push({name: users[item_idx], nickname: item_idx, count: userCounts[item_idx]})
	}
	
	users = userArray.sort(function(a, b) { return arguments[1].count -arguments[0].count })
	
	var html = "<ul>" 
	var userString = ""
	for(var i in users)
	{
		if(i >= 15)
			break
			
		userString += users[i].nickname + ","
		var likeTxt = "Likes"
		if(users[i].count == 1)
		{
			likeTxt = "Like"
		}
		html += "<li><a href=\"/User/" + users[i].nickname + ".html\" target=\"_blank\">" + users[i].name + "</a> (" + users[i].count + " " + likeTxt + " in common)</li>"
	}	
	userString = userString.substring(0,userString.length-1);
	html += "</ul>"
	
	$("#likeContainer").append(html)
	$("#likeminded").val(userString)	
	
	// Check to see if the column exists
	var discover_column = $("div[title=discover:]")

	if(discover_column.length == 1)
	{
		//Reload the column.
		reload_discover_column("discover:", userString)
	}
}

function escapeToHTML(str)
{
str = str.replace(/&/g, "&amp;");
str = str.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
return str;
}