function insertAfter( referenceNode, newNode ) {
    referenceNode.parentNode.insertBefore( newNode, referenceNode.nextSibling );
}

function addEvent() {
	var ni = document.getElementById('myDiv');
	var numi = document.getElementById('theValue');
	var num = (document.getElementById("theValue").value -1)+ 2;
	numi.value = num;
	var divIdName = "my"+num+"Div";
	var newdiv = document.createElement('div');
	newdiv.setAttribute("id",divIdName);
	newdiv.innerHTML = "Element Number "+num+" has been added! <a href=\"javascript:;\" onclick=\"removeEvent(\'"+divIdName+"\')\">Remove the div &quot;"+divIdName+"&quot;</a>";
	ni.appendChild(newdiv);
}

function removeEvent(node, divNum) {
	var d = document.getElementById(node);
	var olddiv = document.getElementById(divNum);
	d.removeChild(olddiv);
}

function AEAlist(aid) {
	var ansblock = document.getElementById('answerblock');
	var AnsNo = document.getElementById('answercount');
	var CAnsNo = document.getElementById('answercount').value;
	var SAnsC = document.getElementById('A'+aid).value;
	if (CAnsNo == aid) { //If the latest answer box is selected
		if (SAnsC != "") { //If the selected answerbox isn't blank
			var newAnsNo = (document.getElementById('answercount').value -1) + 2;
			var newdiv = document.createElement('div');
			newdiv.setAttribute("id","A"+newAnsNo+"div");
			newdiv.innerHTML = "<label id=\"al"+newAnsNo+"\" class=\"addedit\">Answer "+newAnsNo+":</label><input id=\"A"+newAnsNo+"\" class=\"text\" onkeyup=\"AEAlist("+newAnsNo+")\" type=\"text\" name=\"answer[]\" value=\"\" onfocus=\"javascript:infobox('ans');\"/>&nbsp;<input id=\"R"+newAnsNo+"\" type=\"radio\" name=\"correctans\" value=\""+(newAnsNo-1)+"\"/>";
			ansblock.appendChild(newdiv);
			var newRadio = document.getElementById('R'+newAnsNo);
			var oldRadio = document.getElementById('R'+(newAnsNo - 1));
			oldRadio.disabled = false;
			newRadio.disabled = true;
			//newRadio.setAttribute("disabled","true");
			AnsNo.value = newAnsNo;
			}
	} else {
		if (SAnsC == "") { //If the selected answerbox is blank
		//Remove the blank element from the list
			var olddiv = document.getElementById('A'+aid+'div');
			ansblock.removeChild(olddiv);
		//Enable the final radio button for editing
			var radd = document.getElementById('R'+CAnsNo);
			radd.disabled = false;
		//Rename the other elements
			var i=0;
			for (i=(aid+1);i<=CAnsNo;i++)
			{
				//Change container div id
				var cdiv = document.getElementById('A'+i+'div');
				cdiv.setAttribute("id",'A'+(i-1)+'div');
				//Change label (text, id)
				var lab = document.getElementById('al'+i);
				lab.innerHTML = "Answer "+(i-1)+":";
				lab.setAttribute("id",'al'+(i-1));
				//Change text input (id, name, onkeyup)
				var tex = document.getElementById('A'+i);
				tex.setAttribute("id",'A'+(i-1));
// 				tex.setAttribute("name",'answer'+(i-1));
				tex.setAttribute("onkeyup",'AEAlist('+(i-1)+')');
				//Change radio input (id, value)
				var rad = document.getElementById('R'+i);
				rad.setAttribute("value",(i-2));
				rad.setAttribute("id",'R'+(i-1));
			}	
		//Disable the final radio button
			radd.disabled = true;
		//Reduce the Answer Count
			AnsNo.value = (CAnsNo - 1);
		}
	}
}

function AEANew(aid) {
	var wscont = document.getElementById('wscont');
	var aetable = document.getElementById('addedittable');
	var subtr = document.getElementById('sub');
	var AnsNo = document.getElementById('answercount');
	var CSNo = document.getElementById('statementcount').value;
	var CAnsNo = document.getElementById('answercount').value;
	var SAnsC = document.getElementById('A'+aid).value;
	if (CAnsNo == aid) { //If the latest answer box is selected
		if (SAnsC != "") { //If the selected answerbox isn't blank
			var newAnsNo = (document.getElementById('answercount').value -1) + 2;
			var newtr = document.createElement('tr');
			newtr.setAttribute("id","A"+newAnsNo+"tr");
			var newth = document.createElement('th');
			newth.setAttribute("id","ath"+newAnsNo);
			newth.innerHTML = "Answer "+newAnsNo+":";
			var newtd = document.createElement('td');
			newtd.innerHTML = "<input id=\"A"+newAnsNo+"\" class=\"text\" onkeyup=\"AEANew("+newAnsNo+")\" type=\"text\" name=\"answer[]\" value=\"\" onfocus=\"javascript:infobox('ans');\"/>";
			var newtd2 = document.createElement('td');
			newtd2.innerHTML = "<input id=\"R"+newAnsNo+"\" type=\"radio\" name=\"correctans\" value=\""+(newAnsNo-1)+"\"/>";
			newtr.appendChild(newth);
			newtr.appendChild(newtd);
			newtr.appendChild(newtd2);
			aetable.appendChild(newtr);
			subtr.parentNode.insertBefore(newtr,subtr);
			var newRadio = document.getElementById('R'+newAnsNo);
			var oldRadio = document.getElementById('R'+(newAnsNo - 1));
			oldRadio.disabled = false;
			newRadio.disabled = true;
			//newRadio.setAttribute("disabled","true");
			AnsNo.value = newAnsNo;
			//Add new height
			var newheight = 500 + ((CSNo - 1) * 31) + (CAnsNo * 31);
			wscont.setAttribute("style","height:"+newheight+"px;");
			}
	} else {
		if (SAnsC == "") { //If the selected answerbox is blank
		//Remove the blank element from the list
			var oldtr = document.getElementById('A'+aid+'tr');
			aetable.removeChild(oldtr);
		//Enable the final radio button for editing
			var radd = document.getElementById('R'+CAnsNo);
			radd.disabled = false;
		//Rename the other elements
			var i=0;
			for (i=(aid+1);i<=CAnsNo;i++)
			{
				//Change container div id
				var cdiv = document.getElementById('A'+i+'tr');
				cdiv.setAttribute("id",'A'+(i-1)+'tr');
				//Change label (text, id)
				var lab = document.getElementById('ath'+i);
				lab.innerHTML = "Answer "+(i-1)+":";
				lab.setAttribute("id",'ath'+(i-1));
				//Change text input (id, name, onkeyup)
				var tex = document.getElementById('A'+i);
				tex.setAttribute("id",'A'+(i-1));
// 				tex.setAttribute("name",'answer'+(i-1));
				tex.setAttribute("onkeyup",'AEANew('+(i-1)+')');
				//Change radio input (id, value)
				var rad = document.getElementById('R'+i);
				rad.setAttribute("value",(i-2));
				rad.setAttribute("id",'R'+(i-1));
			}	
		//Disable the final radio button
			radd.disabled = true;
		//Reduce the Answer Count
			AnsNo.value = (CAnsNo - 1);
		//Remove height
		var newheight = 500 + (((CSNo -1) * 31) + ((CAnsNo -2) * 31));
		wscont.setAttribute("style","height:"+newheight+"px;");
		}
	}
}

function AESlist(sid) {
	var sblock = document.getElementById('statementblock');
	var SNo = document.getElementById('statementcount');
	var CSNo = document.getElementById('statementcount').value;
	var SSC = document.getElementById('si'+sid).value;
	if (CSNo == sid) { //If the latest statement is selected
		if (SSC != "") { //If the selected statement isn't blank
			var newSNo = (document.getElementById('statementcount').value -1) + 2;
			var newdiv = document.createElement('div');
			newdiv.setAttribute("id","S"+newSNo+"div");
			newdiv.innerHTML = "<label id=\"sl"+newSNo+"\" class=\"addedit\">Statement "+newSNo+":</label><input id=\"si"+newSNo+"\" class=\"text\" onkeyup=\"AESlist("+newSNo+")\" type=\"text\" name=\"statement[]\" value=\"\" onfocus=\"javascript:infobox('sta');\"/>";
			sblock.appendChild(newdiv);
			SNo.value = newSNo;
			}
	} else {
		if (SSC == "") { //If the selected statement is blank
			//Remove the blank element from the list
				var olddiv = document.getElementById('S'+sid+'div');
				sblock.removeChild(olddiv);
			//Rename the other elements
			var i=0;
			for (i=(sid+1);i<=CSNo;i++)
			{
				//Change container div id
				var cdiv = document.getElementById('S'+i+'div');
				cdiv.setAttribute("id",'S'+(i-1)+'div');
				//Change label (text, id)
				var lab = document.getElementById('sl'+i);
				lab.innerHTML = "Statement "+(i-1)+":";
				lab.setAttribute("id",'sl'+(i-1));
				//Change text input (id, name, onkeyup)
				var tex = document.getElementById('si'+i);
				tex.setAttribute("id",'si'+(i-1));
// 				tex.setAttribute("name",'statement'+(i-1));
				tex.setAttribute("onkeyup",'AESlist('+(i-1)+')');
			}
			//Reduce the Answer Count
			SNo.value = (CSNo - 1);
		}
	}
}

function AESNew(sid) {
	var wscont = document.getElementById('wscont');
	var aetable = document.getElementById('addedittable');
	var exptr = document.getElementById('exp');
	var SNo = document.getElementById('statementcount');
	var CSNo = document.getElementById('statementcount').value;
	var CAnsNo = document.getElementById('answercount').value;
	var SSC = document.getElementById('si'+sid).value;
	if (CSNo == sid) { //If the latest statement is selected
		if (SSC != "") { //If the selected statement isn't blank
			var newSNo = (document.getElementById('statementcount').value -1) + 2;
			var newtr = document.createElement('tr');
			newtr.setAttribute("id","S"+newSNo+"tr");
			var newth = document.createElement('th');
			newth.setAttribute("id","sth"+newSNo);
			newth.innerHTML = "Statement "+newSNo+":";
			var newtd = document.createElement('td');
			newtd.setAttribute("colspan","2");
			newtd.innerHTML = "<input id=\"si"+newSNo+"\" class=\"text\" onkeyup=\"AESNew("+newSNo+")\" type=\"text\" name=\"statement[]\" value=\"\" onfocus=\"javascript:infobox('sta');\"/>";
			newtr.appendChild(newth);
			newtr.appendChild(newtd);
			exptr.parentNode.insertBefore(newtr,exptr);
			SNo.value = newSNo;
			//Add new height
			var newheight = 500 + (CSNo * 31) + ((CAnsNo - 1) * 31);
			wscont.setAttribute("style","height:"+newheight+"px;");
		}
	} else {
		if (SSC == "") { //If the selected statement is blank
			//Remove the blank element from the list
				var oldtr = document.getElementById('S'+sid+'tr');
				aetable.removeChild(oldtr);
			//Rename the other elements
			var i=0;
			for (i=(sid+1);i<=CSNo;i++)
			{
				//Change container div id
				var cdiv = document.getElementById('S'+i+'tr');
				cdiv.setAttribute("id",'S'+(i-1)+'tr');
				//Change label (text, id)
				var rowhead = document.getElementById('sth'+i);
				rowhead.innerHTML = "Statement "+(i-1)+":";
				rowhead.setAttribute("id",'sth'+(i-1));
				//Change text input (id, name, onkeyup)
				var tex = document.getElementById('si'+i);
				tex.setAttribute("id",'si'+(i-1));
// 				tex.setAttribute("name",'statement'+(i-1));
				tex.setAttribute("onkeyup",'AESNew('+(i-1)+')');
			}
			//Reduce the Statement Count
			SNo.value = (CSNo - 1);
			//Remove height
			var newheight = 500 + (((CSNo -2) * 31) + ((CAnsNo -1) * 31));
			wscont.setAttribute("style","height:"+newheight+"px;");
		}
	}
}

function populus() {
	//Get Question Number
	var QNoh = document.getElementById('QNo');
	var QNo = QNoh.value;
	//Check QNo is a number
	if (!isNaN(QNo)) {
		//Is a number
		//alert('agagag');
	}
	//Get Instructions and update them
	var prevtab = document.getElementById('previewtable');
	var subval = document.getElementById('autosubject').value;
	var ival = document.getElementById('autoinstruct').value;

	//Get Question and update it
	var qval = document.getElementById('qtext').value;
	//Update the QNo in the preview pane
	var currentQ = document.getElementById('qnosp');
	currentQ.innerHTML = QNo;

	//Does the question have statements?
	var CSNo = document.getElementById('statementcount').value;

	//Remove all the old children from the preview table
	while (prevtab.hasChildNodes()){
		prevtab.removeChild(prevtab.firstChild);
	}

	//Add subject to table
	var str = document.createElement('tr');
	var sth = document.createElement('th');
	sth.innerHTML = "Subject:";
	str.appendChild(sth);
	var std = document.createElement('td');
	std.setAttribute("colspan",2);
	std.innerHTML = subval;
	str.appendChild(std);
	prevtab.appendChild(str);

	//Add instructions to table
	var itr = document.createElement('tr');
	var ith = document.createElement('th');
	ith.innerHTML = "Instructions:";
	itr.appendChild(ith);
	var itd = document.createElement('td');
	itd.setAttribute("colspan",2);
	itd.innerHTML = ival;
	itr.appendChild(itd);
	prevtab.appendChild(itr);

	//Add Question to table
	var qtr = document.createElement('tr');
	var qth = document.createElement('th');
	qth.innerHTML = "Question:";
	qtr.appendChild(qth);
	var qtd = document.createElement('td');
	qtd.setAttribute("colspan",2);
	qtd.innerHTML = qval;
	qtr.appendChild(qtd);
	prevtab.appendChild(qtr);

	//Remove any previous statement or answer table rows
	//alert('len:'+prevtab.childNodes.length);
	for( var x = 0; prevtab.childNodes[x]; x++ ) {
		var thatt = prevtab.childNodes[x].getAttribute("class");
		var msg = 'X:'+x+'\nClass:'+thatt;
		//alert(msg);
		if ((thatt == "statement") || (thatt == "answer")) {
			prevtab.removeChild(prevtab.childNodes[x]);
		}
	}
	if (CSNo > 1) {
		//Question has statements
		var intsta = "";
		for (i=1;i<CSNo;i++) {
			var csta = document.getElementById('si'+i).value;
			var newtr = document.createElement('tr');
			newtr.setAttribute("class","statement");
			var newth = document.createElement('th');
			newth.innerHTML = "Statement "+i+":";
			var newtd = document.createElement('td');
			newtd.setAttribute("colspan","2");
			newtd.innerHTML = csta;
			newtr.appendChild(newth);
			newtr.appendChild(newtd);
			prevtab.appendChild(newtr);
		}
	}
	//Get Answers and show them.
	var CAnsNo = document.getElementById('answercount').value;
	if (CAnsNo > 1) {
		var newtr = document.createElement('tr');
		newtr.setAttribute("class","answer");
		var newth = document.createElement('th');
		newth.setAttribute("rowspan",(CAnsNo - 1));
		newth.innerHTML = "Answers:";
		newtr.appendChild(newth);
		var newtd = document.createElement('td');
		newtd.setAttribute("style","width:22px;");
		newtd.innerHTML = "<input type=\"radio\" name=\"q\" value=\"a1\">";
		newtr.appendChild(newtd);
		var newtd2 = document.createElement('td');
		newtd2.innerHTML = document.getElementById("A1").value;
		newtr.appendChild(newtd2);
		prevtab.appendChild(newtr);
		for (i=2;i<CAnsNo;i++) {
			var cans = document.getElementById('A'+i).value;
			var newtr2 = document.createElement('tr');
			newtr2.setAttribute("class","answer");
			var newtd3 = document.createElement('td');
			newtd3.setAttribute("style","width:22px;");
			newtd3.innerHTML = "<input type=\"radio\" name=\"q\" value=\"a1\">";
			newtr2.appendChild(newtd3);
			var newtd4 = document.createElement('td');
			newtd4.innerHTML = cans;
			newtr2.appendChild(newtd4);
			prevtab.appendChild(newtr2);
		}
	}

	//Deal with Next / Previous Buttons
	var prevbutton = document.getElementById('prevbutt');
	var nxtbutton = document.getElementById('nxtbutt');
	if (QNo != '(new)') {
		var start = parseInt(QNo);
		var prevNo = start - 1;
		var nextNo = start + 1;
		prevbutton.setAttribute('onclick','setq('+prevNo+');');
		nxtbutton.setAttribute('onclick','setq('+nextNo+');');
	} else {
		prevbutton.setAttribute('onclick','');
		nxtbutton.setAttribute('onclick','');
	}
}

function setq(q) {
	document.getElementById('QNo').value = q;
	editq(true);
}

function editq(populate) {
//Populate the Add/Edit Form with data from the database
if (populate == null){
   populate = false;
}
var QNoh = document.getElementById('QNo');
var QNo = QNoh.value;
	//Check QNo is a number
	if (!isNaN(QNo)) {
		//Check to see if the QID exists
		if (populate == true) { 
			AjaxRequest('javascript.php?action=GetQuestion&qid='+QNo+'&populate=true',false);
		} else {
			AjaxRequest('javascript.php?action=GetQuestion&qid='+QNo,false);
		}
	} else {
// 		alert(QNo+' is not a number');
		QNoh.value = "(new)";
	}
}

function infobox(field) {
	var div = document.getElementById('aeinfo');
	var ptit = document.getElementById('aeiTitle');
	var pinf = document.getElementById('aeiBody');
	var tit = "";
	var oldtit = ptit.innerHTML;
	var bod = "";
	if (field == "qid") {
		tit = "Question ID";
		bod = "To add a new question leave this value as '(new)' to edit an existing question enter its ID number here and tab out of the field.";
	} else if (field == "sub") {
		tit = "Subject";
		bod = "<b>[ Required | Autocomplete ]</b><br/>This is the subject the question will be stored under. It is required to be non blank to add or edit a question.";
	} else if (field == "sco") {
		tit = "Score"
		bod = "<b>[ Required ]</b><br/>There are three different methods to score questions.<br/><br/><b>[ positive integer ]</b><br/>This method awards score points for correct answers but does not impose negative marking for incorrect answers.<br/><br/><b>[ negative integer ]</b><br/>This method awards or deducts the same amount of score points depending on whether or not the question was answered correctly.<br/><br/><b>[ n ]</b><br/>When 'n' is entered as a score if the user answers the question correctly they are awarded one point if they answer incorrectly they are deducted a fraction of a point depending on how many answers there are. If there are five options they will have one quarter of a point deducted from their score, if there are four options then they will have one third of a point deducted etc...";
	} else if (field == "ins") {
		tit = "Instructions";
		bod = "<b>[ Required | Autocomplete ]</b><br/>These instructions tell the user how to answer the question they can be used to group questions together e.g. 'Which of the following...' so this field will suggest instructions already in the database.";
	} else if (field == "que") {
		tit = "Question";
		bod = "<b>[ Required ]</b><br/>This is where the question text is entered.";
	} else if (field == "sta") {
		tit = "Statements";
		bod = "<b>[ Not Required ]</b><br/>Statements are optional. They are used to convey discrete information to the user which the user will use to determine the answer to the question. Common usage involves the user deciding which if any of a number of statements are true or false. To remove a statement either delete the contents or click the X next to that statement.";
	} else if (field == "exp") {
		tit = "Explanation";
		bod = "<b>[ Not Required ]</b><br/>An explanation is used to provide extra information about a question or an explanation of the answer. They are displayed at the user's discretion after a test when the score is displayed and the user views which questions they got right or wrong.";
	} else if (field == "ans") {
		tit = "Answers";
		bod = "<b>[ Required ]</b><br/>At least one answer is required although an unlimited number is possible. The correct answer is designated via the radio button to the right of the answers. To remove an answer either delete the contents of the field or click the X next to it.";
	}
	if (tit != oldtit) {
		div.style.display = 'none';
		ptit.innerHTML = tit;
		pinf.innerHTML = bod;
		Effect.Appear('aeinfo');
	}
}

function pausecomp(ms) {
	var date = new Date();
	var curDate = null;
	do { curDate = new Date(); }
	while(curDate-date < ms);
}