// ==UserScript==
// @name Wishlist Buddy
// @namespace http://www.wishlistbuddy.com/
// @description Adds Wishlist Buddy tagging to Amazon's Wish List pages
// @include http://*.amazon.*/gp/registry/*
// @include http://amazon.*/gp/registry/*
// @include http://*.amazon.*/gp/registry/wishlist/*
// @include http://amazon.*/gp/registry/wishlist/*
// @include http://wishlistbuddy.com/*
// @include http://*.wishlistbuddy.com/*
// @include http://wishlistmonitor.com/*
// @include http://*.wishlistmonitor.com/*
// @include http://wishlistwatchdog.com/*
// @include http://*.wishlistwatchdog.com/*
// ==/UserScript==
/*
	Wishlist Buddy
	(C) 2006-2008 Thom Wetzel

	www.lmnopc.com
	www.wishlistbuddy.com

	Release History
	---------------

	2006-11-06 : Original release for amazon.com users
	2007-04-08 : Update for amazon.co.uk users
	2008-03-08 : 
		* Updated to work with updated Amazon.com setup 
		* Redid the graphics and style of the embedded controls

*/
(function() {

	// standard functions
	function getTime() { benchmarkTimer = new Date(); return benchmarkTimer.getTime(); }
	var $ = function(id) { return document.getElementById(id); }

	// grab start time of script
	var benchmarkTimer = null;
	var scriptStartTime = getTime();

function doAmazon()
{
	// don't run in IE (disables Turnabout)
	if (document.all) {
		return false;
	}

	// add custom style rules to page
	GM_addStyle(<><![CDATA[
		tr.wlbtag td {
			background: #66AA33 url(data:image/gif;base64,R0lGODlhSABAALMAAGaqM3K%2BOn3CSYXHVZbObKHUfKjWhbfdmr7hpcvnt9ruzOTy2u335vP57v7%2B%2FgAAACwAAAAASABAAAAE%2FjDISau9mILNu%2F9gl40kGZ6oWK6slL5gK5dwvc14ZsN5b%2B0pn3ACPA2PxdhxmPQskc3bkxmdQpPWKzCrtXG7vC%2FVKx6Hy0LyimDIHNqVd0BwGOBqE8NBMjgQJAQHAg0OfxcOChaIAQeLdy8TCQ52Bo4KDQEGCRmOFIsDCoYWgSOQEpV%2Fkg4Sn6KBooh9BgKsiQIEdgF9dbqSuDooEwMOCAEMDpMEDnsKqwELiA2JAQ6EyNOLynvKDNB9yMulRhPSw5IHjX%2FNAcrFArnV6s7Z4c20uQiFucBKEs2o0tYFWDeogaAJluYl0sbIwQJRjViEoNAImgAF3Rb4czYAWoMC%2FrU2hmTIiNACWhElfqCgzGFDYiInECBkJ%2BHIcBIESNqUUqUKhA42tTQkkADKQtSmCZTGDqehRT19Spnwbw6yXAIXSHOZNOY6hgUcHvvTSAEcqRUC5UKXZ88cBAoOMoKjB1CdPoYIKEhgSGeoGRzK4LUgZ8nUEYHQ7StB0tM0wysagdu0BqfjJ4fdIG1mZ4DROb%2FsVnKry08rYaJ8Rkaaz066pm6hgXMr%2BVqA1hK0yvg5olECBA0ov2ZYqQ3DYbY%2BwaRGeYWTErWDHv3DMB8thsqeTmPAoOlZE89JDA83npkzhq%2B73p6Em8ZK6Ei7lh94njxSAY6GHejmvF9vpO00qvTHaALSt8cwxVTymFaW8fOeeA4104Ad3BwDU0EMUgaNhAzQ8pKHDj44Qh8KxAXiAQog4JkhAySgwAAFuCUAXLg8pkxzGASBBgkCaLXYDzrumMExIIU4kZAZFPBjBXggmYMaTrawQ5S7TUllf1ZeKc4WWhrZZJdAYgEmk1WMSUQUAJjpApppmslmZle%2BCWeUcs6JZJ127ohnnmXsyecXfv6ZRaCCTkHoBhEAADs%3D) 0 50% no-repeat;
			padding: 5px 10px 5px 76px; 			
			border: 5px solid #72BE3A;
			color: #ffffff;
		}		
		tr.wlbtag a img {
			cursor: pointer;
		}
		tr.wlbtag td input,
		tr.wlbtag td,
		tr.wlbtag td select {
			font-size: 12px;
		}
		tr.wlbtag td img {
			border: none;
			float: left;
			margin: 0 10px 0 0;
		}
		tr.wlbtag td a img {
			padding: 0 10px;
			margin: 0;
		}
		tr.wlbtag td span {
			line-height: 20px;
			float: left;
		}
		div#wbThrobber {
			background: #66AA33 url(data:image/gif;base64,R0lGODlhSABAALMAAGaqM3K%2BOn3CSYXHVZbObKHUfKjWhbfdmr7hpcvnt9ruzOTy2u335vP57v7%2B%2FgAAACwAAAAASABAAAAE%2FjDISau9mILNu%2F9gl40kGZ6oWK6slL5gK5dwvc14ZsN5b%2B0pn3ACPA2PxdhxmPQskc3bkxmdQpPWKzCrtXG7vC%2FVKx6Hy0LyimDIHNqVd0BwGOBqE8NBMjgQJAQHAg0OfxcOChaIAQeLdy8TCQ52Bo4KDQEGCRmOFIsDCoYWgSOQEpV%2Fkg4Sn6KBooh9BgKsiQIEdgF9dbqSuDooEwMOCAEMDpMEDnsKqwELiA2JAQ6EyNOLynvKDNB9yMulRhPSw5IHjX%2FNAcrFArnV6s7Z4c20uQiFucBKEs2o0tYFWDeogaAJluYl0sbIwQJRjViEoNAImgAF3Rb4czYAWoMC%2FrU2hmTIiNACWhElfqCgzGFDYiInECBkJ%2BHIcBIESNqUUqUKhA42tTQkkADKQtSmCZTGDqehRT19Spnwbw6yXAIXSHOZNOY6hgUcHvvTSAEcqRUC5UKXZ88cBAoOMoKjB1CdPoYIKEhgSGeoGRzK4LUgZ8nUEYHQ7StB0tM0wysagdu0BqfjJ4fdIG1mZ4DROb%2FsVnKry08rYaJ8Rkaaz066pm6hgXMr%2BVqA1hK0yvg5olECBA0ov2ZYqQ3DYbY%2BwaRGeYWTErWDHv3DMB8thsqeTmPAoOlZE89JDA83npkzhq%2B73p6Em8ZK6Ei7lh94njxSAY6GHejmvF9vpO00qvTHaALSt8cwxVTymFaW8fOeeA4104Ad3BwDU0EMUgaNhAzQ8pKHDj44Qh8KxAXiAQog4JkhAySgwAAFuCUAXLg8pkxzGASBBgkCaLXYDzrumMExIIU4kZAZFPBjBXggmYMaTrawQ5S7TUllf1ZeKc4WWhrZZJdAYgEmk1WMSUQUAJjpApppmslmZle%2BCWeUcs6JZJ127ohnnmXsyecXfv6ZRaCCTkHoBhEAADs%3D) 0 50% no-repeat;
			color: #ffffff;
			border: 5px solid #72BE3A;
			position:fixed;
			_position: absolute;
			top: 0;
			_top:expression(eval(document.body.scrollTop));
			right:0;
			margin:0;
			padding: 1px 10px 1px 76px; 
			overflow: auto;
		}
		div#wbThrobber span {
			padding: 1px 24px 1px 4px;
			line-height: 30px;
			float: left;
			background: transparent url(data:image/gif;base64,R0lGODlhEAAQAPQAAGaqM%2F%2F%2F%2F26uPqvQj3ezStTmxrTVnP%2F%2F%2F8ngt%2Bjy4ZfFdIy%2FZvL37qDKgfv8%2Bt3s0r%2FbqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAkKAAAALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx%2BlwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6%2F3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh%2BQQJCgAAACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI%2ByioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l%2FAg1AXySJgn5LcoE3QXI3IQAh%2BQQJCgAAACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK%2Fe8LRIHn%2Bi1cK0IyKdg0VAoljYIg%2BGgnRrwVS%2F8IAkICyosBIQpBAMoKy9dImxPhS%2BGKkFrkX%2BTigtLlIyKXUF%2BNjagNiEAIfkECQoAAAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkECQoAAAAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK%2BVgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAkKAAAALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq%2BKPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2%2FQ4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAkKAAAALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm%2BkaCxyxa%2BzRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh%2BQQJCgAAACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb%2BA41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh%2BQQJCgAAACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ%2FDkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA%3D%3D) 100% 50% no-repeat;
		}
	]]></>);

	// don't do anything unless the page is a wish list
	if (String(document.title).indexOf('Your Wish List') == -1)
	{
		return;
	}

	var wbUserId = GM_getValue('wbUserId', '');
	var wbWishlistId = GM_getValue('wbWishlistId', '');

	if ((wbUserId == '') || (wbWishlistId == ''))
	{
		alert('You must have an account at www.wishlistbuddy.com before using the Wishlist Buddy Greasemonkey Script.');
		return false;
	}

	// keep list of asins on the page
	var asinList = new String('');

	// add ajax loading throbber to page
	var throbber = document.createElement('div');
	throbber.setAttribute('id', 'wbThrobber');
	throbber.innerHTML = '<span id="wbThrobberText">Working</span>';
	document.getElementsByTagName('body')[0].appendChild(throbber);

	// find all the items on the page
	var version = 0;
	var host = String(window.location.host);
	if (host.indexOf('amazon.com') != -1)
	{
		version = 2008;
		var xpath = '/html/body/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/table/tbody/tr[2]/td/form/table/tbody';
		var currencySymbol = '$';
	}
	else if (host.indexOf('amazon.co.uk') != -1)
	{
		var xpath = '/html/body/table[2]/tbody/tr[3]/td[2]/table/tbody/tr[3]/td/form/table/tbody/tr[1]/td[2]';
		var currencySymbol = '&pound;';
	}
	else
	{
		alert('Please contact Thom Wetzel at Wishlist Buddy to tell him you want to use the script in your country but it\'s not supported!');
		return;
	}

	var items = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (item = null, i = 0; item = items.snapshotItem(i); i++)
	{
		// find ASIN in the price span
		var asin = item.getElementsByTagName('a');
		if (typeof(asin) != 'object') continue;
		asin = asin[0];							// grab the first anchor
		if (!asin) continue;
		asin = asin.getAttribute('href');		// get the value of the href attribute
		if (!asin) continue;
		asin = String(asin).split('/');			// split the contents of the name attribute into array elements
		if (!asin) continue;
		asin = asin[5];							// grab the ASIN from the array

		// add the new asin to asinList
		if (asinList.length) { asinList += ','; }
		asinList += asin;

		if (version == 2008)
		{
			// setup row
			var row = document.createElement('tr');
			row.setAttribute('class', 'wlbtag');

			// setup cell
			var cell = document.createElement('td');
			cell.setAttribute('colspan', '3');
			cell.innerHTML = '<span>Alert me when this item <select id="' + asin + '_condition"><option value="0" selected>new or used</option><option value="1">new</option></select> hits ' + currencySymbol + '  <input type="text" size="8" id="' + asin + '_price" class="curr" value="" /></span><a id="' + asin + '_update"><img src="http://www.wishlistbuddy.com/img/update_button.gif" width="53" height="20" /></a>';

			// add cell to row
			row.appendChild(cell);
			
			// Normal items have 19 trs, the last one only has 18
			if (item.getElementsByTagName('tr').length == 19)
			{
				item.insertBefore(row, item.childNodes[item.childNodes.length - 2]);
			}
			else
			{
				item.appendChild(row);
			}
		}
		else
		{
			// setup row
			var row = document.createElement('tr');
			row.setAttribute('class', 'wlbtag');

			// setup cell
			var cell = document.createElement('td');
			cell.innerHTML = '<img src="http://www.wishlistbuddy.com/img/alerticon.gif" alt="WishlistBuddy Icon" /><span>Alert me when this item <select id="' + asin + '_condition"><option value="0" selected>new or used</option><option value="1">new</option></select> hits ' + currencySymbol + '  <input type="text" size="8" id="' + asin + '_price" class="curr" value="" /></span><a id="' + asin + '_update"><img src="http://www.wishlistbuddy.com/img/update_button.gif" width="53" height="20" /></a>';

			// add cell to row
			row.appendChild(cell);

			// add row to table
			item.appendChild(row);
		}

		// plug in event handler for clicking update button
		$(asin + '_update').addEventListener('click', function(event) {

			$('wbThrobberText').innerHTML = 'Saving';
			$('wbThrobber').style.display = 'block';

			// parse target id to get the asin
			var asin = String(event.currentTarget.getAttribute('id')).split('_');
			asin = asin[0];

   		// grab the price and condition of the selected item
   		var price = $(asin + '_price').value;
   		var condition = $(asin + '_condition').selectedIndex;

			// grab asin, price, condition and transmit them back to wb
			var wbUrl = 'http://www.wishlistbuddy.com/greasemonkey/transmit.php?user=' + escape(wbUserId) + '&wishlist=' + escape(wbWishlistId) + '&asin=' + escape(asin) + '&price=' + escape(price) + '&condition=' + escape(condition);
			GM_xmlhttpRequest({
			    method: 'GET',
			    url: wbUrl,
			    headers: {
			        'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.3',
			        'Accept': 'application/atom+xml,application/xml,text/xml',
			    },
			    onload: function(responseDetails) {

			    		if (responseDetails.responseText == '1')
			    		{
			    			// alert('Saved!');
			    		}
			    		else
			    		{
			    			alert(responseDetails.responseText);
			    		}
		    			$('wbThrobber').style.display = 'none';
		    			return false;
			    }
			});

			return false;

      	}, true);

	}

	// AJAX communication - fetch your tags for this page
	var wbUrl = 'http://www.wishlistbuddy.com/greasemonkey/fetch.php?user=' + escape(wbUserId) + '&asin=' + escape(asinList);
	GM_xmlhttpRequest({
	    method: 'GET',
	    url: wbUrl,
	    headers: {
	        'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.3',
	        'Accept': 'application/atom+xml,application/xml,text/xml',
	    },
	    onload: function(responseDetails) {
	        var parser = new DOMParser();
	        var dom = parser.parseFromString(responseDetails.responseText,
	            "application/xml");
	        var items = dom.getElementsByTagName('item');
	        for (var i = 0; i < items.length; i++)
	        {
	            var asin = items[i].getElementsByTagName('asin')[0].textContent;
					var condition = items[i].getElementsByTagName('new')[0].textContent;
					var price = items[i].getElementsByTagName('price')[0].textContent;

	            $(asin + '_price').value = price;

            	$(asin + '_condition').options[0].selected = (condition == '0');
            	$(asin + '_condition').options[1].selected = (condition == '1');
	        }

	        // hide throbber
	        $('wbThrobber').style.display = 'none';
	    }
	});

}


function doWishlistBuddy()
{
	// this function just grabs the user's user_id and wishlist_id for
	// use in the doAmazon() function

	var wbUserId = $('user-id').innerHTML;
	var wbWishlistId = $('wishlist-id').innerHTML;

	if (wbUserId != '')
	{
		GM_setValue('wbUserId', wbUserId);
	}

	if (wbWishlistId != '')
	{
		GM_setValue('wbWishlistId', wbWishlistId);
	}
}

	// call function based on what site we're on
	var href = window.location.host;
	if (String(href).indexOf('wishlistbuddy') > -1)
	{
		doWishlistBuddy();
	}
	else if (String(href).indexOf('amazon') > -1)
	{
		doAmazon();
	}

	// log execution time
	GM_log((getTime() - scriptStartTime) + 'ms');

})();