Blank Canvas Gmail Signatures

By Jerome Dane Last update Feb 27, 2009 — Installed 31,671 times. Daily Installs: 39, 28, 22, 12, 21, 22, 29, 29, 53, 41, 22, 26, 50, 68, 63, 76, 54, 27, 42, 63, 71, 58, 64, 46, 23, 25, 67, 74, 86, 62, 73, 52

There are 2 previous versions of this script.

// ==UserScript==
// @name           Gmail HTML Signatures 
// @description    Automatically inserts HTML signatures into your Gmail messages based on which address you are sending from. (Replaced by Blank Canvas Gmail Signatures: http://blankcanvasweb.com/pages/id_9/n_gmail_signatures/)
// @namespace      http://blankcanvasweb.com
// @include        http://mail.google.com/*
// @include        https://mail.google.com/*
// ==/UserScript==
//
// version 1.07 - Last updated January 30, 2008
// Author: Jerome Dane - Blank Canvas
// License: http://blankcanvasweb.com/pages/detail/id_43/n_license_&_eula/
// Latest Information: http://blankcanvasweb.com/pages/detail/id_9/n_gmail_signatures/
//
// --------------------------------------------------------------------------------------
// ---------- Do not edit below this line unless you really know what you are doing -----
// --------------------------------------------------------------------------------------
var version = '1.07';
var gmail = null;
var signatures = Array();		
var emails = Array();			
var select_from = null;
var msg_box = null;
var navbox = null;
var target_email = null;
var edit_sig_link = false;
var edit_sig_form = false;
var edit_sig_header = false;
var edit_sig_textarea = false;
var edit_sig_button = false;
var email_addresses = unescape(GM_getValue('email_addresses', ''));
var compose_retries = 2;
var module = null;
var module_node = null;
var module_header = null;
var module_footer = null;
var default_address_link = false;
var module_preview = null;
var default_address = unescape(GM_getValue('default_address', ''));
var installed_version = GM_getValue('version', '');

// make sure that the default gmail address is set
function set_default_address() {
	var str = prompt("Gmail 2.0 Multiple HTML Signatures Setup\n\n\
If you have multiple email addresses set up in your gmail account, all you have to do is look for the 'Create Signature' link that appears on the 'Compose Mail' page. It is located to the right of the select box that allows you to choose which address you're sending from. \n\n\
If you only send mail from your gmail address and do not have any other addresses set up, fill in your gmail address below and then look for the 'Create Signature' link on the 'Compose Mail' page. It is located just under the 'To' field.");
	if(str != null) {
		if(!str.match(/@gmail.com$/)) {
			alert('Your gmail address must end in "@gmail.com".');
			set_default_address();
			return false;
		} else {
			GM_setValue('default_address', str);
			default_address = str;	
			try { 
				default_address_link.innerHTML = str
			} catch(e) {}
			load_signatures();
		}
	}
}
function load_signatures() {
	emails = new Array();
	signatures = new Array();
	var list = unescape(GM_getValue('email_addresses', '')).split(/,/);
	for(x in list) {	// loop through signatures and set up arrays
		if(list[x]) {
			emails.push(list[x]);
			signatures.push(unescape(GM_getValue(list[x], '')));
		}
	}
}
function edit_signature() {
	create_edit_form();
	edit_sig_button.value = 'Save Signature';
	edit_sig_header.innerHTML = 'Edit Signature for ' + target_email;
	edit_sig_link.innerHTML = 'Cancel';
	edit_sig_link.onclick = close_edit_signature;
	var sig = '';
	for(x in emails) {
		if(emails[x] == target_email) {
			sig = signatures[x];
		}
	}
	edit_sig_textarea.innerHTML = sig;	
	edit_sig_form.style.display = 'block';
	edit_sig_button.onclick = save_signature;
	edit_sig_textarea.focus();
}
function create_signature() {
	create_edit_form();
	edit_sig_header.innerHTML = 'Create Signature for ' + target_email;
	edit_sig_button.value = 'Create Signature';
	edit_sig_link.innerHTML = 'Cancel';
	edit_sig_link.onclick = close_edit_signature;
	edit_sig_form.style.display = 'block';
	edit_sig_button.onclick = save_signature;
	edit_sig_textarea.focus();
}
function create_edit_form() {
	try {
		edit_sig_form.parentNode.removeChild(edit_sig_form);
	} catch(e) {}
	// edit signature form
	edit_sig_form = unsafeWindow.document.createElement('span');
	edit_sig_form.style.display = 'block';
	edit_sig_form.style.padding = '10px'
	edit_sig_form.style.display = 'none';
	select_from.parentNode.appendChild(edit_sig_form);
	// edit_sig_header 
	edit_sig_header = unsafeWindow.document.createElement('div');
	edit_sig_header.style.fontWeight = 'bold';
	edit_sig_header.style.fontSize = '12px';
	edit_sig_form.appendChild(edit_sig_header);
	// textarea
	edit_sig_textarea = unsafeWindow.document.createElement('textarea');
	edit_sig_textarea.style.width = '600px';
	edit_sig_textarea.style.height = '200px';
	edit_sig_textarea.style.fontSize = '12px';
	edit_sig_form.appendChild(edit_sig_textarea);
	// button
	edit_sig_button = unsafeWindow.document.createElement('input');
	edit_sig_button.type = 'button';
	edit_sig_button.style.fontSize = '12px';
	edit_sig_button.style.marginLeft = '10px';
	edit_sig_form.appendChild(edit_sig_button);
}
function save_signature() {
	var ptrn = new RegExp(target_email);
	if(!email_addresses.match(ptrn)) {
		GM_setValue('email_addresses', email_addresses + ',' + target_email);
	}	
	var sig = edit_sig_textarea.value;
	sig = sig.replace(/^(\s|\n)*/, '');
	sig = sig.replace(/(\s|\n)*$/, '');
	GM_setValue(target_email, escape(sig));
	load_signatures();
	close_edit_signature();
	draw_edit_sig_link();
	sig_insert();
	draw_module();
}
function close_edit_signature() {
	edit_sig_form.parentNode.removeChild(edit_sig_form);
	draw_edit_sig_link();
}
function draw_edit_sig_link() {
	try {
		edit_sig_link.parentNode.removeChild(edit_sig_link);
	} catch(e) { }
	edit_sig_link = unsafeWindow.document.createElement('span');
	edit_sig_link.style.cursor = 'pointer';
	edit_sig_link.style.margin = '0 0 0 1em;';
	edit_sig_link.style.fontWeight = 'bold';
	edit_sig_link.style.fontSize = '11px';
	select_from.parentNode.appendChild(edit_sig_link);
	var sig = '';
	for(x in emails) {
		if(emails[x] == target_email) {
			sig = signatures[x];
		}
	}
	if(sig) {
		edit_sig_link.style.color = '#0000FF';
		edit_sig_link.innerHTML = 'Edit Signature';
		edit_sig_link.onclick = edit_signature;
	} else {
		edit_sig_link.innerHTML = 'Create Signature';	
		edit_sig_link.style.color = '#FF0000';
		edit_sig_link.onclick = create_signature;
	}
}
function sig_insert() {
	var sig = '';
	for(x in emails) {
		if(emails[x] == target_email) {
			sig = signatures[x];
		}
	}
	if(msg_box) {
		var signature = '<!--START_SIG-->' + sig + '<!--END_SIG-->';
		var pattern = new RegExp('<\!--START_SIG-->(.|\n)*<\!--END_SIG-->');
		// strip any existing sigs	
		if(msg_box.contentDocument.body.innerHTML.match(pattern)) {
			//msg_box.contentDocument.body.innerHTML = signature + msg_box.contentDocument.body.innerHTML;	// new signature
			msg_box.contentDocument.body.innerHTML = msg_box.contentDocument.body.innerHTML.replace(pattern, signature);
		} else {
			msg_box.contentDocument.body.innerHTML = '<br><br>' + signature + msg_box.contentDocument.body.innerHTML;	// new signature
		}
	}
	draw_edit_sig_link();
}
function check_version() {
	if(version != installed_version) {
		clear_saved_sigs();  ///////////////////////////// comment out for future versions //////////////////////
		GM_setValue('version', version);
		installed_version = version;
	}
}
function clear_saved_sigs() {
	for(x in emails) {
		if(emails[x] && emails[x] != 'undefined') {
			GM_setValue(emails[x], '');
		}
	}
	GM_setValue('email_addresses', '');
	load_signatures();
}
function draw_module() {
	module_node.innerHTML = '';
	try {
		module_header.parentNode.removeChild(module_header);
		default_address_link.parentNode.removeChild(default_address_link);
	} catch(e) {}
	// list saved signatures
	if(email_addresses) {
		module_header = unsafeWindow.document.createElement('div');
		module_header.style.fontSize = '11px';
		module_header.innerHTML = '<div style="margin:.5em 0; font-weight:bold;">Saved Signatures:</div>';
		module_header.style.marginBottom = '.5em';
		var found = 0;
		for(x in emails) {
			if(signatures[x] && emails[x]) {
				if(emails[x] == 'undefined') {
					document.location = '';		// reload page in case of signature failure
				}
				module_header.innerHTML += '<div><a title="' + emails[x] + '">' + emails[x] + '</a></div>';
				found++;
			}
		}
		if(found) {
			module_node.appendChild(module_header);
		}
	}
	// default address link
	default_address_link = unsafeWindow.document.createElement('a');
	default_address_link.style.cursor = 'pointer';
	default_address_link.style.color = '#0000FF';
	default_address_link.style.display = 'block';
	default_address_link.style.marginTop = '1em';
	default_address_link.style.textAlign = 'center';
	default_address_link.style.textDecoration = 'underline';
	default_address_link.innerHTML = default_address ? default_address : 'Setup Instructions';
	default_address_link.onclick = set_default_address;
	module_node.appendChild(default_address_link);
	// module footer	
	module_footer = unsafeWindow.document.createElement('div');
	module_footer.innerHTML = ' \
				<div align="right" style="color:#888; margin-top:1em;"> \
					<!--<a href="http://blankcanvasweb.com/gmail2_html_sigs/" target="_blank">Check for Updates</a><br> -->\
					<a href="http://blankcanvasweb.com/gmail2_html_sigs/" target="_blank" style="color:#666;">Gmail HTML Signatures</a><br> \
					By <a href="http://blankcanvasweb.com/contact_us/" target="_blank" style="color:#666;">Jerome Dane</a> \
				</div>';
	module_node.appendChild(module_footer);
}

function from_select_change() {
	target_email = select_from.value;
	sig_insert();
	close_edit_signature();
	draw_edit_sig_link();	
}
window.addEventListener('load', function() {
	load_signatures();
	check_version();							
	if (unsafeWindow.gmonkey) {							 
		unsafeWindow.gmonkey.load('1.0', function(gmail) {
		   function setViewType() {
              	var str = '';
              	switch (gmail.getActiveViewType()) {
					case 'tl': str = 'Threadlist'; break;
					case 'cv': str = 'Conversation'; break;
					case 'co': str = 'Compose'; break;
					case 'ct': str = 'Contacts'; break;
					case 's': str = 'Settings'; break;
                	default: str = 'Unknown';
              	}
				// set up from onchange function
				if(str == 'Compose') {
					compose_context();
				} else if(str == 'Conversation') {
					reply_context();
					reply_context_two();					
				}
           	}
			function click_compose() {
				var elems = gmail.getNavPaneElement().getElementsByTagName('span');
				for(x in elems) {
					if(elems[x].innerHTML.match(/Compose Mail/)) {
						simulateClick(elems[x], 'click');
					}
				}
			}
			function select_from_listener() {
				try { 
					var elems  = gmail.getActiveViewElement().getElementsByTagName('select'); 
				} catch(e) {
					var elems = Array();	
				}
				// look for select from
				if(elems.length > 0) {
					for(x in elems) {
						if(elems[x].name == 'from') {
							select_from = elems[x];
							target_email = elems[x].value;
							select_from.style.width = '400px';
							select_from.onchange = from_select_change;
							draw_edit_sig_link();
							return true;
						}
					}
				} else {
					return false;
				}
			}
			function message_box_listener() {
				var elems = gmail.getActiveViewElement().getElementsByTagName('iframe');
				if(elems.length > 0) {
					msg_box = elems[0];
					return true;
				} else {
					return false;
				}
			}
			function compose_context() {
				if(select_from_listener()) {
					if(message_box_listener()) {
						sig_insert();	
					} else {
						setTimeout(compose_context, 500);	
					}
				} else if(compose_retries) {
					compose_retries--;	// reduce the number of compose_retries left
					setTimeout(click_compose, 200);
				} else { // gmail account only has one account
					single_address_context();					
				}
			}
			function reply_context() {
				if(message_box_listener()) {
					target_email = false;
					var elems = gmail.getActiveViewElement().getElementsByTagName('input');
					if(elems.length > 0) {
						target_email = elems[0].value;		
					}
					if(!target_email) {
						target_email = default_address;
						single_address_context();
					}					
					sig_insert();
				} else {
					setTimeout(reply_context, 500);
				}
			}
			function reply_context_two() {
				if(!select_from_listener()) {
					setTimeout(reply_context_two, 500);
				}
			}
			function single_address_context() {
				// get message box
				message_box_listener();
				// get to element
				try { 
					var elems  = gmail.getActiveViewElement().getElementsByTagName('textarea'); 
				} catch(e) {
					var elems = Array();	
				}
				for(x in elems) {
					if(elems[x].name == 'to') {
						select_from = elems[x];
						select_from.style.marginBottom = '.5em';
						target_email = default_address;
						sig_insert();
						draw_edit_sig_link();
						create_edit_form();
						if(target_email == '') {
							edit_sig_link.innerHTML = 'Set default gmail address';	
							edit_sig_link.onclick = function() {
								set_default_address();
								compose_context();
							}
						}							
					}
				}
			}
			function simulateClick(node, eventType) {
			  var event = node.ownerDocument.createEvent("MouseEvents");
			  event.initMouseEvent(eventType,
								   true, // can bubble
								   true, // cancellable
								   node.ownerDocument.defaultView,
								   1, // clicks
								   50, 50, // screen coordinates
								   50, 50, // client coordinates
								   false, false, false, false, // control/alt/shift/meta
								   0, // button,
								   node);
			
			  node.dispatchEvent(event);
			}
            gmail.registerViewChangeCallback(setViewType);
        	setViewType();
			// add module
			var module = gmail.addNavModule('HTML Sigs v' + version);
			module.getContentElement().style.fontSize = '11px';
			module.getContentElement().style.overflow = 'hidden';
			module.getContentElement().style.marginTop = '.2em';
			module.getContentElement().style.padding = '5px';
			module_node = module.getContentElement();
			draw_module();
	});
	}
}, true);
// used for development purposes only
function dump(obj) {
	var dump_text = '';
	try {
		for (x in obj) {
			try {
				var str = obj[x];
				if(x == 'innerHTML') { 
					str = str.replace(/</g, '&lt;');
					str = str.replace(/>/g, '&gt;');
					str = str.replace(/\t/g, '&nbsp;&nbsp;&nbsp;&nbsp;');
					str = str.replace(/\n/g, '<br>\n');
				}
				dump_text += "<br><strong>" + x + "</strong> => " + str;
			} catch(e) {
				
			}
		}
	} catch(e) {
		alert("Error dumping object");
	}
	var WindowDump = window.open('','','left=0,top=0,width=610,height=600,toolbar=0,scrollbars=1,status=0');
	WindowDump.document.write(dump_text);
}