// ==UserScript==
// @name           Twitter Search Results on Yahoo!
// @namespace      prassarkar
// @description    Shows results from Twitter on Yahoo! search pages
// @include        http://*search.yahoo.*/search*?*p=*
// ==/UserScript==

GM_YTS = {
	un : "",
	lang : "en",
	init : function()
	{
		var href = document.location.href;
		GM_YTS.un = href.match(/[&?]p=([^&]*)(?:&|$)/)[1];

		if( GM_YTS.un != "" )
		{
			GM_xmlhttpRequest({
				method:"GET",
				url:"http://search.twitter.com/search.atom?q="+GM_YTS.un+"&lang="+GM_YTS.lang,
				headers:{
					"User-Agent":"Mozilla/5.0",
					"Accept":"application/xml"
				},
				onload:GM_YTS.handle
			});
		}
	},

	handle : function(response)
	{
		var parser = new DOMParser();
        var dom = parser.parseFromString(response.responseText,
            "application/xml");
        var entries = dom.getElementsByTagName('entry');

		if( entries && entries.length > 0 )
		{
			var results = document.getElementById("web");
			var ds = document.createElement("div");
			ds.className = "res sc";
			ds.style.paddingBottom = "1.5em";
			results.insertBefore(ds, results.firstChild);
								  
			var il, h;
			var query = unescape(GM_YTS.un).replace(/\+/g, ' ');
			h = ds.appendChild(document.createElement("li"));
			h.className = "g";
			var h3 = h.appendChild(document.createElement("h3"));
			//h3.className = "r";
			h3.innerHTML = '<a name="twitter" class="yschttl spt" href="http://search.twitter.com/search?q='+ GM_YTS.un +'"><b>'+ query +'</b> - Twitter Results</a>';
			var d = h.appendChild(document.createElement("table"));
			var tr = d.appendChild(document.createElement("tr"));
			var td = tr.appendChild(document.createElement("td"));
			td.className = "news-r";
			td.innerHTML = GM_YTS.generateoutput(entries);

		}
	},

	generateoutput : function(entries)
	{

		var entry = new Object();
		var output = '';
		for( var i=0; i < entries.length; i++ )
		{
			entry.id = i;
			entry.text = entries[i].getElementsByTagName('content')[0].textContent;
			entry.text = entry.text.replace('&lt;','<');
			entry.text = entry.text.replace('&gt;','>');
			entry.rawdate = entries[i].getElementsByTagName('updated')[0].textContent;
			entry.updated = new Date(convertAtomDateString(entry.rawdate));
            entry.twittericon = entries[i].getElementsByTagName('link')[1].getAttribute('href');
            entry.tweetlink = entries[i].getElementsByTagName('link')[0].getAttribute('href');
            entry.authorname_raw=entries[i].getElementsByTagName('author')[0].childNodes[1].textContent;
            entry.aws=entry.authorname_raw.split(' (');
            entry.authorname=entry.aws[1].substr(0, entry.aws[1].length-1);
            entry.authorlink=entries[i].getElementsByTagName('author')[0].childNodes[3].textContent;
			if (i >= 5) { entry.display = 'display:none'; }
			output += GM_YTS.outputentry(entry);
		}
		
		if (entries.length>5) 
		{
			var iout = '';
			for (var i=5; i < entries.length; i++)
			{
			 	iout += 'document.getElementById(\'tweet'+i+'\').style.display=\'\';';
			}
			output += '<a href="#twitter" onClick="javascript:this.style.display=\'none\';'+iout+'">More...</a>';
		}
		return output;
	},
	
	outputentry : function(entry)
	{
		var output;
		output = "<li id='tweet"+entry.id+
			"' style='padding-bottom:0.5em;"+entry.display+
			"'>"+'<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAqCAIAAAClYzUyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA+NJREFUeNrEWE2IFEcU/qZrup3enp1slnFwHCVZNWBgFYOK5BBvIbcENQSCBC+5evGci5d48JYguQSCkGsOogcPgZyMCCohBCUkMeIqu/6QnZ2dmZ7umled1zW6rtNtb9ea3hSPhu4Z6n313ldfvVelKIrwv45SKgIf+DPEEuE1gRmBqthABATcDHGhjX9CsF8JTDv4aBKH3A1BwO6v+/j2MeoWtlfgAF3g/gCLEic243C1eATs7/Q8LUtMWzEaBVj6+7KK0ZxpCbeAdFirX37x8WiACWCgIBVIP9lsBgHc8AuJQXl1CjqESC99jJz8hQjzsmAEsSe97hGIMQQq8bEYBKCQSFlPva7kicMjg9GbKBYBu5ISHYAZt0KQkBlKkIXpQXnsnRPRlwgUNlko6UiECkMqUJHGYzBEvPFCig0vJuLnNj0eIMgxabyNiWZr4oOaMOWBpn2CcjEsK34uSLLyrYwTd22OfpygUy3RdEReBLzQiECJ//OHuo0aEOROB0vI1gr+6OL0HM7tzCJwORnAKG26vkI3MJRboGLhQZ++e4TPGyKvHsSSkFBNW0CRsR5YevYS4W7PhAdESRpACbEOPaKnEaUgU0jWzoLSTCynZWfNLDCIoeLzTJjshUQW2PEA8Oz1ZKErOX10YEIYKFKUlu+eYrEWDMJIldsyZHF7v+l+WDeIASlFqWvtE/F0JeTajqN8vT6BT99wTzSEsSKptBnZ3qs7R7cIrt7ycLDqYJ8nckhiIgscAZWmsjy2T+JgreCzUW96lY4gPp8KKZnHVVkxe+00BIUdj+M8iFQcidQYbAQC6xnpUum9LKnwGmmTYCZSkgiRjs1fS6EuHgqr1nl1W+xYP0fn02qLdPn6+6K82aUCEfDY44mqI+TIZcI4BF/86t8P/2MEL/RMXJmdvOX/NDdI7Y0ifURNOeLYm5V9U3Ah1MurNG52Zz3hCEMEHOLz8+GZG52KnaV3Q4ky17EiS5X5x9ak89lM5XjTMeuduW06cqVzrx065VzinzHCYQz06C7vy91uXh7w8ASOv1VRzwqFDFtz8BqYUhfvDH6YJwMEHL1PGs6727x+T6vTqxnP7od0+aFvgACaRGffdnfUnV7wqiDi8564+VdmCHg0XXxz0GtNiZ6fvjNzmtLNeCm/Hqweu6vi+0O1vS3HD+KuLcJ6jLSDnVXL+Cbr+ZUW4au7/vnby50ebMsStoHUxD1ngF0NcelwrfryYrWU5zbvbx9f3+leXZAL7ZViXq3dOsKabYpz+2szmZc/pfz3iXwmXFkMf1vCE0kdSZQpFZ6Fd6bdjxvILtXNEBQ0/hVgANbdbXZbeZWHAAAAAElFTkSuQmCC" alt="" height="16" width="16">'+
			autolink(entry.text)+" <cite style='clear:both;font-size:85%;color:#888888;white-space:nowrap;'> - tweeted by <a href='"+
			entry.authorlink+"' class=''>"+
			entry.authorname+"</a> - "+GM_YTS.tt(entry.updated)+'</cite></li>';
		return output;
	},

	tt : function(dt)
	{

		var nw = new Date(), df = nw - dt, dm = Math.floor(df/60000), dh = Math.floor(dm/60), at = new Date(dt);
		if( dm <= 0 )	{ return "a few seconds ago"; }
		if( dm < 60 )	{ return (dm == 1)?"1 minute ago":dm+" minutes ago"; }
		if( dh <= 1 )	{ return "about 1 hour ago"; }
		if( dh < 24 )	{ return "about " + dh + " hours ago"; }
		if( (nw.getDate() - dt.getDate()) == 1 )	{ return "yesterday"; }
		at.setDate(at.getDate() + 1);
		nw.setDate(nw.getDate() + 1);
		if( (nw.getDate() - at.getDate()) == 1 )	{ return "yesterday"; }
		var minutes = dt.getMinutes();
		if( minutes < 10 ) minutes = "0"+minutes;
		if( dt.getHours() == 0 ) nw = "12:"+minutes+" AM ";
		else if( dt.getHours() < 12 ) nw = dt.getHours()+":"+minutes+" AM ";
		else nw = (dt.getHours()-12)+":"+minutes+" PM ";
		return nw + ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][dt.getMonth()] + " " + dt.getDate();
	}

};

GM_YTS.init();

function autolink(s) 
{   
   var hlink = /\s(ht|f)tp:\/\/([^ \,\;\:\!\)\(\"\'\<\>\f\n\r\t\v])+/g;
   return (s.replace (hlink, function ($0,$1,$2) { s = $0.substring(1,$0.length); 
                                                   // remove trailing dots, if any
                                                   while (s.length>0 && s.charAt(s.length-1)=='.') 
                                                      s=s.substring(0,s.length-1);
                                                   // add hlink
                                                   return " " + s.link(s); 
                                                 }
                     ) 
           );
}


function autobold(s)
{
	// todo
}

//convert an Atom-formatted date string to a javascript-compatible date string
function convertAtomDateString(str)
{
	//YYYY-MM-DDThh:mm:ss[.f*](Z|-hh:mm|+hh:mm)
	var atomFormat = /^\d{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2}(\.\d*)?(Z|[+-]\d{2}:\d{2})$/i;
	//if(!atomFormat.test(str)) return "";	//invalid format
	
	var months = new Array("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	
	var year, month, date, hour, minute, second, offset;
	year = str.slice(0,4);
	month = months[1*str.slice(5,7)];		//Jan-Dec
	date = str.slice(8,10);		//01-31
	hour = str.slice(11,13);	//00-23
	minute = str.slice(14,16);	//00-59
	second = str.slice(17,19);	//00-59
	offset = "GMT";
	if(str.indexOf("Z") == -1)	//time zone offset specified
	{
		var x = str.lastIndexOf(":");
		offset += str.slice(x-3,x) + str.slice(x+1);
	}
	
	//DD MMM YYYY hh:mm:ss GMT[(+|-)hhmm]
	return date+" "+month+" "+year+" "+hour+":"+minute+":"+second+" "+offset;
}