var directory = null;
var topics_dir = null;
var clickable = new Array();
var currentRoot = null;
var grabbedNode = null;
var grabbedNodeIndent = null;

function toggleList(e,me,imgDir,instanceNum,hide_subtree_icon){
  var remoteRequest = false;
  if (directory)
    imgDir = directory;
  try {
    element = document.getElementById(instanceNum+'_'+e).style;
    element.display == 'none' ? element.display = 'block' : element.display='none';
  } catch (error) {
    remoteRequest = true;
  }
  var o='open';
  var c='closed';
  var ob='openBottom';
  var cb='closedBottom';
  if (me.className.indexOf(cb)>-1){
    me.className = ob;
    me.src = imgDir+'openbottom.gif';
  } else if (me.className.indexOf(ob)>-1){
    me.className = cb;
    me.src = imgDir+'closedbottom.gif';
  } else if (me.className.indexOf(c)>-1){
    me.className = o;
    me.src = imgDir+'open.gif';
  } else if (me.className.indexOf(o)>-1){
    me.className = c;
    me.src = imgDir+'closed.gif';
  }
  if (remoteRequest) {
    var oldImage = me.src;
    me.src = imgDir+'../../loading-18x18.gif';
    fetchSubtree(e, imgDir, oldImage, instanceNum, hide_subtree_icon);
  }
}
function collapseAll(imgDir){
  if (directory)
    imgDir = directory;
  var element, me;
  var labels = document.getElementsByTagName('span');
  for( var i = 0; i < labels.length; i++ ) {
    if( labels[i].className == 'newBranch' ) {
      labels[i].style.display = 'none';
    }
  }
  var o='open';
  var c='closed';
  var ob='openBottom';
  var cb='closedBottom';
  labels = document.getElementsByTagName('img');
  for( var i = 0; i < labels.length; i++ ) {
    me = labels[i];
    if( labels[i].className == ob ) {
      me.className = cb;
      me.src = imgDir+'closedbottom.gif';
    } else if ( labels[i].className == o ) {
      me.className = c;
      me.src = imgDir+'closed.gif';
    }
  }
}
function expandAll(imgDir){
  if (directory)
    imgDir = directory;
  var me;
  var labels = document.getElementsByTagName('span');
  for( var i = 0; i < labels.length; i++ ) {
    if( labels[i].className == 'newBranch' ) {
      labels[i].style.display = 'block';
    }
  }
  var o='open';
  var c='closed';
  var ob='openBottom';
  var cb='closedBottom';
  labels = document.getElementsByTagName('img');
  for( var i = 0; i < labels.length; i++ ) {
    me = labels[i];
    if( labels[i].className == cb ) {
      me.className = ob;
      me.src = imgDir+'openbottom.gif';
    } else if ( labels[i].className == c ) {
      me.className = o;
      me.src = imgDir+'open.gif';
    }
  }
}
function setListStyle(currentStyle, newStyle, imgDir) {
  var i,styleChooser,curStyleChooser;
  directory = imgDir;

  if (typeof(clickable[newStyle]) != "undefined" && !clickable[newStyle])
    return;

  clickable[newStyle] = false;
  clickable[currentStyle] = true;
  styleChooser = document.getElementById('style_chooser_'+newStyle);
  styleChooser.style.cursor = 'default';
  curStyleChooser = document.getElementById('style_chooser_'+currentStyle);
  curStyleChooser.style.cursor = 'pointer';
  for (i=0; i<document.images.length; i++) {
    if (document.images[i].id.search('style_chooser') < 0 && document.images[i].src.search('empty.gif') < 0) {
        document.images[i].src = document.images[i].src.replace('/'+currentStyle+'/','/'+newStyle+'/');
    }
  }
}
function moveDownToHere(nodeId, instanceNum) {
  var tree = document.getElementById(instanceNum+'_tree');
  var treeNodes = getElementsByClass('treeNode',tree,'span');
  var tnLen = treeNodes.length;

  var node = document.getElementById(instanceNum+'_treeNode_'+nodeId);
  var spacers = getElementsByClass('spacer',node,'img');
  var numSpacers = spacers.length;
  var finalImage = document.getElementById(instanceNum+'_final_image_'+nodeId);
  var temp = finalImage.src;
  finalImage.src = finalImage.src.replace('join.gif','joinbottom.gif');
  finalImage.src = finalImage.src.replace('closed.gif','closedbottom.gif');
  finalImage.src = finalImage.src.replace('open.gif','openbottom.gif');
  if (temp != finalImage.src)
    finalImage.name = 'switchBack';

  var i,j;
  for (i=0; i<tnLen; i++) {
    if (treeNodes[i].className.search('/'+nodeId+'/') < 0 && treeNodes[i].id != instanceNum+'_treeNode_'+nodeId) {
      treeNodes[i].style.display = 'none';
    } else {
      spacers = getElementsByClass('spacer',treeNodes[i],'img');
      for (j=0; j<numSpacers; j++) {
        spacers[j].style.display = 'none';
      }
      if (spacers.length>numSpacers) {
        if (spacers[numSpacers].className == 'spacer') {
          temp = spacers[numSpacers].src;
          spacers[numSpacers].src = spacers[numSpacers].src.replace('line','empty');
          if (temp != spacers[numSpacers].src)
            spacers[numSpacers].name = 'switchBack';
        }
      }
    }
  }
  currentRoot = nodeId;
  document.getElementById(instanceNum+'_upLevel').style.display = 'inline';
}
function moveUpOneLevel(instanceNum) {
  if (currentRoot == null)
    return;
  var currentNode = document.getElementById(instanceNum+'_treeNode_'+currentRoot);
  if (getNodeIndent(currentNode) == 0)
    return;
  var parentId = currentNode.parentNode.id;
  parentId = parentId.substring(parentId.indexOf('_')+1);
  var tree = document.getElementById(instanceNum+'_'+parentId);
  var treeNodes = getElementsByClass('treeNode',tree,'span');

  var node = document.getElementById(instanceNum+'_treeNode_'+parentId);
  var spacers = getElementsByClass('spacer',node,'img');
  var numSpacers = spacers.length;
  treeNodes.push(node);

  var finalImage;

  var i,j;
  var tnLen = treeNodes.length;
  for (i=0; i<tnLen; i++) {
    treeNodes[i].style.display = 'block';
    spacers = getElementsByClass('spacer',treeNodes[i],'img');
    for (j=0; j<numSpacers; j++) {
      spacers[j].style.display = 'none';
    }
    for (j=numSpacers; j<spacers.length; j++) {
      spacers[j].style.display = 'inline';
      if (spacers[j].name == 'switchBack')
        spacers[j].src = spacers[j].src.replace('empty','line');
    }
    var treeNodeId = treeNodes[i].id;
    treeNodeId = treeNodeId.substring(treeNodeId.indexOf('_')+1).substring(9);
    finalImage = document.getElementById(instanceNum+'_final_image_'+treeNodeId);
    if (finalImage.name == 'switchBack') {
      finalImage.src = finalImage.src.replace('joinbottom.gif','join.gif');
      finalImage.src = finalImage.src.replace('closedbottom.gif','closed.gif');
      finalImage.src = finalImage.src.replace('openbottom.gif','open.gif');
    }
  }

  currentRoot = parentId;
  if (getNodeIndent(currentNode) == 1) {
    document.getElementById(instanceNum+'_upLevel').style.display = 'none';
  }
}

function toggleSubtreeUrls() {
  var links = getElementsByClass('subtree_url_link', document, 'a');
  var num_links = links.length;
  var i;
  var display = links[0].style.display;
  for (i=0; i<num_links; i++) {
    if (display == 'none')
      links[i].style.display = '';
    else
      links[i].style.display = 'none';
  }
}

function getElementsByClass(searchClass,node,tag) {
    var classElements = new Array();
    if ( node == null )
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
}

function submitFeedback(topics_dir) {
    /* Set up the request */
    var xmlhttp =  new XMLHttpRequest();
    xmlhttp.open('POST', topics_dir+'/feedback.php', true);

    /* The callback function */
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                var result = xmlhttp.responseXML.getElementsByTagName('result')[0].firstChild.data;
                if (result > 0) {
                    var feedbackSpan = document.getElementById('feedbackspan');
                    var responseSpan = document.createElement('span');
                    var responseText = "thank you for your feedback...we hope it's helpful.";
                    responseSpan.appendChild(document.createTextNode(responseText));
                    feedbackSpan.parentNode.replaceChild(responseSpan,feedbackSpan);
                } else {
                    alert("Failure: Permissions are probably incorrect on feedback.log"+xmlhttp.responseText);
                }
            } else {
                alert("Request failed!");
            }
        }
    }

    var frm = document.getElementById('feedbackForm');
    /* Send the POST request */
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.send('feedbacktext=' + frm.elements['feedbacktext'].value);
}


function login() {
    /* Set up the request */
    var xmlhttp =  new XMLHttpRequest();
    xmlhttp.open('POST', 'login.php', true);

    /* The callback function */
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200 || xmlhttp.status == 404) {
                document.images.editModeImg.style.display = 'inline';
                document.getElementById('login_link').style.display = 'none';
            } else {
                if (xmlhttp.status != 401)
                    alert('Login failed with status: '+xmlhttp.status);
            }
        }
    }

    /* Send the POST request */
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.send('redir=none');
}

function grabNode(id, imgDir, instanceNum) {
  //ungrab any grabbed node
  if (grabbedNode != null) {
    node = document.getElementById('grab_'+grabbedNode);
    node.src = imgDir+'hand.png';
  }
  //store node id
  grabbedNode = id;
  node = document.getElementById(instanceNum+'_treeNode_'+id);
  grabbedNodeIndent = getNodeIndent(node);
  //change image to grabbed
  grab = document.getElementById('grab_'+grabbedNode);
  grab.src = imgDir+'hand_grab.png';
  //show all "insert here" images
  displayInsertIcons('inline', document, imgDir);
  //hide all "insert here" images in grabbedNode's subtree, itself, and its parent
  var nodeSubtree = document.getElementById(instanceNum+'_'+id);
  if (nodeSubtree)
    displayInsertIcons('none', nodeSubtree, imgDir);
  var parentId = node.parentNode.id;
  var item = document.getElementById('insert_'+parentId);
  item.style.display = 'none';
  item = document.getElementById('insert_'+id);
  item.style.display = 'none';
}

function moveSubtreeHere(id, topicsDir, instanceNum) {
  imgDir = topicsDir+'/../images/';
  //which node to insert?
  if (grabbedNode == null) {
    alert("No node is currently selected for insert");
    return false;
  }
  // ajax call to move the node
  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  xmlhttp.open('POST', topicsDir+'/moveSubtree.php', true);

  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200) {
	var result = xmlhttp.responseXML.getElementsByTagName('result')[0].firstChild.data;
	var message = xmlhttp.responseXML.getElementsByTagName('message')[0].firstChild.data;
	if (result == 'failure') {
	  alert(message);
	  return false;
	}
	//unselect grabbed node id
	node = document.getElementById('grab_'+grabbedNode);
	node.src = imgDir+'hand.png';
	//hide all "insert here" images
	displayInsertIcons('none', document, imgDir);
	//move subtree to new parent
	srcNode = document.getElementById(instanceNum+'+treeNode_'+grabbedNode);
	srcSubtree = document.getElementById(instanceNum+'_'+grabbedNode)
	dstNode = document.getElementById(instanceNum+'_treeNode_'+id);
	indentDiff = getNodeIndent(dstNode)-grabbedNodeIndent+1;
	var add = true;
	if (indentDiff < 0) {
	  add = false;
	  indentDiff = -1*indentDiff;
	}
	var nodes = new Array();
	if (srcSubtree)
	  nodes = getElementsByClass('treeNode',srcSubtree,'span');
	nodes.push(srcNode);
	for (var j=0; j<nodes.length; j++) {
	  node = nodes[j];
	  for (var i=0; i<indentDiff; i++) {
	    spacer = node.firstChild;
	    while (spacer.style.display == 'none')
	      spacer = node.nextSibling;
	    if (add)
	      node.insertBefore(spacer.cloneNode(false), spacer);
	    else
	      node.removeChild(spacer);
	  }
	}
	
	dstSubtree = document.getElementById(instanceNum+'_'+id);
	//create subtree if it doesn't exist
	if (!dstSubtree) {
	  dstSubtree = document.createElement('span');
	  dstSubtree.id = instanceNum+'_'+id;
	  dstSubtree.className = 'newBranch';

	  //make sure new parent has "expander"
	  var finalImage = document.getElementById(instanceNum+'_final_image_'+id);
	  if (!finalImage.className.match(/open/)) {
	    styleImgDir = finalImage.src.slice(0,finalImage.src.lastIndexOf('/')+1);
	    finalImage.src = styleImgDir+'open.gif';
	    finalImage.className = 'open';
	    finalImage.onclick = function(){javascript:toggleList(id,finalImage,styleImgDir, instanceNum)};
	  }
	  //add dstSubtree to dstNode
	  dstNode.parentNode.appendChild(dstSubtree);
	}
	dstSubtree.appendChild(srcNode);
	if (srcSubtree)
	  dstSubtree.appendChild(srcSubtree);
	
	grabbedNode = null;
	grabbedNodeIndent = null;
      } else {
	alert("Request failed!");
      }
    }
  }

  /* Send the POST request */
  xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xmlhttp.send('srcNodeID='+grabbedNode+'&dstNodeID='+id);
}

function displayInsertIcons(display, node, imgDir) {
  var icons = getElementsByClass('insert_here',node,'img');
  for (var i=0; i<icons.length; i++)
    icons[i].style.display = display;
}

function getNodeIndent(node) {
  var spacers = getElementsByClass('spacer',node,'img');
  return spacers.length;
}

function updateTopic(node_id, topic) {
  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  xmlhttp.open('GET', 'tree.php?func=updateTopic&async=true&nodeID='+node_id+'&topic='+topic, true);
  
  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200) {
	var status = xmlhttp.responseXML.getElementsByTagName('status')[0].firstChild.data;
	var new_topic = xmlhttp.responseXML.getElementsByTagName('topic')[0].firstChild.data;
	if (status == 1) {
	  var topicSpan = document.getElementById('topic_'+node_id);
	  topicSpan.innerHTML = new_topic;
	} else {
	  alert("Updating topic for node "+node_id+" failed!");
	}
      } else {
	alert('Request to update topic for node: '+node_id+' failed with status: '+xmlhttp.status);
      }
    }
  }
  
  xmlhttp.send(null);
}

function setNodeCategory(node_id, category_id) {
  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  xmlhttp.open('GET', 'tree.php?func=setNodeCategory&async=true&nodeID='+node_id+'&categoryID='+category_id, true);
  
  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200) {
	var status = xmlhttp.responseXML.getElementsByTagName('status')[0].firstChild.data;
	if (status == 1) {
	  alert("Category set");
	} else {
	  alert("Updating category for node "+node_id+" failed!");
	}
      } else {
	alert('Request to update category for node: '+node_id+' failed with status: '+xmlhttp.status);
      }
    }
  }
  
  xmlhttp.send(null);
}

function assignClips(node_id, clips) {
  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  xmlhttp.open('GET', 'tree.php?func=assignClipToNode&async=true&nodeID='+node_id+'&clipID='+clips, true);
  
  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200) {
	var status = xmlhttp.responseXML.getElementsByTagName('status')[0].firstChild.data;
	if (status == 1)
	  alert("Clip(s) assigned")
	else
	  alert("Assigning clip(s) for node "+node_id+" failed!");
      } else {
	alert('Request to assign clip(s) for node: '+node_id+' failed with status: '+xmlhttp.status);
      }
    }
  }
  
  xmlhttp.send(null);
}


function removeSubtree(node_id, instanceNum) {
  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  xmlhttp.open('GET', 'tree.php?func=removeSubtree&async=true&nodeID='+node_id, true);
  
  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200) {
	var status = xmlhttp.responseXML.getElementsByTagName('status')[0].firstChild.data;
	if (status == 1) {
	  var parentNode = document.getElementById(instanceNum+'_treeNode_'+node_id);
	  try {
	    var children = document.getElementById(instanceNum+'_'+node_id);
	    children.style.display = 'none';
	  } catch(e) {}
	  parentNode.style.display = 'none';
	} else {
	  alert("Removing subtree of node "+node_id+" failed!");
	}
      } else {
	alert('Request to remove subtree for node: '+node_id+' failed with status: '+xmlhttp.status);
      }
    }
  }
  
  xmlhttp.send(null);
}


function slideSubtree(node_id, dir, instanceNum) {
  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  xmlhttp.open('GET', 'tree.php?func=slideSubtree&async=true&nodeID='+node_id+'&dir='+dir, true);
  
  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200) {
	var status = xmlhttp.responseXML.getElementsByTagName('status')[0].firstChild.data;
	if (status == 1) {
	  var swapNodeID = xmlhttp.responseXML.getElementsByTagName('swapNode')[0].firstChild.data;
	  var movingNode = document.getElementById(instanceNum+'_treeNode_'+node_id);
	  var swapNode = document.getElementById(instanceNum+'_treeNode_'+swapNodeID);
	  if (dir > 0) {
	    movingNode.parentNode.insertBefore(swapNode, movingNode);
	    try {
	      movingNode.parentNode.insertBefore(document.getElementById(instanceNum+'_'+swapNodeID), movingNode);
	    } catch(e) {}
	  } else {
	    movingNode.parentNode.insertBefore(movingNode, swapNode);
	    try {
	      movingNode.parentNode.insertBefore(document.getElementById(instanceNum+'_'+node_id), swapNode);
	    } catch(e) {}
	  }
	} else {
	  alert("Sliding subtree of node "+node_id+" failed!");
	}
      } else {
	alert('Request to slide subtree for node: '+node_id+' failed with status: '+xmlhttp.status);
      }
    }
  }
  
  xmlhttp.send(null);
}



function fetchSubtree(node_id, imgDir, oldImage, instanceNum, hide_subtree_icon) {
  // figure out depth (left padding)
  var parent = document.getElementById(instanceNum+'_treeNode_'+node_id);
  var images = getElementsByClass('spacer',parent,'img');
  var treeStack = new Array();
  for (var i=0; i<images.length; i++) {
    treeStack[i] = images[i].src.match(/.*\/([a-z]*\.gif)/)[1];
  }
  var finalImage = document.getElementById(instanceNum+'_final_image_'+node_id);
  if (finalImage.className.match(/Bottom/))
    treeStack[treeStack.length] = 'empty.gif';
  else
    treeStack[treeStack.length] = 'line.gif';

  /* Set up the request */
  var xmlhttp =  new XMLHttpRequest();
  var edit = '';
  if (window.location.search.match('edit'))
    edit = '&edit';
  if (directory)
    imgDir = directory
  xmlhttp.open('GET', imgDir+'../../../topics/tree.php?autonomous=true&tree_only='+treeStack.join()+'&node='+node_id+'&instance_num='+instanceNum+'&hide_subtree_icon='+hide_subtree_icon+'&topics_dir='+topics_dir+edit, true);
  
  /* The callback function */
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      if (xmlhttp.status == 200) {
	parent = document.getElementById(instanceNum+'_treeNode_'+node_id);
	var parentImage = document.getElementById(instanceNum+'_final_image_'+node_id);
	parentImage.src = oldImage;
	var subtree = document.createElement('span');
	subtree.innerHTML = xmlhttp.responseText;
	parent.parentNode.insertBefore(subtree, parent.nextSibling);
      } else {
	alert('Request failed with status: '+xmlhttp.status);
      }
    }
  }
  
  xmlhttp.send(null);
}


