// treeview with dynamic nodes

var aspLink = "SkosTree.aspx"; // TODO: geautomatiseerd vaststellen
var aspLinkAjax = "SkosTreeAjax.aspx"; // TODO: geautomatiseerd vaststellen
var aspLinkEditAction = "SkosTreeEditAction.aspx"; // TODO: geautomatiseerd vaststellen

var nodeBuilding = false;
var identifierName = "uri";
var urlPostFix = "";

var editor;
var nodeSelection;

function _debug(s) {
	return;
  document.getElementById("skosConceptEditor").innerHTML += "<br/>" + s;
}

var Tree = {
	
}

Tree.Editor = Class.create();

Tree.Editor.prototype = {
  initialize: function() {
    this.process();
  },

	process: function() {
	},

	confirm: function(s, buttons) {
		return (window.confirm(s))? buttons[0]: buttons[1];
	},
	
	alert: function(s, buttons) {
		alert(s);
		return true;
	}
};
					 
Tree.Edit = Class.create();

Tree.Edit.prototype = Object.extend(new Tree.Editor(), {

	process: function() {
		if (nodeSelection.length() == 1) {
			new Ajax.Updater(
			document.getElementById("skosConceptEditor"), 
			aspLinkAjax + "?treeFragment=contents" + nodeSelection.toRequest(),
			//aspLink + "?site=" + siteAlias + "&page_alias=" + "tree" + "&version=results" + nodeSelection.toRequest(),
			{asynchronous:false, evalScripts: true}
			);

		}
		else {
			this.alert("Can't edit node. The selection is empty. Please select a node.", ["Ok"]);
		}
	}

});

Tree.ApproveNode = Class.create();

Tree.ApproveNode.prototype = Object.extend(new Tree.Editor(), {

	process: function() {
		if (nodeSelection.length() == 1) {
			new Ajax.Updater(
				document.getElementById("ActionResult"), 
				aspLinkEditAction + "?execute=approve" + nodeSelection.toRequest(),
				{asynchronous:false, evalScripts: true}
				);
		}
		else {
			this.alert("Can't change status. The selection is empty. Please select a node.", ["Ok"]);
		}
	}

});

Tree.RejectNode = Class.create();

Tree.RejectNode.prototype = Object.extend(new Tree.Editor(), {

	process: function() {
		if (nodeSelection.length() == 1) {
			new Ajax.Updater(
				document.getElementById("ActionResult"), 
				aspLinkEditAction + "?execute=reject" + nodeSelection.toRequest(),
				{asynchronous:false, evalScripts: true}
				);
		}
		else {
			this.alert("Can't change status. The selection is empty. Please select a node.", ["Ok"]);
		}
	}

});

Tree.New = Class.create();

Tree.New.prototype = Object.extend(new Tree.Editor(), {

	process: function() {
		if (nodeSelection.length() > 0) {
			//_debug(aspLink + "?execute=new" + nodeSelection.toRequest());
			new Ajax.Updater(
				document.getElementById("ActionResult"), 
				aspLinkEditAction + "?execute=new" + nodeSelection.toRequest(),
				{asynchronous:false, evalScripts: true}
				);
			//alert("creating in tree " + nodeSelection.items[0]);
			//nodeSelection.select(addNodeToTree(nodeSelection.items[0]));
		}
		else {
			this.alert("Can't create a new node without a parent. Please select a parent node.", ["Ok"]);
		}
	}

});

Tree.NewRoot = Class.create();

Tree.NewRoot.prototype = Object.extend(new Tree.Editor(), {

	process: function() {
		//_debug(aspLink + "?execute=newroot" + nodeSelection.toRequest());
		new Ajax.Updater(
			document.getElementById("ActionResult"), 
			aspLinkEditAction + "?execute=newroot" + nodeSelection.toRequest(),
			{asynchronous:false, evalScripts: true}
			);
			
		new Ajax.Updater(
			document.getElementById("referenceStructures"), 
			aspLinkAjax + "?treeFragment=referencestructures",
			{asynchronous:false, evalScripts: true}
			);
	}

});

Tree.Delete = Class.create();

Tree.Delete.prototype = Object.extend(new Tree.Editor(), {

	process: function() {
		if (nodeSelection.length() > 0) {
			if (this.confirm("Are you sure you want to delete the selected node and underlying nodes?", ["Yes", "No"]) == "Yes") {
				//_debug(aspLink + "?execute=delete" + nodeSelection.toRequest());
				new Ajax.Updater(
					document.getElementById("ActionResult"), 
					aspLinkEditAction + "?execute=delete" + nodeSelection.toRequest(),
					/* aspLink + "?site=" + siteAlias + "&page_alias=" + "tree" + "&version=edit&execute=delete" + nodeSelection.toRequest(), */
					{asynchronous:false, evalScripts: true}
					);
			}
		}
		else {
			this.alert("Can't remove node. The selection is empty. Please select a node.", ["Ok"]);
		}
	}

});

Tree.Move = Class.create();

Tree.Move.prototype = Object.extend(new Tree.Editor(), {
	
	step: 0,
	mode: "child",
	
	process: function() {
		switch (nodeSelection.length()) {
			case 0:
				this.alert("Can't move node. The selection is empty. Please select a node.", ["Ok"]);
				break;
			default:		
				if (this.step == 0) {
					//alert("Selecteer doel node");
					this.step++;
				} 
				else {
					var pars = nodeSelection.toRequestXX();
					nodeSelection.pop();
					_debug(aspLinkEditAction + "?execute=move" + "&moveMode=" + this.mode + pars);
					new Ajax.Updater(
						document.getElementById("ActionResult"), 
						/*aspLink + "?site=" + siteAlias + "&page_alias=" + "tree" + "&version=edit&execute=move" + "&moveMode=" + this.mode + pars,*/
						aspLinkEditAction + "?execute=move" + "&moveMode=" + this.mode + pars,
						{asynchronous:false, evalScripts: true}
						);
					showEditActionResponse();
				}
		}
	}

});

Tree.Selection = Class.create();

Object.extend(Tree.Selection.prototype, {
  initialize: function(options) {
    this.items = new Array();
    this.setOptions(options);
  },
	
  setOptions: function(options) {
    this.options = {
      backgroundColor:  '#6699ff',
      color:            '#fff',
      prefix:           'a_',
      className:        'selected',
			addMode:          'new'
    }
    Object.extend(this.options, options || {});
  },

	select: function(nodeId) {
		var ids;
		ids = nodeId.split(", ");
		for (var i = 0; i < ids.length; i++) {
			if (ids[i] != 'null') { this.add(null, ids[i]); }
		}
	},
	
	add: function(e, nodeId) {
		if (this.options.addMode == "new") {
			if (e) {
				if (!e.ctrlKey) {
					this.clear();
				}
			}
		}
		this.items.push(nodeId);
		$(this.options.prefix + this.items[this.items.length-1]).className = this.options.className;
	},
	
	pop: function() {
		var item = this.items.pop();
		if (item) { $(this.options.prefix + item).className = "" };
	},

	getElement: function(index) {
		return $(this.options.prefix + this.items[index]);
	},

	clear: function() {
		for (var i = 0; i < this.items.length; i++) {
			if ($(this.options.prefix + this.items[i])!= null)
			{
				$(this.options.prefix + this.items[i]).className = "";
			}
		}
		this.items.length = 0;
	},
	
	reset: function() {
		this.clear()
		nodeSelection.options.addMode = "new";
	},

	length: function() {
		return this.items.length;
	},

	toRequestXX: function() {
		var s = "";
		for (var i = 0; i < this.items.length-1; i++) { //!!!!!!!!!!!!!!!!! -1
			//s += "&uri=" + escape(this.items[i]) + "&uri=" + "null" + "&uri=" + escape(this.items[this.items.length-1]);
			s += "&uri=" + escape(this.items[i]) + "&uri=" + escape(this.items[this.items.length-1]);
		}
		return s;
		//return "cid=" + this.items.join("&cid=");
	},

	toRequest: function() {
		var s = "";
		for (var i = 0; i < this.items.length; i++) {
			s += "&uri=" + escape(this.items[i]);
		}
		return s;
		//return "&uri=" + this.items.join("&uri=");
	}

});

function toggleNodeClass(nodeId) {
	var nodeLI = document.getElementById("li_"+nodeId);			
	switch (nodeLI.className) {
		case "open":
			nodeLI.className = "closed";
			break;
		case "openNoConnect":
			nodeLI.className = "noConnect";
			break;
		case "closed":
			nodeLI.className = "open";
			break;
		case "noConnect":
			nodeLI.className = "openNoConnect";
			break;
	} 
}

function toggleNode(nodeId) {
	if (document.getElementById("ul_"+nodeId) == null) buildNode(nodeId); else toggleX(nodeId);
}	 

function toggleX(nodeId) { 
	var nodeButton = document.getElementById("tb_"+nodeId);
	nodeButton.className = (nodeButton.className == "min")? "plus": "min";
	var nodeUl = document.getElementById("ul_"+nodeId);
	toggleNodeClass(nodeId);
	nodeUl.style.display = (nodeUl.style.display == "none")? "block": "none";
	/*
	Effect.DefaultOptions.duration = 0.1;
	new Effect.toggle(nodeUl, 'blind');
	*/
}	 
	
function buildNode(nodeId) {
	//_debug(aspLink + "?site=" + siteAlias + "&page_alias=" + "tree" + "&" + identifierName + "=" + escape(nodeId) + "&version=ajax&treeFragment=children&browsemode=tree" + urlPostFix);
	new Ajax.Updater(
		document.getElementById("cd_" + nodeId), 
//		aspLink + "?site=" + siteAlias + "&page_alias=" + "tree" + "&" + identifierName + "=" + escape(nodeId) + "&version=ajax&treeFragment=children&browsemode=tree" + urlPostFix, 
		aspLinkAjax + "?treeFragment=children" + "&" + identifierName + "=" + escape(nodeId),
		{asynchronous:false, insertion: Insertion.After, onComplete:updateNode(nodeId)}
		);
}	 

function replaceNode(nodeId, open) {

	//_debug(aspLinkAjax + "?treeFragment=node" + "&" + identifierName + "=" + escape(nodeId));
	new Ajax.Request(
		//aspLink + "?site=" + siteAlias + "&page_alias=" + "tree" + "&" + identifierName + "=" + escape(nodeId) + "&version=ajax&treeFragment=node&browsemode=tree" + urlPostFix,
	  aspLinkAjax + "?treeFragment=node" + "&" + identifierName + "=" + escape(nodeId),
	  {asynchronous:false, method: 'get', onComplete: function(t) { Element.replace($("li_" + nodeId), t.responseText); if (open == true) {toggleNode(nodeId);} } } );	
}	 

function updateNode(nodeId) {
	var nodeButton = document.getElementById("tb_"+nodeId);
	nodeButton.className = (nodeButton.className == "min") ? "plus" : "min";
	nodeButton.href = "javascript:toggleNode('" + nodeId + "')";
	toggleNodeClass(nodeId);
	/*
	Effect.DefaultOptions.duration = 0.1;
	var nodeUl = document.getElementById("bc_"+nodeId);
	new Effect.toggle(nodeUl, 'blind');
	*/
}

function addNodeToTree(nodeId) {
  //alert(nodeId);
	var ids;
	var result = new Array();
	if (nodeId.indexOf(",") != -1) {
		ids = nodeId.split(",");
	} 
	else {
		ids = nodeId.split(", ");
	}

	_debug(ids);
	for (var i = 0; i < ids.length; i+=3) {
		result.push(ids[0])
		replaceNode(ids[0], false);
	}
	return (result.join(", "));
}

function addChildrenToTree(nodeId) {
  //alert(nodeId);
	var ids;
	var result = new Array();
	if (nodeId.indexOf(",") != -1) {
		ids = nodeId.split(",");
	} 
	else {
		ids = nodeId.split(", ");
	}

	_debug(ids);
	for (var i = 0; i < ids.length; i+=3) {
		result.push(ids[0])
		replaceNode(ids[0], true);
	}
	return (result.join(", "));
}

function removeNodeFromTree(nodeId) {
	var ids = nodeId.split(", ");
	var updateParent;
	var result;
	for (var i = 0; i < ids.length; i++) {
		updateParent = ($("li_" + ids[i])).parentNode;
		result = Element.remove($("li_" + ids[i]));
		if (updateParent.getElementsByTagName("li").length == 0) {
			//alert(updateParent.id.slice(3));
			//updateParent.getElementsByClassName("icons")[0].getElementsByTagName("a")[0].className = "connector";
			replaceNode(updateParent.id.slice(3), false);
		}
	}
	return result;
}

function moveNodeInTree(nodeId, moveMode) {
	var ids;
	var result = new Array();
	
	if (nodeId.indexOf(",") != -1) {
		ids = nodeId.split(",");
	} 
	else {
		ids = nodeId.split(", ");
	}
		
	//_debug(ids + " --> " + moveMode);
	for (var i = 0; i < ids.length; i+=2) {
		result.push(ids[0])
		if (moveMode == 'previousSibling') {
			var before = $("li_" + ids[i+1]);
			if (before == null) {
				//alert("before node = null");
			}
			else {
				//alert(before.id)
				_debug("li_" + ids[i] + "-" + "li_" + ids[i+1]);
				before.parentNode.insertBefore(removeNodeFromTree(ids[i]), before);
			}
		}
		else if (moveMode == 'nextSibling') {
			var next = $("li_" + ids[i+1]);
			if (next == null) {
				//alert("next node = null");
			}
			else {
				//alert(next.id)
				_debug("li_" + ids[i] + "-" + "li_" + ids[i+1]);
				next.parentNode.insertBefore(removeNodeFromTree(ids[i]), next.nextSibling);
			}
		}
		else {
			var dest = $("ul_" + ids[i+1]);
			if (dest == null) {
				removeNodeFromTree(ids[i]);
				buildNode(ids[i+1]);
			}
			else {
				dest.appendChild(removeNodeFromTree(ids[i]));
			}
		}
	}
	return (result.join(", "));
}

function reset() {
	editor = null;
}

function editNode() {
	editor = new Tree.Edit();
	editor = null;
	updateAnchors();
	selectTabConcepts();
}

function rejectNode() {
	editor = new Tree.RejectNode();
	editor = null;
	updateAnchors();
}

function approveNode() {
	editor = new Tree.ApproveNode();
	editor = null;
	updateAnchors();
}

function newNode() {
	editor = new Tree.New();
	editor = null;
	updateAnchors();
	showEditActionResponse();
}

function newRootNode() {
	editor = new Tree.NewRoot();
	editor = null;
	updateAnchors();
	showEditActionResponse();
}

function deleteNode() {
	editor = new Tree.Delete();
	editor = null;
	showEditActionResponse();
	nodeSelection.reset();
	hideConceptEditor();
}

function moveNodeAsChild() {
	nodeSelection.options.addMode = "append";
	editor = new Tree.Move();
	editor.mode = "child";
}

function moveNodeAsPreviousSibling() {
	nodeSelection.options.addMode = "append";
	editor = new Tree.Move();
	editor.mode = "previousSibling";
}

function moveNodeAsNextSibling() {
	nodeSelection.options.addMode = "append";
	editor = new Tree.Move();
	editor.mode = "nextSibling";
}

function copyNodeTo() {
	nodeSelection.options.addMode = "append";
	editor = new Tree.Move();
	editor.mode = "copyto";
}

function updateDelete() {
  alert("");
}

function selectNode(e, nodeId) {
	
	nodeSelection.add(e, nodeId);

	if (editor) {
		editor.process();
	}

	if (nodeSelection.length() == 1)
	{
		editNode();
	}
	
	return false;
}

function saveNode(params) {
	//_debug(aspLinkEditAction + "?" + params);
	//alert(aspLinkEditAction + "?" + params);
 	new Ajax.Updater(
		document.getElementById("ActionResult"), 
		aspLinkEditAction + "?" + params,
		{asynchronous:false, evalScripts: true}
		);
	showEditActionResponse()
}

function hideConceptEditor()	 {
  Element.hide("skosConceptEditor");
}

function showConceptEditor()	 {
  Element.show("skosConceptEditor");
}

function hideEditActionResponse()	 {
  Element.hide("ActionResult");
}

function showEditActionResponse()	 {
	Element.show("ActionResult");
}

function selectTabStructures()	 {
	rootId = getRootId();
	rootIdEscaped = rootId.replace('#', '%23');
	
	document.location.href = "skostree.aspx?selected="+rootIdEscaped+"&root="+rootIdEscaped;
}

function selectTabConcepts()	 {
	Element.hide("referenceToolbar");
	Element.hide("referenceStructures");
	Element.show("conceptToolbar");
	Element.show("skosConceptEditor");
	Element.hide("skosSearchPage");
	Element.hide("skosHelp");
	$('editorTabStructures').className = '';
	$('editorTabConcepts').className = 'active';
	$('editorTabSearch').className = '';
	$('editorTabHelp').className = '';
}

function selectTabSearch()	 {
	Element.hide("referenceToolbar");
	Element.hide("referenceStructures");
	Element.hide("conceptToolbar");
	Element.hide("skosConceptEditor");
	Element.show("skosSearchPage");
	Element.hide("skosHelp");
	$('editorTabStructures').className = '';
	$('editorTabConcepts').className = '';
	$('editorTabSearch').className = 'active';
	$('editorTabHelp').className = '';
}

function selectTabHelp()	 {
	Element.hide("referenceToolbar");
	Element.hide("referenceStructures");
	Element.hide("conceptToolbar");
	Element.hide("skosConceptEditor");
	Element.hide("skosSearchPage");
	Element.show("skosHelp");
	$('editorTabStructures').className = '';
	$('editorTabConcepts').className = '';
	$('editorTabSearch').className = '';
	$('editorTabHelp').className = 'active';
}

function selectReferenceStructure(e, rootId)
{
	var rootIdEscaped = rootId.replace('#','%23');
	setRootId(rootId);
	
 	new Ajax.Updater(
		document.getElementById("treeEditor"), 
		"skostree.aspx?selected=" + rootIdEscaped + "&root="+rootIdEscaped+"&altTemplate=SkosTreeEditorOnly",
		{asynchronous:false, evalScripts: true}
		);
	
	nodeSelection.reset();
	
	if (rootId!="")
	{
		selectNode(e, rootId);
	}
	
	return false;
}

function getRootId()
{
	rootId = ($('root')!=null)?$('root').value:"";
	
	return rootId;
}

function setRootId(rootId)
{
	$('root').value = rootId;
}


nodeSelection = new Tree.Selection();