/*
Geocaching Log Maximizer - v02.90 2010-08-05
(c) 2010, Prime Suspect Software

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

Function:
 Allows user to resize text entry box on log pages. Also keeps
 user from trying to submit a log when a log type has not been
 selected, or no log text has been entered.

 Tracks number of characters entered into log. Shows number of
 remaining characters before hitting maximum of 4,000.

Usage:
 Use the arrow icons (next to the smilie button) to adjust the size
 of the text entry box. The Submit Button Validation function is
 controlled by the asterisk icon. Click the icon to turn the validation
 off. The icon will change to a X-ed circle. Click again to turn the
 validation back on.

Features:
 Separate settings are maintained for each member profile that uses the PC.

Change Log:
* v02.90 2010-08-05 Added Auto-Visit function for trackables.

* v02.82 2010-07-30 Fix for site change. Added option to always open with
		smilie bar displayed. 

* v02.81 2010-05-18 Minor fix to make sure it works with other scripts.

* v02.80 2010-05-06 Fix for work with trackable logs.

* v02.70 2010-02-24 Fix for site change. Added update notification.

* v02.06 2010-02-13 Restored ability to hide/show inventory list.

* v02.05 2010-01-21 Update for site changes. Removed left/right arrows, as
	the text box now auto-resizes to screen width.

* v02.04 2009-08-03 Removed 2 lines of text explaining encryption function.

* v02.03 2009-02-04 Minor change to support the PDA Field Notes script.

* v02.02 2008-11-10 Added menu option to select font for text area. Choose the
	font from the font list, and select "Use currently selected font for text
	area" from the Greasemonkey menu. Added "Smiley Bar" to replace the pop-up
	window.

* v02.01 2008-07-27 Added coordinate paste-box.

* v02.00 2008-07-24 Added edit controls for Bold, Italics, Strikethrough,
	Fonts, Text Color, and Hyperlinks. Added Date Detection, to notify when
	selected date is not the current date. Added ability to rename the months
	to that of other languages. Added control to change selected date to
	current date. Added menu option to control if inventory is initially
	hidden or shown. Fix to accommodate website changes.

* v01.05 2007-10-09 Minor fix to accommodate website changes.

* v01.04 Minor fix to accommodate website changes.

* v01.03 Cosmetic update. Replaced text-based controls with icon images from
	the famfamfam.com "Silk" icon collection. Pretty!

* v01.02 Text quoting added. Copy text to text box and click ">". Line breaks
  will be added at the approxomate line width, and each line prepended with
  a ">".

* v01.01 Bug inventory is hidden, and inventory count added next to submit
  button if inventory not empty. Click on inventory count to show/hide
  the inventory selector box.

* v01.01 Remaining Characters display added. Count now included in validating
  submission. Turn on/off by clicking the # symbol. Automatically turns on when
  count is below 100.

* v01.00 Initial release


// ==UserScript==
// @name           GC Log Maximizer
// @description    (v02.90) GC Log Maximizer
// @namespace      http://gmscripts.locusprime.net/
// @include        http://*.geocaching.com/seek/log.aspx*
// @include        http://*.geocaching.com/track/log.aspx*
// @include        http://*.geocaching.com/*%2F*log.aspx*
// @require        VrChk.js
// ==/UserScript==

*/

// ------------------------Version Checking------------------------ //
fCheckScriptVersion('8394e685-d38b-4e11-93ef-9bed810a12ae', '02.90');
// ------------------------Version Checking------------------------ //

	//  Trim functions.  Use as yyy = xxx.trim();
	String.prototype.trim=function() {
		return this.replace(/^\s*|\s*$/g,'');
	}
	String.prototype.ltrim=function() {
		return this.replace(/^\s*/g,'');
	}
	String.prototype.rtrim=function() {
		return this.replace(/\s*$/g,'');
	}


	//  Get currently signed-on geocaching.com profile.
	var e_LogIn = document.getElementById("ctl00_LoginUrl");
	if (e_LogIn.firstChild.data != 'Log out') { return; }
	SignedInAs = e_LogIn.parentNode.childNodes[1].firstChild.data;
	SignedInAs = SignedInAs.replace(/<\&amp;>/g, '&');


	//  Quote Length. Determines where to look for a word break.
	var ql = 74;

	//  Initialize values.
	var redAlert = false;
	var maxLogLen = 4000;
	var contextTimerSwitch = false;
	var lastVal = 0;
	var txtFocused = false;
	var bShowInventory = (GM_getValue('HideInventory' + SignedInAs, 'On') == 'Off');
	var bHideSmilieBar = (GM_getValue('HideSmilieBar' + SignedInAs, 'On') == 'On');
	var ByPass = false;


	//  Create tools options.
	GM_registerMenuCommand('Log Editor: Change Selection Auto-Trim Setting', fSetAutoTrim);
	GM_registerMenuCommand('Log Editor: Customize Month Names', fSetMonthNames);
	GM_registerMenuCommand('Log Editor: Set Date Detection Status', fSetDateDetection);
	GM_registerMenuCommand('Log Editor: Change Block Quote Action', fSetBlockQuoteAction);
	GM_registerMenuCommand('Log Editor: Set Initial Smilie Bar to Hide or Show', fSetHideSmilieBar);
	GM_registerMenuCommand('Log Editor: Set Initial Inventory to Hide or Show', fSetHideInventory);
	GM_registerMenuCommand('Log Editor: Use Currently Selected Font for Text Area', fSetTextAreaFont);


	var imgCalendar =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAHOSURBVDjLpZOxa1RBEIe%2Fd%2Fe8FKeFEA2IGBWCICZYBSESBCFglUDSCJZaRBBb" +
		"K1HQ0s4%2FQQlCgoKdoBA9sVBshCBETCNRiUUg5PDt7MxY7HuXdxgEycKwyzJ88%2FvN7G" +
		"buzl5WDvDozeZtd66p21EzQw2iGaqGmhPVaqFodNTs%2Ff0rI%2BM5gLnfmB0%2FMPg%2F" +
		"le88%2BTLWU6BmgwDtpevgDhrBFETSORQgAQoBEbZvvUJEB2qAqg8ORw6BxRQeS0gBUkAM" +
		"sPIdAIm60wNVKwEZrG%2BAW1JilpRotQNDQwCEOiCWgIXhe1w%2Bf%2Fif3hffrXMhxH4F" +
		"ooa5kzdT0rNPi3TWlrl6bp7PP1d4ufqCiyNTzIzOUYiz1RWCJECjsuBA3swAmBmdoxu6AP" +
		"za3uDB9EM6a8sAFFEJYsRoOwBRww3yxt%2BSu6FLq9nqAQuxst11QDTcnX2lhc7XVO3jtw" +
		"8cOzjMzafzTJ26RJUL0B7Ia020dNlsJAsTJyaZODlZziVj%2BswsWZb1AarJJUCMeCnn8e" +
		"sfaWruiIKoEtQIkry3mlUx%2Bqfg7owd389prd6%2B9%2F7CbsvMrfaQ%2FO3dhdWzQa0t" +
		"UZGoaDREjahxV8Dm1u%2FnANlev%2FMfAjw0JrMu09AAAAAASUVORK5CYII%3D";

	var imgArrowLeft =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAADrSURBVDjLY%2Fz%2F%2Fz8DJYCJgUIwyAwoPZHJBsS7STGABY1%2F9e%2BfvzKkGM" +
		"AIiwWgzRfF2ST0%2Fvz5w%2FDw%2FUOGXz9%2FM%2Fz6AcK%2FGH4CMZj%2BjmCD5C70X2" +
		"VkgWo%2BKcYqrqfArcTw598fBhluOTD9%2B%2B9fIP7N8PsfEP%2F9AxUD0b8ZVq9ci%2F" +
		"AC0Nm%2F%2FzD%2BYfj19xdY0R%2Bgot9gxb8RNNQAkNyf%2F0CxX39QvZC5M%2B68MJuI" +
		"AQczJ8PDlw8ZXr9%2Fg9XZIK%2BBNP%2F5%2FYfh%2FsJHjIzIKTF2VchNoEI5oAbHDWk7" +
		"TpAcjUDNukDNB4nVjOKFEZwXAOOhu7x6WtPJAAAAAElFTkSuQmCC";

	var imgArrowRight =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAADvSURBVDjLY%2Fz%2F%2Fz8DJYCJgUIwxAwImOWx22uSExvZBvz68cvm5%2FdfV5HF" +
		"GEGxUHoiExwVf%2F%2F8Zfjz%2Bw%2FD719%2FGH79%2FA3UAMK%2FGH4CMYiWFJJk%2BP" +
		"XrN8PN27cunWq%2FoA%2FSwwIzyUrYluHvP6AB%2F%2F7A8e%2B%2Ff4H4N8Pvf0D8Fyb2" +
		"h%2BHLl696WllqJ69Nu2XOArMZpBCuGajoN1jxbwT9FyH36%2FdvkCt%2Fw10Acvb%2Bh3" +
		"uxOhvoZzCbi4OLQVJSiuH1q9cMt2%2FcvXB7zj0beBgQAwwKtS2AFuwH2vwIqFmd5Fi40H" +
		"%2F1BFDzQaBrdTFiYYTnBQAI58A33Wys0AAAAABJRU5ErkJggg%3D%3D";

	var imgArrowUp =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAEGSURBVDjLpZM%2FLwRRFMXPspmEaGc1shHRaiXsJ5GIRixbCr6SikxIlqgJM5UohI" +
		"iGdofovHf%2FPZVmYwZvTntPfjnn3txWCAFNNFE33L%2FZKXYv%2B1dRgL3r7bu0PbucJp" +
		"3e4GLjtsrXGq9wkA8SU7tPk87i%2FMwCzAyP5QNeytcnJl46XMuoNoGKDoVlTkQhJpAgmJ" +
		"qcBjnqkqPTXxN8qz9cD6vdHtQMxXOBt49y5XjzLB%2F3tau6kWewKiwoRu8jZFvn%2BU%2" +
		"B%2BGgCBlWFBQY4qr1ANcAQxgQaFjwH4TwYrQ5skYBOYKbzjiASOwCrNd2BBwZ4jAcowGJ" +
		"gkAuAZ2dEJhAUqij%2F%2Fwn%2F1BesSumImTttSAAAAAElFTkSuQmCC";

	var imgArrowDown =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAENSURBVDjLpZM%2FSwNREMTnxBRpFYmctaKCfwrBSCrRLuL3iEW6%2BEEUG8XvIVjY" +
		"WNgJdhFjIXamv3s7u%2FssrtO7hFy2fcOPmd03SYwR88xi1cPgpRdjjDB1mBquju%2BTMt" +
		"1CFcDd0V7q4GilAwpnd2A0qCvcHRSdHUBqAYgOyaUGIBQAc4fkNSJIIGgGj4ZQx4EEAY3w" +
		"aPUiSC5FhLoOQkbQCJvioPQfnN2ctpuNJugKNUWYsMR%2FgO71yYPk8tRaboGmoCvS1RQ7" +
		"%2Fc1sq7f%2BOBUQcjkPGb9%2BxmOoF6ckCQb9pmj3rz6pKtPB5e5rmq7tmxk%2BhqO34e" +
		"1or0yXTGrj9sXGs1Ib73efh1WaZN46%2FwI8JLfHaN24FwAAAABJRU5ErkJggg%3D%3D";

	var imgValidateOn =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAKfSURBVDjLpZPrS1NhHMf9O3bOdmwDCWREIYKEUHsVJBI7mg3FvCxL09290jZj2EyL" +
		"MnJexkgpLbPUanNOberU5taUMnHZUULMvelCtWF0sW%2Fn7MVMEiN64AsPD8%2Fn83uucQ" +
		"Di%2Fid%2FDBT4Dolypw%2Fqsz0pTMbj%2FWHpiDgsdSUyUmeiPt2%2BV7SrIM%2BbSss8" +
		"ySGdR4abQQv6lrui6VxsRonrGCS9VEjSQ9E7CtiqdOZ4UuTqnBHO1X7YXl6Daa4yGq7vWO" +
		"1D40wVDtj4kWQbn94myPGkCDPdSesczE2sCZShwl8CzcwZ6NiUs6n2nYX99T1cnKqA2EKu" +
		"i6%2BTwphA5k4yqMayopU5mANV3lNQTBdCMVUA9VQh3GuDMHiVcLCS3J4jSLhCGmKCjBEx" +
		"0xlshjXYhApfMZRP5CyYD%2BUkG08%2Bxt%2B4wLVQZA1tzxthm2tEfD3JxARH7QkbD1Zu" +
		"ozaggdZbxK5kAIsf5qGaKMTY2lAU%2FrH5HW3PLsEwUYy%2BYCcERmIjJpDcpzb6l7th9K" +
		"tQ69fi09ePUej9l7cx2DJbD7UrG3r3afQHOyCo%2BV3QQzE35pvQvnAZukk5zL5qRL59js" +
		"KbPzdheXoBZc4saFhBS6AO7V4zqCpiawuptwQG%2BUAa7Ct3UT0hh9p9EnXT5Vh6t4C22Q" +
		"aUDh6HwnECOmcO7K%2B6kW49DKqS2DrEZCtfuI%2B9GrNHg4fMHVSO5kE7nAPVkAxKBxcO" +
		"zsajpS4Yh4ohUPPWKTUh3PaQEptIOr6BiJjcZXCwktaAGfrRIpwblqOV3YKdhfXOIvBLeR" +
		"EWpnd8ynsaSJoyESFphwTtfjN6X1jRO2%2BFxWtCWksqBApeiFIR9K6fiTpPiigDoadqCE" +
		"ag5YUFKl6Yrciw0VOlhOivv%2FFf8wtn0KzlebrUYwAAAABJRU5ErkJggg%3D%3D";

	var imgValidateOff =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAHdSURBVDjLpZNraxpBFIb3a0ggISmmNISWXmOboKihxpgUNGWNSpvaS6RpKL3Ry%2F" +
		"%2FMh1wgf6PElaCyzq67O09nVjdVlJbSDy8Lw77PmfecMwZg%2FI%2FGDw3DCo8HCkZl%2" +
		"FRlgGA0e3Yfv7%2BDbAfLrW%2BSXOvLTG%2BSHV%2FgPbuMZRnsyIDL%2FOASziMxkkKkU" +
		"QTJJsLaGn8%2FiHz6nd%2B8mQv87Ahg2H9Th%2FBxZqxEkEgSrq%2FiVCvLsDK9awtvfxb" +
		"2zjD2ARID%2BlVVlbabTgWYTv1rFL5fBUtHbbeTJCb3EQ3ovCnRC6xAgzJtOE%2BztheYI" +
		"EkqbFaS3vY2zuIj77AmtYYDusPy8%2FzuvunJkDKXM7tYWTiyGWFjAqeQnAD6%2B7ueNx%" +
		"2FFLpRGAru7mcoj5ebqzszil7DggeF%2FDX1nBN82rzPqrzbRayIsLhJqMPT2N83Sdy2GA" +
		"pwFqRN7jFPL0tF%2B10cDd3MTZ2AjNUkGCoyO6y9cRxfQowFUbpufr1ct4ZoHg%2BDg067" +
		"zduTmEbq4yi%2FUkYidDe%2BkaTcP4ObJIajksPd%2Feyx3c%2BN2rvPbMDPbUFPZSLKzc" +
		"GjKPrbJaDsu%2BdQO3msfZzeGY2TCvKGYQhdSYeeJjUt21dIcjXQ7U7Kv599f4j%2FoF55" +
		"W4g%2F2e3b8AAAAASUVORK5CYII%3D";

	var imgEmailQuote =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM1MO6znw" +
		"AAAYBJREFUOE%2BNk8tKw0AUhq0%2BhBsLvkNLX0VUXOjCSlcq6HsI7SIqIi6kuNAilC5c" +
		"u3DrG2hs0tzM%2FdrL75zBtKFNjYGfmcyc%2F8s5kzOlldmzwabrTGuZtbypyhY%2FmSbz" +
		"m5UoiqzhcDgejUbIE9tHs9m8YMZNptV5QI3MnufB9%2F2pbNuGaZpQFIVDZVlGq9VagJQY" +
		"rUYBYRgijmM%2BklzXhWVZUFWVA4IgAH1EEIQUwhPhAMtPuDkVAcjgOA40TVsoizzZMngG" +
		"qeo9Hac9Dbod8nKoFF3XeSaSJPG4PwGNrobzFx3HHRWqGXAIZULnYRhGMUAyYxw%2BKjjp" +
		"qthrD9B5M3g5dCYEKsyAAt4%2FfOzeSzh7VrBz8wXPjziEVAjoGxEO7vpoPAywdS3i6dWY" +
		"Hi71QyFg%2F7aPo7aM%2BpUIzYqQJAkXmf8F2L4UURdEfNszcwqhsTCD9Hey7kSelgEmy%" +
		"2B5Bzvp4vg%2BqrAN9Frj0MmUgYxbrMkAl24ll9lL9pVKLFonM5R8w%2BXfvhb07FwAAAA" +
		"BJRU5ErkJggg%3D%3D";

	var imgBlockQuote =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAEvSURBVDjLY%2Fj%2F%2Fz8DJZiBagZEtO8QAuKlQPwTiP%2FjwbuAWAWbARtXHrz1" +
		"%2F%2Fefv%2F%2FxgS0n74MMuQ3EbHADgBweIP7z99%2B%2F%2Fx%2B%2B%2Ffv%2F8tO%" +
		"2F%2F88%2B%2Fvv%2F5P2%2F%2Fw%2Ff%2Fft%2F782%2F%2F7df%2Ff1%2F5xXE8OoFx0" +
		"GGmCEbIJcz9QBY8gVQ47MP%2F%2F4%2FBmp%2B8Pbf%2F7tQzddf%2FP1%2F9RnEgM5VZ0" +
		"EGeGM14ClQ86N3UM2v%2F%2F2%2F9RKi%2BQpQ88UnuA2AewHk%2FPtAW%2B%2B8%2Fvv%" +
		"2FJlDzted%2F%2F18Gar7wBGTAH7ABtYtOgAywxBqIIEOQAcg1Fx7%2FBRuMFoicuKLxDy" +
		"zK5u64Cjfo%2FecfYD5Q%2FDLWaMSGgQrvPH%2F3FabxOxDXEp0SgYp7Z267AtL4BYgLSU" +
		"rKQA1KQHwPiFPolxcGzAAA94sPIr7iagsAAAAASUVORK5CYII%3D";

	var imgTextLink =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAADpSURBVCjPY%2FjPgB8y0EmBHXdWaeu7ef9rHuaY50jU3J33v%2FVdVqkdN1SBEZtP" +
		"18T%2FL%2F7f%2FX%2Fwf%2BO96kM3f9z9f%2BT%2FxP8%2BXUZsYAWGfsUfrr6L2Ob9J%" +
		"2FX%2FpP%2BV%2F1P%2Fe%2F%2BJ2LbiYfEHQz%2BICV1N3yen%2B3PZf977%2F9z%2FQ%" +
		"2F%2FX%2Frf%2F7M81Ob3pu1EXWIFuZvr7aSVBOx1%2Fuf0PBEK3%2F46%2FgnZOK0l%2F" +
		"r5sJVqCp6Xu99%2F2qt%2Bv%2BT%2F9f%2BL8CSK77v%2Bpt73vf65qaYAVqzPYGXvdTvm" +
		"R%2Fz%2F4ZHhfunP0p%2B3vKF6%2F79gZqzPQLSYoUAABKPQ%2BkpVV%2FigAAAABJRU5E" +
		"rkJggg%3D%3D";

	var imgTextBold =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAADCSURBVCjPY%2FjPgB8yUEtBeUL5%2BZL%2FBe%2Bz61PXJ7yPnB8sgGFCcX3m%2F6" +
		"z9IFbE%2FJD%2FXucxFOTWp%2F5PBivwr%2Ff77%2FgfQ0F6ffz%2FaKACXwG3%2B27%2F" +
		"LeZjKEioj%2FwffN%2Bn3vW8y3%2Bz%2FVh8EVEf%2FN8LLGEy3%2BK%2F2nl5ATQF%2Fv" +
		"W%2B%2Fx3BCrQF1P7r%2FhcvQFPgVg%2B0GWq0zH%2FN%2FwL1aAps6x3%2B64M9J12g8p" +
		"%2F%2FPZcCigKbBJP1uvvV9sv3S%2FYL7%2Bft51SgelzghgBKWvx6E5D1XwAAAABJRU5E" +
		"rkJggg%3D%3D";

	var imgTextItalic =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAABxSURBVCjPY%2FjPgB8yUFtBdkPqh4T%2FkR%2BCD%2BA0Ie5B5P%2FABJwmxBiE%2" +
		"F%2Ff%2FgMeKkAlB%2F90W4FHg88Dzv20ATgVeBq7%2FbT7g8YXjBJf%2FRgvwKLB4YPFf" +
		"KwCnAjMH0%2F8a%2F3EGlEmD7gG1A%2FIHJDfQOC4wIQALYP87Y6unEgAAAABJRU5ErkJg" +
		"gg%3D%3D";

	var imgTextStrikethrough =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAACfSURBVCjPY%2FjPgB8yUFNBiWDBzOy01PKEmZG7sSrIe5dVDqIjygP%2FY1GQm5b2" +
		"P7kDwvbAZkK6S8L%2F6P8hM32N%2FzPYu2C1InJ36P%2FA%2Fx7%2Fbc%2BYoSooLy3%2F" +
		"D4Px%2F23%2BSyC5G8kEf0EIbZSmfdfov9wZDCvc0uzLYWyZ%2F2J3MRTYppn%2F14eaIv" +
		"KOvxxDgUma7ju1M%2FLlkmnC5bwdNIoL7BAAWzr8P9A5d4gAAAAASUVORK5CYII%3D";

	var imgTextColor =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAMOSURBVDjLVZNNaBxlAIafb%2Bab2Z3N7Oxv%2FnYTEyv2LzQJpKBgrQqNUKmY4kUI" +
		"XqUHT70p9iB48CKIiN5E0It6KFiwiv9FpAVpKUggNc3mZ7vpJpv9n93ZnZ35PNRI%2B8B7" +
		"e9%2Fn9gqlFAeIVUfPeN3zh0R0eVpYM1OanhvTCEY0f3tU79%2BctnpfHM73fuQhxIHAWH" +
		"nmkOGXPjgZyS09l5hnNv4YOdMhoQmigzqGt4nhfeub1fpnVsl%2Fe%2BhMv%2Fq%2FQKy%" +
		"2BMe0EO5dfso%2FOvzB8grgV4HGXJC7jwAQ2oxxDuC36xZ%2BRhe%2Bv6iutZf2iqklReN" +
		"e0tPSHZ2Nz84ujR7ht3iJKjcexiOIQI8SiixxcR7QtRORFlK7O9t0rlyy4KBEj5%2BYisV" +
		"eez85wy9zGIUeGDDYhDhYOITYuoh2BvTJ68y7B0GnCym8XGq%2BKL2U0MrE8Z2SRVhqdPm" +
		"lCsvgk8RlCkgAivRbUNKj1YPMeeu4wcnjRql7%2F%2BjVpyvxsPjbK3whi5LEAB0WWgBRg" +
		"qwAaFah04X4V7puwdwddz%2BFXjJMSbXI8aSTYCgU2oKMwEdgCEoDhug%2FG5SjsmFDUoV" +
		"%2BDXJ7BnpiUVCNBaJqEXfDVfwG6CjoKnF4crZGCVvNBug0IPXzPZOCnAunfk8W6ro7H2g" +
		"K3A02gGoDeA1MDGx2nkYG6C24bvDaMSzq7ZfxBsiC7O%2BaNDaWOn0oLfl0HMwDlQRCAHY" +
		"UkEGvFkLsp2G9Bo0n41AiNG6sMBvY1yZr6%2FJsV%2F%2FXZZ3WZaEp2t6DvgWFA1QRHQb" +
		"wjSDeTUGvCiSPU1ovU%2FtypQPIrTV0yrrl3vE%2B%2F%2B8XlaCIgq8H%2BBtSLUN2C2i" +
		"bsl8ArR%2BHYGE0rwvbvRTr96HsL6od1CUDDf%2BenK92JwT%2B982cWEswvRmiug6qAr0" +
		"E4AV4uoFXosnV1g8bN5kcp7E8eOZOYKtmUqm%2FZiDdfPhV3Zp6IM5k0SIUBstwmXKvCX5" +
		"UdM6y9n2b34wV1IXxEcEBU3J4dprU0zODpjFBTIyoIxgjXxlB%2FPIl1eUmdLjzc%2Fxce" +
		"OVXddrB6BQAAAABJRU5ErkJggg%3D%3D";

	var imgTextFont =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAHJSURBVDjLY%2Fj%2F%2Fz8DJZiBZgY4tN9wcO6%2B0erZd2uKc%2BfNfoeWGxMcW2" +
		"7Msiq%2B3GWUdIZXL%2FokI14D7JqvB%2Bcsf3Rv4p6X%2F%2Ft3Pf%2Ffvf35%2F8Ilj3" +
		"471V3bph9zmougC6xrr8mETbu7q3jl40%2FFKx5%2BLVzy8Ltd%2BeUZBvGnOYjygk3llf" +
		"KCZY%2B%2Bu3fcWutcd21B07on%2F61yz88kKgwsCi8qJc%2B%2B9yhu2p37ppnnQ4C4oW" +
		"blo%2F9WOReXEjTANOsCs1PD9VVZ8%2B9%2FN0k7m6Yfe5LLOPFMR%2BWyh%2F9dqq5eUv" +
		"c6xIbXALOs8zEZc%2B9%2FC%2Bq%2BddEw%2FrSfXuRxLfP0swuqgAYEt934pOq2nxenAU" +
		"bJZ0TjJt9%2BVbn80X%2Bv5huXrbLOb7LMOLfVterqjcYVj%2F%2BHtd38qey4TxqrAQax" +
		"pxntSy7PBvnVPO0MSmCZJ5%2FZWL7g%2Fv%2Bozlv%2Flex2K2EYoB9zigsYPS6lSx7%2B" +
		"j%2Bi59UYn6JgtTIGK635hdY%2FD9dnT7vxP6L%2F9X9F%2Bb4icxTYmFAMsMs6ti%2B2%" +
		"2F9S9hwu3%2FAc3X32oHHOlVdtoroGS%2FR0vb9%2FAip8ILrwLrrv33rbn63zD02F5Zy2" +
		"2GtM8LdDMAACVPr6ZjGHxnAAAAAElFTkSuQmCC";


	var imgNumbersOn =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAImSURBVDjLjZLda9JRGMf3b3TTdTcFXXXRTbeDIijo5W7GmtWqCysIF1JM9DfffvMN" +
		"%2Bfk284UpKqRIMCfIDCO7kNSRooJvOBUvgkFEKPv2O8%2BWsWmtB77n4TznPJ%2Fz5eHM" +
		"AZiTyWQat9vdCQaDCIfDiEQiiEajlNme1f1%2BPxwOx1ChUJhYz2%2FRYrPZCmL%2BhtPj" +
		"pyAIe1MAr9c7EvPBNdkm%2FiUWolNMAZg9FrdW3mFRu4Ml%2FQdI%2BSwern%2FEsukTHl" +
		"s%2B0xkLj8czDfD5fBOAVGx%2BcKL5qfUPYMPzdjZgPB6jWq2iXC6jWCwin88jl8shm80i" +
		"k8kgnU7%2F3cFRkSZvMBhQqVQQCASg0WgI1H%2F%2BDLU7NzAajWbPwOWiIjqdDlqtFur1" +
		"Omq1GrkplUqkQqFAd5yuGQDBbqfDWCwGo9GIdrtNbnieJ1goFIJerycHgmCfBlitVgL0%2" +
		"B330ej10u11yw0DNZhONRgObW068ECRYMlzHXeWV%2FfmXF15NAEajiQCJRAIWi4Ug8Xgc" +
		"ZrOZQLqN13gTliCxa8WXvST47Ue4zZ%2FHpeUzOgJodToCDIdD0mAwmLhhkmjmESutI%2F" +
		"b18CFd6j74lJQBfhBApVKNdjKZg1QqBabtE7q6chHvd53H%2FnS8aGWAw0HI5fLS6qryu0" +
		"qlhlotiuPAra2B45g4XH5yFtrkPaiTC9Ss3lo47uA0iReVN3XnoE8u0ssss%2F1kBv8J4U" +
		"TtM9tHmWP1X8ma%2F9q6R1ZmAAAAAElFTkSuQmCC";

	var imgNumbersOff =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAA" +
		"AABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT" +
		"wAAAJGSURBVDjLjZLda5JhGMYN3R9QRxF04EEnQf9AR1HtLE86aNFhSVtsdWCjLQMLjNd3" +
		"bmp%2BIWqa%2BUGKGikGswyZy8oiQ4UUXfk1pya0k9YHilfv81BW01U3XO%2FNez%2FP9X" +
		"svbl4eAJ5EIlHa7fa61%2BuF3%2B9HIBBAMBiknbyTudvthtVq7chkMh3x%2FBR9mEymDN" +
		"c38e%2F6ZjabN4YATqezy%2FW%2BSHIPfxMpLimGACQeqVPXHkC8uILzqlVMapK4cOsZpn" +
		"UvMGN4Sc9IORyOYYDL5RoAJjnz1DbzJeMvwB3H3dGAXq%2BHYrGIfD6PbDaLdDqNVCqFZD" +
		"KJRCKBeDy%2Bc4IfQ7p5tVqNQqEAj8cDpVJJQa3ZyyidPolutzt6BzYbHaJer6NarWJtbQ" +
		"2lUommyeVyVJlMht65bRsBMFss9DAUCkGr1aJWq9E0Go2Gwnw%2BH1QqFU1gNluGAUajkQ" +
		"JarRaazSYajQZNQ0CVSgXlchkZuxzPzx5E7OgYouP8Gqf5AUCr1VFAJBKBwWCgkHA4DL1e" +
		"T0FRZgZvZg%2Fjy0MV%2Bm%2BXseWV4NX0od6jY4KLFLC4tEQBnU6Hqt1uD9IQxc8I8Zkz" +
		"QycC5nYDjBAd5RFEj%2FPfUwDDMN2VRKIfi8VA9HibSOz%2B6%2Ft%2F%2FNOb1%2Fdyc0" +
		"GfAqRSaU4uv7nFMAooFJxYFuzCAliWiEXkxB58sp0DONPXKzx85FSd4pNdrPN%2B3%2BhO" +
		"Wp3YdyMlPtDdmBPiw9UxvBPvwhORoLc8zpf%2BF4Do6cT%2Bee6LZRKb63ViJvPvI7z%2B" +
		"j7d96tcAAAAASUVORK5CYII%3D";



	//  Get button validation switch value.
	var ValidateButton = GM_getValue("ValidateButton_" + SignedInAs, true);

	//  Get character counter display switch value.
	var CounterButton = GM_getValue("CounterButton_" + SignedInAs, true);

	//  Get handle to page's form.
	var e_LogTextArea = document.getElementById("ctl00_ContentBody_LogBookPanel1_tbLogInfo");
	if (! e_LogTextArea) { return; }
	var e_LogBookPanel1_ddLogType = document.getElementById("ctl00_ContentBody_LogBookPanel1_ddLogType");
	if (! e_LogBookPanel1_ddLogType) { return; }
	var e_LogBookPanel1_LogButton = document.getElementById("ctl00_ContentBody_LogBookPanel1_LogButton");

	//  Move submit button to the right.
	e_LogBookPanel1_LogButton.parentNode.style.textAlign = 'right';

	//  Remove unnecessary spacing.
	var e_Breadcrumbs = document.getElementById("ctl00_Breadcrumbs");
	e_Breadcrumbs = e_Breadcrumbs.parentNode.parentNode;
	removeNode(e_Breadcrumbs);

	var e_lbHeading = document.getElementById("ctl00_ContentBody_lbHeading");
	removeNode(e_lbHeading.parentNode);

	e_WaypointLink = document.getElementById("ctl00_ContentBody_LogBookPanel1_WaypointLink");
	e_WaypointLink.parentNode.style.marginTop = '0px';



	if (GM_addStyle) {
		GM_addStyle("p { margin-top: 0; margin-bottom: 0; line-height: .85 } !important");
	}

	var taFont = GM_getValue('TextAreaFont' + SignedInAs, 'Verdana');
	e_LogTextArea.style.fontFamily = taFont + ', Helvetica, san-serif';

	var e_lbHeading = document.getElementById("ctl00_ContentBody_lbHeading");
	if (e_lbHeading) {
		e_break = e_lbHeading.parentNode.parentNode.firstChild;
		if (e_break.nodeName == 'BR') {
			e_break.parentNode.removeChild(e_break);
		}
	}


	var e_divEncrypt = document.getElementById('divEncrypt');
	removeNode(e_divEncrypt.childNodes[3]);


	//  Remove "mm/dd/yyyy" line.
	e_EditLogPanel = document.getElementById("ctl00_ContentBody_LogBookPanel1_EditLogPanel");
	//  Don't remove is this a trackable.
	// if (e_WptSelectCheckBox) {
		// removeNode(e_EditLogPanel.childNodes[5].childNodes[9]);
	// }

	//  Shorten log type to resonable length.
	e_LogBookPanel1_ddLogType.style.width = 'auto';

	//  Shorten waypoint entry to resonable length.
	wp_entry = document.getElementById("ctl00_ContentBody_uxVistOtherListingGC");
	if (wp_entry) {
		wp_entry.setAttribute('size', '');
		wp_entry.style.width = '100px';
	}

	var divAO = document.getElementById("divAdvancedOptions");
	divAO.style.padding = '0.2em';

	//  Get handles to date drop-down selectors, and parent container.
	var e_dlMonth = document.getElementById("ctl00_ContentBody_LogBookPanel1_DateTimeLogged_Month");
	var e_dlDay = document.getElementById("ctl00_ContentBody_LogBookPanel1_DateTimeLogged_Day");
	var e_dlYear = document.getElementById("ctl00_ContentBody_LogBookPanel1_DateTimeLogged_Year");
	if (e_dlMonth) {
		var span_Dates = document.getElementById("ctl00_ContentBody_LogBookPanel1_DateTimeLogged");
		span_Dates.parentNode.style.whiteSpace = 'nowrap';
	}


	//  Number and rename months.
	if (e_dlMonth) {		//  If editing an existing log, there might be no selectors, so skip.
		var mthNameList = GM_getValue("MonthNames_" + SignedInAs, '');
		if (!mthNameList) {
			mthNameList = 'January, February, March, April, May, June, July, August, September, ' +
					'October, November, December';
		}
		var mthNames = mthNameList.split(',');
		if (mthNames.length == 12) {
			for (var i = 0; i < 12; i++) {
				var mthText = i + 1;
				if (mthText < 10) { mthText = '0' + mthText; }
				mthText += ' - ' + mthNames[i].trim();
				e_dlMonth.options[i].text = mthText;
			}
		}

		//  Add Date Detection.
		if (GM_getValue('DateDetection_' + SignedInAs, 'On') == 'On') {
			var lnkCalendar = document.createElement("a");
			lnkCalendar.style.marginLeft = '-0.75em';
			lnkCalendar.style.marginRight = '5px';
			var lnkCalendarImg = document.createElement("img");
			lnkCalendarImg.src = imgCalendar;
			lnkCalendarImg.border = 0;
			lnkCalendarImg.style.opacity = 0;
			lnkCalendarImg.align = 'absmiddle';
			lnkCalendar.appendChild(lnkCalendarImg);
			var e_datefmt = document.getElementById("ctl00_ContentBody_LogBookPanel1_uxDateFormatHint");
			insertAheadOf(lnkCalendar, e_datefmt.parentNode);
			//  Update display, based on date setting.
			fDateChanged();
			//  Attach event listeners to date selectors.
			e_dlYear.addEventListener("change", fDateChanged, true);
			e_dlMonth.addEventListener("change", fDateChanged, true);
			e_dlDay.addEventListener("change", fDateChanged, true);
			//  Add blur listener for cross-script communication with PDA Field Notes script.
			e_dlDay.addEventListener("blur", fDateChanged, true);
		}
	}


	//  Determine waypoint entry type.
	var ns = document.getElementById('ctl00_ContentBody_LogBookPanel1_LatlongEditor1:_selectNorthSouth');
	if (ns) {

		//  Locate table holding coordinate entry fields.
		coorTab = ns.parentNode;
		while (coorTab.nodeName != 'TABLE') {
			coorTab = coorTab.parentNode;
		}

		var LatlongEditor1 = document.getElementsByName("ctl00$ContentBody$LogBookPanel1$LatlongEditor1");
		var WptEntryType = LatlongEditor1[0].value;

		//  Add new column to table.
		var ctCell = coorTab.rows[0].insertCell(coorTab.rows[0].cells.length);
		ctCell.rowSpan = 5;

		//  Create text area, and add to new cell.
		coorBox = document.createElement("textarea");
		coorBox.rows = 2;
		coorBox.cols = 23;
		coorBox.id = 'coorBox';
		coorBox.title = 'Enter free-form coordinates, and click Add Coordinates.'
		ctCell.appendChild(coorBox);
		ctCell.appendChild(document.createElement("br"));

		//  Get hemisphere defaults.
		var nsDefault = GM_getValue("nsSelect_" + SignedInAs, 1);
		var weDefault = GM_getValue("weSelect_" + SignedInAs, -1);

		//  Add hemisphere selectors.
		var nsSelect = document.createElement("select");
		nsSelect.id = "nsSelect_" + SignedInAs;
		var nsOption = document.createElement("option");
		nsOption.value = 1;
		nsOption.appendChild(document.createTextNode("N"));
		nsSelect.appendChild(nsOption);
		nsOption.selected = (nsOption.value == nsDefault);
		var nsOption = document.createElement("option");
		nsOption.value = -1;
		nsOption.appendChild(document.createTextNode("S"));
		nsSelect.appendChild(nsOption);
		nsOption.selected = (nsOption.value == nsDefault);
		ctCell.appendChild(nsSelect);
		nsSelect.addEventListener("change", nsweChange, true);

		var weSelect = document.createElement("select");
		weSelect.id = "weSelect_" + SignedInAs;
		var weOption = document.createElement("option");
		weOption.value = -1;
		weOption.appendChild(document.createTextNode("W"));
		weSelect.appendChild(weOption);
		weOption.selected = (weOption.value == weDefault);
		var weOption = document.createElement("option");
		weOption.value = 1;
		weOption.appendChild(document.createTextNode("E"));
		weSelect.appendChild(weOption);
		weOption.selected = (weOption.value == weDefault);
		ctCell.appendChild(weSelect);
		weSelect.addEventListener("change", nsweChange, true);

		//  Add button.
		ctButton = document.createElement("input");
		ctButton.id = 'ctButton';
		ctButton.type = 'button';
		ctButton.name = 'ctButton';
		ctButton.value = 'Add Coordinates';
		ctCell.appendChild(ctButton);
		ctButton.addEventListener('click', ctButtonClicked, false);
	}



	//  Add resize links next to icon button.
	xPathSearch = "//a[contains(@href, '/about/smilies.aspx')]";
	RevList = document.evaluate(
		xPathSearch,
		document,
		null,
		XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
		null);
	var ic = RevList.snapshotLength;
	var lnkSmileys = RevList.snapshotItem(0);

	var vsdt = document.getElementById("ctl00_ContentBody_LogBookPanel1_EditLogPanel").childNodes[3].childNodes[15];
	if (vsdt) {

		//  Create span to hold new controls.
		var spanCtrls = document.createElement("span");
		spanCtrls.id = 'spanCtrls';
		spanCtrls.style.whiteSpace = 'nowrap';
		spanCtrls.style.fontSize = '20px';
		vsdt.appendChild(spanCtrls);


		//  Create span to hold arrow size controls.
		var spanArrows = document.createElement("span");
		spanArrows.id = 'spanArrows';

		//  Create up arrow and add to span.
		var lnkUpArrow = document.createElement("a");
		var lnkUpArrowImg = document.createElement("img");
		lnkUpArrowImg.src = imgArrowUp;
		lnkUpArrowImg.border = 0;
		lnkUpArrow.appendChild(lnkUpArrowImg);
		lnkUpArrow.title = 'Move bottom textbox edge up';
		lnkUpArrow.href = 'javascript:void(0)';
		lnkUpArrow.setAttribute('incCol', 0);
		lnkUpArrow.setAttribute('incRow', -1);
//		lnkUpArrow.style.marginLeft = '15px';
		lnkUpArrow.addEventListener("click", ChangeSize, true);
		spanArrows.appendChild(lnkUpArrow);

		//  Create down arrow and add to span.
		var lnkDownArrow = document.createElement("a");
		var lnkDownArrowImg = document.createElement("img");
		lnkDownArrowImg.src = imgArrowDown;
		lnkDownArrowImg.border = 0;
		lnkDownArrow.appendChild(lnkDownArrowImg);
		lnkDownArrow.title = 'Move bottom textbox edge down';
		lnkDownArrow.href = 'javascript:void(0)';
		lnkDownArrow.setAttribute('incCol', 0);
		lnkDownArrow.setAttribute('incRow', 1);
		lnkDownArrow.addEventListener("click", ChangeSize, true);
		spanArrows.appendChild(lnkDownArrow);

		//  Create span to hold validator control.
		var spanValidator = document.createElement("span");
		spanValidator.id = 'spanValidator';
		//  Create validator on/off control and add to span.
		var lnkValidator = document.createElement("a");
		var imgVldBtn = document.createElement("img");
		imgVldBtn.border = 0;
		SetVldBtn();
		lnkValidator.style.marginLeft = '12px';
		lnkValidator.appendChild(imgVldBtn);
		lnkValidator.href = 'javascript:void(0)';
		lnkValidator.addEventListener("click", ToggleVldBtn, true);
		spanValidator.appendChild(lnkValidator);


		//  Create span to hold quote control.
		var spanQuote = document.createElement("span");
		spanQuote.id = 'spanQuote';

		//  Create email-quote controls and add to span.
		var lnkQuoteE = document.createElement("a");
		var lnkQuoteEImg = document.createElement("img");
		lnkQuoteEImg.src = imgEmailQuote;
		lnkQuoteEImg.border = 0;
		lnkQuoteE.appendChild(lnkQuoteEImg);
		lnkQuoteE.title = 'Email-style Text Quoting';
		lnkQuoteE.style.marginLeft = '12px';
		lnkQuoteE.href = 'javascript:void(0)';
		lnkQuoteE.addEventListener("click", QuoteTextEmail, true);
		spanQuote.appendChild(lnkQuoteE);

		//  Create block-quote controls and add to span.
		var lnkQuoteB = document.createElement("a");
		var lnkQuoteBImg = document.createElement("img");
		lnkQuoteBImg.src = imgBlockQuote;
		lnkQuoteBImg.border = 0;
		lnkQuoteB.appendChild(lnkQuoteBImg);
		lnkQuoteB.title = 'Forum-style Block Quoting';
		lnkQuoteB.setAttribute('editType', 'quote');
		lnkQuoteB.style.marginLeft = '3px';
		lnkQuoteB.href = 'javascript:void(0)';
		lnkQuoteB.addEventListener("click", fEditText, true);
		spanQuote.appendChild(lnkQuoteB);



		//  Create span to hold edit controls.
		var spanEdit = document.createElement("span");
		spanEdit.id = 'spanEdit';

		//  Create link control and add to span.
		var lnkTextLink = document.createElement("a");
		var lnkTextLinkImg = document.createElement("img");
		lnkTextLinkImg.src = imgTextLink;
		lnkTextLinkImg.border = 0;
		lnkTextLink.appendChild(lnkTextLinkImg);
		lnkTextLink.title = 'Insert hyperlink';
		lnkTextLink.style.marginLeft = '3px';
		lnkTextLink.href = 'javascript:void(0)';
		lnkTextLink.addEventListener("click", fTextLink, true);
		spanEdit.appendChild(lnkTextLink);

		//  Create bold control and add to span.
		var lnkTextBold = document.createElement("a");
		var lnkTextBoldImg = document.createElement("img");
		lnkTextBoldImg.src = imgTextBold;
		lnkTextBoldImg.border = 0;
		lnkTextBold.appendChild(lnkTextBoldImg);
		lnkTextBold.title = 'Bold';
		lnkTextBold.setAttribute('editType', 'b');
		lnkTextBold.style.marginLeft = '3px';
		lnkTextBold.href = 'javascript:void(0)';
		lnkTextBold.addEventListener("click", fEditText, true);
		spanEdit.appendChild(lnkTextBold);

		//  Create italic control and add to span.
		var lnkTextItalic = document.createElement("a");
		var lnkTextItalicImg = document.createElement("img");
		lnkTextItalicImg.src = imgTextItalic;
		lnkTextItalicImg.border = 0;
		lnkTextItalic.appendChild(lnkTextItalicImg);
		lnkTextItalic.title = 'Italic';
		lnkTextItalic.setAttribute('editType', 'i');
		lnkTextItalic.style.marginLeft = '3px';
		lnkTextItalic.href = 'javascript:void(0)';
		lnkTextItalic.addEventListener("click", fEditText, true);
		spanEdit.appendChild(lnkTextItalic);

		//  Create Strikethrough control and add to span.
		var lnkTextStrikethrough = document.createElement("a");
		var lnkTextStrikethroughImg = document.createElement("img");
		lnkTextStrikethroughImg.src = imgTextStrikethrough;
		lnkTextStrikethroughImg.border = 0;
		lnkTextStrikethrough.appendChild(lnkTextStrikethroughImg);
		lnkTextStrikethrough.title = 'Strikethrough';
		lnkTextStrikethrough.setAttribute('editType', 's');
		lnkTextStrikethrough.style.marginLeft = '3px';
		lnkTextStrikethrough.href = 'javascript:void(0)';
		lnkTextStrikethrough.addEventListener("click", fEditText, true);
		spanEdit.appendChild(lnkTextStrikethrough);


		//  Create Font selector and add to span.
		var fontSelect = document.createElement("select");
		fontSelect.id = 'fontSelect';
		fontSelect.style.borderStyle = 'solid';
		fontSelect.style.borderWidth = 'thin';
		fontSelect.style.padding = "1px";
		fontSelect.style.borderColor = 'rgb(165, 172, 178)';
		fontSelect.style.marginBottom = '3px';
		fontSelect.style.marginLeft = '6px';
		fontSelect.title = 'Select text font';
		spanEdit.appendChild(fontSelect);

		//  Add options to Font selector.
		var lastFont = GM_getValue("EditTextFont_" + SignedInAs, 'Andale Mono');
		var aFonts = ['Andale Mono', 'Arial', 'Arial Black', 'Book Antiqua', 'Century Gothic',
				'Comic Sans Ms', 'Courier New', 'Georgia', 'Impact', 'Lucida Console', 'Tahoma',
				'Times New Roman', 'Trebuchet Ms'];
		for (var c = 0; c < aFonts.length; c++) {
			var cOption = document.createElement("option");
			cOption.value = aFonts[c];
			cOption.selected = (aFonts[c] == lastFont);
			fontSelect.appendChild(cOption);
			var tFont = aFonts[c];
			cOption.appendChild(document.createTextNode(tFont));
			cOption.style.fontFamily = tFont;
			cOption.style.fontSize = 'small';
		}
		fontSelect.style.fontFamily = lastFont;
		fontSelect.style.fontSize = 'small';
		fontSelect.addEventListener("change", fFontChange, true);


		//  Create Font control and add to span.
		var lnkTextFont = document.createElement("a");
		var lnkTextFontImg = document.createElement("img");
		lnkTextFontImg.src = imgTextFont;
		lnkTextFontImg.border = 0;
		lnkTextFont.id = 'lnkTextFont';
		lnkTextFont.appendChild(lnkTextFontImg);
		lnkTextFont.title = 'Apply selected font';
		lnkTextFont.setAttribute('editType', lastFont);
		lnkTextFont.style.marginLeft = '6px';
		lnkTextFont.href = 'javascript:void(0)';
		lnkTextFont.addEventListener("click", fEditTextFont, true);
		spanEdit.appendChild(lnkTextFont);


		//  Create Color selector and add to span.
		var colorSelect = document.createElement("select");
		colorSelect.id = 'colorSelect';
		colorSelect.style.borderStyle = 'solid';
		colorSelect.style.borderWidth = 'thin';
		colorSelect.style.padding = "1px";
		colorSelect.style.borderColor = 'rgb(165, 172, 178)';
		colorSelect.style.marginBottom = '3px';
		colorSelect.style.marginLeft = '10px';
		colorSelect.style.fontSize = 'small';
		colorSelect.title = 'Select text color';
		spanEdit.appendChild(colorSelect);

		//  Add options to Color selector.
		var lastColor = GM_getValue("EditTextColor_" + SignedInAs, 'black');
		var aColors = ['beige', 'black', 'blue', 'brown', 'gold', 'green', 'limegreen', 'maroon',
				'navy', 'orange', 'pink', 'purple', 'red', 'teal', 'violet', 'white', 'yellow'];
		for (var c = 0; c < aColors.length; c++) {
			var cOption = document.createElement("option");
			cOption.value = aColors[c];
			cOption.selected = (aColors[c] == lastColor);
			colorSelect.appendChild(cOption);
			var tColor = aColors[c].substr(0,1).toUpperCase() + aColors[c].substr(1);
			cOption.appendChild(document.createTextNode(tColor));
			cOption.style.color = tColor;
			cOption.style.fontSize = 'small';
			cOption.style.backgroundColor = 'Lavender';
		}
		colorSelect.addEventListener("change", fColorChange, true);

		//  Create Color control and add to span.
		var lnkTextColor = document.createElement("a");
		var lnkTextColorImg = document.createElement("img");
		lnkTextColorImg.src = imgTextColor;
		lnkTextColorImg.border = 0;
		lnkTextColor.appendChild(lnkTextColorImg);
		lnkTextColor.title = 'Apply selected color';
		lnkTextColor.setAttribute('editType', lastColor);
		lnkTextColor.style.marginLeft = '6px';
		lnkTextColor.href = 'javascript:void(0)';
		lnkTextColor.addEventListener("click", fEditText, true);
		spanEdit.appendChild(lnkTextColor);


		//  Create span to hold Character counter control.
		var spanCounter = document.createElement("span");
		spanCounter.id = 'spanCounter';

		//  Character counter on/off.
		var lnkCounter = document.createElement("a");
		var imgCntBtn = document.createElement("img");
		imgCntBtn.src = imgNumbersOn;
		imgCntBtn.border = 0;
		lnkCounter.style.marginLeft = '12px';
		lnkCounter.appendChild(imgCntBtn);
		lnkCounter.href = 'javascript:void(0)';
		lnkCounter.addEventListener("click", ToggleCntBtn, true);
		spanCounter.appendChild(lnkCounter);

		//  Character counter and add to span.
		var spanCharsLeft = document.createElement("span");
		spanCharsLeft.id = 'spanCharsLeft';
		spanCharsLeft.style.fontSize = '12px';
		spanCharsLeft.appendChild(document.createTextNode(' \u00A0 Chars Left: '));
		spanCharsLeft.title = 'Characters remaining before reaching maximum limit';
		spanCharsLeft.style.fontWeight = 'bold';
		spanCharsLeft.style.display = 'none';
		var txtCharsLeft = (document.createTextNode(maxLogLen));
		txtCharsLeft.id = 'txtCharsLeft';
		spanCharsLeft.appendChild(txtCharsLeft);
		spanCounter.appendChild(spanCharsLeft);
		SetCntBtn();


		//  Add control spans to main control span.
		spanCtrls.appendChild(spanArrows);
		spanCtrls.appendChild(spanValidator);
		spanCtrls.appendChild(spanQuote);
		spanCtrls.appendChild(spanEdit);
		spanCtrls.appendChild(spanCounter);


		//  Change smiley button to open smiley bar.
 		lnkSmileys.href = 'javascript:void(0)';
		lnkSmileys.addEventListener("click", fSmileyBarOnOff, true);
		lnkSmileys.title = 'Open/Close the Smiley Bar';

		//  Create smiley bar.
		var sbTable = document.createElement('table');
		var sbRow = document.createElement('tr');
		var sbCol = document.createElement('td');
		sbTable.appendChild(sbRow);
		sbRow.appendChild(sbCol);
		sbCol.id = 'sbCol';

		if (bHideSmilieBar) {
			lnkSmileys.setAttribute('status', false);
			sbTable.style.visibility = 'collapse';
		} else {
			lnkSmileys.setAttribute('status', true);
			sbTable.style.visibility = 'visible';
		}
			
		sbTable.style.width = '116px';
		sbTable.style.border = 'solid 1px rgb(68, 142, 53)';
		sbTable.style.marginTop = '10px';
		sbTable.style.MozBorderRadius = '5px';
		sbTable.style.backgroundColor = 'rgb(239, 239, 239)';

		var arSbImgs = ['icon_smile.gif', 'icon_smile_big.gif', 'icon_smile_cool.gif',
				'icon_smile_blush.gif', 'icon_smile_tongue.gif', 'icon_smile_evil.gif',
				'icon_smile_wink.gif', 'icon_smile_clown.gif', 'icon_smile_blackeye.gif',
				'icon_smile_8ball.gif', 'icon_smile_sad.gif', 'icon_smile_shy.gif',
				'icon_smile_shock.gif', 'icon_smile_angry.gif', 'icon_smile_dead.gif',
				'icon_smile_sleepy.gif', 'icon_smile_kisses.gif', 'icon_smile_approve.gif',
				'icon_smile_dissapprove.gif', 'icon_smile_question.gif'];
		var arSbTitles = ['smile', 'big smile', 'cool', 'blush', 'tongue', 'evil', 'wink', 'clown',
				'black eye', 'eightball', 'frown', 'shy', 'shocked', 'angry', 'dead', 'sleepy',
				'kisses', 'approve', 'disapprove', 'question'];
		var arSbCodes = ['[:)]', '[:D]', '[8D]', '[:I]', '[:P]', '[}:)]', '[;)]', '[:o)]', '[B)]', '[8]',
				'[:(]', '[8)]', '[:O]', '[:(!]', '[xx(]', '[|)]', '[:X]', '[^]', '[V]', '[?]'];
		for (var c = 0; c < arSbImgs.length; c++) {
			var sbLink = document.createElement("a");
			var sbImg = document.createElement("img");
			sbImg.src = '../images/icons/' + arSbImgs[c];
			sbImg.border = 0;
			sbLink.style.marginLeft = '6px';
			sbLink.style.marginRight = '6px';
			sbLink.appendChild(sbImg);
			sbLink.title = arSbTitles[c];
			sbLink.setAttribute('code', arSbCodes[c]);
			sbLink.href = 'javascript:void(0)';
			sbLink.addEventListener("click", fSmileyClicked, true);
			sbCol.appendChild(sbLink);
		}
		var ctBreak = document.createElement('br');
		insertAfter(ctBreak, lnkSmileys);
		insertAfter(sbTable, ctBreak);

	}


	//  Change text entry box size.
	var NewRowSize =  GM_getValue("CustomRowSize_" + SignedInAs, 0);
	var NewColSize =  GM_getValue("CustomColSize_" + SignedInAs, 0);

	if (NewRowSize > 0) {
		e_LogTextArea.rows = NewRowSize;
	}

	if (NewColSize > 0) {
		e_LogTextArea.cols = NewColSize;
	}


	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	//  Add column to trackable table, if present.
	arTrackers = new Array();  //  Needs to be a global variable, so it can be used in functions.
	var e_tblTravelBugs = document.getElementById("tblTravelBugs");
	var cp = 1;
	if (e_tblTravelBugs) {
		var e_headTravelBugs = e_tblTravelBugs.childNodes[1].childNodes[1];
		var avHead = document.createElement('th');
		avHead.style.width = '100px';
		avHead.appendChild(document.createTextNode('Auto-Visit'));
		insertAfter(avHead, e_headTravelBugs.cells[cp]);
		
		var e_bodyTravelBugs = e_tblTravelBugs.childNodes[3];
		for (r in e_bodyTravelBugs.rows) {
			if (r == e_bodyTravelBugs.rows.length - 1) {
				e_bodyTravelBugs.rows[r].cells[0].setAttribute('colspan', 4);
			} else {
				var avTracker = e_bodyTravelBugs.rows[r].cells[0].firstChild.firstChild.data;
				var avDrpDwn = e_bodyTravelBugs.rows[r].cells[2].childNodes[1].id;
				arTrackers.push(avTracker);
				var avCol = document.createElement('td');
				insertAfter(avCol, e_bodyTravelBugs.rows[r].cells[cp]);
				var avChkBox = document.createElement('input');
				avChkBox.type = 'Checkbox';
				avChkBox.id = 'chkbox_' + avTracker;
				avChkBox.setAttribute('tracker', avTracker);
				avChkBox.setAttribute('row', r);
				avChkBox.setAttribute('drpdwnctl', avDrpDwn);
				avChkBox.addEventListener("click", fAutoVisitChanged, true);
				var avCbLbl = document.createElement('label');
				avCbLbl.setAttribute('for', 'chkbox_' + avTracker);
				avCbLbl.appendChild(document.createTextNode('Auto-Visit'));
				avCol.appendChild(avChkBox);
				avCol.appendChild(avCbLbl);
			}
		}
		fUpdateAutoVisit(false);
	}
	
	//  Update checkboxs whenever window gets focus, so changes in other tabs are recognized.
	window.document.addEventListener("focus", fWinFocus, true);
	
	
	//  Set submission button enable/disable status.
	EnableButton();

	//  Add event listeners to monitor text box and drop-down changes.
	e_LogTextArea.addEventListener("keyup", TextChg, true);
	e_LogTextArea.addEventListener("change", TextChg, true);
	e_LogTextArea.addEventListener("click", TextChg, true);
	e_LogTextArea.addEventListener("blur", Blurred, true);
	e_LogTextArea.addEventListener("focus", Focused, true);
	e_LogBookPanel1_ddLogType.addEventListener("change", TextChg, true);
	document.addEventListener("contextmenu", contextMenu, true);

	//  If travel bugs, hide, and add link to show.
	var e_LogBookPanel1_TBPanel = document.getElementById("ctl00_ContentBody_LogBookPanel1_TBPanel");
	if (e_LogBookPanel1_TBPanel) {

		if (!bShowInventory) {
			e_LogBookPanel1_TBPanel.style.display = 'none';
		}
		e_tblTravelBugs = document.getElementById("tblTravelBugs");
		if (e_tblTravelBugs) {
			s1 = '';
			var BugCount = (e_tblTravelBugs.rows.length - 2);
			if (BugCount != 1) { s1 = 's'; }
			e_BugCountSpan = document.createElement("span");
			e_BugCountSpan.style.color = 'rgb(255, 0, 0)';
			e_BugCountSpan.style.fontWeight = 'bold';
			e_BugCountSpan.style.paddingRight = '40px';
			e_BugCountLink = document.createElement("a");
			e_BugCountLink.href = 'javascript:void(0)';
			e_BugCountLink.title = 'Click to show/hide inventory';
			e_BugCountLink.addEventListener("click", ToggleInventory, true);
			e_BugCountLink.appendChild(document.createTextNode(BugCount + ' item' + s1 +
				' in inventory'));
			e_BugCountSpan.appendChild(e_BugCountLink);
			e_LogBookPanel1_LogButton.parentNode.insertBefore(e_BugCountSpan,
					e_LogBookPanel1_LogButton.parentNode.firstChild);
		}
	}


	//  Timer function to update counter when context menu is displayed.
	window.contextTimer = function() {
		if (contextTimerSwitch) {
			TimeOutID = 0;
			EnableButton();
			TimeOutID = window.setTimeout(contextTimer, 250);
		}
	}


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



	//  Check if date matches current date. Show calendar if it does.
	function fDateChanged() {
		var d = new Date();
		if ((e_dlDay.value != d.getDate()) ||
				(e_dlMonth.value != d.getMonth()+1) ||
				(e_dlYear.value != d.getFullYear())) {
			lnkCalendar.title = 'Set to current local date';
			lnkCalendarImg.style.opacity = 1;
			lnkCalendar.href = 'javascript:void(0)';
			lnkCalendar.addEventListener("click", fCalendarClicked, true);
			e_dlDay.style.backgroundColor = 'rgb(254, 255, 143)';
			e_dlMonth.style.backgroundColor = 'rgb(254, 255, 143)';
			e_dlYear.style.backgroundColor = 'rgb(254, 255, 143)';
		} else {
			lnkCalendar.title = '';
			lnkCalendarImg.style.opacity = 0.3;
			lnkCalendar.removeAttribute('href');
			lnkCalendar.removeEventListener("click", fCalendarClicked, true);
			e_dlDay.style.backgroundColor = 'rgb(255, 255, 255)';
			e_dlMonth.style.backgroundColor = 'rgb(255, 255, 255)';
			e_dlYear.style.backgroundColor = 'rgb(255, 255, 255)';
		}
	}


	//  Set date settings back to current date.
	function fCalendarClicked() {
		var d = new Date();
		//  Set year to current year.
		var curYear = d.getFullYear();
		for (i = 0; i < e_dlYear.options.length; i++) {
			e_dlYear.options[i].selected = (e_dlYear.options[i].value == curYear);
		}
		//  Set month to current month.
		e_dlMonth.options[d.getMonth()].selected = true;
		//  Set day to current day.
		e_dlDay.options[d.getDate()-1].selected = true;
		//  Set focus to the year field.
		e_dlYear.focus();
		//  Update display by calling date-changed function.
		fDateChanged();
	}



	//  Track textbox losing focus.
	function Blurred() {
		txtFocused = false;
		contextTimerSwitch = false;
	}


	//  Track textbox getting focus.
	function Focused() {
		txtFocused = true;
		EnableButton();
	}


	//  Start context menu timer.
	function contextMenu() {
		if (txtFocused) {
			contextTimerSwitch = true;
			contextTimer();
		}
	}


	//  Process textbox changes.
	function TextChg() {
		if (contextTimerSwitch) { contextTimerSwitch = false; }
		EnableButton();
	}

	//  Show/hide inventory.
	function ToggleInventory() {
		bShowInventory = (!bShowInventory);
		if (bShowInventory) {
			e_LogBookPanel1_TBPanel.style.display = '';
		} else {
			e_LogBookPanel1_TBPanel.style.display = 'none';
		}
	}

	//  Set submission button enable/disable status, and update character count.
	function EnableButton() {
		//  Get log text.
		var logText = e_LogTextArea.value;
		if (txtCharsLeft) {
			//  Carriage Returns count as 2 characters. Make adjustment.
			var crCount = 0;
			var cr = logText.match(/\n/g);
			if (cr) { crCount = cr.length; }
			//  Calculate remaining characters.
			var cl = maxLogLen - (logText.length + crCount);
			//  Update screen value.
			txtCharsLeft.data = cl;
			//  Change color to indicate if less than zero.
			if ((cl < 0) && !redAlert) {
				spanCharsLeft.style.color = 'rgb(255, 0, 0)';
				redAlert = true;
			} else if ((cl >= 0) && redAlert) {
				spanCharsLeft.style.color = 'rgb(0, 0, 0)';
				redAlert = false;
			}
			//  Terminate context timer if text length changed.
			if ((lastVal != cl) && contextTimerSwitch) {
				contextTimerSwitch = false;
			}
			//  Override display if 100 characters or less.
			if (lastVal != cl) {
				if (cl <= 100) {
					if (!CounterButton) {
						spanCharsLeft.style.display = '';
					}
				} else {
					if (!CounterButton) {
						spanCharsLeft.style.display = 'none';
					}
				}
			}

			//  Save current text length.
			lastVal = cl;
		}
		//  Enabel/disable submit button based on conditions.
		if (ValidateButton) {
			if ((logText.match(/\S/)) && !redAlert &&
					(e_LogBookPanel1_ddLogType.value != -1)) {
				e_LogBookPanel1_LogButton.disabled = false;
			} else {
				e_LogBookPanel1_LogButton.disabled = true;
			}
			e_VisSubBtn = document.getElementById("VisSubBtn");
			if (e_VisSubBtn) {e_VisSubBtn.disabled = e_LogBookPanel1_LogButton.disabled; }
		}
	}


	//  Change text entry box size.
	function ChangeSize() {
		var incRow = this.getAttribute('incRow') - 0;
		var incCol = this.getAttribute('incCol') - 0;
		if (incRow != 0) {
			var sizeVal = e_LogTextArea.rows + incRow;
			if (sizeVal > 0) {
				e_LogTextArea.rows = sizeVal;
				GM_setValue("CustomRowSize_" + SignedInAs, sizeVal);
			}
		}
		if (incCol != 0) {
			sizeVal = e_LogTextArea.cols + incCol;
			if (sizeVal > 0) {
				e_LogTextArea.cols = sizeVal;
				GM_setValue("CustomColSize_" + SignedInAs, sizeVal);
			}
		}
	}


	//  Toggle button validation status.
	function ToggleVldBtn() {
		ValidateButton = !ValidateButton;
		GM_setValue("ValidateButton_" + SignedInAs, ValidateButton);
		SetVldBtn();
	}


	//  Set button validation switch attributes.
	function SetVldBtn() {
		if (ValidateButton) {
			var ivVldBtn = imgValidateOn;
			var tiVldBtn = 'Turn button validation off'
			EnableButton();
		} else {
			ivVldBtn = imgValidateOff;
			tiVldBtn = 'Turn button validation on'
			e_LogBookPanel1_LogButton.disabled = false;
			e_VisSubBtn = document.getElementById("VisSubBtn");
			if (e_VisSubBtn) {e_VisSubBtn.disabled = e_LogBookPanel1_LogButton.disabled; }
		}
		imgVldBtn.src = ivVldBtn;
		lnkValidator.title = tiVldBtn;
	}


	//  Toggle counter status.
	function ToggleCntBtn() {
		CounterButton = !CounterButton;
		GM_setValue("CounterButton_" + SignedInAs, CounterButton);
		SetCntBtn();
	}

	//  Set counter switch attributes.
	function SetCntBtn() {
		if (CounterButton) {
			var ivCntBtn = imgNumbersOn;
			var tiCntBtn = 'Turn counter off'
			spanCharsLeft.style.display = '';
		} else {
			ivCntBtn = imgNumbersOff;
			tiCntBtn = 'Turn counter on'
			spanCharsLeft.style.display = 'none';
		}
		imgCntBtn.src = ivCntBtn;
		lnkCounter.title = tiCntBtn;
	}


	//  Insert hyperlink.
	function fTextLink() {
		var tlRtnVar = prompt('Enter the complete URL for the hyperlink.', 'http://');
		if (tlRtnVar == null) {
			alert('Link insertion canceled.');
			return;
		}
		//  [url=tlRtnVar][/url]
		var opnBBCode = '[url=' + tlRtnVar.trim() + ']';
		var clsBBCode = '[/url]';

		//  Autotrim selection;
		fAutoTrim();

		//  Reset work fields.
		var nTxt = '';
		var xTxt = '';

		//  Save original text value and scroll position.
		var oTxt = e_LogTextArea.value;
		var txtTop = e_LogTextArea.scrollTop;

		//  If portion of the text selected, save that text.
		var selStart = e_LogTextArea.selectionStart;
		var selEnd = e_LogTextArea.selectionEnd;
		if (selStart < selEnd) {
			xTxt = oTxt.substring(selStart, selEnd);
		}
		//  Get text on each side of the selection/carat;
		var txt1 = oTxt.substr(0, selStart);
		var txt2 = oTxt.substr(selEnd);
		//  Create new text and insert into text area.
		nTxt = txt1 + opnBBCode + xTxt + clsBBCode + txt2;
		e_LogTextArea.value = nTxt;
		//  Position carot, based on if any text was selected.
		var newCaretPos = selStart + opnBBCode.length;
		if (xTxt.length) { newCaretPos += xTxt.length + clsBBCode.length; }
		e_LogTextArea.focus();
		e_LogTextArea.selectionStart = newCaretPos;
		e_LogTextArea.selectionEnd = newCaretPos;
		e_LogTextArea.scrollTop = txtTop;
		TextChg();
	}


	//  Quote Text - Email style.
	function QuoteTextEmail() {
		var nTxt = '';

		//  Save original text value.
		var oTxt = e_LogTextArea.value;

		//  If portion of the text selected, use only that text.
		var selStart = e_LogTextArea.selectionStart;
		var selEnd = e_LogTextArea.selectionEnd;
		if (selStart < selEnd) {
				xTxt = oTxt.substring(selStart, selEnd);
			var selOnly = true;
		} else {
			xTxt = oTxt;
			selOnly = false;
		}

		//  Get rid of trailing line feeds.
		var xTxt = xTxt.replace(/\n+$/, '');

		//  Split by hard linebreaks.
		var pLine = xTxt.split('\n');
		for (var i = 0; i < pLine.length; i++) {
			//  Get line and trim right.
			var xLine = pLine[i].rtrim();
			do {
				//  If less or equal to quote length, use as is.
				if (xLine.length <= ql) {
					nTxt += ('> ' + xLine + '\n');
					xLine = '';
				//  Otherwise, search for last word break within quote length.
				} else {
					ssTxt = xLine.substr(0, ql + 1);
					var wbrk = ssTxt.lastIndexOf(' ');
					if (wbrk < 0) {
						wbrk = xLine.indexOf(' ');
						if (wbrk < 0) {
							wbrk = xLine.length -1;
						}
					}
					var nLine = xLine.substr(0, wbrk);
					nTxt += '> ' + nLine.rtrim() + '\n';
					xLine = xLine.substr(wbrk + 1);
					xLine = xLine.trim();
				}
			} while (xLine.length > 0);
		}

		//  Quoting finished. Replace all or selected text with
		//  the quoted text.
		if (!selOnly) {
			e_LogTextArea.value = nTxt;
		} else {
			var txt1 = oTxt.substr(0, selStart).trim();
			var txt2 = oTxt.substr(selEnd).trim();
			if (txt1.length > 0) { txt1 += '\n\n' }
			if (txt2.length > 0) { txt2 = '\n' + txt2 }
			e_LogTextArea.value = txt1 + nTxt + txt2;
		}
		TextChg();
	}



	//  Apply text edits (block-quotes, bold, italic, strikethrough, and color).
	function fEditText() {
		var editType = this.getAttribute('editType');
		var opnBBCode = '[' + editType + ']';
		var clsBBCode = '[/' + editType + ']';

		//  Autotrim selection;
		fAutoTrim();

		//  Reset work fields.
		var nTxt = '';
		var xTxt = '';

		//  Save original text value and scroll position.
		var oTxt = e_LogTextArea.value;
		var txtTop = e_LogTextArea.scrollTop;

		//  If portion of the text selected, save starting and ending points.
		var selStart = e_LogTextArea.selectionStart;
		var selEnd = e_LogTextArea.selectionEnd;

		//  If block quote, use enhances mode, if turned on.
		if (editType == 'quote') {
			var ynBlockQuoteEnhanced = GM_getValue('BlockQuoteEnhanced_' + SignedInAs, 'Off');
			if ((ynBlockQuoteEnhanced == 'On') & (selStart == selEnd)) {
				e_LogTextArea.select();
				selStart = e_LogTextArea.selectionStart;
				selEnd = e_LogTextArea.selectionEnd;
			}
		}

		//  Get selected text.
		if (selStart < selEnd) {
			xTxt = oTxt.substring(selStart, selEnd);
		}

		//  Get text on each side of the selection/carat;
		var txt1 = oTxt.substr(0, selStart);
		var txt2 = oTxt.substr(selEnd);

		//  Create new text and insert into text area.
		nTxt = txt1 + opnBBCode + xTxt + clsBBCode + txt2;
		e_LogTextArea.value = nTxt;

		//  Position carot, based on if any text was selected.
		var newCaretPos = selStart + opnBBCode.length;
		if (xTxt.length) { newCaretPos += xTxt.length + clsBBCode.length; }
		e_LogTextArea.focus();
		e_LogTextArea.selectionStart = newCaretPos;
		e_LogTextArea.selectionEnd = newCaretPos;
		e_LogTextArea.scrollTop = txtTop;
		TextChg();
	}



	//  Apply text edits (bold, italic, strikethrough, and color).
	function fEditTextFont() {
		var newFont = this.getAttribute('editType');
		var opnBBCode = '[font=' + newFont + ']';
		var clsBBCode = '[font=Verdana]';

		//  Autotrim selection;
		fAutoTrim();

		//  Reset work fields.
		var nTxt = '';
		var xTxt = '';

		//  Save original text value and scroll position.
		var oTxt = e_LogTextArea.value;
		var txtTop = e_LogTextArea.scrollTop;

		//  If portion of the text selected, save that text.
		var selStart = e_LogTextArea.selectionStart;
		var selEnd = e_LogTextArea.selectionEnd;
		if (selStart < selEnd) {
			xTxt = oTxt.substring(selStart, selEnd);
		}
		//  Get text on each side of the selection/carat;
		var txt1 = oTxt.substr(0, selStart);
		var txt2 = oTxt.substr(selEnd);
		//  Create new text and insert into text area.
		nTxt = txt1 + opnBBCode + xTxt + clsBBCode + txt2;
		e_LogTextArea.value = nTxt;
		//  Position carot, based on if any text was selected.
		var newCaretPos = selStart + opnBBCode.length;
		if (xTxt.length) { newCaretPos += xTxt.length + clsBBCode.length; }
		e_LogTextArea.focus();
		e_LogTextArea.selectionStart = newCaretPos;
		e_LogTextArea.selectionEnd = newCaretPos;
		e_LogTextArea.scrollTop = txtTop;
		TextChg();
	}


	//  Color selector changed.
	function fColorChange() {
		var newColor = this.value;
		lnkTextColor.setAttribute('editType', newColor);
		GM_setValue("EditTextColor_" + SignedInAs, newColor);
	}


	//  Font selector changed.
	function fFontChange() {
		var newFont = this.value;
		lnkTextFont.setAttribute('editType', newFont);
		fontSelect.style.fontFamily = newFont;
		GM_setValue("EditTextFont_" + SignedInAs, newFont);
	}


	//  Store default dropdown values.
	function nsweChange() {
		GM_setValue(this.id, this.value)
	}


	//  Coordinate button clicked.
	function ctButtonClicked() {
		// Split input value into number groups.
		var cs = coorBox.value;
		cs = cs.replace(/(\D)+/g,' ').trim();
		var nums = cs.split(' ');

		var selectNorthSouth = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1:_selectNorthSouth");
		var selectEastWest = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1:_selectEastWest");
		var LatDegs = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLatDegs");
		var LonDegs = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLongDegs");

		//  Save original coordinates.
		var prvNS = selectNorthSouth.value - 0;
		var prvEW = selectEastWest.value - 0;
		var prvLat = 0;
		var prvLon = 0;

		selectNorthSouth.value = nsSelect.value;
		selectEastWest.value = weSelect.value;

		//  Type 0: Decimal Degrees (DegDec)
		if (WptEntryType == 0) {
			prvLat = LatDegs.value * prvNS;
			prvLon = LonDegs.value * prvEW;
			if (nums.length < 4) {
				alert('Not enough numeric data elements.');
			} else {
				LatDegs.value = nums[0] + '.' + nums[1];
				LonDegs.value = nums[2] + '.' + nums[3];
			}

		//  Type 1: Degrees and minutes (MinDec)
		} else if (WptEntryType == 1) {
			if (nums.length < 6) {
				alert('Not enough numeric data elements.');
			} else {
				var LatMins = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLatMins");
				var LonMins = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLongMins");
				LatDegs.value = nums[0];
				LatMins.value = nums[1] + '.' + nums[2];
				LonDegs.value = nums[3];
				LonMins.value = nums[4] + '.' + nums[5];
			}

		//  Type 2: Degrees, minutes, seconds (DMS)
		} else if (WptEntryType == 2) {
			if (nums.length < 8) {
				alert('Not enough numeric data elements.');
			} else {
				var LatMins = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLatMins");
				var LatSecs = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLatSecs");
				var LonMins = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLongMins");
				var LonSecs = document.getElementById("ctl00_ContentBody_LogBookPanel1_LatlongEditor1__inputLongSecs");
				LatDegs.value = nums[0];
				LatMins.value = nums[1];
				LatSecs.value = nums[2] + '.' + nums[3];
				LonDegs.value = nums[4];
				LonMins.value = nums[5];
				LonSecs.value = nums[6] + '.' + nums[7];
			}
		}

	}


	//  Toggle Smiley bar on/off.
	function fSmileyBarOnOff() {
		var sbStatusOn = eval(this.getAttribute('status'));
		sbStatusOn = eval(!sbStatusOn);
		this.setAttribute('status', sbStatusOn);
		if (sbStatusOn) {
			sbTable.style.visibility = 'visible';
		} else {
			sbTable.style.visibility = 'collapse';
		}
		e_LogTextArea.focus();
	}



	function fSmileyClicked() {
		var sCode = this.getAttribute('code');

		//  Autotrim selection;
		fAutoTrim();

		//  Reset work fields.
		var nTxt = '';

		//  Save original text value and scroll position.
		var oTxt = e_LogTextArea.value;
		var txtTop = e_LogTextArea.scrollTop;

		//  If portion of the text selected, save that text.
		var selStart = e_LogTextArea.selectionStart;
		var selEnd = e_LogTextArea.selectionEnd;
		//  Get text on each side of the selection/carat;
		var txt1 = oTxt.substr(0, selStart);
		var txt2 = oTxt.substr(selEnd);
		//  Create new text and insert into text area.
		nTxt = txt1 + sCode + txt2;
		e_LogTextArea.value = nTxt;
		//  Position carot, based on if any text was selected.
		var newCaretPos = selStart + sCode.length;
		e_LogTextArea.focus();
		e_LogTextArea.selectionStart = newCaretPos;
		e_LogTextArea.selectionEnd = newCaretPos;
		e_LogTextArea.scrollTop = txtTop;
		TextChg();
	}

	
	
	// ------------ Auto Visit Functions ------------ //
	
	//  Update checkmark whenever this tab gets focus, to keep all tabs in sync.
	function fWinFocus() {
		fUpdateAutoVisit(false);
	}
	
	//  Change checkmarks and visit action based on stored trackers.
	function fUpdateAutoVisit(UpdateDropdown) {
		//  Counter for number of auto-trackers checked.
		var atc = 0;
		// Get list of auto-visiting trackers, and put in array.
		var arAutoTrackers = GM_getValue('AutoTrackers' + SignedInAs, '').split(',');
		for (idx in arTrackers) {
			var cbox = document.getElementById('chkbox_' + arTrackers[idx]);
			var drop = document.getElementById(cbox.getAttribute('drpdwnctl', ''));
			var bSetToAuto = (arAutoTrackers.indexOf(arTrackers[idx]) >= 0);
			cbox.checked = bSetToAuto;
			if (bSetToAuto) {
				++atc;
				if(UpdateDropdown) {
					drop.value = drop.options[drop.options.length - 1].value;
				}
			}
		}
		if (UpdateDropdown) {
			unsafeWindow.setSelectedActions();
		}
		//  Create Visit & Submit button.
		var e_VisSubBtn = document.getElementById("VisSubBtn");
		if (e_VisSubBtn) {
			if (atc == 0) {
				removeNode(e_VisSubBtn);
			} else {
				e_VisSubBtn.value = 'Visit ' + atc.toString() + ' & Submit';
			}
		} else {
			if (atc > 0) {
				e_VisSubBtn = document.createElement("input");
				e_VisSubBtn.id = "VisSubBtn"
				e_VisSubBtn.type = 'Submit';
				e_VisSubBtn.setAttribute('class', 'Button');
				e_VisSubBtn.style.marginRight = '20px';				
				e_VisSubBtn.value = 'Visit ' + atc.toString() + ' & Submit';
				e_VisSubBtn.disabled = e_LogBookPanel1_LogButton.disabled;
				insertAheadOf(e_VisSubBtn, e_LogBookPanel1_LogButton);
				e_VisSubBtn.addEventListener("click", fVisSubBtnClicked, true);
			}
		}
	}
	
	
	//  Handler for Visit & Submit button. Update dropdowns and click submit button.
	function fVisSubBtnClicked() {
		fUpdateAutoVisit(true);
		e_LogBookPanel1_LogButton.click();
	}
	
	
	//  When checkmarks changed, update list of stored trackers, and execute function to
	//  update display.
	function fAutoVisitChanged() {
		var arAutoTrackers = GM_getValue('AutoTrackers' + SignedInAs, '').split(',');
		var cbTracker = this.getAttribute('tracker');
		var idx  = arAutoTrackers.indexOf(cbTracker);
		var bInList = (idx >= 0);
		if (this.checked) {
			if (!bInList) { arAutoTrackers.push(cbTracker); }
		} else {
			if (bInList) { arAutoTrackers.splice(idx, 1); }
		}
		GM_setValue('AutoTrackers' + SignedInAs, arAutoTrackers.join(','));
		fUpdateAutoVisit(false);
	}
	
	// ------------ End of Auto Visit Functions ------------ //
	
	

	//  Apply Auto Trim to selected text, if option is turned on.
	function fAutoTrim() {
		if (GM_getValue('AutoTrim_' + SignedInAs, 'On') == 'On') {
			var atStart = e_LogTextArea.selectionStart;
			var atEnd = e_LogTextArea.selectionEnd;
			if (atEnd > atStart) {
				var atTxt = e_LogTextArea.value;
				var atLastChar = atTxt.substr(atEnd-1, 1);
				while (atLastChar.match(/\s/)) {
					atEnd--;
					var atLastChar = atTxt.substr(atEnd-1, 1);
				}
				e_LogTextArea.selectionEnd = atEnd;
			}
		}
	}


	//  Turn Auto Trim on or off, via Tools menu option.
	function fSetAutoTrim() {
		var ynAutoTrim = GM_getValue('AutoTrim_' + SignedInAs, 'On');
		var Resp = confirm('When Auto Trim is On, any trailing spaces within\n' +
				'the selected text is ignored when applying editing\n' +
				'styles to the text. This allows you to select a\n' +
				'single word by double-clicking it, without having\n' +
				'to remove any trailing space included within the\n' +
				'selection.\n\n' +
				'Click OK to activate Auto Trim.\n' +
				'Click CANCEL to deactivate Auto Trim.\n\n' +
				'Auto Trim is currently turned ' + ynAutoTrim + '.');
		if (Resp) {
			ynAutoTrim = 'On';
		} else {
			ynAutoTrim = 'Off';
		}
		GM_setValue('AutoTrim_' + SignedInAs, ynAutoTrim);
		alert('Auto Trim has been turned ' + ynAutoTrim + '.\n\n' +
				'This change is immediately applied.\n');
	}


	//  Allow user to customize month names.
	function fSetMonthNames() {
		var mthNameList = GM_getValue("MonthNames_" + SignedInAs, '');
		var Resp = prompt('Enter all 12 month names, separated by commas.\n' +
				'Set to blank to revert names back to English.', mthNameList);
		if (Resp == null) {
			alert('Month name editing canceled.');
		} else {
			Resp = Resp.trim();
			if (Resp.length) {
				smnTest = Resp.split(',');
				if (smnTest.length != 12) {
					alert('Incorrect number of month names entered.\n\n' +
							'Editing failed.\n');
					return;
				}
			}
			GM_setValue("MonthNames_" + SignedInAs, Resp)
			alert('Month names have been edited.\n\n' +
					'This change will appear when the page is refreshed.\n');
		}
	}



	//  Turn Date Detection on or off, via Tools menu option.
	function fSetDateDetection() {
		var ynDateDetection = GM_getValue('DateDetection_' + SignedInAs, 'On');
		var Resp = confirm('When Date Detection is On, the date fields will be\n' +
				'checked to see if they match the current date, as\n' +
				'set on your PC. If the date is different, the date\n' +
				'fields will be highlighted (as a reminder), and a\n' +
				'calendar icon is displayed. Clicking this icon\n' +
				'will set the date fields to the current date, and\n' +
				'remove the highlighting. When the date fields\n' +
				'match your PC\'s date, the calendar icon will be\n' +
				'dimmed, to indicate that Date Detection is turned On.\n\n' +
				'Click OK to activate Date Detection.\n' +
				'Click CANCEL to deactivate Date Detection.\n\n' +
				'Date Detection is currently turned ' + ynDateDetection + '.');
		if (Resp) {
			ynDateDetection = 'On';
		} else {
			ynDateDetection = 'Off';
		}
		GM_setValue('DateDetection_' + SignedInAs, ynDateDetection);
		alert('Date Detection has been turned ' + ynDateDetection + '.\n\n' +
				'This change will appear when the page is refreshed.\n');
	}


	//  Set how Block Quote behaves when no text is selected.
	function fSetBlockQuoteAction() {
		var ynBlockQuoteEnhanced = GM_getValue('BlockQuoteEnhanced_' + SignedInAs, 'Off');
		var Resp = confirm(
				'By default, when you click the Block Quote control, and no text\n' +
				'was selected, a bare [quote][/quote] tag pair are set at the\n' +
				'current text entry point. However, you can turn on an enhanced\n' +
				'quoting mode. In this mode, if there is no text selected, all\n' +
				'the text currently in the text box will be enclosed in quote\n' +
				'tags. This is handy if you paste in the text you\'re quoting\n' +
				'before you enter any additional text, as it saves you from having\n' +
				'to select what you\'ve just pasted.\n' +
				'\n' +
				'Click OK to activate the Enhanced Blocke Quote Mode.\n' +
				'Click CANCEL to deactivate the Enhanced Blocke Quote Mode.\n' +
				'\n' +
				'Enhanced Blocke Quote Mode is currently turned ' + ynBlockQuoteEnhanced + '.');
		if (Resp) {
			ynBlockQuoteEnhanced = 'On';
		} else {
			ynBlockQuoteEnhanced = 'Off';
		}
		GM_setValue('BlockQuoteEnhanced_' + SignedInAs, ynBlockQuoteEnhanced);
		alert('Enhanced Blocke Quote Mode has been turned ' + ynBlockQuoteEnhanced + '.\n' +
				'\n' +
				'This change is immediately applied.\n');
	}


	//  Set option to initially hide or show inventory.
	function fSetHideInventory() {
		var ynHideInventory = GM_getValue('HideInventory' + SignedInAs, 'On');
		var Resp = confirm('When Hide Inventory is On, your inventory\n' +
				'of travel bugs and coins is initially hidden from\n' +
				'view. Instead, the number of items in your\n' +
				'inventory is displayed in a link next to the\n' +
				'submit button. Clicking the link will cause the\n' +
				'inventory to be displayed. Clicking again will\n' +
				'hide it.\n\n' +
				'Click OK to turn Hide Inventory On.\n' +
				'Click CANCEL turn Hide Inventory Off.\n\n' +
				'Hide Inventory is currently turned ' + ynHideInventory + '.');
		if (Resp) {
			ynHideInventory = 'On';
		} else {
			ynHideInventory = 'Off';
		}
		GM_setValue('HideInventory' + SignedInAs, ynHideInventory);
		alert('Hide Inventory has been turned ' + ynHideInventory + '.\n\n' +
				'This change will appear when the page is refreshed.\n');
	}


	//  Set option to initially hide or show smilie bar.
	function fSetHideSmilieBar() {
		var ynHideSmilieBar = GM_getValue('HideSmilieBar' + SignedInAs, 'On');
		var Resp = confirm('When Hide Smilie Bar is On, the Smilie\n' +
				'Bar is initially hidden from view. Turning this\n' +
				'the link will cause the Smilie Bar to be displayed. \n' +
				'option Off will cause the Smilie Bar to initially.\n' +
				'be shown when the log page opens.\n\n' +
				'Click OK to turn Hide Smilie Bar On.\n' +
				'Click CANCEL turn Hide Smilie Bar Off.\n\n' +
				'Hide Smilie Bar is currently turned ' + ynHideSmilieBar + '.');
		if (Resp) {
			ynHideSmilieBar = 'On';
		} else {
			ynHideSmilieBar = 'Off';
		}
		GM_setValue('HideSmilieBar' + SignedInAs, ynHideSmilieBar);
		alert('Hide Smilie Bar has been turned ' + ynHideSmilieBar + '.\n\n' +
				'This change will appear when the page is refreshed.\n');
	}


	//  Set font for text area.
	function fSetTextAreaFont() {
		var e_lnkTextFont = document.getElementById("lnkTextFont");
		var taFont = e_lnkTextFont.getAttribute('editType');
		var Resp = confirm('Click OK to set Text Area font to ' + taFont + '.\n' +
				'Click CANCEL to reset font to default value of Verdana.');
		if (Resp) {
		} else {
			taFont = 'Verdana';
		}
		GM_setValue('TextAreaFont' + SignedInAs, taFont);
		e_LogTextArea.style.fontFamily = taFont + ', Helvetica, san-serif';
		alert('Text area font has been changed to ' + taFont + '.');
	}


	//	Insert element after an existing element.
	function insertAfter(newElement, anchorElement) {
		anchorElement.parentNode.insertBefore(newElement, anchorElement.nextSibling);
	}

	//  Insert element aheadd of an existing element.
	function insertAheadOf(newElement, anchorElement) {
		anchorElement.parentNode.insertBefore(newElement, anchorElement);
	}


	//  Remove element and everything below it.
	function removeNode(element) {
		element.parentNode.removeChild(element);
	}


	//  Move up the DOM tree a specific number of generations.
	function fUpGen(gNode, g) {
		var gNode;
		var g;
		for (var i = 0; i < g; i++) {
			gNode = gNode.parentNode;
		}
		return gNode;
	}

	//  Move up the DOM tree until a specific DOM type is reached.
	function fUpGenToType(gNode, gType) {
		var gNode;
		var gType = gType.toUpperCase();
		while (gNode.nodeName.toUpperCase() != gType) {
			gNode = gNode.parentNode;
		}
		return gNode;
	}

