// ==UserScript==
// @name           Friendfeed Keyboard Shortcuts
// @namespace      http://userscripts.org/users/44035
// @description    Like Google Reader keyboard shortcuts, but for FF! w00t.
// @include        http://friendfeed.com/*
// @exclude        http://friendfeed.com/settings*
// ==/UserScript==

unsafeWindow.document.onkeydown = KeyCheck;

var currentEntry;

function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}

addGlobalStyle('div.selectedEntry { margin-left: -12px; padding-left: 7px; border-left: 5px solid #D7E4F4;}');

function GM_wait() 
{
	if(typeof unsafeWindow.jQuery == 'undefined') 
	{ 
		window.setTimeout(GM_wait,100); 
	}
	else 
	{ 
		$ = unsafeWindow.jQuery; letsJQuery(); 
	}
}
GM_wait();

function KeyCheck(event)
{
	var key = event.keyCode;
	switch(key)
	{
		case 74: //j
			var oldEntry = currentEntry;
			currentEntry = currentEntry.toggleClass('selectedEntry').next('.cluster').toggleClass('selectedEntry');
			if(currentEntry.length != 0)
			{
				$.scrollTo( currentEntry, 1, {offset: -10} );
			}
			else
			{
				currentEntry = oldEntry.toggleClass('selectedEntry');
			}
			break;
		case 75: //k
			currentEntry = currentEntry.toggleClass('selectedEntry').prev('.cluster').toggleClass('selectedEntry');
			if(currentEntry.length != 0)
			{
				$.scrollTo( currentEntry, 1, {offset: -10} );
			}
			else
			{
				currentEntry = $('.feed .cluster:first').toggleClass('selectedEntry');
			}
			break;
		case 72: //h
			var link = currentEntry.find('.l_hideone');
			if (link.length == 0) link = currentEntry.find('.l_unhideone');
			triggerClick(link);
			break;
		case 69: //e
			var link = currentEntry.find('.l_expandcomments');
			triggerClick(link);
			break;
		case 76: //l
			var link = currentEntry.find('.l_like');
			if (link.length == 0) link = currentEntry.find('.l_unlike'); //unliking isn't working...???
			triggerClick(link);
			break;
		case 67: //c  -- todo: clear out comment form (the 'c' keypress appears in the form)
			var link = currentEntry.find('.l_comment');
			triggerClick(link);
			unsafeWindow.document.onkeydown = typingComment;
			break;
	}
}

function triggerClick(link) {
	link.each(function () { 
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent("click", true, true);
		this.dispatchEvent(evt);
	});
}	

function typingComment (event) {
	var key = event.keyCode;
	if (key == 13) unsafeWindow.document.onkeydown = KeyCheck;
	// todo: keypress 'esc' (27) cancels comment
	//	    submitting or cancelling the comment form via mouseclick returns the onkeydown event handler to KeyCheck
}
	


var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}

function letsJQuery() 
{
	currentEntry = $('.feed .cluster:first');
	currentEntry.toggleClass('selectedEntry');
	at = new RegExp(/name="at" value="([\S\s]*?)"/ig).exec(unsafeWindow.gShareMainForm);
	//console.log(at[1].toString());
}