
var gMapsApiKey = "ABQIAAAAOjt9drceT_zlyVDEinVlkRQjiWSPqyZFGADQOYUctwlG-gHl5hTeyHyabY8C_ITqPmqW3IGEWtGi8Q";

var searchQuery = "";

//
// utils
//

var utils = {
	is : function(v)
	{
		return v?v:"";
	},
	pad : function(s,l,c)
	{
		var str = ""+s;
		while(str.length<l) str = c+str;
		return str;
	},
	dayDiff : function(d1,d2)
	{
		return parseInt((d1.getTime()-d2.getTime())/1000/60/60/24);
	},
	objToStr : function(o, end, pre)
	{
		var str = "";
		for (p in o)
		{
			var v = o[p];
			if ((typeof v) == "object")
			{
				str += pre + p + ": " + end;
				str += utils.objToStr(v, end, pre + "&nbsp;&nbsp;");
			}
			else
			{
				str += pre + p + ": " + v + end;
			}
		}
		return str;
	}
}

var fsqClient = {
	settings : {
		printOther : false
	},
	formatCheckinTime : function(datetime)
	{
//		if (!Date.parse(datetime)) return datetime;
		var cur = new Date();
		var date = new Date();
		date.setTime(datetime*1000);
		datetime = date;
//		datetime = new Date(datetime);
/*		var day = datetime.getUTCDate();
		var month = datetime.getUTCMonth()+1;
		var year = datetime.getUTCFullYear();
		var hour = datetime.getUTCHours()+1;
		var minute = datetime.getUTCMinutes()+1;*/
		var day = datetime.getDate();
		var month = datetime.getMonth()+1;
		var year = datetime.getFullYear();
		var hour = datetime.getHours()+1;
		var minute = datetime.getMinutes()+1;

//		if (year == cur.getUTCFullYear() && month == cur.getUTCMonth()+1 && day == cur.getUTCDate())
		if ((cur.getTime()-datetime.getTime())<1000*60*60*24)
			return "at " + utils.pad(hour,2,'0') + ":" + utils.pad(minute,2,'0');
		else
			return utils.dayDiff(cur,datetime) + " days ago";
	}
}

function debug(t)
{
	$("#debug").append(t + "<br />");
}

function output(txt) {
	if (!txt)
	{
		$("#output").text("");
		$("#output").slideUp("fast");
		return;
	}
	$("#output").text(txt);
	$("#output").slideDown("slow");
	setTimeout("hideOutput()",2000);
}

function hideOutput() {
	$("#output").slideUp("slow");
}

function onerror(msg) {
	output("error: " + msg); //utils.objToStr(msg,"<br />",""));
}

function createBackButton()
{
	if (_paneHistory.length==0) return $("");
	var b = $("<button></button>");
	b.attr('id','button_back');
	b.click( function() {
		showPane(-1,false);
	});
	return b;
}

//
// view
//

// pane handling
//
// basically for only showing one pane/screen at a time. shows the one in argument, and hides any other panes.
var _panes = ["checkin", "venue", "venues", "history", "friends", "friend","me","addvenue","friendrequests","addtip","info"];
var _paneHistory = [];
var _paneCurrent = undefined;
function createPanes()
{
	for(var i = 0;i<_panes.length;i++)
	{
		var p = _panes[i];
		$("#main").append("<div id='" + p + "'></div>");
	}
}
function showPane(pane, track)
{
	if (track == undefined)
		track = true;
	if (pane=="-1")
	{
		if (_paneHistory.length==0) return;
		pane = _paneHistory.pop();
		showPane(pane);
		return;
	}
	for(var i = 0;i<_panes.length;i++)
	{
		var p = _panes[i];
		if (p!=pane)
		{
			if ($("#"+p).is(":visible"))
			{
				if (track) _paneHistory.push(p);
				$("#"+p).fadeOut("fast", function() {
					if (!$("#"+pane).is(":visible"))
						$("#"+pane).fadeIn("slow");
				});
			}
		}
	}
	_paneCurrent = pane;
}

function getCurrentPane()
{
	if (_paneCurrent == undefined)
		return $("#" + main);
	else
		return $("#" + _paneCurrent);
}

var fsq_position = null;

function showPosition(position) {
	fsq_position = position;
	output("Position: " + position.coords.latitude + ", " + position.coords.longitude);
}

var isGeolocationSupported = geo_position_js.init();

function createLocationSpecifyer()
{
	if ($("#locationSpecifyer").length!=0) return;

	isGeolocationSupported = false;

	var inp = $("<input type='text' id='location' />");
	var b = $("<button>Set location</button>");
	b.click(function() {
		var loc = inp.val();
//		alert("Location: " + loc);
		$.get("geo.php?address=" + escape(loc), function(data) {
//			output(utils.objToStr(data, "<br />", ""));
//			output(data.results.geometry.location.lat);
			// find geometry in results
			var geometry = null;
			for (var i=0,ii=data.results.length;i<ii;i++)
			{
				if (data.results[i].geometry) {
					geometry = data.results[i].geometry;
					break;
				}
			}
			if (geometry)
			{
				var p = {};
				p.coords = {};
				p.coords.latitude = geometry.location.lat;
				p.coords.longitude = geometry.location.lng;
				showPosition(p);
				$("#locationSpecifyer").hide();
			}
		}, "json");
	});
	var div = $("<div></div>");
	div.attr('id','locationSpecifyer');
	div.append(inp);
	div.append(b);
	$("#main").prepend(div);
}

function getPos(cb)
{
	output("Position: updating");
	if(isGeolocationSupported)
	{
		var calls = 0;
		geo_position_js.getCurrentPosition(function(pos) { if (calls++==0) cb(pos); },onlocationerror,{enableHighAccuracy:false});
	}
	else
	{
		output("Location functionality not available in your web browser. Sorry.");
	}
}

function onlocationerror(err)
{
	output("Location is temporarily unavailable");
	createLocationSpecifyer();
}

var fsq_venues = [];

function nearbyPos(position) {
//	output("[nearbyPos]");
	showPosition(position);
	$("#venues").text("Loading...");
//	$("#venues").prepend(createButton("Search", createSearch));
//	$("#venues").load("fsq.php?cmd=venues&lon=" + position.coords.longitude + "&lat=" + position.coords.latitude, function() {makeVenueLinks("venues") });
	$.get("fsq.php?cmd=venuesjson&lon=" + position.coords.longitude + "&lat=" + position.coords.latitude, formatVenues, "json");
}

function searchPos(position) {
	output("[searchPos]");
	showPosition(position);
	$("#venues").text("Loading...");
	if (searches[searchQuery])
	{
		searches[searchQuery] ++;
	}
	else
	{
		searches[searchQuery] = 1;
	}
	$.get("fsq.php?cmd=venuesjson&lon=" + position.coords.longitude + "&lat=" + position.coords.latitude + "&q=" + escape(searchQuery), formatVenues, "json" );
}

function outputerror(msg)
{
	output(msg);
	getCurrentPane().text(msg);
}

function handleFsqError(data)
{
	if (typeof data != "object") { outputerror("Unknown error"); return true; }

	if (data.unauthorized)
	{
		showLogin();
		return true;
	}
	if (data.error)
	{
		outputerror(data.error);
	}
	if (data.ratelimited)
	{
		outputerror("Rate limit reached. Please wait for a while.");
	}
	return false;
}

function formatVenues(data) {
	if (handleFsqError(data)) return;

	showPane("venues");
	$("#venues").empty();
	fsq_venues = [];
	if (data.error)
	{
		$("#venues").html("<h2>Error</h2>");
		$("#venues").append(utils.objToStr(data.error,"<br />", ""));
		return;
	}
	var groups = data.response && data.response.groups;
	if (!groups || groups.length==0)
	{
		$("#venues").html("No venues.");
		$("#venues").prepend(createButton("", createSearch, "button_search"));
		$("#venues").prepend(createButton("", addVenue, "button_addvenue"));
		if (fsqClient.settings.printOther)
		{
			$("#venues").append("<h2>Other</h2>");
			$("#venues").append(utils.objToStr(data.error,"<br />", ""));
		}
		return;
	}
	for(var i=0;i<groups.length;i++)
	{
		var group = groups[i];
		$("#venues").append("<h2>" + group.type + "</h2>");
		var ul = $("<ul></ul>");
		for (var j=0;j<group.items.length;j++)
		{
			var venue = group.items[j];
			var li = $("<li></li>");
			li.attr('fsqid',venue.id);
			var category = getCategory(venue);
			if (category)
				li.append("<img style='float:left;' class='categoryicon' src=\"" + category.icon + "\" /> ");
			else
				li.append("<div style='float:left;' class=\"iconplaceholder\"></div>&nbsp;");
			if (venue.spotifyURL)
				li.append("<img style='float: right' src=\"img/spotify-icon32.png\" /> ");
			li.append(venue.name + " (" + venue.location.distance + "m)");
			li.append("<br style='clear:both;'/>");
			ul.append(li);
			fsq_venues.push(venue);
		}
		$("#venues").append(ul);
	}
	makeVenueLinks("venues");

	if (fsqClient.settings.printOther)
	{
		$("#venues").append("<h2>Other</h2>");
		$("#venues").append(utils.objToStr(data,"<br />",""));
	}
}

function makeVenueLinks(div)
{
	$("#"+div+" > ul li").each(function() {
		var id = $(this).attr("fsqid");
		$(this).click(function() {
			loadVenue(id);
		});
		$(this).addClass('clickable');
	});

	if (div=="venues")
	{
//		$("#venues").prepend(createButton("Map", showOnMap));
		$("#venues").prepend(createButton("", createSearch, "button_search"));
		$("#venues").prepend(createButton("", addVenue, "button_addvenue"));
	}
}

function showOnMap()
{
	$("#main").hide();
	$("#header").hide();
	$("#map").show();
	openMap(fsq_position.coords.latitude, fsq_position.coords.longitude, function() {});
	for(var i=0;i<fsq_venues.length;i++)
	{
		var div = $("<div></div>");
		div.attr('fsqid',fsq_venues[i].id);
		div.append("<a href=\"javascript:cmsv('"+fsq_venues[i].id+"')\">" + fsq_venues[i].name + "</a>");
		addMapMarker(fsq_venues[i].geolat, fsq_venues[i].geolong, div[0]);
	}
}

function cmsv(id)
{
	closeMap();
	$("#map").hide();
	$("#header").show();
	$("#main").show();
	loadVenue(id);
}

function doCheckin(id)
{
	showPane("checkin", false);
	$("#checkin").text("checking in...");
	$.get("fsq.php?cmd=checkin&id="+id, checkinOk, "json");
}

function checkinOk(data, text, xhr) {
	if (handleFsqError(data)) return;

	$("#checkin").html("<h2>Checked in!</h2>");
/*
	$("#checkin").append(data.checkin.message + "<br />");
	if (data.checkin.scores)
	{
		$("#checkin").append("<h3>Scores</h3>");
		for (var i=0;i<data.checkin.scores.length;i++)
		{
			$("#checkin").append(data.checkin.scores[i].message + " <b>" + data.checkin.scores[i].points + " points</b><br />");
		}
	}
	if (data.checkin.mayor)
	{
		$("#checkin").append("<h3>Mayor</h3>");
		var ul = $("<ul></ul>");
		var li = $("<li></li>");
		if (data.checkin.mayor.user && data.checkin.mayor.user.photo)
			li.append("<img src=\"" +  data.checkin.mayor.user.photo + "\" style=\"float: left; margin-right: 4px;\" />");
		if (data.checkin.mayor.message)
			li.append(data.checkin.mayor.message);
		ul.append(li);
		li.addClass('clickable');
		if (data.checkin.mayor.user)
			ul.click(function() { loadUser(data.checkin.mayor.user.id); });
		$("#checkin").append(ul);
	}
	if (data.checkin.badges)
	{
		$("#checkin").append("<h3>You've just unlocked:</h3>");
		var ul = $("<ul></ul>");
		for (var i=0,ii=data.checkin.badges.length;i<ii;i++)
		{
			var badge = data.checkin.badges[i];
			var li = $("<li></li>");
			li.append("<img class='badge' src='"+badge.icon+"' style='float: left;' />");
			li.append("<b>" + badge.name + "</b><br />");
			li.append(badge.description);
			ul.append(li);
		}
		$("#checkin").append(ul);
	}
	if (fsqClient.settings.printOther)
	{
		$("#checkin").append("<h2>Other</h2>");
		$("#checkin").append(utils.objToStr(data.checkin,"<br />",""));
	}
*/
	$("#checkin").append("<br style='clear:both' />");

	$("#checkin").prepend(createBackButton());
}

function addTip(vid)
{
	showPane("addtip");
	$("#addtip").empty();
	$("#addtip").append(createBackButton());
	$("#addtip").append("<h2>Add tip</h2>");
	var area = $("<textarea></textarea>");
	area.css('width','100%');
	area.attr('id','tiptext');
	$("#addtip").append(area);
	$("#addtip").append(createButton("",function() { submitAddTip(vid); }, "button_add"));
}

function submitAddTip(vid)
{
	var text = $("#tiptext").val();
	$.get("fsq.php?cmd=addtip&vid="+vid+"&text="+escape(text),function(data) {
		if (handleFsqError(data)) return;

		output(data.tip.text);

		loadVenue(vid);
	}, "json");
}

function addVenue()
{
	showPane("addvenue");
	$("#addvenue").empty();
	$("#addvenue").append(createBackButton());
	$("#addvenue").append("<h2>Add venue</h2>");
	var form = $("<div name=\"addvenue\">");
	form.append("Name: <input type='text' name='venuename' value='" + searchQuery + "' /><br />");
	form.append("Address: <input type='text' name='venueaddress' /><br />");
	form.append("City: <input type='text' name='venuecity' /><br />");
	form.append("Zip: <input type='text' name='venuezip' /><br />");
	form.append(createButton("", submitAddVenue, "button_add"));
	$("#addvenue").append(form);
}

function submitAddVenue()
{
	var name = $("input[name=venuename]").val();
	var address = $("input[name=venueaddress]").val();
	var city = $("input[name=venuecity]").val();
	var zip = $("input[name=venuezip]").val();
	$("#addvenue").empty();
	$("#addvenue").html("Adding venue...");
	$.get("fsq.php?cmd=addvenue&name=" + escape(name) + "&address=" + escape(address) + "&city=" + escape(city) + "&zip=" + escape(zip) + "&lat=" + fsq_position.coords.latitude + "&lon=" + fsq_position.coords.longitude, function(data) {
		if (handleFsqError(data)) return;

		if (data.error)
		{
			$("#addvenue").empty();
			$("#addvenue").append("Error adding venue.<br />");
			$("#addvenue").append(data.error);
			$("#addvenue").append("<br />");
			$("#addvenue").append(createButton("Retry", addVenue));

			if (fsqClient.settings.printOther)
			{
				$("#addvenue").append("<h2>Other</h2>");
				$("#addvenue").append(utils.objToStr(data,"<br />",""));
			}
		}
		else
		{
			loadVenue(data.venue.id);
		}
	}, "json");
	return false;
}

function loadVenue(id)
{
	showPane("venue");
	$("#venue").html("Loading venue...");
	$("#venue").prepend(createBackButton());
	$.get("fsq.php?cmd=venue&id="+id, function(data) {
		if (handleFsqError(data)) return;

		var venue = data.response.venue;

		var e = $("#venue");
		e.html("<h2>" + venue.name + "</h2>");
		var category = getCategory(venue);
		if (category)
		{
			e.append("<img class='categoryicon' src=\"" + category.icon + "\" style='float: left; margin-right: 5px;' />");
		}
		var b = $("<button></button>");
		b.click(function() { doCheckin(venue.id); });
		b.css('float','right');
		b.attr('id','button_checkin');
		b.appendTo("#venue");
		e.append(utils.is(venue.location.address) + "<br />");
		$("#venue").prepend(createBackButton());

		if (venue.spotifyURL)
		{
			e.append("<br /><img style=' margin-right: 2px; float: left;' src='img/spotify-icon32.png'><a href=\"" + venue.spotifyURL + "\" target='_blank'>open spotify playlist</a>");
		}
		else
		{
			e.append("<br /><img style=' margin-right: 2px; float: left;' src='img/spotify-icon32.png'>this venue does not have a playlist yet! add one from your desktop.");
		}
		e.append("<br style='clear:both;' />");

		// mayor
		if (venue.mayor)
		{
			var mayor = venue.mayor;
			e.append("<h2>Mayor</h2>");
			var ul = $("<ul></ul>");
			var li = $("<li></li>");
			li.append("<img src=\"" + mayor.user.photo + "\" style=\"float:left;\" />&nbsp;");
			li.append(utils.is(mayor.user.firstName));
			li.append("<br style=\"clear: left;\" />");
			li.click(function() {
				loadUser(mayor.user.id);
			});
			li.addClass('clickable');
			ul.append(li);
			e.append(ul);
		}

		// checkins
		if (venue.hereNow && venue.hereNow.count>0)
		{
			e.append("<h2>Checkins</h2>");
			var ul = $("<ul></ul>");
			for (var j=0,jn=venue.hereNow.groups.length;j<jn;j++)
			{
				var items = venue.hereNow.groups[j].items;
				for (var i=0;i<items.length;i++)
				{
					var chkin = items[i];
					var li = $("<li></li>");
					li.append("<img src='" + chkin.user.photo + "' style='width: 32px; height: 32px; float: left;' />");
					li.append(utils.is(chkin.user.firstName) + " " + utils.is(chkin.user.lastName) + "<br/>");
					if (chkin.shout)
						li.append("<em>" + chkin.shout + "</em>");
					li.append("<br style='clear:left;' />");
					li.attr('fsqid',chkin.user.id);
					li.click(function() { loadUser($(this).attr('fsqid')); });
					li.addClass('clickable');
					ul.append(li);
				}
			}
			e.append(ul);
		}

//		var b = createButton("", function() {}, "button_addtip");
//		b.css('float','right');
//		b.click(function() { addTip(data.venue.id); });
//		e.append(b);
		// tips
		if (venue.tips)
		{
			e.append("<h2>Tips</h2>");
			var ul = $("<ul></ul>");
			for (var j=0,jn=venue.tips.groups.length;j<jn;j++)
			{
				var items = venue.tips.groups[j].items;
				for (var i=0;i<items.length;i++)
				{
					var tip = items[i];
					var li = $("<li></li>");
					li.append(utils.is(tip.user.firstName) + " " + utils.is(tip.user.lastName) + " says<br/>");
					li.append("<em>" + tip.text + "</em>");
					if (tip.url)
						li.append(" <a href=\"" + tip.url + "\">link</a>");
					li.attr('fsqid',tip.user.id);
					li.click(function() { loadUser($(this).attr('fsqid')); });
					li.addClass('clickable');
					ul.append(li);
				}
			}
			e.append(ul);
		}
		e.append("<br style='clear:both;' />");

		if (fsqClient.settings.printOther)
		{
			e.append("<h2>Other</h2>");
			e.append(utils.objToStr(data.venue,"<br />", ""));
		}
	}, "json");
}

function getNearby() {
	showPane("venues");
	$("#venues").text("Updating position...");
//	$("#venues").prepend(createButton("Search", createSearch));
	if(isGeolocationSupported)
		getPos(nearbyPos);
	else if (fsq_position)
		nearbyPos(fsq_position);
	else
		output("Please specify your location");
}

function createSearch()
{
	showPane("venues");
	$("#venues").empty();
	var i = $("<input type='text' id='searchquery' value='' />");
	var b = $("<button id='button_search'></button>");
	b.click( function() {
		searchQuery = $("#searchquery").val(); //.replace(' ','+');
		$("#venues").text("Loading...");
		if(isGeolocationSupported)
			getPos(searchPos);
		else if (fsq_position)
			searchPos(fsq_position);
		else
			output("Please specify your location");
	});
	i.appendTo("#venues");
	b.appendTo("#venues");

	// add old searches
	var ss = getSearches();
	var ul = $("<ul></ul>");
	for(s in ss)
	{
		var li = $("<li></li>");
		li.text(ss[s]);
		li.attr('q', escape(ss[s]));
		li.click(function() {
			$("#searchquery").val(unescape($(this).attr('q')));
		});
		ul.append(li);
	}
	$("#venues").append(ul);
	$("#searchquery").focus();
}

var searches = {};

function getSearches()
{
	var arr = [];
	for(q in searches)
	{
		if (typeof q == "string" && typeof searches[q] == "number")
			arr.push(q);
		if (arr.length>10) break;
	}
	return arr;
}

function loadHistory() {
	showPane("history");
	$("#history").html("<h2>History</h2>Loading..");
	$.get("fsq.php?cmd=history",function(data) {
		if (handleFsqError(data)) return;

		$("#history").html("<h2>History</h2>");
		var ul = $("<ul></ul>");
		for (var i=0;i<data.checkins.length;i++)
		{
			var c = data.checkins[i];
			var li = $("<li></li>");
			li.attr('fsqid',c.venue.id);
//			var str = "<li fsqid=\"" + c.venue.id + "\">";
			if (c.venue.primarycategory)
			{
				li.append( "<img class='categoryicon' src=\"" + c.venue.primarycategory.iconurl + "\" /> " );
			}
			else
				li.append( "<div class=\"iconplaceholder\"></div>&nbsp;" );
			if (c.venue.spotifyURL)
				li.append("<img style='float:right;' src=\"img/spotify-icon32.png\" /> ");
			li.append( c.venue.name );
			li.addClass('clickable');
			ul.append(li);
		}
		$("#history").append(ul);

		if (fsqClient.settings.printOther)
		{
			$("#history").append("<h2>Other</h2>");
			$("#history").append(utils.objToStr(data, "<br />","&nbsp;&nbsp;"));
		}
		makeVenueLinks("history");
	}, "json");
}

function loadFriends() {
	showPane("friends");
	$("#friends").html("<h2>Friend checkins</h2>Loading...")
	$.get("fsq.php?cmd=checkins",function(data) {
		if (handleFsqError(data)) return;

		$("#friends").html("<h2>Friend checkins</h2>");
		var ul = $("<ul></ul>");
		if (data.response.recent)
		{
			var checkins = data.response.recent;
			for(var i=0;i<checkins.length;i++)
			{
				var c = checkins[i];
				var li = $("<li></li>");
				if (c.user.photo)
				{
					li.append("<img style='display: inline; float: left; margin-right: 3px;' src=\"" + c.user.photo + "\" width=\"32\" height=\"32\" />");
				}
				var venuename = "";
				if (c.venue)
				{
					if (c.venue.primarycategory)
					{
						li.append("<img class='categoryicon' src=\"" + c.venue.primarycategory.iconurl + "\" style=\"display: inline; float: right;\" />");
					}
					venuename = c.venue.name;
	//				if (c.venue.spotifyURL)
	//					li.append("<img style='float:right;' src=\"img/spotify-icon32.png\" /> ");
	//				li.append("&nbsp;");
				}
//				li.append(c.display + " " + fsqClient.formatCheckinTime(c.created));
				li.append(c.user.firstName + "@" + venuename + " " + fsqClient.formatCheckinTime(c.createdAt));
				li.append("<br style='clear: both'>");
				li.attr("fsqid",c.user.id);
				li.click(function() {
					loadUser($(this).attr("fsqid"));
				});
				li.addClass('clickable');
				ul.append(li);
			}
			$("#friends").append(ul);
		}

		if (fsqClient.settings.printOther)
		{
			$("#friends").append("<h2>Other</h2>");
			$("#friends").append(utils.objToStr(data,"<br />",""));
		}
	}, "json");
}

var fsq_badges = {};

function showBadgeInfo(id)
{
	var bi = $("#badgeinfo");
	var badge = fsq_badges[id];
	bi.html("<img class='badge' src=\"" + badge.icon + "\" style=\"float:left;\" />" + badge.name + "<br />" + badge.description);
	bi.append("<br style=\"clear: left;\" />");
	bi.css('padding','5px 5px 5px 5px');
	bi.css('background-color','#4db8e0');
	bi.slideDown("slow");
}

var getCategory = function(venue)
{
	var c = venue.categories;
	if (!c) return false;
	var cat = null;
	for(var i=0,n=c.length;i<n;i++)
	{
		if (c[i].primary)
		{
			cat = c[i];
		}
	}
	return cat;
}

function loadUser(id) {
	showPane("friend");
	$("#friend").text("Loading...");
	if (id!='')
		$("#friend").prepend(createBackButton());

	$.get("fsq.php?cmd=user&id="+id,function(data) {
		if (handleFsqError(data)) return;

		if (!data.response && !data.response.user) return;

		var user = data.response.user;
		$("#friend").html("<h2>" + utils.is(user.firstName) + " " + utils.is(user.lastName) + "</h2>");
		$("#friend").append("<img src=\"" + user.photo + "\" style=\"float:left; margin-right: 10px\" />");
		if (user.checkins)
		{
			checkin = user.checkins.items[0];
			var category = getCategory(checkin.venue);
			if (category)
				$("#friend").append("<img class='categoryicon' src=\"" + category.icon + "\" style=\"float:right;\" />");
			$("#friend").append("Checked in at <a href=\"javascript:loadVenue('"+ checkin.venue.id + "')\">" + checkin.venue.name + "</a> ");
			$("#friend").append(" " + fsqClient.formatCheckinTime(checkin.createdAt));
		}
		if (id && id != '' && !user.relationship!="friend")
		{
/*			var b = $("<button>Add as friend</button>");
			b.css('float','right');
			b.attr('id','b_addasfriend');
			b.click(function() { sendFriendRequest(user.id); });
			$("#friend").append(b);*/
		}
		$("#friend").append("<br style=\"clear: left;\" />");

		if (id!='')
			$("#friend").prepend(createBackButton());

		// badges
/*		if (user.badges) {
			var badges = user.badges.items;
			$("#friend").append("<h2>Badges</h2>");
			$("#friend").append("<div id=\"badgeinfo\" style=\"display: none;\"></div>");
			var badges = data.user.badges;
			for (var i=0;i<badges.length;i++) {
				fsq_badges[badges[i].id] = badges[i];
				var eb = $("<img class='badge' fsqid=\"" + badges[i].id + "\" src=\"" + badges[i].icon + "\" />");
				eb.click(function() {
					showBadgeInfo($(this).attr("fsqid"));
				});
				$("#friend").append(eb);
			}
		}*/

		// mayors
		if (user.mayorships) {
			var mayorships = user.mayorships.items;
			$("#friend").append("<h2>Mayor</h2>");
			var ul = $("<ul></ul>");
//			var mayor = data.user.mayor;
			for (i=0;i<mayorships.length;i++)
			{
				var venue = mayorships[i];
				var li = $("<li></li>");
				var category = getCategory(venue);
				if (category)
				{
					li.append("<img class='categoryicon' src=\"" + category.icon + "\" /> ");
				}
				else
				{
					li.append("<div class='iconplaceholder'></div>&nbsp;");
				}
				if (venue.spotifyURL)
				{
					li.append("<img style='float:right;' src=\"img/spotify-icon32.png\" /> ");
				}
				li.attr('fsqid',venue.id);
				li.append( venue.name );
				li.click(function() { loadVenue($(this).attr('fsqid')); });
				li.addClass('clickable');
				ul.append(li);
			}
			$("#friend").append(ul);
		}

		if (fsqClient.settings.printOther)
		{
			$("#friend").append("<h2>Other</h2>");
			$("#friend").append(utils.objToStr(data,"<br />",""));
		}

		if (user.settings && user.settings.pings)
		{
//			$("#friend").prepend(createButton( "", loadHistory, "button_history"));

			checkFriendRequests();
		}
	},"json");
}

function loadMe()
{
	loadUser('');
}

var fsq_friendRequests = null;
var fsq_friendRequestsRendered = false;

function sendFriendRequest(id)
{
	$("#b_addasfriend").attr('disabled','disabled');
	$.get("fsq.php?cmd=friendrequest&id="+id, function(data) {
		if (handleFsqError(data)) return;

		$("#b_addasfriend").remove();
	}, "json");
}

function checkFriendRequests()
{
	$.get("fsq.php?cmd=friendrequests", function(data) {
		if (handleFsqError(data)) return;

		if (data.requests && data.requests.length>0)
		{
			fsq_friendRequests = data.requests;
			fsq_friendRequestsRendered = false;
			var div = $("<div></div>");
			div.attr('id','requests_bar');
			$("#friend").prepend(div);
			setFriendRequestBar();
		}
	}, "json");
}

function setFriendRequestBar()
{
	if (fsq_friendRequests.length>0)
		$("#requests_bar").html("<a href='javascript:showFriendRequests()'>You have " + fsq_friendRequests.length + " friend requests.</a>");
	else
		$("#requests_bar").hide();
}

function removeFriendRequest(id)
{
	var fr = [];
	for (var i=0,ii=fsq_friendRequests.length;i<ii;i++)
	{
		var us = fsq_friendRequests[i];
		if (us.id!=id)
			fr.push(us);
	}
	fsq_friendRequests = fr;
}

function showFriendRequests()
{
	showPane('friendrequests');

	if (fsq_friendRequestsRendered)	return;

	$("#friendrequests").html("<h2>Friend Requests</h2>");

	var ul = $("<ul></ul>");
	for (var i=0,ii=fsq_friendRequests.length;i<ii;i++)
	{
		var user = fsq_friendRequests[i];

		var li = $("<li></li>");
		li.attr('fsqid',user.id);
		li.append("<img src='" + user.photo + "' style='float:left;' />");
		li.append(utils.is(user.firstname) + " " + utils.is(user.lastname));
		li.append(" <a href='javascript:approveFriend("+user.id+")'>accept</a> <a href='javascript:denyFriend("+user.id+")'>deny</a><br style='clear: left;' />");

		ul.append(li);
	}
	$("#friendrequests").append(ul);

	fsq_friendRequestsRendered = true;
}

function approveFriend(id)
{
	$("li[fsqid="+id+"]").append("<br />accepting...");
	$.get("fsq.php?cmd=approvefriend&id="+id, function(data) {
		if (handleFsqError(data)) return;

		output("Friend request accepted");
		$("li[fsqid="+id+"]").slideUp("slow");
		removeFriendRequest(id);
		setFriendRequestBar();
	}, "json");
}

function denyFriend(id)
{
	$("li[fsqid="+id+"]").append("<br />denying...");
	$.get("fsq.php?cmd=denyfriend&id="+id, function(data) {
		if (handleFsqError(data)) return;

		output("Friend request denied");
		$("li[fsqid="+id+"]").slideUp("slow");
		removeFriendRequest(id);
		setFriendRequestBar();
	}, "json");
}

function login() {
	var user = $("#loginuser").val();
	var pass = $("#loginpass").val();
//	$("#loginform").text("Logging in...");
	output("Logging in...");
/*	$("#loginform").load("fsq.php?cmd=login&user="+user+"&pass="+pass, function() {
		loggedIn();
	});*/
	$.get("fsq.php?cmd=login&user="+user+"&pass="+pass, function(data) {
		loggedIn();
	});
}

function showLogin()
{
	$("#main").fadeOut("fast");
	$("#loginform").fadeIn("slow");
}

function loggedIn()
{
	$("#loginform").fadeOut("fast");
	$("#main").fadeIn("slow");
	loadFriends();
//	checkFriendRequests();
}

function createButton(text,func, id)
{
	var b = $("<button>"+text+"</button>");
	if (id) b.attr('id',id);
	b.click( func );
	return b;
}

function createButtons() {
	var bdiv = $("<div id='buttons'></div>");
//	bdiv.append( createButton( "History", loadHistory ) );
	bdiv.append( createButton( "", getNearby, "button_venues" ) );
//	bdiv.append( createButton( "Search", createSearch ) );
	bdiv.append( createButton( "", loadFriends, "button_friends" ) );
	bdiv.append( createButton( "", loadMe, "button_me" ) );
	$("#main").append(bdiv);
}

$(document).ready(function () {
	createButtons();
	createPanes();
	if(!isGeolocationSupported)
		createLocationSpecifyer();

	output("initializing");
	
	$("#a_about").click(function() {
		$("#main").hide();
		$("#about").show();
		var b = createButton("", function() { $("#main").show(); $("#about").hide(); }, "button_back" );
		$("#about").prepend(b);
	});

	$("#main").show();
	showPane("info", false);
	$("#info").html("Signing in");

	// check if we are logged in. if we are, then remove loginfield and show main view
	$.get("fsq.php?cmd=isloggedin",function(data) {
		if (data)
		{
			loggedIn();
		}
		else
		{
			output("");
			$("#main").hide("slow");
			$("#loginform").show("slow");
		}
	}, "json");
});

