/*
Geocaching Seek Log - v1.1 2007-01-02
(c) 2007, Prime Suspect Software

Greasemonkey user script: see http://greasemonkey.mozdev.org

Compatible with Greasemonkey 0.6.4.

Adds a link to log any cache from the search list page.

Change Log:

* (v1.1) Fix to accomodate longer waypoint IDs.

* (v1.0) Initial release.

*/

// ==UserScript==
// @name             GC Seek Log
// @description      (v1.1) Adds a link to log any cache from the search list page
// @namespace        http://gmscripts.locusprime.net/
// @include          http://www.geocaching.com/seek/nearest.aspx*
// ==/UserScript==


(function() {

	// Log icon string.
	var LogImg = 		
		'data:image/gif;base64,R0lGODlhEAAQAMQVAOPj44G0TqPWcObm5tLS0u' +
		'Dg4NnZ2dTU1NbW1ujo6NDQ0Ovr68%2FPz9vb297e3u3t7fX19crJyYuKikx%' +
		'2FGJmZmf%2F%2F%2FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5' +
		'BAEAABUALAAAAAAQABAAAAVeYCWOZDWdJaWu6iRM1EhBdH26tzg%2FSzIALk' +
		'FgONFBFioA5RbIVWY%2BQMHRMEyaEYlxQCmsELesUUo1IA4EBUP8BETebzSc' +
		'XZHY7%2BmsvZRaa%2Fl8FHSAJBR%2FhCmIioslIQA7';		

	// Generate list of cache links.
	var xPathSearch = "//a[contains(@href, 'seek\/cache_details.aspx')]";
	var allCacheLinks = document.evaluate(
			xPathSearch,
			document,
			null,
			XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
			null);

	// Loop through list of cache links.
	var ic = allCacheLinks.snapshotLength;
	for (var i = 0; i < ic; i++) {
		
		// Get cache description.
		var thisLink = allCacheLinks.snapshotItem(i);		
		var thisText = thisLink.nextSibling;
		var CacheDesc = thisText.data;

		// Extract waypoint ID from description.
		var RegEx1 = new RegExp('[(](.*?)[)]$');
		RegRslt = RegEx1.exec(CacheDesc);
		var WptID = RegRslt[1];

		// Create logging url.
		LogUrl = 'http://www.geocaching.com/seek/log.aspx?ID=' + WptToID(WptID);
		
		// Create icon image.
		var iconImage = document.createElement('img');
		iconImage.align = 'absbottom';
		iconImage.src = LogImg;
		iconImage.border = 0;

		// Create span.
		var logSpan = document.createElement('span');
		logSpan.style.whiteSpace = 'nowrap';
		logSpan.title = 'Log This Cache';
		logSpan.appendChild(document.createTextNode('\u00A0'));

		// Create image logging link.
		var logImgLink = document.createElement('a');
		logImgLink.href = LogUrl;
		logImgLink.appendChild(iconImage);

		// Add link to span.
		logSpan.appendChild(logImgLink);
		
		// Add span to page.
		thisText.parentNode.insertBefore(logSpan, thisText.nextSibling);

	}


// -------------------- Functions -------------------- //


	//  Convert Waypoint to ID number.
	function WptToID(Wpt) {
		var BASE_GC = "0123456789ABCDEFGHJKMNPQRTVWXYZ";
		var BASE_31 = "0123456789ABCDEFGHIJKLMNOPQRSTU";
		var WptWork, Wpt31 = '', idNum;	
		// Strip off leading 'GC'.
		WptWork = Wpt.replace(/^GC/,'');
		// If old-style base-16 value.
		if ((WptWork.length <= 4) && (WptWork.search(/^(\d|[A-F]).*/)) >= 0) {
			idNum = parseInt(WptWork, 16);
		// If new-style base-31 value.
		} else {
			for (var i = 0; i < WptWork.length; i++) {
				Wpt31 += BASE_31.substr(BASE_GC.indexOf(WptWork.substr(i, 1)), 1);
			}
			idNum = parseInt(Wpt31, 31) - 411120;
		}
		return idNum;	
	}

	
})();

