var baseUrl = "http://www.carus.canby.k12.or.us/";
var request = false;

function createRequest() {

        try {
                request = new XMLHttpRequest();

        } catch (trymicrosoft) {

                try {
                        request = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (othermicrosoft) {

                        try {
                                request = new ActiveXObject("Microsoft.XMLHTTP");
                        } catch (failed) {
                                request = false;
                        }
                }
        }

        if (request === false)
                alert("Error creating request object!");

}

function addNode()
{
	var ul1 = document.getElementById("ul1");
	
	var newNodeId = 1;
	newNodeId += document.getElementById("last_category_id").value++;

	node1 = document.createElement("li");
	node1.setAttribute("id", "li" + newNodeId);
	node1.setAttribute("class", "topic");
	//var nodeContents = "<a href=\"javascript:moveNodeUp(\'li" + newNodeId  + "\')\">Up</a>&nbsp;&nbsp;<a href=\"javascript:moveNodeDown(\'li" + newNodeId  + "\')\">Down</a>&nbsp;&nbsp;<a href=\"javascript:popNodeOut(\'li" + newNodeId  + "\')\">Pop Out</a>&nbsp;&nbsp;<a href=\"javascript:pushNodeInto(\'li" + newNodeId  + "\')\">Push Into</a>&nbsp;&nbsp;<a href=\"javascript:editNode(\'li" + newNodeId + "\')\">Edit</a>&nbsp;&nbsp;<a href=\"javascript:deleteNode(\'li" + newNodeId + "\')\">Delete</a>&nbsp;&nbsp;&nbsp;<span class=\"category_name\">Category: " + newNodeId + "</span>";
		
	var nodeContents = "<a href=\"javascript:moveNodeUp('li" + newNodeId + "')\"><img src=\"http://www.carus.canby.k12.or.us/themes/simple/images/category/up.gif\" title=\"Move Up\" border=0></a><a href=\"javascript:moveNodeDown('li" + newNodeId + "')\"><img src=\"http://www.carus.canby.k12.or.us/themes/simple/images/category/down.gif\" title=\"Move Down\" border=0></a><a href=\"javascript:editNode('li" + newNodeId + "')\"><img src=\"http://www.carus.canby.k12.or.us/themes/simple/images/category/edit.gif\" title=\"Edit\" border=0></a><a href=\"javascript:popNodeOut('li" + newNodeId + "')\"><img src=\"http://www.carus.canby.k12.or.us/themes/simple/images/category/bottom.gif\" title=\"Move To Bottom Of All Categories\" border=0></a><a href=\"javascript:pushNodeInto('li" + newNodeId + "')\"><img src=\"http://www.carus.canby.k12.or.us/themes/simple/images/category/moveinto.gif\" title=\"Move This To Another Category\" border=0></a><a href=\"javascript:deleteNode('li" + newNodeId + "')\"><img src=\"http://www.carus.canby.k12.or.us/themes/simple/images/category/delete.gif\" title=\"Delete\" border=0></a><span class=\"category_name\">" + newNodeId + "</span>";

	var containerDiv = document.getElementById("ul1");
	containerDiv.appendChild(node1);
	node1.innerHTML = nodeContents;
	node1.setAttribute("id","li" + newNodeId);
	node1.className = "topic";

	var categoryAdditionInfo = document.getElementById("category_additions").value;
	document.getElementById("category_additions").value = categoryAdditionInfo + node1.id + "|";
}

function editNode(node) {

	node1 = document.getElementById(node);

	for (var i = 0; i < node1.childNodes.length; i++) {
		
		if (node1.childNodes[i].tagName == "SPAN") {

			// Create individual edit form for a particular LI
			var shortForm = '<form name="shortForm_' + node + '" method="post" style="display: inline;" onSubmit="getEditNode(\'' + node + '\');return false;">';
			   shortForm += '<input type="text" id="category_name_' + node + '" name="category_name" size="15" value="' + node1.childNodes[i].firstChild.nodeValue + '">';
			   shortForm += '<input type="hidden" id="category_id_' + node + '" value="' + node + '">&nbsp;';
			   shortForm += '<input type="button" value="OK" onClick="getEditNode(\'' + node + '\');">';
			   shortForm += '</form>';

			var temp = document.createElement("p");
			temp.setAttribute("style", "margin:0;padding:0;display:inline;");

			//node1.removeChild(node1.childNodes[i]);
			//node1.appendChild(temp);
			//node1.lastChild.innerHTML = shortForm;

			node1.replaceChild(temp, node1.childNodes[i]);
			node1.childNodes[i].innerHTML = shortForm;

			document.getElementById("category_name_" + node).focus();
			
		}	
	}	

}


function getEditNode(node) {

	var category = document.getElementById("category_name_" + node).value;
	var category_id = document.getElementById("category_id_" + node).value;

	createRequest();
	var url = baseUrl + "functions/category_functions.php?go=getQuickCategoryInfo";
	url = url + "&dummy=" + new Date().getTime();
	request.open("POST", url, true);

	request.onreadystatechange = updateEditNode;
	request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	request.send("category=" + escape(category) +
		     "&category_id=" + escape(category_id));

}


function updateEditNode() {

	if (request.readyState == 4) {

		var info = request.responseText.split("|");

		var newCategoryName = document.createTextNode(info[0]);
		var category_id = info[1];
		var newSpan = document.createElement("span");
		newSpan.setAttribute("class", "category_name");

		node1 = document.getElementById(category_id);

		for (var i = 0; i < node1.childNodes.length; i++) {
			if (node1.childNodes[i].tagName == "P") {
				newSpan.appendChild(newCategoryName);
			
				node1.replaceChild(newSpan, node1.childNodes[i]);
				//node1.childNodes[i] = newCategory_name;

				/*node1.removeChild(node1.childNodes[i]);
				node1.appendChild(newSpan);
				node1.lastChild.appendChild(newCategoryName);*/
			}
		}

	}
}


function deleteNode(node)
{
	node1 = document.getElementById(node);


	if (node1.childNodes.length > 7) {
		alert("You have to delete categories within this category first.");
	} else {

		var yesDelete = confirm("Are you sure you want to delete this category?");

		if (yesDelete) {
			// Delete leftover UL if there aren't any more categories inside of another category
			if (node1.parentNode.childNodes.length < 2) {
				node1.parentNode.parentNode.removeChild(node1.parentNode.parentNode.lastChild);
			}
			
			var categoryDeleteInfo = document.getElementById("category_deletions").value;
			categoryDeleteInfo += node + "|";
			document.getElementById("category_deletions").value = categoryDeleteInfo;

			// Delete the node
			node1.parentNode.removeChild(node1);
		}
	}
}

function moveNodeUp(node)
{
	node1 = document.getElementById(node);
	var temp = document.getElementById(node).previousSibling;

	// Check to make sure we aren't at top of list
	if (temp) {

		if (((temp.previousSibling) && (document.getElementById(node).className == "topic")) || 
		 ((temp) && (document.getElementById(node).className == "subtopic")) ||  
		 ((temp) && (document.getElementById(node).className == "subsubtopic"))) {
			while (temp.nodeName != "LI") {
				temp = temp.previousSibling;
			}
			
			node1.parentNode.insertBefore(node1, temp);

		}

	}
}

function moveNodeDown(node)
{
	node1 = document.getElementById(node);
	var temp = document.getElementById(node).nextSibling;

	// Check to make sure we aren't at end of list
	if (temp) {

		// Find next LI (and skip all of the extra DOM stuff in between)
		while (temp.nodeName != "LI") {
			temp = temp.nextSibling;
		}

		node1.parentNode.insertBefore(node1, temp.nextSibling);

	}
}

function popNodeOut(node)
{
	node1 = document.getElementById(node);

	var ul1 = document.getElementById("ul1");

	// Delete leftover UL if there aren't any more categories inside of another category
	if (node1.parentNode.childNodes.length < 2) {
		node1.parentNode.parentNode.removeChild(node1.parentNode.parentNode.lastChild);
	}

	ul1.appendChild(node1);

	if (node1.className == "subtopic") {
		node1.className = "topic";
		
		traverseForTopicsChildren(node1);
	} else {
		node1.className = "topic";
	}
			
}


function traverseForTopicsChildren(node) {

	if ((node.nodeType == 1) && (node.tagName == "LI")) {
		if (node.className == "subtopic") { node.className = "topic"; }
		if (node.className == "subsubtopic") { node.className = "subtopic"; }
	} 

	if (node.childNodes != null) {
		for (var i = 0; i < node.childNodes.length; i++) {
			traverseForTopicsChildren(node.childNodes.item(i));
		}
	}

}

var currentLI = "";	// current LI counter in loop
var foundID = "";	// node we are looking for

function walkover(node, i, moveToNode) {

	// Update currentLI counter
	if ((node.nodeType == 1) && (node.tagName == "LI")) {

		currentLI = node.id;
	}

	// If we found the node we are looking for
	// .value is for Firefox
	// .innerHTML is for IE and Safari
	if ((node.nodeType == 1) && (node.value == moveToNode) ||
	    (node.nodeType == 1) && (node.innerHTML == moveToNode)) {

		foundID = currentLI;

	// else if iterating over nodes (and make sure it's an element node)
	} else if (node.nodeType == 1) {

		// Walk over each tag in tree 
		for (var c = node.firstChild; c !== null; c = c.nextSibling) {
			walkover(c, i+1, moveToNode);	// recursion
		}
	}

	return foundID;

}


function setClassName(node, targetLI) {

	if (node.tagName == "LI") {

		if (node.className == "topic" && targetLI.className == "topic") {
			node.className = "subtopic";
		} else if (node.className == "topic" && targetLI.className == "subtopic") {
			node.className = "subsubtopic";
		} else if (node.className == "subtopic" && targetLI.className == "topic") {
			node.className = "subtopic";
		} else if (node.className == "topic" && targetLI.className == "subtopic") {
			node.className = "subsubtopic";
		} else if (node.className == "subtopic" && targetLI.className == "subtopic") {
			node.className = "subsubtopic";
		} else if (node.className == "subsubtopic" && targetLI.className == "topic") {
			node.className = "subtopic";
		}

		// Update child LI classes
		for (var i = 0; i < node.getElementsByTagName("li").length; i++) {
			if (node.getElementsByTagName("li")[i].className == "subtopic")
				node.getElementsByTagName("li")[i].className = "subsubtopic";
		}


	}

}


function pushNodeInto(node)
{
	
	var ul1 = document.getElementById("ul1");
	node1 = document.getElementById(node);
	
	var moveToNode = prompt("What category do you want to place this under?");
	var childNodes = document.getElementById("ul1").childNodes;
	var child;
	var whichLI;

	if (moveToNode) {
	
		// Get LI id by calling walkover function
		whichLI = walkover(ul1, 0, moveToNode);

		// Exception Handling
		try {

			if (!document.getElementById(whichLI))
				throw "CategoryDoesNotExist";

			if (node == whichLI)
				throw "CannotMoveIntoItself";

			var levels = 0;

			for (var i = 0; i < node1.getElementsByTagName("li").length; i++) {
				if (node1.getElementsByTagName("li")[i].id == whichLI)
					throw "CannotMoveIntoChildOfItself";
				
				if (node1.getElementsByTagName("li")[i].className == "topic")
					levels = 1;
				if (node1.getElementsByTagName("li")[i].className == "subtopic")
					levels = 2;
				if (node1.getElementsByTagName("li")[i].className == "subsubtopic")
					levels = 3;
				
			}

			//alert("className: " + document.getElementById(whichLI).className + "\nlevels: " + levels + "\ntarget childNodes length: " + document.getElementById(whichLI).childNodes.length + "\nmoveThis className: " + node1.className);

			if ((document.getElementById(whichLI).className == "topic") && (document.getElementById(whichLI).childNodes.length > 7) && (levels > 2) && (node1.className != "subtopic"))
				throw "MaximumNumberOfFolders";
			else if ((document.getElementById(whichLI).className == "topic") && (levels > 2) && (node1.className != "subtopic"))
				throw "MaximumNumberOfFolders";
			else if ((document.getElementById(whichLI).className == "subtopic") && (levels > 1))
				throw "MaximumNumberOfFolders";
			else if ((document.getElementById(whichLI).className == "subsubtopic") && (levels >= 0))
				throw "MaximumNumberOfFolders";
		
			// Delete leftover UL if there aren't any more categories inside of another category
			if (node1.parentNode.childNodes.length < 2) {
				node1.parentNode.parentNode.removeChild(node1.parentNode.parentNode.lastChild);
			}
			
			var targetLI = document.getElementById(whichLI);

			if (targetLI.lastChild.tagName != "SPAN") {
				targetLI.lastChild.appendChild(node1);
			} else {
				var newUL = document.createElement("ul");

				targetLI.appendChild(newUL);
				newUL.appendChild(node1);
			}

			setClassName(node1, targetLI);
		
		}

		// Exception Handling
		catch (e) {
			if (e == "CategoryDoesNotExist") {
				alert("There isn't a category by that name.");
			} else if (e == "CannotMoveIntoItself") {
				alert("You can't move a category into itself.");
			} else if (e == "MaximumNumberOfFolders") {
				alert("This category has too many folder depths to move into the desired category.");
			} else if (e == "CannotMoveIntoChildOfItself") {
				alert("You can't move a category into a child category of itself.");
			}
		}

	}

}

var report = "";

function traverseForNodeInfo(node) {

	if ((node.nodeType == 1) && (node.tagName == "LI")) { 
		
		var theCSSClass = 0;

		report += node.id.replace(/[li]/gi, "") + ":";

		if (node.className == "topic") {
			theCSSClass = 1;
		} else if (node.className == "subtopic") {
			theCSSClass = 2;
		} else if (node.className == "subsubtopic") {
			theCSSClass = 3;
		}
		
		report +=  theCSSClass + ":";
	}

	if ((node.nodeType == 1) && (node.tagName == "SPAN")) {

		var strip_these = /[\:\|]+/gi;
		var category_name = node.firstChild.nodeValue.replace(strip_these, "_");

		report += category_name + "|";

	}

	if (node.childNodes != null) {
		for (var i = 0; i < node.childNodes.length; i++) {
			traverseForNodeInfo(node.childNodes.item(i));
		}
	}

}

function gatherNodeInfo(node) {

	traverseForNodeInfo(node);

	//alert(report);

	//report = "";

	//alert(document.getElementById("category_deletions").value);

	report = "1:1:none|" + report;
	
	document.getElementById("category_changes").value = report;
	
	report = "";

}
