var log = 
{

	post : function(data)
	{
		if(window && window.console && console.log)
		{
			console.log(data);
		}
	}

}

var messenger =
{

	yesCallback : null,
	noCallback : null,

	newConfirm : function(string)
	{
		$('div.messages').html('<div class="message">'+string+'</div>');
		$('div.messages div.message').append('<span class="yes">Yes</span> <span class="no">No</span>');
		if(typeof(messenger.yesCallback)=='function') $('div.message span.yes').click(function() { messenger.yesCallback(); });
		if(typeof(messenger.noCallback)=='function') $('div.message span.no').click(function() { messenger.noCallback(); })
		$('div.messages').show();
		$('div.message').addClass('visible');
	},
	newMessage : function(string)
	{
		$('div.messages').html('<div class="message">'+string+'</div>');
		$('div.message').append('<span class="loadprogress"></span><span class="cancel">(cancel)</span>');
		$('div.message span.cancel').click(function(){ feed.cancelFetch(); });
		$('div.messages').show();
		$('div.message').addClass('visible');
	},
	
	removeAll : function()
	{
		$('div.message').removeClass('visible');
		$('div.messages').hide();
		$('div.message').remove();
	}
}

var changeDateDisplay = 
{
	
	setFeedDateToFuzzy : function(feeddateElement)
	{
		//if(typeof($(feeddateElement).data('fuzzyTime'))!='undefined')
		if(typeof(jQuery.data(feeddateElement,'fuzzyTime'))=='undefined')
		{
			//$(feeddateElement).text($(feeddateElement).data('fuzzyTime'));
			$(feeddateElement).text(jQuery.data(feeddateElement,'fuzzyTime'));
		}
	},
	
	setFeedDateToUTC : function(feeddateElement)
	{
// 		if(typeof($(feeddateElement).data('utcTime'))=='undefined')
		if(typeof(jQuery.data(feeddateElement,'utcTime'))=='undefined')
		{
			var unixTime = $(feeddateElement).attr('title');
			var fuzzyTime = $(feeddateElement).text();
			var d = new Date();
			d.setTime( unixTime * 1000 );
			var utcTime = d.toUTCString();

			jQuery.data(feeddateElement,'unixTime',unixTime);
			jQuery.data(feeddateElement,'fuzzyTime',fuzzyTime);
			jQuery.data(feeddateElement,'utcTime',utcTime);
			
// 			$(feeddateElement).data('unixTime',unixTime);
// 			$(feeddateElement).data('fuzzyTime',fuzzyTime);
// 			$(feeddateElement).data('utcTime',utcTime);
		}
// 		$(feeddateElement).text($(feeddateElement).data('utcTime'));
		$(feeddateElement).text(jQuery.data(feeddateElement,'utcTime'));
	}
	
}

var feedItemData =
{
	showHideContentBinding : function(el)
	{
		var openContentHeight = $('div.contents:visible').height();
		if($(el).next('div.contents').is(':hidden'))
		{
			feedItemData.showThisContent(el);
			feedItemData.scrollToThisContent(el,openContentHeight);
		}
		else
		{
			feedItemData.hideThisContent(el);
		}
		return false;
	},

	init : function()
	{
		$('li.feeditem a.feedtitle').click(
		function()
		{
			return feedItemData.showHideContentBinding(this);
		});
	},

	hideAllContents : function(el)
	{
// 		$('li.feeditem.active span.feeddate').each(function(){
// 			changeDateDisplay.setFeedDateToFuzzy(this);
// 		});
		$('li.feeditem').removeClass('active');
		$('div.contents').slideUp();
	},

	hideThisContent : function(el)
	{
// 		changeDateDisplay.setFeedDateToFuzzy($(el).children('span.feeddate'));
		$('li.feeditem').removeClass('active');
		$('div.contents').slideUp();
	},

	showThisContent : function(el)
	{
		feedItemData.hideAllContents();
		$(el).parent('li.feeditem').addClass('active');
// 		changeDateDisplay.setFeedDateToUTC($(el).children('span.feeddate'));
		$(el).next('div.contents').slideDown();
	},

	scrollToThisContent : function(el,openContentHeight)
	{
		var targetOffset = $(el).offset().top - openContentHeight - 60;

		var scrollElement = 'html, body';
		$('html, body').each(function()
		{
			var initScrollTop = $(this).attr('scrollTop');
			$(this).attr('scrollTop', initScrollTop + 1);
			if ($(this).attr('scrollTop') == initScrollTop + 1)
			{
				scrollElement = this.nodeName.toLowerCase();
				$(this).attr('scrollTop', initScrollTop);
				return false;
			}
		});

		$(scrollElement).animate({ 'scrollTop' : targetOffset }, 1000);
	}
}

var feed =
{

	request : null,
	itemsInFetch : 0,

	init : function()
	{
		$('div.feednav a').click(
		function(){
			var feedname = $(this).attr('title');
			var feedurl = $(this).attr('href');
			feed.fetch(feedname,feedurl,false);
			$('div.feednav').removeClass().addClass('feednav').addClass(feedname);
			return false;
		});
	},

	cancelFetch : function()
	{
		feed.request.abort();
		messenger.removeAll();
	},

	fetch : function(feedname,feedurl,warnBeforeReplace)
	{
		if(feedname=='all')
		{
			messenger.newMessage('Fetching latest items from '+feedname+' feeds');
		}
		else
		{
			messenger.newMessage('Fetching latest '+feedname+' feed items');
		}
		$('ul#tmpFeedItems').remove();
		jQuery('<ul id="tmpFeedItems"></ul>').hide().appendTo('div#content');
		feed.request = $.getJSON(feedurl, function(data)
		{
			feed.itemsInFetch = data.objects.length;
			for(var i=0; i<feed.itemsInFetch; i++)
			{
				obj = data.objects[i];
				var description = '';
				var extra = '';
				if(obj.description) description=obj.description;
				if(obj.extra)
				{
					extra='';
					for(j=0;j<obj.extra.length;j++)
					{
						extra+=obj.extra[j]+' ';
					}
				}
				$('ul#tmpFeedItems').append('<li class="feeditem '+obj.feedname+'"><a class="feedtitle" href="'+obj.link+'"><span class="feedtitle">'+obj.title+'</span> <span class="feeddate" title="'+obj.unixTime+'">about '+obj.fuzzyDate+'</span></a><div class="contents"><div class="content-link"><a href="'+obj.link+'">'+obj.link+'</a></div><div class="description">'+description+'</div><div class="extra">'+extra+'</div></div></li>');
			}
			//TODO : only fire if warnBeforeReplace AND there are unique elements between ul#tmpFeedItems and ul.feeditems
			//currently, it operates on the number of items returned
			if(warnBeforeReplace && feed.itemsInFetch != $('ul.feeditems li').length)
			{
				messenger.removeAll();
				messenger.yesCallback = function(){
					feed.displayNew();
					messenger.removeAll();
				};
				messenger.noCallback = function(){
					messenger.removeAll();
				};
				messenger.newConfirm('New feed items have been found. Would you like to re-load the feed now?');
			}
			else
			{
				feed.displayNew();
				messenger.removeAll();
			}
			feedItemData.init();
		});
	},

	displayNew : function()
	{
		$('#feeditem_count').text(feed.itemsInFetch);
		$('ul.feeditems').html('');
		$('ul#tmpFeedItems li').each(function(){
			$('ul.feeditems').append(this);
		});
		//$('ul#tmpFeedItems').remove();
	}
}

$(document).ready(function()
{

	feedItemData.init();
	
	feed.init();

	var warnBeforeReplace = true;
	feed.fetch('all','/ssf/feed.php',warnBeforeReplace);

});