/*
Created: Carlos 18 Aug 2002
*/

	var sQuestionType = "";
	var iAnswerCount = 0;
		
	function AddNewText(sEditID, sWhere) {
		AddNewElement(sEditID, sWhere, xmlTempDoc.loadXML("<text><![CDATA[...place your text here...]]></text>"));
	}

	function CheckAnswerValidity() {
	/*
		if ((sQuestionType != "radio" && sQuestionType != "checkbox") && iAnswerCount > 1) {
			alert(sQuestionType + " questions cannot have more than one answer node.\n\nThere is always only one answer per question.\nChoice questions may have more than one answer node as\nthese are options - the user would only be able to choose one.");
			return false;
		}
		else
	*/
			return true;
	}

	function AddNewAnswer(sEditID, sWhere) {
		iAnswerCount++;

		if (CheckAnswerValidity()) {
			iAnswerCount--;
			AddNewElement(sEditID, sWhere, xmlTempDoc.loadXML("<answer score=\"\" value=\"\"></answer>"));
		} else {
			iAnswerCount--;
		}
	}

	function AddNewHelp(sEditID, sWhere) {
		AddNewElement(sEditID, sWhere, xmlTempDoc.loadXML("<help><![CDATA[...place your help here...]]></help>"));
	}

	function AddNewSection(sEditID, sWhere) {
		AddNewElement(sEditID, sWhere, xmlTempDoc.loadXML("<section number=\"\" score-weighting=\"1\" title=\"\"></section>"));
	}

	function AddNewChoice(sEditID, sWhere) {
		AddNewElement(sEditID, sWhere, xmlTempDoc.loadXML("<choice><branch></branch><branch></branch></choice>"));
	}

	function AddNewBranch(sEditID, sWhere) {
		AddNewElement(sEditID, sWhere, xmlTempDoc.loadXML("<branch></branch>"));
	}

	function AddNewQuestionLink(sEditID, sQuestionID, sQuestionTitle, sWhere) {
		var xmlChildQuestionLinks = xmlIn.selectNodes("*//question");
		var iNumber = 1;
		
		if (xmlChildQuestionLinks != null)
			iNumber = xmlChildQuestionLinks.length + 1;
	
		AddNewElement(sEditID, "child", xmlTempDoc.loadXML("<question id=\"" + sQuestionID + "\" copy-responses=\"no\" number=\"" + iNumber + "\" score-weighting=\"1\" description=\"" + sQuestionTitle + "\" />"));
	}


	// ------------------------------------------------------------------------- //

	var iNodeCount = 0;
	var sXmlType = "";
	var bFirstBuild = true;

	function fOnDragOver(oEdit) {
		event.returnValue = false;
		if (oEdit.EDIT_NODE != null) {
			if (window.event.dataTransfer.getData("Text")) {
				var text, elements;
				
				text = window.event.dataTransfer.getData("Text")
				
				elements = text.split(" ")
				
				if (elements[0] == "<question") {
					window.event.dataTransfer.dropEffect = "copy";
				}
			}
		}
	}

	function fOnDrop(oEdit) {
		var item = new Object()
		var elements, text, value, total

		text = window.event.dataTransfer.getData("Text")

		elements = text.split(" ")

		if (elements[0] == "<question") {
			AddNewElement(oEdit.EDIT_ID, "child", xmlTempDoc.loadXML(text));
		}
	}

	function fIgnoreQuestionDrop() {
		if (window.event.dataTransfer.getData("Text")) {
			var text, elements;
			
			text = window.event.dataTransfer.getData("Text")
			
			elements = text.split(" ")
			
			if (elements[0] == "<question") {
				window.event.dataTransfer.dropEffect = "none";
				event.returnValue = false;
			}
		}
	}

	function doFunction() {
		eval(event.result);
	}

	function UpdateNode(oEdit) {
		var sNode = "//*[@EDIT_ID='" + oEdit.EDIT_ID + "']";

		if (oEdit.EDIT_NODE != null) {
			sNode += "/" + oEdit.EDIT_NODE;
			xmlIn.selectSingleNode(sNode).nodeValue = oEdit.innerText;
		} else {
			var CDATASection;
			CDATASection = xmlIn.createCDATASection(oEdit.innerHTML);
			xmlIn.selectSingleNode(sNode).replaceChild(CDATASection, xmlIn.selectSingleNode(sNode).childNodes.item(0));
		}
	}

	function UpdateNodeDD(oEdit) {
		var sNode = "//*[@EDIT_ID='" + oEdit.EDIT_ID + "']";

		if (oEdit.EDIT_NODE != null) {
			sNode += "/" + oEdit.EDIT_NODE;
			xmlIn.selectSingleNode(sNode).nodeValue = oEdit[oEdit.selectedIndex].value;
			sQuestionType = oEdit[oEdit.selectedIndex].value;
			CheckAnswerValidity()
		}
	}

	function UpdateNodeCR(oEdit) {
		var sNode = "//*[@EDIT_ID='" + oEdit.EDIT_ID + "']";
		var node;
		var val;
		
		if (oEdit.EDIT_NODE != null) {
			if (oEdit.checked)
				val = "yes";
			else
				val = "no";
				
			sNode += "/" + oEdit.EDIT_NODE;
			
			node = xmlIn.selectSingleNode(sNode);
			
			if (node != null) {
				if (oEdit.checked)
					node.nodeValue = "yes";
				else
					node.nodeValue = "no";
			} else {
				sNode = "//*[@EDIT_ID='" + oEdit.EDIT_ID + "']";
				node = xmlIn.selectSingleNode(sNode);
				if (node != null) {
					var xmlAtt = node.ownerDocument.createAttribute("copy-responses");
					xmlAtt.value = val;
					node.setAttributeNode(xmlAtt);
				}
			}
		}
	}

	function UpdateNodeText(oEdit) {
		var sNode = "//*[@EDIT_ID='" + oEdit.EDIT_ID + "']";
		var node;
		var val;

		if (oEdit.EDIT_NODE != null) {
			sNode += "/" + oEdit.EDIT_NODE;
			
			node = xmlIn.selectSingleNode(sNode);
			
			if (node != null) {
				node.nodeValue = oEdit.value;
			} else {
				sNode = "//*[@EDIT_ID='" + oEdit.EDIT_ID + "']";
				node = xmlIn.selectSingleNode(sNode);
				if (node != null) {
					if (oEdit.EDIT_NODE.charAt(0) == '@') {
						var xmlAtt = node.ownerDocument.createAttribute(oEdit.EDIT_NODE.substring(1));
						xmlAtt.value = oEdit.value;
						node.setAttributeNode(xmlAtt);
					} else {
						alert("Help!\n\nI don't know how to add an element yet.\n\nI'm UpdateNodeText.\nYou'll find me in edit_xml.js.");
					}
				}
			}
		}
	}

	function Delete(sEditID) {
		var xmlNode = xmlIn.selectSingleNode("//*[@EDIT_ID='" + sEditID + "']");
		if (xmlNode.nodeName == "answer") 
			iAnswerCount--;
		var xmlParent = xmlNode.parentNode;
		xmlParent.removeChild(xmlNode);
		IsWellFormed();
	}

	function AddNewElement(sEditID, sWhere, xmlNode) {
		var xmlNode = xmlIn.selectSingleNode("//*[@EDIT_ID='" + sEditID + "']");
		var xmlParent = xmlNode.parentNode;
		
		switch (sWhere) {
			case "before":
				xmlParent.insertBefore(xmlTempDoc.documentElement, xmlNode);
				break;
			case "after":
				if (xmlNode.nextSibling != null)
					xmlParent.insertBefore(xmlTempDoc.documentElement, xmlNode.nextSibling);
				else
					xmlParent.appendChild(xmlTempDoc.documentElement);
				break;
			case "bottom":
				xmlParent.appendChild(xmlTempDoc.documentElement);
				break;
			case "child":
				xmlNode.appendChild(xmlTempDoc.documentElement);
				break;
			default:
				alert("Cannot perform this move. Where to?");
				return;
		}
		
		IsWellFormed();
	}

	function MoveDown(sEditID) {
		var xmlNode = xmlIn.selectSingleNode("//*[@EDIT_ID='" + sEditID + "']");
		var xmlParent = xmlNode.parentNode;
		var xmlTop, xmlBottom, xmlAtt;

		if (xmlParent == null) {
			alert("Cannot be moved?");
		} else {
			for (var i = 0; i < xmlParent.childNodes.length; i++) {
				xmlTop = xmlParent.childNodes.item(i);
				if (xmlTop == xmlNode) {
					xmlBottom = xmlParent.childNodes.item(i+1);
					if (xmlBottom == null) {
						xmlBottom = xmlParent.childNodes.item(0);
						xmlParent.removeChild(xmlTop);
						xmlParent.insertBefore(xmlTop, xmlBottom); // new, old
					} else {
						xmlParent.removeChild(xmlBottom);
						xmlParent.insertBefore(xmlBottom, xmlTop); // new, old
					}
					IsWellFormed();
					return;
				}
			}
		}
	}

	function MoveUp(sEditID) {
		var xmlNode = xmlIn.selectSingleNode("//*[@EDIT_ID='" + sEditID + "']");
		var xmlParent = xmlNode.parentNode;
		var xmlTop, xmlBottom, xmlAtt;

		if (xmlParent == null) {
			alert("Cannot be moved?");
		} else {
			for (var i = 0; i < xmlParent.childNodes.length; i++) {
				xmlBottom = xmlParent.childNodes.item(i);
				if (xmlBottom == xmlNode) {
					xmlTop = xmlParent.childNodes.item(i-1);
					xmlParent.removeChild(xmlBottom);
					xmlParent.insertBefore(xmlBottom, xmlTop); // new, old
					IsWellFormed();
					return;
				}
			}
		}
	}

	function CleanEditXml(xmlDoc) {
			var xmlNodeList;
			var xmlNode;
			var xmlAtt;

			xmlOut.loadXML(xmlDoc.xml);

			iNodeCount = 0;

			xmlNodeList = xmlOut.selectNodes("//*");
		
			for (var i=0; i < xmlNodeList.length; i++) {
					xmlNode = xmlNodeList.item(i);
					xmlAtt = xmlNode.getAttributeNode("EDIT_ID");
					if (xmlAtt != null)
						xmlNode.removeAttributeNode(xmlAtt);
			}

			return xmlOut;
	}

	function CleanXmlNode(xmlNode) {
			var xmlNodeList;
			var xmlAtt;
			var xmlTmpNode;

			iNodeCount = 0;

			xmlNodeList = xmlNode.selectNodes(".//*");
		
			for (var i=0; i < xmlNodeList.length; i++) {
					xmlTmpNode = xmlNodeList.item(i);
					xmlAtt = xmlTmpNode.getAttributeNode("EDIT_ID");
					if (xmlAtt != null)
						xmlTmpNode.removeAttributeNode(xmlAtt);
			}

			return xmlNode;
	}

	function MessageWindow(iWidth, iHeight, bShowCloseWindowLink, bShowScrollbars) {
		var sScrollbars = "scrollbars=yes";
		
		if (!bShowScrollbars)
			sScrollbars = "scrollbars=no";
			
		var oWin = window.open("", "MESSAGE", "top=" + (window.screenTop + 20) + ", left=" + (window.screenLeft + 50) + ", width=" + iWidth + ", height=" + iHeight + ", " + sScrollbars);
		var sCloseWindowLink = "<div align='center' style='color: black;'>[<a href='#' onclick='window.close(); return false;' style='color: black;'>close</a>]</div>";
		
		if (!bShowCloseWindowLink)
			sCloseWindowLink = "";
			
		oWin.document.write("<html><head><link rel='stylesheet' type='text/css' href='/admin/css/atkui_std.css' /></head><body bgcolor='#FFFFCC' style='margin: 5px; color: black'><span id='header' style='color: black; font-weight: bold;'></span><br /><br /><span id='normal' style='font-family: monospace;'></span><span id='red' style='font-family: monospace; color: red'></span><br /><br /><span id='footer' style='color: black;'></span>"  + sCloseWindowLink + "</body></html>");

		return oWin;
	}

	function IsWellFormed() {
		var oError = xmlIn.parseError;
		
		if (oError.errorCode == 0) {
			var xmlNodeList;
			var xmlNode;
			var xmlAtt;
			
			var oWin = MessageWindow(300, 300, false, false);
			oWin.header.innerText = "XML Editor Message";
			oWin.normal.innerHTML = "Please be patient...<br /><br /><i>For large XML files and / or slow machines, this process may take a short while. On completion, this window will close.</i><br /><br />";
			oWin.red.innerHTML = "<br /><br />";
			oWin.focus();
			
			iNodeCount = 0;
			iAnswerCount = 0;

			oWin.normal.innerHTML += "1. Checking XML into memory...<br /><br />";
			oWin.focus();
			
			sXmlType = xmlIn.documentElement.nodeName;

			xmlNodeList = xmlIn.selectNodes("//*");
		
			for (var i=0; i < xmlNodeList.length; i++) {
					xmlNode = xmlNodeList.item(i);
					
					xmlAtt = xmlNode.ownerDocument.createAttribute("EDIT_ID");
					xmlAtt.value = iNodeCount++;
					xmlNode.setAttributeNode(xmlAtt);
					
					// For ordering the nodes easily...
					xmlAtt = xmlNode.ownerDocument.createAttribute("UNIQUE_NODE_COUNT");
					xmlAtt.value = iNodeCount;
					xmlNode.setAttributeNode(xmlAtt);
			}
			
			oWin.normal.innerHTML += "2. Building user interface from XML...<br /><br />";
			oWin.focus();
			
			BuildTree();
			
			oWin.normal.innerHTML += "3. Checking answer validity...<br /><br />";
			oWin.focus();
			
			CheckAnswerValidity();

			oWin.close();
		} else {
			var oWin = MessageWindow(600, 400, true, true);
			oWin.header.innerText = oError.reason + "Error occurred at position " + oError.linepos + " on line " + oError.line + ".";
			oWin.normal.innerText = oError.srcText.substring(0, oError.filepos);
			oWin.red.innerText = oError.srcText.substring(oError.filepos, oError.srcText.length);
			oWin.focus();
		}
	}

	function BuildTree() {
		var sHTML = "";
		document.all["xmlTree"].innerHTML = ShowElement(xmlIn.documentElement, 0, 0, sHTML);
		document.all["xmlTree"].innerHTML += "<div style=\"font-size: 0.8em; text-align:right\">Paste as plain text: <input type=\"checkbox\" name=\"PasteAsText\" id=\"PasteAsText\" checked=\"checked\" value=\"1\" /></div>";
		if (bFirstBuild) {
			// Ensures all editable divs have their nodes in the Xml trees as CDATA sections
			// The problem seems to come from xsl:copy-of which does not leave cdata sections unchanged, 
			// but escapes the ><& tags and removes the cdata section. This effectively undoes that.
			bFirstBuild = false;
			var colDivs = document.all.tags("div");
			for (var i = 0; i < colDivs.length; i++) {
				if (colDivs[i].className == "RichTextNode") {
					UpdateNode(colDivs[i]);
				}
			}
		}
	}

	function ShowElement(Item, x, iNode, sHTML) {
		var oNodeList, sDisplay, sBorder, bRecurse, bEditable;

		bRecurse = true;
		sDisplay = "";
		sBorder = "none";

		if (Item.nodeValue != null)
			sValue = Item.nodeValue;
		else
			sValue = "";

		switch (Item.nodeName) {
		case "#text" :
			break;
		case "#comment" :
			sDisplay = "<i>" + sValue + "</i>";
			break;
		case "#cdata-section" :
			break;
		default:
			// SHOW THE NODE NAME WITH THE MENU
			var sNodeName = Item.nodeName;
			
			if (sNodeName == "answer") {
				iAnswerCount++;
			}
			
			sDisplay += "<myMenu:menu id=\"EditXmlNode\" onsubmenu_click=\"doFunction()\" style=\"color: black;\" >" + sNodeName;
			if (!bReadOnly) {
				if (x == 0) {
					sDisplay += "<myMenu:menu id=\"AddNewText('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Text (Child)</myMenu:menu>";
					if (sXmlType == "question") {
						sDisplay += "<myMenu:menu id=\"AddNewAnswer('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Answer (Child)</myMenu:menu>";
						sDisplay += "<myMenu:menu id=\"AddNewHelp('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Help (Child)</myMenu:menu>";
					}
					if (sXmlType == "survey") {
						sDisplay += "<myMenu:menu id=\"AddNewChoice('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Choice (Child)</myMenu:menu>";
						sDisplay += "<myMenu:menu id=\"AddNewSection('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Section (Child)</myMenu:menu>";
					}
				}
				if (x > 0) { 
					sDisplay += "<myMenu:menu id=\"MoveUp('" + Item.getAttributeNode("EDIT_ID").value + "');\">Move Up</myMenu:menu>";
					sDisplay += "<myMenu:menu id=\"MoveDown('" + Item.getAttributeNode("EDIT_ID").value + "');\">Move Down</myMenu:menu>";
					sDisplay += "<myMenu:menu id=\"AddNewText('" + Item.getAttributeNode("EDIT_ID").value + "', 'after');\">Add New Text (Here)</myMenu:menu>";
					if (sXmlType == "question") {
						if (x == 1) {
							sDisplay += "<myMenu:menu id=\"AddNewAnswer('" + Item.getAttributeNode("EDIT_ID").value + "', 'after');\">Add New Answer (Here)</myMenu:menu>";
							sDisplay += "<myMenu:menu id=\"AddNewHelp('" + Item.getAttributeNode("EDIT_ID").value + "', 'after');\">Add New Help (Here)</myMenu:menu>";
						}
					}
					if (sNodeName != "text" && sNodeName != "question") {
						sDisplay += "<myMenu:menu id=\"AddNewText('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Text (Child)</myMenu:menu>";
						if (sXmlType == "survey") {
							sDisplay += "<myMenu:menu id=\"AddNewSection('" + Item.getAttributeNode("EDIT_ID").value + "', 'after');\">Add New Section (Here)</myMenu:menu>";
							sDisplay += "<myMenu:menu id=\"AddNewSection('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Section (Child)</myMenu:menu>";
							if (sNodeName == "section") {
								sDisplay += "<myMenu:menu id=\"AddNewChoice('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Choice (Child)</myMenu:menu>";
							}
							if (sNodeName == "choice") {
								sDisplay += "<myMenu:menu id=\"AddNewBranch('" + Item.getAttributeNode("EDIT_ID").value + "', 'child');\">Add New Branch (Child)</myMenu:menu>";
							}
							if (sNodeName == "branch") {
								sDisplay += "<myMenu:menu id=\"AddNewBranch('" + Item.getAttributeNode("EDIT_ID").value + "', 'after');\">Add New Branch (Here)</myMenu:menu>";
							}
						}
					}
					sDisplay += "<myMenu:menu id=\"Delete('" + Item.getAttributeNode("EDIT_ID").value + "');\">Delete</myMenu:menu>";
				}
			}
			sDisplay += "</myMenu:menu>";
			
			if ((((sXmlType == "survey" && sNodeName == "section") || (sXmlType == "question" && sNodeName == "answer")) || (sXmlType == "survey")) && !bReadOnly ) {
				sDisplay += "<img class=\"node\" ";
				sDisplay += "onDragEnter=\"fOnDragOver(this)\" onDragOver=\"fOnDragOver(this)\" onDrop=\"fOnDrop(this)\" ";
				sDisplay += "EDIT_ID=\"" + Item.getAttributeNode("EDIT_ID").value + "\" ";
				sDisplay += "src=\"/admin/images/drop.gif\" ";
				sDisplay += "alt=\"You can drop questions here.\" />";
			}

			if (((Item.nodeName == "answer") || (Item.nodeName == "question")) && (x > 0)) {
				sBorder = "none";
			}
			
			if ((Item.nodeName == "question") && (x > 0)) {
				var xmlAtt = Item.getAttributeNode("id");
				if (xmlAtt != null) {
					sDisplay += " [<a style='color: white; font: 8pt arial;' ";
					sDisplay += "href='/" + xmlAtt.value + "' ";
					sDisplay += "onclick='var oWin = window.open(\"/admin/questions/?xsl_tableedit_action=edit&xsl_tableedit_question_id=" + xmlAtt.value + "&mod_tableedit_primary_key_value=" + xmlAtt.value + "\", \"SHOW_QUESTION\"); oWin.focus(); return false;' ";
					sDisplay += ">";
					sDisplay += "edit";
					sDisplay += "</a>] ";
				
					if (Item.parentNode.nodeName == "section") {
						sDisplay += "<span style='font: bolder 10pt arial; vertical-align: middle; border: 1px black none; padding: 2px; padding-left: 5px; color: white;'>";
						sDisplay += "copy-responses:</span>";
						sDisplay += "<input type='checkbox' value='yes' ";
						sDisplay += "EDIT_ID='" + Item.getAttributeNode("EDIT_ID").value + "' ";
						sDisplay += "EDIT_NODE='@copy-responses' ";
						if (bReadOnly) sDisplay += "DISABLED ";
						if (Item.attributes != null)
							for (var j=0; j<Item.attributes.length; j++)
								if (Item.attributes(j).nodeValue != null)
									if (Item.attributes(j).nodeName == "copy-responses")
										if (Item.attributes(j).nodeValue == "yes")
											sDisplay += "checked='checked' ";
						sDisplay += "onclick='UpdateNodeCR(this);' />";
					}
				}
			}
			
			if ((Item.nodeName == "question") && (x == 0)) {
				sDisplay += "<span style='font: bolder 10pt arial; vertical-align: middle; border: 1px black none; padding: 2px; padding-left: 5px; color: white;'>";
				sDisplay += "survey-code:</span>";
				sDisplay += "<input type='text' style='width: 25px;' ";
				sDisplay += "EDIT_ID='" + Item.getAttributeNode("EDIT_ID").value + "' ";
				sDisplay += "EDIT_NODE='@survey-code' ";
				if (bReadOnly) sDisplay += "DISABLED ";
				sDisplay += "value='";
				if (Item.attributes != null)
					for (var j=0; j<Item.attributes.length; j++)
						if (Item.attributes(j).nodeValue != null)
							if (Item.attributes(j).nodeName == "survey-code")
								sDisplay += Item.attributes(j).nodeValue;
				sDisplay += "' onchange='UpdateNodeText(this);' />";
			}
			
			// SHOW THE NODE'S ATTRIBUTES
			if (Item.attributes != null) {
				for (var j=0; j<Item.attributes.length; j++) {
					if (Item.attributes(j).nodeValue != null)
						switch (Item.attributes(j).nodeName) {
							case "EDIT_ID": 
								break;
							case "UNIQUE_NODE_COUNT":
								break;
							case "id":
								break;
							case "copy-responses":
								break;
							case "survey-code":
								break;
							case "type":
								sQuestionType = Item.attributes(j).nodeValue;
								sDisplay += "<span style='font: bolder 10pt arial; vertical-align: middle; border: 1px black none; padding: 2px; padding-left: 5px; color: white;'>";
								sDisplay += Item.attributes(j).nodeName + ":</span>";
								sDisplay += "<select style='border: 1px solid #555555; width: 300px;' ";
								sDisplay += "EDIT_ID='" + Item.getAttributeNode("EDIT_ID").value + "' ";
								sDisplay += "EDIT_NODE='@" + Item.attributes(j).nodeName + "' ";
								if (bReadOnly)
								{
									sDisplay += "DISABLED ";
								}
								sDisplay += "onchange='UpdateNodeDD(this);'>";
								sDisplay += "<option value='container'";
								if (Item.attributes(j).nodeValue == "container") {sDisplay += " selected"}
								sDisplay += ">Container (Groups questions)</option>";
								sDisplay += "<option value='radio'";
								if (Item.attributes(j).nodeValue == "radio") {sDisplay += " selected"}
								sDisplay += ">Radio (Single choice)</option>";
								sDisplay += "<option value='checkbox'";
								if (Item.attributes(j).nodeValue == "checkbox") {sDisplay += " selected"}
								sDisplay += ">Checkbox (Multiple choice)</option>";
								sDisplay += "<option value='text'";
								if (Item.attributes(j).nodeValue == "text" || Item.attributes(j).nodeValue == "") sDisplay += " selected";
								sDisplay += ">Text (A line of text)</option>";
								sDisplay += "<option value='textarea'";
								if (Item.attributes(j).nodeValue == "textarea" || Item.attributes(j).nodeValue == "") sDisplay += " selected";
								sDisplay += ">Text Area (Lots of text)</option>";
								sDisplay += "<option value='matrix'";
								if (Item.attributes(j).nodeValue == "matrix") sDisplay += " selected";
								sDisplay += ">Matrix (Tables questions of same type)</option>";
								sDisplay += "<option value='matrix_complex'";
								if (Item.attributes(j).nodeValue == "matrix_complex") sDisplay += " selected";
								sDisplay += ">Complex Matrix (Tables questions of many types)</option>";
								sDisplay += "<option value='dropdown'" ;
								if (Item.attributes(j).nodeValue == "dropdown") sDisplay += " selected";
								sDisplay += ">Drop Down List</option>";
								sDisplay += "</select>";
								break;
							default :
								sDisplay += "<span style='font: bolder 10pt arial; vertical-align: middle; border: 1px black none; padding: 2px; padding-left: 5px; color: white;'>";
								sDisplay += Item.attributes(j).nodeName + ":</span>";
								bEditable = "true";
								if (bReadOnly)
								{
									switch (Item.attributes(j).nodeName)
									{
										case "score":
										case "number":
										case "score-weighting":
										case "optional":
											bEditable = "false";
											break;
									}
								}
								sDisplay += "<span ";
								sDisplay += "onfocusout='UpdateNode(this);' ";
								sDisplay += "onmouseout='UpdateNode(this);' ";
								sDisplay += "contenteditable='" + bEditable + "' ";
								sDisplay += "onDragEnter='fIgnoreQuestionDrop()' ";
								sDisplay += "onDragOver='fIgnoreQuestionDrop()' ";
								sDisplay += "onDrop='fIgnoreQuestionDrop()' ";
								sDisplay += "EDIT_ID='" + Item.getAttributeNode("EDIT_ID").value + "' ";
								sDisplay += "EDIT_NODE='@" + Item.attributes(j).nodeName + "' ";
								sDisplay += "style='font: 10pt arial; border: 1px #CCCCCC solid; padding: 2px; color: black; background-color: white; '>" 
								sDisplay += Item.attributes(j).nodeValue;
								sDisplay += "</span>";
						}
				}
				
				// SHOW THE NODE'S CDATA SECTION, TEXT SECTION (IF THERE IS ANY TEXT)
				// (IF ITS CHILD HAS A NODE NAME OF "BODY" CONVERT IT TO A CDATA SECTION
				if (Item.hasChildNodes) {
					var iNodeType = Item.childNodes.item(0).nodeType;
					// 4 = #cdata-section, 3 = #text
					if (((iNodeType == 4) || (iNodeType == 3 && Item.childNodes.item(0).nodeValue != '')) || Item.childNodes.item(0).nodeName == 'body') {
						sDisplay += "<div ";
						sDisplay += "class='RichTextNode' ";
						sDisplay += "onfocusout='UpdateNode(this);' ";
						sDisplay += "onmouseout='UpdateNode(this);' ";
						sDisplay += "onDragEnter='fIgnoreQuestionDrop()' ";
						sDisplay += "onDragOver='fIgnoreQuestionDrop()' ";
						sDisplay += "onDrop='fIgnoreQuestionDrop()' ";
						sDisplay += "contenteditable='true' ";
						sDisplay += "onpaste='if (PasteAsText.checked) {this.innerText = window.clipboardData.getData(\"Text\"); return false;}' ";
						sDisplay += "EDIT_ID='" + Item.getAttributeNode("EDIT_ID").value + "' ";
						sDisplay += "style='margin: 5px 0 0 0; border: 1px #CCCCCC solid; padding: 5px; color: black; background-color: white;'>" 
						if (iNodeType == 4) {
							var sCdataContents = Item.childNodes.item(0).xml;
							sDisplay += sCdataContents.substring(9, sCdataContents.length - 3);
						} else if (Item.childNodes.item(0).nodeName == 'body') {
							// convert it into #cdata-section
							sDisplay += CleanXmlNode(Item.childNodes.item(0)).xml;
							bRecurse = false;
						} else {
							sDisplay += Item.childNodes.item(0).nodeValue;
						}
						sDisplay += "</div>";
					}
				}
			}
		}

		if (sDisplay != "") {
			sHTML += "<table style='border: 1px black " + sBorder + ";' width='100%'><tr><td width='" + x * 10 + "'></td>";
			sHTML += "<td style='color: white;'>" + sDisplay;
			
			// RECURSE DOWN THE TREE
			if (Item.hasChildNodes && bRecurse == true) {
				oNodeList = Item.childNodes;

				for (var i=0; i<oNodeList.length; i++) {
					sHTML = ShowElement(oNodeList.item(i), x+1, iNode++, sHTML);
				}
			}
			
			sHTML += "</td></tr></table>";
		}

		return sHTML;
	}

