/***
**  JQUERY MINIFBFEED PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  09/2011
**  DEPENDENCIES : JQUERY 1.3.1+
***/
var MiniFbFeed = function(element, options) {
	var conf 		= $.extend({}, $.fn.minifbfeed.defaults, options);
	var container  	= $(element);
	var query 	 	= "";
	var entryIds = [];

	var _initialize = function() {
		container.addClass("minifbfeed-container");
		_loadFeed(false);
	};
	
	var _loadFeed = function(reload){
		var pageID = "me";
		if(conf.pageID)
			pageID = conf.pageID;
		var url = "https://graph.facebook.com/"+pageID+"/feed?access_token="+conf.token+"&expires_in=0&callback=?&limit="+conf.limit;
		$.getJSON(url,
			    function(ob){
					var entries = ob.data;
					var timed = 0;
					var count = 0;
					for(var i=(entries.length-1); i >= 0;i--){
						
						if(!_exists(entries[i].id)){
							count ++;
							if(conf.limit && count > conf.limit){
								timed++;
								_createTimedEntry(entries[i],conf.delay*timed);
							}else{
								_createEntry(entries[i]);
							}
						}
					}
					if(timed){
						setTimeout(function(){_refreshEntries();},conf.delay*timed);
					}else{
						_refreshEntries();
					}
				}
		);
	}
	var _createTimedEntry = function(entry,delay){
		setTimeout(function(){_createEntry(entry);},delay);
	}
	
	var _refreshEntries = function(){
		setTimeout(function(){_loadFeed(true);},conf.refresh);
	}
	
	var _exists = function(id){
		for(a=0;a<entryIds.length;a++){		
			if(entryIds[a] == id){
				return true;
			}
		}
		return false;
	}
	var _createEntry = function(entry){
		entryIds[entryIds.length] = entry.id;
		var msg = "";
		if(entry.message)
			msg = entry.message;
		if(entry.story)
			msg = entry.story;
		if(entry.link)
			msg += " "+entry.link;
		var entryOb =  $('<div class="minifbentry">\
						<a href="http://www.facebook.com/'+entry.from.id+'" target="_blank" class="avatar"><img src="https://graph.facebook.com/'+entry.from.id+'/picture" alt="'+entry.from.name+'" /></a>\
						<div class="txt">'+_format(msg)+'</div>\
						<span class="user"><a href="http://www.facebook.com/'+entry.from.id+'" target="_blank">'+entry.from.name+'</a></span>\
						<span class="time">'+_timer(entry.created_time)+'</span>\
					</div>');
		entryOb.css("display","none");				
		container.prepend(entryOb);
		if(conf.limit){
			if($(".minifbentry",container).length > conf.limit){
				$(".minifbentry:last",container).slideUp("normal",function(){$(this).remove()});
			}
		}
		entryOb.slideDown();
	}
	var _format = function(str){
		str=' '+str;
		str = str.replace(/((ftp|https?):\/\/([-\w\.]+)+(:\d+)?(\/([\w/_\.\-]*(\?\S+)?)?)?)/gm,'<a href="$1" target="_blank">$1</a>');
		return str;
	}
	var _timer = function(time){
		
		var arr = time.split("T");
		var dArr = arr[0].split("-");
		var tempArr = arr[1].split("+");
		var tArr = tempArr[0].split(":");
		var origDate = new Date();
		
		origDate.setFullYear(dArr[0]);
		origDate.setMonth(dArr[1]-1);
		origDate.setDate(dArr[2]);
		origDate.setHours(tArr[0]);
		origDate.setMinutes(tArr[1]);
		origDate.setSeconds(tArr[2]);
		
		var origStamp = origDate.getTime();
		var curDate = new Date();
		var currentStamp = curDate.getTime();
		var difference = parseInt((currentStamp - origStamp)/1000);
		
		if(difference < 0) 				return false;
		if(difference <= 5)				return conf.lng.justnow;
		if(difference <= 20)			return conf.lng.seconds;
		if(difference <= 60)			return conf.lng.minute;
		if(difference < 3600)			return parseInt(difference/60)+" "+conf.lng.minutes;
		if(difference <= 1.5*3600) 		return conf.lng.hour;
		if(difference < 23.5*3600)		return Math.round(difference/3600)+" "+conf.lng.hours;
		if(difference < 1.5*24*3600)	return conf.lng.day;;
		
		var dateArr = origDate.toString().split(' ');
		return dateArr[4].replace(/\:\d+$/,'')+' '+dateArr[2]+' '+dateArr[1]+(dateArr[3]!=curDate.getFullYear()?' '+dateArr[3]:'');
	}
	
	_initialize();
	return container;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minifbfeed = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minifbfeed')) return;
			var w = new MiniFbFeed(this, options);
			element.data('minifbfeed', w);
		});
	};
})(jQuery);

$.fn.minifbfeed.defaults = {
	token 	: '',
	pageID	: '',
	refresh	: 3500,
	delay	: 7500,
	limit	: 5,
	lng		: {justnow	:	"Just now",
	   		   seconds	:	"Seconds ago",
	   		   minute	:	"A minute ago",
	   		   minutes  :	"minutes ago",
	   		   hour		: 	"One hour ago",
	   		   hours	:   "hours ago",
	   		   day		:	"One day ago"}
};
