// Modified "Remove Dupes from Google Reader" version m-1.00
//
// partly based on the script code and idea:
//      "Remove Dupes from Google Reader" by Hao Chen, released under GPL
// Modifications and enhancements by Michael Devore
//  All added code released to the public domain.
//
// ==UserScript==
// @name          Modified Remove Dupes from Google Reader
// @description   Because duplicate posts still suck, and now they go away better.
// @version       m2.0.0
// @include       http://www.google.com/reader/*
// ==/UserScript==

var removeDupesGlobals =
{
		bIsCards : false,
		arrayReadState : null
};

Array.prototype.removeDuplicate = function(arrayAnchors)
{
	// Here we remove duplicate values from the array of entries
	var array4 = new Array;
	var len = this.length;
	var entries = document.getElementById('entries');
	for(var i=0; i<len; i++) 
	{
		iboth = this[i];
		indexDash = iboth.lastIndexOf(' - ');
		if(indexDash != -1)
		{
			ititle = iboth.substr(0, indexDash);
		}
		else
		{
			ititle = iboth;
		}
		indexSlash = ititle.indexOf(' | ');
		if(indexSlash != -1)
		{
			ititle2 = ititle.substr(indexSlash + 3, ititle.length);
		}
		else
		{
			ititle2 = ititle;
		}
	    var xx = true;
		for(var j=i+1; j<len; j++)
		{
			jboth = this[j];
			indexDash = jboth.lastIndexOf(' - ');
			if(indexDash != -1)
			{
				jtitle = jboth.substr(0, indexDash);
			}
			else
			{
				jtitle = jboth;
			}
			indexSlash = jtitle.indexOf(' | ');
			if(indexSlash != -1)
			{
				jtitle2 = jtitle.substr(indexSlash + 3, jtitle.length);
			}
			else
			{
				jtitle2 = jtitle;
			}
			if(iboth == jboth || ititle == jtitle || ititle2 == jtitle2)
				xx = false;		
		}
		if(xx == true)
		{
			array4.push(iboth);
		}
		else
		{
			var entry = entries.childNodes[i];
			// don't double mark
			if (entry.className.match(/ read$/) == null)
			{
				console.log("Title dupe removed: " + ititle);
				entry.className = entry.className.replace('unread','') + " read";
				var oEvent = document.createEvent("MouseEvents");
//				oEvent.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, arrayAnchors[i]);
				oEvent.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, null);
				if (removeDupesGlobals.bIsCards)
				{
					removeDupesGlobals.arrayReadState[i].dispatchEvent(oEvent);
				}
				else
				{
					arrayAnchors[i].dispatchEvent(oEvent);
				}
			}
		}
	}
	console.log(len - array4.length, "dupes marked as read.");
	return array4;
}

// mark duplicate entries as read based on their URL
Array.prototype.removeDupLinks = function()
{
	var array4 = new Array;
	var len = this.length;
	var entries = document.getElementById('entries');
	for(var i=0; i<len; i++) 
	{
		var linki = this[i].getAttribute('href');
	    var xx = true;
		for(var j=i+1; j<len; j++)
		{
			var linkj = this[j].getAttribute('href');
			if (linki == linkj)
			{
				xx = false;
			}
		}
		if(xx == true)
		{
			array4.push(linki);
		}
		else
		{
			var entry = entries.childNodes[i];
			// entry may have been marked as read by previous dupe check, don't double mark
			if (entry.className.match(/ read$/) == null)
			{
				entry.className = entry.className.replace('unread','') + " read";
				var oEvent = document.createEvent("MouseEvents");
//				oEvent.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, this[i]);
				oEvent.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, null);
				if (removeDupesGlobals.bIsCards)
				{
					removeDupesGlobals.arrayReadState[i].dispatchEvent(oEvent);
				}
				else
				{
					this[i].dispatchEvent(oEvent);
				}
				console.log("New link dupe removed: " + linki);
			}
			else
			{
				console.log("Previously marked dupe: " + linki);
			}
		}
	}
//	console.log("Checked " + len + " messages.");
	console.log(len - array4.length, "link dupes marked as read.");
	return array4;
}

removeDupes = function ()
{
	console.log("Removing dupes...");
	var entries = document.getElementById('entries');
	var arrayEntries = new Array();
	var arrayAnchors = new Array();
	removeDupesGlobals.arrayReadState = new Array();
	var entryCount = entries.childNodes.length - 1;
	removeDupesGlobals.bIsCards = false;
	if (entries.className.search(/cards/) >= 0)
	{
		removeDupesGlobals.bIsCards = true;
	}
	for(var i=0; i < entryCount; i++)
	{
		var entry = entries.childNodes[i];
		var entryTitleLink = "";
		var snippet = "";
		if (removeDupesGlobals.bIsCards)
		{
			removeDupesGlobals.bIsCards = true;
			var entryActions = entry.childNodes[0].childNodes[2].childNodes[0];
			removeDupesGlobals.arrayReadState[i] = entryActions.childNodes[4];
			var entryMain = entry.childNodes[0].childNodes[0].childNodes[0].childNodes[0];
			var entryTitleNode = entryMain.getElementsByTagName('h2')[0];
			var entryTitle = entryTitleNode.textContent;
			entryTitleLink = entryTitleNode.getElementsByTagName('A')[0];
			var entryBodyNode = entryMain.childNodes[4];
			var itemBodyNode = entryBodyNode.childNodes[0].childNodes[0];
			var itemText = itemBodyNode.childNodes[0].textContent;
			snippet = itemText.substr(0, 100);
		}
		else
		{
			var entrySecondary = entry.childNodes[0].childNodes[2].getElementsByTagName('div')[0];
			var entryTitle = entrySecondary.getElementsByTagName('h2')[0].innerHTML;
			var spans1 = entrySecondary.getElementsByTagName('span');
			var spans2 = spans1[0].getElementsByTagName('span');
			if(spans1.length > 0)
			{
				if(spans2.length > 0)
				{
					snippet = spans2[0].innerHTML.substr(0,100);
				}
			}
			var entryOriginal = entry.childNodes[0].childNodes[2].getElementsByTagName('A')[0];
			entryTitleLink = entryOriginal;

		}
		snippet = snippet.replace(/\s+$/g, "");	// trim trailing whitespace on snippet
		snippet = snippet.replace(/[ ]{2,}/g, " ");	// remove extra whitespace anywhere
		arrayEntries[i] = entryTitle + " " + snippet;
		arrayAnchors[i] = entryTitleLink;
	}

	arrayEntries = arrayEntries.removeDuplicate(arrayAnchors);
	arrayAnchors = arrayAnchors.removeDupLinks();
	var rdNode = document.getElementById('btnRemoveDupes');
	if (rdNode)
	{
		var whichMess = rdNode.firstChild.nodeValue;
		if (whichMess.match(/Refresh/i))
		{
			var tablerefresh = document.getElementById('viewer-refresh');
			var oEvent = document.createEvent("MouseEvents");
			oEvent.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, tablerefresh);
			tablerefresh.dispatchEvent(oEvent);
		}
	}
	console.log("Done.");
}

addButtonRemoveDupes = function ()
{
	var rdID = "btnRemoveDupes";
	var dupeMessages = [
		"Remove Dupes+Refresh",
		"Remove Dupes Only",
	];
//	var tablerefresh = document.getElementById('viewer-refresh');
	var tablerefresh = document.getElementById('stream-prefs-menu');
	if(tablerefresh && !document.getElementById(rdID))
	{
//		var parent = document.getElementById('viewer-top-links');
		var parent = tablerefresh.parentNode;
		var dupeNode = document.createElement('button');
		dupeNode.setAttribute("id", rdID);
		dupeNode.appendChild(document.createTextNode(dupeMessages[0]));
		dupeNode.addEventListener('click', removeDupes, true);
		dupeNode.addEventListener('contextmenu',
			function () {
				var rdNode = document.getElementById(rdID);
				if (rdNode)
				{
					var whichMess = rdNode.firstChild.nodeValue;
					var newMessIndex = 0;
					if (whichMess == dupeMessages[1])
					{
						newMessIndex = 1;
					}
					rdNode.firstChild.nodeValue = dupeMessages[newMessIndex ^ 1];
				}
			},
			true);
		var divNode = document.createElement('div');
		divNode.appendChild(dupeNode);
		parent.insertBefore(divNode, tablerefresh.nextSibling);
	}
	else
	{
		window.setTimeout(addButtonRemoveDupes, 2000);
	}
}

window.addEventListener( "load", addButtonRemoveDupes, false );
