Blog Comment Identity

By Alex Netkachov Last update Jun 27, 2008 — Installed 22 times.
// ==UserScript==
// @name           Blog Comment Identity
// @author         Alex@Net http://www.alexatnet.com/
// @namespace      an.blog.comment.identity
// @description    Allows you to select your name, email and website URL on blogs
// @include        *
// ==/UserScript==

// AS IS, NO WARRANTY, FREE DISTRIBUTION, DO NOT REMOVE COPYRIGHT.
// Copyright 2008, Alex Netkachov
// Bugs/comments/suggestions: http://www.alexatnet.com/

(function () {

	function addOption(select, value, text, selected) {
		var option = select.appendChild(document.createElement('option'));
		option.setAttribute('value', value);
		option.appendChild(document.createTextNode(text));
		if (selected)
			option.setAttribute('selected', 'yes');
		return option;
	}

	function updateUI(select, controls, identities) {
		with (select) while (lastChild) removeChild(lastChild);
		var ds = identities.toListBoxDataSource();
		if (0 == ds.length)
			addOption(nameSelect, '', '', true);
		for (var i = 0; i < ds.length; i++)
			with (ds[i])
				addOption(nameSelect, value, text, selected);
		addOption(nameSelect, '-----', '----------------------'
			+ '-------------------------').disabled = true;
		addOption(nameSelect, 'create_new_identity', '[Create new identity]');
		if (0 != ds.length)
			addOption(nameSelect, 'delete_current', '[Delete current identity]');
		addOption(nameSelect, 'turn_off', '[Turn identity manager off]');
		if (0 != ds.length)
			updateControls(controls, identities.selected());
	}

	function updateControls(controls, identity) {
		controls.author.value = identity.name;
		controls.email.value = identity.email;
		controls.url.value = identity.url;
	}

	var blogType = null;
	var metaTags = document.getElementsByTagName('meta');
	for (var i = 0; i < metaTags.length; i++) {
		var tag = metaTags[i];
		var nameAttr = tag.getAttributeNode('name');
		var contentAttr = tag.getAttributeNode('content');
		if (null != nameAttr && null != contentAttr
			&& 'generator' == nameAttr.nodeValue.toLowerCase())
		{
			blogType = contentAttr.nodeValue.toLowerCase();
			break;
		}
	}
	if (null == blogType) return;

	// Model
	function Identities() {

		var list = {};
		var names = [];
		var selected = -1;

		this.add = function (identity) {
			list[identity.name] = identity;
			names.push(identity.name);
			if (-1 == selected)
				selected = 0;
		};

		this.selected = function () {
			if (-1 == selected)
				return null;
			return list[names[selected]];
		};

		this.selectAt = function (index) {
			selected = index;
		};

		this.removeSelected = function () {
			delete list[names[selected]];
			names.splice(selected, 1);
			if (0 == names.length)
				selected = -1;
			else if (selected >= names.length)
				selected--;
		};

		this.toString = function () {
			var result = [];
			for (var name in list) {
				var identity = list[name];
				result.push(identity.name + ','
					+ identity.email + ',' + identity.url);
			}
			return result.join('|');
		};

		this.toListBoxDataSource = function () {
			var result = [];
			for (var name in list) {
				result.push({
					'value' : name,
					'text' : name,
					'selected' : name == names[selected]
				});
			}
			return result;
		};

	}

	Identities.createFromString = function (str) {
		var result = new Identities();
		if ('' != str) {
			var parts = str.split('|');
			for (var i = 0; i < parts.length; i++) {
				var row = parts[i].split(',');
				result.add({ 'name' : row[0], 'email' : row[1], 'url' : row[2] });
			}
		}
		return result;
	};

	// Load model data
	var identities = Identities.createFromString(GM_getValue('identities') || '');

	if (0 == blogType.indexOf('wordpress')) {
		var controls = {
			'author' : document.getElementById('author'),
			'email' : document.getElementById('email'),
			'url' : document.getElementById('url')
		};
		if (controls.author && controls.email && controls.url) {
			var nameSelect = document.createElement('select');
			var nameTextBox = controls.author;
			controls.author.parentNode.replaceChild(nameSelect, nameTextBox);
			with (controls.author = nameSelect) {
				setAttribute('id', 'author');
				setAttribute('name', 'author');
			}

			updateUI(nameSelect, controls, identities);
			(function (element, event, handler) {
				if (element.addEventListener)
					element.addEventListener(event, handler, false);
				else if (element.attachEvent)
					element.attachEvent('on' + event, handler);
				else
					element['on' + event] = handler;
			})(nameSelect, 'change', function () {
				if ('' == this.value) {
					controls.email.value = '';
					controls.email.url = '';
				} else if ('turn_off' == this.value) {
					nameSelect.parentNode.replaceChild(nameTextBox, nameSelect);
					controls.author = nameTextBox;
				} else if ('delete_current' == this.value) {
					if (confirm('Are you sure you want to delete the "'
						+ identities.selected().name + '" identity?'))
					{
						identities.removeSelected();
					}
					GM_setValue('identities', identities.toString());
					updateUI(nameSelect, controls, identities);
				} else if ('create_new_identity' == this.value) {
					var identityInfo = prompt('Type identity information (name,email,url):');
					if (identityInfo) {
						var parserIdentity = identityInfo.split(/, */);
						if (parserIdentity.length > 1) {
							identities.add({
								'name' : parserIdentity[0],
								'email' : parserIdentity[1],
								'url' : parserIdentity[2] || ''
							});
						}
					}
					GM_setValue('identities', identities.toString());
					updateUI(nameSelect, controls, identities);
				} else {
					identities.selectAt(this.selectedIndex);
					updateUI(nameSelect, controls, identities);
				}
			});

		}
	}
})();