//Make a new namespace so that the millions of other plugins run less of a risk of colliding with us.
var cryptoquote = function() {
	return {
		ascii : 65,
		guess : function(guessobj) {
			mainform = this.getParentClass(guessobj, "cryptoquote");
			if (mainform != null) {
				cryptqlines = mainform.getElementsByClassName("cryptqline");
				cryptalines = mainform.getElementsByClassName("cryptaline");
				cryptcounts = mainform.getElementsByClassName('cryptcount');
				cryptguesses = mainform.getElementsByClassName('cryptguess');
				if (cryptcounts.length == 26 && cryptguesses.length == 26) {
					for (x = 0; x < 26; x++) {
						if (cryptguesses[x].tagName.toLowerCase() == "input") {
							if (cryptguesses[x].value.length >= 1 && /[A-Za-z]/.test(cryptguesses[x].value)) {
								this.setValue(cryptqlines, cryptalines, x, cryptguesses[x].value);
							} else {
								this.setValue(cryptqlines, cryptalines, x, '_');
							}
						}
					}
					this.updateCount(cryptcounts, cryptguesses);
				}
			}
		},
		setValue : function(cryptqlines, cryptalines, q, a) {
			for (line = 0; line < cryptalines.length; line++) {
				for (letter = 0; letter < cryptqlines[line].firstChild.data.length; letter++) {
					if (cryptqlines[line].firstChild.data.charAt(letter) == String.fromCharCode(this.ascii + q)) {
						cryptalines[line].value = cryptalines[line].value.substring(0, letter) + a.toUpperCase() + cryptalines[line].value.substring(letter+1, cryptalines[line].value.length);
					}
				}
			}
		},
		updateCount :  function(cryptcounts, cryptguesses) {
			counts = Array(26);
			for (x = 0; x < 26; x++) {
				counts[x] = 0;
			}
			for (x = 0; x < 26; x++) {
				if (/[A-Za-z]/.test(cryptguesses[x].value)) {
					counts[cryptguesses[x].value.toUpperCase().charCodeAt(0) - this.ascii] += 1;
				}
			}
			for (x = 0; x < 26; x++) {
				cryptcounts[x].value = counts[x];
			}
		},
		reset : function(formobj) {
			//This may be wrong
			solutionform = this.getParentClass(formobj, "cryptsolution");
			if (solutionform != null && solutionform.reset != undefined) {
				solutionform.reset();
			}
		},
		getParentClass : function(child, classname) {
			if (child.parentNode != null) {
				if (child.parentNode.className == classname) {
					return child.parentNode;
				} else {
					return this.getParentClass(child.parentNode, classname);
				}
			} else {
				return null;
			}
		},
	}
}
