var units = new Array ("Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen");
var tens = new Array ("Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety");

var customstyle;
var target;
var spellcheck = 0;

function num(it) {
	var theword = "";
	var started;
	if (it>999) return "Lots";
	if (it==0) return units[0];
	for (var i = 9; i >= 1; i--){
		if (it>=i*100) {
			theword += units[i];
			started = 1;
			theword += " hundred";
			if (it!=i*100) theword += " and ";
			it -= i*100;
			i=0;
		}
	};
	
	for (var i = 9; i >= 2; i--){
		if (it>=i*10) {
			theword += (started?tens[i-2].toLowerCase():tens[i-2]);
			started = 1;
			if (it!=i*10) theword += "-";
			it -= i*10;
			i=0
		}
	};
	
	for (var i=1; i < 20; i++) {
		if (it==i) {
			theword += (started?units[i].toLowerCase():units[i]);
		}
	};
	return theword;
}

var timeleft = time+1;
var remaining;
var found = new Array ();

function selectTheCurrentItem() {
	for (var i=0; i < document.getElementById("which").options.length; i++) {
		if (document.getElementById("which").options[i].value == currentpage) document.getElementById("which").selectedIndex=i;
	};
}

function addrandom () {
	var theIndex = Math.floor(Math.random()*lists.length);
	document.getElementById("therandom").setAttribute("href","/"+lists[theIndex][0]);
	return;
}

var strippedArray = new Array(items.length);

function stripArray () {
	for (var i=0; i < items.length; i++) {
		strippedArray[i] = new Array(items[i].length);
		for (var j=0; j < items[i].length; j++) {
			strippedArray[i][j] = stripStuff(items[i][j]);
		}
	}
}

function start() {
	remaining = (target?target:items.length);
	updateFound();
	document.getElementById("box").removeAttribute("readOnly");
	document.getElementById("box").focus();
	document.getElementsByTagName("h2")[0].innerHTML = title;
	document.title = title.replace(/(<([^>]+)>)/ig,""); // strip tags
	document.getElementById('menuplace').appendChild(optionlistMenu());
	selectTheCurrentItem();
	addrandom();
	if (customstyle) {
		var theStyle = document.createElement("style");
		var theText = document.createTextNode(customstyle);
		//theStyle.innerHTML = customstyle;
		theStyle.appendChild(theText);
		theStyle.type = 'text/css';
		theStyle.rel = 'stylesheet';
		theStyle.media = 'screen';
		theStyle.title = 'dynamicSheet';
		
		document.getElementsByTagName("head")[0].appendChild(theStyle);
	}
	stripArray();
	updateTime();
}

function updateFound() {
	if (remaining>0) document.getElementById("togo").innerHTML = "<em>"+num((target?target:items.length)-remaining)+"</em> "+((target?target:items.length)-remaining!=1?plur:sing)+" found. <em>"+num(remaining)+"</em> "+(target?"more ":"")+(remaining>1?plur:sing)+(target?" needed.":" remain"+(remaining!=1?".":"s."));
	else document.getElementById("togo").innerHTML = "Complete. "+(target?"":"All ")+"<em>"+(target?num(target):num(items.length).toLowerCase())+"</em> "+plur+" found in <em>"+wordTime(time-timeleft)+"</em>.";	
}

function hasDuplicate(testString,i2,j2) {
	var dupes=0;
	for (var i=0; i < strippedArray.length; i++) {
		for (var j=0; j < strippedArray[i].length; j++) {
			if (!((i2==i)&&(j2==j))) {
				//if ((items[i][j].toLowerCase().indexOf(testString.toLowerCase()) == 0) && (found[i2]==1)) dupes++;
				if ((strippedArray[i][j].indexOf(testString) == 0) && (found[i2]==1)) dupes++;
			}
		};
	};
	//alert(dupes);
	if (dupes==0) return false;
	else return true;
}

function stripStuff (it) {
	it = it.toLowerCase();
	it = it.replace(/(<([^>]+)>)/ig,"");
	it = it.replace(/[‘’“”"']/g,"");
	it = it.replace(/[åáâäàãÅÁÂÄÀÃ]/g,"a");
	it = it.replace(/[éèêëÉÈÊË]/g,"e");
	it = it.replace(/[íìîïÍÌÎÏ]/g,"i");
	it = it.replace(/[øóòöôØÓÒÖÔ]/g,"o");
	it = it.replace(/[úùûüÚÙÛÜ]/g,"u");
	it = it.replace(/[…\.™®©]/g,"");
	it = it.replace("&","and");
	it = it.replace("-"," ");
	
	if (spellcheck==1) {
		
		// gratefully adapted from code from AndyV: http://snippets.dzone.com/user/AndyV

		it = it.replace(/\A[gkp]n/g,'n'); // gn, kn, or pn at the start turns into 'n'
		it = it.replace(/\Ax/g,'s'); // x at the start turns into 's'
		it = it.replace(/\Awh/g,'w'); // wh at the start turns into 'w'
		it = it.replace(/mb\z/g,'m'); // mb at the end turns into 'm'
		it = it.replace(/sch/g,'sk'); // sch sounds like 'sk'
		it = it.replace(/x/g,'ks');
		it = it.replace(/cia/g,'xia'); // the 'c' -cia- and -ch- sounds like 'x'
		it = it.replace(/ch/g,'xh');
		it = it.replace(/c([iey])/g,'s\1'); // the 'c' -ce-, -ci-, or -cy- sounds like 's'
		it = it.replace(/ck/g,'k');
		it = it.replace(/c/g,'k');
		it = it.replace(/dg([eiy])/g,'j\1'); // the 'dg' in -dge-, -dgi-, or -dgy- sounds like 'j'
		it = it.replace(/d/g,'t');
		it = it.replace(/gh/g,'');
		it = it.replace(/gned/g,'ned');
		it = it.replace(/gn((?![aeiou])|(\z))/g,'n');
		it = it.replace(/g[eiy]/g,'j');
		it = it.replace(/ph/g,'f');
		it = it.replace(/[aeiou]h(?![aeoiu])/g,'\1'); // 'h' is silent after a vowel unless it's between vowels
		it = it.replace(/q/g,'k');
		it = it.replace(/s(h|(ia)|(io))/g,'x\1');
		it = it.replace(/t((ia)|(io))/g, 'x\1');
		it = it.replace(/th/g,'0');
		it = it.replace(/v/g,'f');
		it = it.replace(/w(?![aeiou])/g,'');
		it = it.replace(/y(?![aeiou])/g,'');
		it = it.replace(/z/g,'s');
		
		it = it.replace(/bb/g,"b");
		it = it.replace(/dd/g,"d");
		it = it.replace(/ff/g,"f");
		it = it.replace(/gg/g,"g");
		it = it.replace(/hh/g,"h");
		it = it.replace(/jj/g,"j");
		it = it.replace(/kk/g,"k");
		it = it.replace(/ll/g,"l");
		it = it.replace(/mm/g,"m");
		it = it.replace(/nn/g,"n");
		it = it.replace(/pp/g,"p");
		it = it.replace(/rr/g,"r");
		it = it.replace(/ss/g,"s");
		it = it.replace(/tt/g,"t");
		it = it.replace(/ww/g,"w");
		it = it.replace(/xx/g,"x");
		it = it.replace(/yy/g,"y");

		it = it.replace(/[aeiou]/g,"");
	}
	
	return it;
}

function check(it) {
	if (it.value == " ") it.value = "";
	if (it.value.toLowerCase() == "check spelling") {spellcheck = 1; it.value = "wait"; stripArray(); it.value = "";}
	if ((it.value.toLowerCase() == "give up")||(it.value.toLowerCase() == "i give up")) {
		if (window.confirm("Are you sure you want to give up?")) {
			revealAll();
			timeleft = 1;
		}
		it.value = "";
	}
	
	var strippedValue = stripStuff(it.value);
	
	for (var i=0; i < items.length; i++) {
		for (var j=0; j < items[i].length; j++) {
			//if (it.value.toLowerCase() == items[i][j].toLowerCase() && !hasDuplicate(it.value,i,j)) {
			if (strippedValue == strippedArray[i][j] && !hasDuplicate(strippedValue,i,j)) {
				if (found[i]!=1 && timeleft>0) {
					var theItem = document.createElement("li");
					theItem.innerHTML = items[i][0];				
					// theItem.innerHTML = strippedValue;
					document.getElementById("thelist").insertBefore(theItem, document.getElementById("thelist").childNodes[0]);
					remaining--;
					updateFound();
					found[i]=1;
				}
				it.value = "";
			}
		}
	};
}

function formatTime(secs) {
	mins = 0
	while (secs>59) {
		secs -= 60;
		mins ++;
	}
	
	return ""+(mins<10?"0":"")+mins+":"+(secs<10?"0":"")+secs;
}

function go() {
	which = document.getElementById("which");
	destination = which.options[which.selectedIndex].value;
	if (currentpage!=destination) location.href = "/"+destination;
}

function optionlistMenu() {
	var theSelect = document.createElement("select");
	theSelect.setAttribute("id","which");
	theSelect.setAttribute("onchange","go()");
	
	var categories = new Array();
	for (var i=0; i < lists.length; i++) {
		var isThere = 0;
		for (var j=0; j < categories.length; j++) {
			if (categories[j] == lists[i][3][0]) isThere=1;
		};
		if (isThere==0) categories[categories.length]=lists[i][3][0];
	};
	
	var theGroup = new Array();
	for (var i=0; i < categories.length; i++) {
		theGroup[i] = document.createElement("optgroup");
		theGroup[i].setAttribute("label",categories[i]);
	};
	
	for (var i=0; i < lists.length; i++) {
		var theOption = document.createElement("option");
		var theText = document.createTextNode(lists[i][1].replace(/(<([^>]+)>)/ig,""));
		theOption.setAttribute("value",lists[i][0]);
		theOption.appendChild(theText)
		for (var j=0; j < categories.length; j++) {
			if (categories[j] == lists[i][3][0]) theGroup[j].appendChild(theOption);
		};
	};
	
	for (var i=0; i < theGroup.length; i++) {
		theSelect.appendChild(theGroup[i]);
	};
	
	return theSelect;
}

function wordTime(secs) {
	mins = 0
	if (secs==0) return "less than a second";
	while (secs>59) {
		secs -= 60;
		mins ++;
	}
	
	theword = "";
	if (secs==0) theword += "exactly "
	if (mins>0) theword += num(mins).toLowerCase();
	if (secs==0) theword += (mins==1?" minute":" minutes");
	if (secs>0) {
		if (mins>0) theword += (mins==1?" minute":" minutes");
		if (mins>0) theword += " and ";
		theword += num(secs).toLowerCase();
		theword += " second";
		if (secs>1) theword += "s";
	}
	
	return theword;
}

function revealAll() {
	theUL = document.getElementById("thelist");
	while (theUL.firstChild) {
		theUL.removeChild(theUL.firstChild);
	};
	
	for (var i=0; i < items.length; i++) {
		var theItem = document.createElement("li");
		if (found[i]!=1) theItem.setAttribute("class","missed");
		theItem.innerHTML = items[i][0];
		theUL.appendChild(theItem);
	};	
	
	document.getElementById("togo").innerHTML = "You found <em>"+num((target?target:items.length)-remaining).toLowerCase()+"</em> out of <em>"+num(items.length).toLowerCase()+"</em> "+plur+".";
}

function updateTime() {
	timeleft--;
	if (remaining>0) document.getElementById("clock").innerHTML = formatTime(timeleft);
	if (timeleft/time<0.25) {
		red = 144*(1-(timeleft/time)*4); red = Math.ceil(red);
		green = 48*(1-(timeleft/time)*4); green = Math.ceil(green);
		blue = 48*(1-(timeleft/time)*4); blue = Math.ceil(blue);
		document.getElementById("clock").style.color = "rgb("+red+","+green+","+blue+")";
	}
	if (timeleft>0 && remaining>0)
		setTimeout("updateTime()",1000);
	else
		if (remaining>0) revealAll();
}