// ==UserScript==
// @name           Autocomplete
// @description    Turn on autocomplete in forms and input elements (Confirm remembering of usernames and passwords).
// @include        *
// ==/UserScript==

var tags = [
	"form",
	"input",
];

function main() {
	try {
		if (!isArray(tags)) error("Variable ``tags'' should be an `array'!");
		for (var i=0; i<tags.length; i++) {
			var elements = xpath("//" + tags[i]);			// get elements
			if (!isXPathResult(elements)) return;
			for (var j=0; j<elements.snapshotLength; j++) setAutocompleteOn(elements.snapshotItem(j));
		}
	} catch(e) {alert(e);}
}

function setAutocompleteOn(element) {
	if (!isObject(element)) return;
	element.setAttribute("autocomplete", "on");				// set autocomplete on
}

function error(err) {
	throw("Exception: " + err);
}

function isArray(a) {
	var result = false;
	try {result = isObject(a) && a.length >= 0;}
	catch(e) {}
	return result;
}

function isFunction(a) {
	var result = false;
	try {result = !isNull(a) && typeof(a) == "function";}
	catch(e) {}
	return result;
}

function isNull(a) {
	return a == null;
}

function isObject(a) {
	var result = false;
	try {result = !isNull(a) && typeof(a) == "object";}
	catch(e) {}
	return result;
}

function isString(a) {
	var result = false;
	try {result = !isNull(a) && typeof(a) == "string";}
	catch(e) {}
	return result;
}

function isXPathResult(a) {
	var result = false;
	try {result = isObject(a) && a.snapshotLength >= 0;}
	catch(e) {}
	return result;
}

function xpath(q) {
	return document.evaluate(q, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

main();

