// ==UserScript==
// @name           onPageFavView
// @namespace      http://neko-mangaka.deviantart.com/
// @description    View the deviants who have added a deviation to their favourites
// @include        http://www.deviantart.com/deviation/*
// @include        http://www.deviantart.com/view/*
// ==/UserScript==

var THROBBER_SRC = "data:image/gif;base64,R0lGODlhEgASAMQaAHl5d66urMXFw3l5dpSUk5WVlKOjoq+vrsbGw6Sko7u7uaWlpbm5t3h4doiIhtLSz4aGhJaWlsbGxNHRzrCwr5SUkqKiobq6uNHRz4eHhf///wAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAaACwAAAAAEgASAAAFaaAmjmRplstyrkmbrCNFaUZtaFF0HvyhWRZNYVgwBY4BEmFJOB1NlYpJoYBpHI7RZXtZZb4ZEbd7AodFDIYVAjFJJCYA4ISoI0hyuUnAF2geDxoDgwMnfBoYiRgaDQ1WiIqPJBMTkpYaIQAh+QQFAAAaACwBAAEAEAAQAAAFY6AmjhpFkSh5rEc6KooWzIG2LOilX3Kd/AnSjjcyGA0oBiNlsZAkEtcoEtEgrghpYVsQeAVSgpig8UpFlQrp8Ug5HCiMHEPK2DOkOR0A0NzxJBMTGnx8GhAQZwOLA2ckDQ0uIQAh+QQFAAAaACwBAAEAEAAQAAAFZKAmjpqikCh5rVc6SpLGthSFIjiiMYx2/AeSYCggBY4B1DB1JD0ertFiocFYMdGENnHFugxgg2YyiYosFhIAkIpEUOs1qUAvkAb4gcbh0BD+BCgNDRoZhhkaFRVmh4hmIxAQLiEAIfkEBQAAGgAsAQABABAAEAAABWOgJo6aJJEoiaxIOj6PJsyCpigopmNyff0X0o43AgZJk0mKwSABAK4RhaJ5PqOH7GHAHUQD4ICm0YiKwCSHI7VYoDLwDClBT5Di8khEY+gbUBAQGgWEBRoWFmYEiwRmJBUVLiEAIfkEBQAAGgAsAQABABAAEAAABWSgJo7a85Aoia1YOgKAxraShMKwNk0a4iOkgXBAEhgFqEYjZSQ5HK6RQqHJWDPRi/Zyxbq2Fw0EEhUxGKRIJEWhoArwAulAP5AIeIJmsdAE/gEoFRUaCYYJfoFRBowGZSQWFi4hACH5BAUAABoALAEAAQAQABAAAAVloCaOGgCQKGma6eg42iAP2vOgWZ5pTaNhQAxJtxsFhSQIJDWZkCKR1kgi0RSuBSliiyB4CVKBWKCpVKQiMWmxSCkUqIQ8QbrYLySD3qChUDR3eCQWFhoHhwcaDAxoAY4BaCSOLSEAIfkEBQAAGgAsAQABABAAEAAABWOgJo6a45Aoma1ZOkaRxrYAgBZ4oUGQVtckgpBAGhgHqEol1WiQFgvX6PHQJK4JKWaLMXgNWq7GYpGKJhMShZKSSFCH+IGEqCNIgXxAo1BoBIACKHkaF4YXf4JSh4hmIwwMLiEAIfkEBQAAGgAsAQABABAAEAAABWSgJo5aFJEoWaxFOi6LRsyE5jhooidaVWmZYIZkKBpIwiHJYklBICQKxTUCADSH7IFqtQa+AepgPNB8qaJGg6RQpB4P1GV+IWHuGBK9LpFo8HkkDAwaCIYIGhMTaAKNAmgkjS4hADs=";

var TO_OPEN_TITLE = 'onPageFavView: Click to open list on page...';

var TO_CLOSE_TITLE = 'onPageFavView: Click to close list...';

(function()
{
	var whoLink = document.getElementById('artist-comments').getElementsByTagName('div')[0].getElementsByTagName('a')[0];
	
	if (whoLink.href.indexOf('/favourites') == -1)
	{
		return;
	}
	
	var replacementLink = document.createElement('a');
	var listDiv = document.createElement('div');
	
	var showList = function(event)
	{
		var requestURL = whoLink.href;
		
		var requestOnload = function(response)
		{
			try
			{
				var parseDiv = document.createElement('div');
				
				var listHTML = /(<ul.*\/ul>)/.exec(response.responseText.replace(/\n/g, ''))[1];
				var title = /<strong>(.*)<\/strong>/.exec(response.responseText)[1];
				
				parseDiv.innerHTML = listHTML;
				
				var numberOfDeviants = parseDiv.getElementsByTagName('li').length;
				
				var headerText = '<span id="gm-dev-fav-header">' + ((numberOfDeviants == 0) ? '<strong>No</strong>' : 'The following <strong>') + ((numberOfDeviants > 1) ? numberOfDeviants + ' ' : '') + 'deviant' + ((numberOfDeviants == 1) ? '</strong> has' : 's</strong> have') + ' added <strong>' + title + '</strong> to ' + ((numberOfDeviants > 1) ? 'their' : 'his or her') + ' favourites.</span>';
				
				listHTML = listHTML.replace(/\d+\. /g, '');
				
				listDiv.innerHTML = headerText + listHTML;
				listDiv.className = '';
			}
			catch (exception)
			{
				requestOnerror(response);
			}
		};
		
		var requestOnerror = function(response)
		{
			listDiv.innerHTML = '<br /><br />An error occured while loading the favourites list.';
			listDiv.className = 'gm-dev-fav-error';
		};
		
		whoLink.addEventListener('click', hideList, true);
		whoLink.removeEventListener('click', showList, true);
		
		replacementLink.title = TO_CLOSE_TITLE;
		
		whoLink.parentNode.insertBefore(listDiv, whoLink.nextSibling.nextSibling);
		
		listDiv.innerHTML = '';
		listDiv.className = 'gm-dev-fav-loading';
		
		GM_xmlhttpRequest(
		{
			method: 'GET',
			url: requestURL,
			header:
			{
				'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
				'Accept': 'application/atom+xml,application/xml,text/xml,text/html'
			},
			data: '',
			onload: requestOnload,
			onerror: requestOnerror
		});
		
		event.preventDefault();
		event.stopPropagation();
	};
	
	var hideList = function(event)
	{
		listDiv.parentNode.removeChild(listDiv);
		
		whoLink.addEventListener('click', showList, true);
		whoLink.removeEventListener('click', hideList, true);
		
		replacementLink.title = TO_OPEN_TITLE;
		
		event.preventDefault();
		event.stopPropagation();
	};
	
	var style = 
	[
	 
		'div#gm-dev-fav-list { width:167px; height:200px; margin-top:1em; border:1px solid #A6AEAA; overflow:auto; }',
		
		'div#gm-dev-fav-list span#gm-dev-fav-header { display:block; margin:2px 2px 0 2px; }',
		
		'div#gm-dev-fav-list ul, div#gm-dev-fav-list ul li { list-style:decimal inside; }',
		
		'div#gm-dev-fav-list ul { padding:0; }',
		
		'div#gm-dev-fav-list ul li { padding:0.2em 2px 0.4em 2px; }',
		
		'div#gm-dev-fav-list ul li.odd { background:#C8D0CC; }',
		
		'div#gm-dev-fav-list ul li span:last-child { display:block; padding-left:2em; }',
		
		'div#gm-dev-fav-list.gm-dev-fav-loading { border-color:transparent; background:url("' + THROBBER_SRC + '"); background-repeat:no-repeat; background-position:center center; }',
		
		'div#gm-dev-fav-list.gm-dev-fav-error { color:maroon; border-color:transparent; }'
	
	].join('\n');
	
	GM_addStyle(style);
	
	listDiv.id = 'gm-dev-fav-list';
	
	replacementLink.id = 'gm-dev-fav-link';
	replacementLink.href = whoLink.href;
	replacementLink.innerHTML = whoLink.innerHTML;
	replacementLink.className = whoLink.className;
	replacementLink.title = TO_OPEN_TITLE;
	
	whoLink.parentNode.replaceChild(replacementLink, whoLink);
	
	whoLink = replacementLink;
	
	whoLink.addEventListener('click', showList, true);
})();