/*
Geocaching Email Maximizer - v1.0 2006-10-18
(c) 2006, Prime Suspect Software

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

Compatible with Greasemonkey 0.6.4.

Function:
 Allows user to resize text entry box on the email. 
 Text quoting function: Copy text to text box and 
 click ">". Line breaks will be added at the approxomate 
 line width, and each line prepended with a ">".
 
Usage:
 Use the arrow icons (next to the smilie button) to adjust the size
 of the text entry box. Clicking the Quote icon quote-formats all the
 text in the text box, if no text is selected. If text is selected,
 only that text will be quote-formatted. 

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

Change Log:

* (v1.0) Initial release

*/

// ==UserScript==

// @name             GC Email Maximizer
// @description      (v1.0) GC Email Maximizer
// @namespace        http://gmscripts.locusprime.net/
// @include          http://www.geocaching.com/email/* 

// ==/UserScript==

(function() {

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

	//  Remove unnecessary blank space.
	var e_Form1 = document.getElementById("Form1");
	if (e_Form1) {
		var Form1_TD = e_Form1.parentNode;
		if (Form1_TD.nodeName == "TD") {
			var ndList = Form1_TD.childNodes;
			for (var i = ndList.length - 1; i > 0; i--) {
				if (ndList[i].nodeName == "BR") {
					ndList[i].parentNode.removeChild(ndList[i]);
				}
			}
		}
	}
	
	//  Get currently signed-on geocaching.com profile.
	var e_LogInName = document.getElementById("Header1_lnkLoginName");
	if (e_LogInName) {
		SignedInAs = e_LogInName.firstChild.firstChild.data;
		SignedInAs = SignedInAs.replace(/<\&amp;>/g, '&');
	} else {
		return;
	}

	//  Get handle to page's message entry box.
	e_MsgBox = document.getElementById("SendMessagePanel1_tbMessage");
	if (!e_MsgBox) {
		return;
	}

	//  Icon images.
	var imgQuote = 
		"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 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";

	
	//  Create div to hold new controls.
	var divCtrls = document.createElement("div");
	divCtrls.id = 'divCtrls';
	divCtrls.style.whiteSpace = 'nowrap';
	divCtrls.style.marginTop = "4px";
	
	//  Add control div below character counter.
	var e_spnMsg = document.getElementById("spnMsg");
	var e_spnMsg_Parent = e_spnMsg.parentNode;
	e_spnMsg_Parent.parentNode.insertBefore(divCtrls, e_spnMsg_Parent.nextSibling);

	//  Create left arrow and add to div.
	var lnkLeftArrow = document.createElement("a");
	var lnkLeftArrowImg = document.createElement("img");
	lnkLeftArrowImg.src = imgArrowLeft;
	lnkLeftArrowImg.border = 0;
	lnkLeftArrow.appendChild(lnkLeftArrowImg);
	lnkLeftArrow.title = 'Decrease textbox width';
	lnkLeftArrow.href = 'javascript:void(0)';
	lnkLeftArrow.setAttribute('incCol', -1);
	lnkLeftArrow.setAttribute('incRow', 0);
	lnkLeftArrow.addEventListener("click", ChangeSize, true);
	divCtrls.appendChild(lnkLeftArrow);

	//  Create up arrow and add to div.
	var lnkUpArrow = document.createElement("a");
	var lnkUpArrowImg = document.createElement("img");
	lnkUpArrowImg.src = imgArrowUp;
	lnkUpArrowImg.border = 0;
	lnkUpArrow.appendChild(lnkUpArrowImg);		
	lnkUpArrow.title = 'Decrease textbox height';
	lnkUpArrow.href = 'javascript:void(0)';
	lnkUpArrow.setAttribute('incCol', 0);
	lnkUpArrow.setAttribute('incRow', -1);
	lnkUpArrow.addEventListener("click", ChangeSize, true);
	divCtrls.appendChild(lnkUpArrow);

	//  Create down arrow and add to div.
	var lnkDownArrow = document.createElement("a");		
	var lnkDownArrowImg = document.createElement("img");
	lnkDownArrowImg.src = imgArrowDown;
	lnkDownArrowImg.border = 0;		
	lnkDownArrow.appendChild(lnkDownArrowImg);		
	lnkDownArrow.title = 'Increase textbox height';
	lnkDownArrow.href = 'javascript:void(0)';
	lnkDownArrow.setAttribute('incCol', 0);
	lnkDownArrow.setAttribute('incRow', 1);
	lnkDownArrow.addEventListener("click", ChangeSize, true);
	divCtrls.appendChild(lnkDownArrow);
	
	//  Create right arrow and add to div.
	var lnkRightArrow = document.createElement("a");
	var lnkRightArrowImg = document.createElement("img");
	lnkRightArrowImg.src = imgArrowRight;
	lnkRightArrowImg.border = 0;
	lnkRightArrow.appendChild(lnkRightArrowImg);		
	lnkRightArrow.title = 'Increase textbox width';
	lnkRightArrow.href = 'javascript:void(0)';
	lnkRightArrow.setAttribute('incCol', 1);
	lnkRightArrow.setAttribute('incRow', 0);
	lnkRightArrow.addEventListener("click", ChangeSize, true);
	divCtrls.appendChild(lnkRightArrow);
	divCtrls.appendChild(document.createTextNode('\u00A0 '));

	//  Create quote control and add to div.
	var lnkQuote = document.createElement("a");
	var lnkQuoteImg = document.createElement("img");
	lnkQuoteImg.src = imgQuote;
	lnkQuoteImg.border = 0;
	lnkQuote.appendChild(lnkQuoteImg);
	lnkQuote.title = 'Quote text';
	lnkQuote.href = 'javascript:void(0)';
	lnkQuote.addEventListener("click", QuoteText, true);
	divCtrls.appendChild(lnkQuote);
	
	//  Change text entry box size.
	var NewRowSize =  GM_getValue("CustomRowSize_" + SignedInAs, 0);
	var NewColSize =  GM_getValue("CustomColSize_" + SignedInAs, 0);
	
	if (NewRowSize > 0) {
		e_MsgBox.rows = NewRowSize;
	}
	
	if (NewColSize > 0) {
		e_MsgBox.cols = NewColSize;
	}
	

	//  Add default setting checkbox for email address.
	var e_SndAdr = document.getElementById("SendMessagePanel1_chkSendAddress")
	var cellDftSndAdr = e_SndAdr.parentNode.parentNode.childNodes[1];
	cellDftSndAdr.style.whiteSpace = 'nowrap';
	var chkDftSndAdr = document.createElement("input");
	chkDftSndAdr.type = "checkbox";
	chkDftSndAdr.id = "chkDftSndAdr";
	cellDftSndAdr.appendChild(chkDftSndAdr);
	lblDftSndAdr = document.createElement("label");
	lblDftSndAdr.setAttribute('for', 'chkDftSndAdr');
	lblDftSndAdr.appendChild(document.createTextNode("Default for \u21D2"))
	cellDftSndAdr.appendChild(lblDftSndAdr);
	chkDftSndAdr.addEventListener("click", ChgDftSndAdr, true);

	//  Add default setting checkbox for email copy.
	var e_SndCpy = document.getElementById("SendMessagePanel1_chkEmailCopy")
	var cellDftSndCpy = e_SndCpy.parentNode.parentNode.childNodes[1];
	cellDftSndCpy.style.whiteSpace = 'nowrap';
	var chkDftSndCpy = document.createElement("input");
	chkDftSndCpy.type = "checkbox";
	chkDftSndCpy.id = "chkDftSndCpy";
	cellDftSndCpy.appendChild(chkDftSndCpy);
	lblDftSndCpy = document.createElement("label");
	lblDftSndCpy.setAttribute('for', 'chkDftSndCpy');
	lblDftSndCpy.appendChild(document.createTextNode("Default for \u21D2"))
	cellDftSndCpy.appendChild(lblDftSndCpy);
	chkDftSndCpy.addEventListener("click", ChgDftSndCpy, true);

	//  Set defaults.
	chkDftSndAdr.checked = GM_getValue("DftSndAdr_" + SignedInAs, true);
	e_SndAdr.checked = chkDftSndAdr.checked;	
	chkDftSndCpy.checked = GM_getValue("DftSndCpy_" + SignedInAs, true);
	e_SndCpy.checked = chkDftSndCpy.checked;

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

	
	function ChgDftSndAdr() {
		GM_setValue("DftSndAdr_" + SignedInAs, chkDftSndAdr.checked);
		e_SndAdr.checked = chkDftSndAdr.checked;
	}
	
	function ChgDftSndCpy() {
		GM_setValue("DftSndCpy_" + SignedInAs, chkDftSndCpy.checked);
		e_SndCpy.checked = chkDftSndCpy.checked;
	}

	//  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_MsgBox.rows + incRow;
			if (sizeVal > 0) {
				e_MsgBox.rows = sizeVal;
				GM_setValue("CustomRowSize_" + SignedInAs, sizeVal);
			}
		}		
		if (incCol != 0) {
			sizeVal = e_MsgBox.cols + incCol;
			if (sizeVal > 0) {
				e_MsgBox.cols = sizeVal;
				GM_setValue("CustomColSize_" + SignedInAs, sizeVal);
			}
		}		
	}


	//  Quote Text.
	function QuoteText() {
		var nTxt = '';

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

		//  If portion of the text selected, use only that text.
		var selStart = e_MsgBox.selectionStart;
		var selEnd = e_MsgBox.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_MsgBox.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_MsgBox.value = txt1 + nTxt + txt2;
		}
		TextChg();
	}		


	//  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,'');
	}
	
})();

