//------------------------------
// http://chemistry.messed.info
//  All content copyright 2007
//    by Lucas Lemanowicz
//------------------------------

//------------------------------
// Variables and Arrays
//------------------------------

var fadeHex = 255;
var foundCount = 0;
var elemID = new Array(	"H","He",
			"Li","Be","B","C","N","O","F","Ne",
			"Na","Mg","Al","Si","P","S","Cl","Ar",
			"K","Ca","Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr",
			"Rb","Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn","Sb","Te","I","Xe",
			"Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf",
				"Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po","At","Rn",
			"Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm","Md","No","Lr","Rf",
				"Db","Sg","Bh","Hs","Mt","Ds","Rg","Uub");
var elemName = new Array("Hydrogen","Helium",
			"Lithium","Beryllium","Boron","Carbon","Nitrogen","Oxygen","Fluorine","Neon",
			"Sodium","Magnesium","Aluminum","Silicon","Phosphorus","Sulfur","Chlorine","Argon",
			"Potassium","Calcium","Scandium","Titanium","Vanadium","Chromium","Manganese","Iron","Cobalt",
				"Nickel","Copper","Zinc","Gallium","Germanium","Arsenic","Selenium","Bromine","Krypton",
			"Rubidium","Strontium","Yttrium","Zirconium","Niobium","Molybdenum","Technetium","Ruthenium",
				"Rhodium","Palladium","Silver","Cadmium","Indium","Tin","Antimony","Tellurium","Iodine","Xenon",
			"Cesium","Barium","Lanthanum","Cerium","Praseodymium","Neodymium","Promethium","Samarium","Europium",
				"Gadolinium","Terbium","Dysprosium","Holmium","Erbium","Thulium","Ytterbium","Lutetium",
				"Hafnium","Tantalum","Tungsten","Rhenium","Osmium","Iridium","Platinum","Gold","Mercury",
				"Thallium","Lead","Bismuth","Polonium","Astatine","Radon",
			"Francium","Radium","Actinium","Thorium","Protactinium","Uranium","Neptunium","Plutonium","Americium",
				"Curium","Berkelium","Californium","Einsteinium","Fermium","Mendelevium","Nobelium", "Lawrencium",
				"Rutherfordium","Dubnium","Seaborgium","Bohrium","Hassium","Meitnerium","Darmstadtium","Roentgenium",
				"Ununbium");
var elemFound = new Array(elemID.length);

for (var i = 0; i < elemID.length; i++) {
	elemFound[i] = "";
}

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

function ajaxFetch(elemVal) {
	var xmlHttpReq = false;
	var self = this;

	document.getElementById('elementinfo').innerHTML = '<p class="center">Please wait while our monkeys fetch the information.</p>';

	if (window.XMLHttpRequest) {
		self.xmlHttpReq = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	}

	self.xmlHttpReq.open('POST', 'element.php', true);
	self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	self.xmlHttpReq.onreadystatechange = function() {
		if (self.xmlHttpReq.readyState == 4) {
			document.getElementById('elementinfo').innerHTML = self.xmlHttpReq.responseText;
		}
	}
	self.xmlHttpReq.send('elemID=' + elemVal);
}

function checkElement(elemVal) {
	if (elemVal.value.length > 2) {
		// International Spellings!
		if (elemVal.value.toLowerCase() == "caesium") {
			elemVal.value = "Cesium";
		}
		
		if (elemVal.value.toLowerCase() == "sulphur" || elemVal.value.toLowerCase() == "sulpher") {
			elemVal.value = "Sulfur";
		}
		
		if (elemVal.value.toLowerCase() == "aluminium") {
			elemVal.value = "Aluminum";
		}
	
		for (var i = 0; i < elemName.length; i++) {
			if (elemVal.value.toLowerCase() == elemName[i].toLowerCase() && elemName[i].toLowerCase() != elemFound[i].toLowerCase()) {
				elemFound[i] = elemName[i];
				document.getElementById(elemID[i]).style.color = "#000000";
				document.getElementById(elemID[i]).title = (i + 1) + " - " + elemName[i];
				document.getElementById(elemID[i]).innerHTML = elemID[i];
				elemVal.value = "";
				foundCount++;
				if (foundCount == 1) {
					timeTime(timeKeySet());
				}
				fadeIn(elemID[i]);
				document.getElementById("countDone").innerHTML = "Progress: <b>" + foundCount + "/" + elemID.length + "</b>";
				if (foundCount == elemID.length) {
					timeKeySet();
					messageShow('Congratulations! Well done!');
				}
			}
		}
	} else {
		if (elemVal.value == " ")
			elemVal.value = "";
	}
}

function fetchInfo(elemVal) {
	if (document.getElementById(elemVal).innerHTML == elemVal) {
		ajaxFetch(elemVal);
	}
}

function fadeIn(objToFade) {
	if(fadeHex >= 0) {
		fadeHex -= 10;
		document.getElementById(objToFade).style.color = "rgb(" + fadeHex + "," + fadeHex + "," + fadeHex + ")";
		fadeInBgSelector(objToFade, 1);
		setTimeout("fadeIn(\"" + objToFade + "\");", 20); 
	} else {
		fadeHex = 255;
	}
}

function fastFadeIn(objToFade, changeBg) {
	document.getElementById(objToFade).style.color = "#000000";
	if (changeBg == 1) {
		fadeInBgSelector(objToFade, 1);
	}
}

function messageShow(msgToShow) {
	document.getElementById("messageBox").innerHTML = msgToShow;
}

function messageShowExtended(elemVal) {
	if (document.getElementById(elemVal).innerHTML == elemVal) {
		messageShow("Click to find out more about " + elemVal);
	}
}

function revealAll() {
	var foundOne = 0;
	timeKeySet();
	for (var i = 0; i < elemName.length; i++) {
		if (elemFound[i] == elemName[i]) {
			foundOne = 1;
		}
	}
	for (i = 0; i < elemName.length; i++) {
		elemFound[i] = elemName[i];
		setTimeout("document.getElementById(\"" + elemID[i] + "\").title = \"" + (i + 1) + " - " + elemName[i] + "\";", i * 10);
		setTimeout("document.getElementById(\"" + elemID[i] + "\").innerHTML = \"" + elemID[i] + "\";", i * 10);
		if (foundOne == 1) {
			setTimeout("fastFadeIn(\"" + elemID[i] + "\", 0);", i * 10);
		} else {
			setTimeout("fastFadeIn(\"" + elemID[i] + "\", 1);", i * 10);
		}
	}
}

var hintsMax = 999;
var hintsNow = 0;

function showHint() {
	var leftToGuess = "";
	var guessItem = 0;
	var guessArray = new Array();
	
	if (hintsNow < hintsMax) {
		for (var i = 0; i < elemName.length; i++) {
			if (elemFound[i] != elemName[i]) {
				leftToGuess = leftToGuess + i + ",";
			}
		}
		
		guessArray = leftToGuess.split(",");
		
		if (guessArray.length > 1) {

			guessItem = guessArray[Math.floor(Math.random()*(guessArray.length))]; // Ignore Last Item Since It's Blank
			
			document.getElementById(elemID[guessItem]).style.color = "#000000";
			document.getElementById(elemID[guessItem]).innerHTML = elemID[guessItem];
			
			fadeIn(elemID[guessItem]);
			
			setTimeout("document.getElementById(\"" + elemID[guessItem] + "\").innerHTML = \"\";", 1000);
			setTimeout("fadeInBgSelector(\"" + elemID[guessItem] + "\", 0);", 1000);
			
			hintsNow++;
			document.getElementById("hintsleft").innerHTML = hintsNow;
		}
	} else {
		messageShow("No more hints left!");
	}
}

function unrevealAll() {

	for (var i = 0; i < elemName.length; i++) {
		elemFound[i] = "";
		setTimeout("document.getElementById(\"" + elemID[i] + "\").title = \"\";", i * 10);
		setTimeout("document.getElementById(\"" + elemID[i] + "\").innerHTML = \"\";", i * 10);
		setTimeout("fadeInBgSelector(\"" + elemID[i] + "\", 0);", i * 10);
	}
	
	foundCount = 0;
	document.getElementById("countDone").innerHTML = "Progress: <b>" + foundCount + "/" + elemID.length + "</b>";
	document.getElementById('elementinfo').innerHTML = "";
	
	timeKeySet();
	document.getElementById("timeleft").innerHTML = "Time: " + timeMinutes + ":0" + timeSeconds
	
	hintsNow = 0;
	document.getElementById("hintsleft").innerHTML = "";
}

function fadeInBgSelector(objToFade, typeImage) {
	// document.getElementById('H').className
	var imgExt = "full";
	
	if (typeImage == 1) {
		imgExt = "full";
	} else {
		imgExt = "empty";
	}
	
	if (document.getElementById(objToFade).className == "noble") {
		document.getElementById(objToFade).style.background = "url(images/element_gray_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "halogen") {
		document.getElementById(objToFade).style.background = "url(images/element_magenta_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "nonmetal") {
		document.getElementById(objToFade).style.background = "url(images/element_purple_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "earthmetal") {
		document.getElementById(objToFade).style.background = "url(images/element_lime_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "alkalimetal") {
		document.getElementById(objToFade).style.background = "url(images/element_red_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "metalloid") {
		document.getElementById(objToFade).style.background = "url(images/element_blue_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "poormetal") {
		document.getElementById(objToFade).style.background = "url(images/element_aqua_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "lanthanide") {
		document.getElementById(objToFade).style.background = "url(images/element_green_" + imgExt + ".gif)";
	} else if (document.getElementById(objToFade).className == "actinide") {
		document.getElementById(objToFade).style.background = "url(images/element_yellow_" + imgExt + ".gif)";
	} else {
		document.getElementById(objToFade).style.background = "url(images/element_gold_" + imgExt + ".gif)";
	}
}

function preloadImages() {
	imagesToLoad = new Array("aqua", "blue", "gold", "gray", "lime", "magenta", "purple", "red", "yellow");
	imagesLoaded = new Array(imagesToLoad.length);
	
	for (var i = 0; i < imagesToLoad.length; i++) {
		imagesLoaded[i] = new Image();
		imagesLoaded[i].src = "images/element_" + imagesToLoad[i] + "_full.gif";
	}
}

function clearText(objToClear, actType) {
	if (actType == "onClick") {
		if (objToClear.value == "Type Element Name") {
			objToClear.value = "";
		}
	} else if (actType == "onBlur") {
		if (objToClear.value == "") {
			objToClear.value = "Type Element Name";
		}
	} else if (actType == "onKeyDown") {
		if (objToClear.value == "Type Element Name") {
			objToClear.value = "";
		}
	}
}

//-----------------------------------------
// Time Functions
//-----------------------------------------

var timeKey = 1;
var timeSeconds = -1;
var timeMinutes = 0;

function timeKeySet() {
	timeKey++;
	timeSeconds = 0;
	timeMinutes = 0;
	return timeKey;
}

function timeTime(intKey) {
	if (intKey == timeKey) {
		// Calculate Time
		if (timeSeconds >= 59) {
			timeSeconds = 0;
			timeMinutes++;
		} else {
			timeSeconds++;
		}
		
		// Format and Display Time
		if (timeSeconds < 10) {
			document.getElementById("timeleft").innerHTML = "Time: " + timeMinutes + ":0" + timeSeconds
		} else {
			document.getElementById("timeleft").innerHTML = "Time: " + timeMinutes + ":" + timeSeconds
		}
		
		// Is Time Up?
		if (timeSeconds == 0 && timeMinutes >= 30) {
			timeKeySet();
			messageShow("Time's up! Let's see what you missed!");
			revealAll();
		} else {
			// Recurse
			setTimeout("timeTime(" + intKey + ");", 1000);
		}
	} else {
		// Bye Bye Timer!
	}
}