/**
 * Author: Philip Wu
 * Copyright 2009 Australian Phenome Bank 
 */

function showLoading(parentEl) {
	var imageLoader = findImageLoader(parentEl);
	imageLoader.style.display='inline';
}

function hideLoading(parentEl) {
	var imageLoader = findImageLoader(parentEl);
	imageLoader.style.display='none';
}

/**
 * Finds the image loader contained within the given parent element
 * @param parentEl
 * @return
 */
function findImageLoader(parentEl) {
	
	var imgEls = parentEl.getElementsByTagName('img');
	for (var i=0; i < imgEls.length; i++) {
		if (imgEls[i].className == 'loaderImage') {
			return imgEls[i];
		}
	}
	
	return null;
}

/**
 * Finds the select ontology name element contained within the given parent element
 * @param parentEl
 * @return
 */
function getOntologyName(parentEl) {
	
	var imgEls = parentEl.getElementsByTagName('select');
	for (var i=0; i < imgEls.length; i++) {
		if (imgEls[i].className == 'ontologyName') {
			var selectEl = imgEls[i];
			return selectEl.options[selectEl.selectedIndex].value;
		}
	}
	
	return null;	
	
}

/**
 * Finds the select ontology element contained withint the given parent element
 * @param parentEl
 * @return
 */
function getOntologySelect(parentEl) {
	
	var imgEls = parentEl.getElementsByTagName('select');
	for (var i=0; i < imgEls.length; i++) {
		if (imgEls[i].className == 'ontologySelect') {
			var selectEl = imgEls[i];
			return selectEl;
		}
	}
	
	return null;	
	
}

/**
 * After an ontology name has been selected, update the ontology list
 * @param selectEl
 * @return
 */
function updateOntologySelect(selectEl) {
	
	var ontologyName = selectEl.options[selectEl.selectedIndex].value;
	
	var targetSelectEl = getOntologySelect(selectEl.parentNode);
	// See http://directwebremoting.org/dwr/browser/extra-data.html
	var callMetaData = { 
			  callback:updateOntology, 
			  arg: targetSelectEl				  
			};		
	
	// Clear the ontology path
	if (targetSelectEl.ontologyPath !=  null)
		targetSelectEl.ontologyPath.length=0;
	

	
	showLoading(selectEl.parentNode);
	Ontology.findPrimaryOntologies(ontologyName, callMetaData);
	
}


/**
 * Updates the ontology drop down menu 
 * @param ontologies
 * @param selectEl
 * @return
 */
function updateOntology(ontologies, selectEl) {
	hideLoading(selectEl.parentNode);
	
	// Clear the select options
	selectEl.options.length = 0;
	
	// Now update the select options
	addOption(selectEl, '-Select-', null);
	
	for (var i=0; i < ontologies.length; i++) {
		
		var ontology = ontologies[i];
		addOption(selectEl, ontology.name, ontology.id);		
	}
	
	// Hide the next/previous level links
	findNextAnchor(selectEl).style.visibility='hidden';
	if (selectEl.ontologyPath != null && selectEl.ontologyPath.length > 0)
		findPreviousAnchor(selectEl).style.visibility='visible';
	else
		findPreviousAnchor(selectEl).style.visibility='hidden';
	
	var tooltip = findQuestionMark(selectEl);
	tooltip.style.visibility='hidden';

}

function updateNextOntology(ontologies, selectEl) {
	hideLoading(selectEl.parentNode);
	
	var nextOntologyId = getSelectedOntologyId(selectEl);
	var parentOntology = selectEl.getAttribute("parentOntologyId");
	
	updateOntology(ontologies, selectEl);
	
	
	// Keep track of the path we have followed to get to the current ontology level
	if (selectEl.ontologyPath == null) {
		var ontologyPath = new Array();		
		selectEl.ontologyPath = ontologyPath;
	}
	// Add the previous ontology to the array
	selectEl.ontologyPath[selectEl.ontologyPath.length]=parentOntology;
	//Update the current ontology to be the next ontology
	selectEl.setAttribute("parentOntologyId", nextOntologyId);
	
	
	
	// Find the previous Anchor element
	var prevAnchor = findPreviousAnchor(selectEl);
	prevAnchor.style.visibility='visible';	
	
}

function updatePreviousOntology(ontologies, selectEl) {
	// Update the ID of the current ontology
	var parentOntology = selectEl.ontologyPath[selectEl.ontologyPath.length - 1];
	selectEl.setAttribute("parentOntologyId", parentOntology);

	// Truncate the array by one
	selectEl.ontologyPath.length = selectEl.ontologyPath.length - 1;

	
	updateOntology(ontologies, selectEl);
}

// Helper method for adding options to a Select element
function addOption(selectEl, text, value) {
	
	var optionEl = document.createElement('option');
	optionEl.text = text;
	optionEl.value = value;
	selectEl.appendChild(optionEl);
	
	
}

// Helper method to retrieve the ID of the selected ontology
function getSelectedOntologyId(selectEl) {
	return selectEl.options[selectEl.selectedIndex].value;
}

function fetchNextOntology(clickEl) {

	var selectEl = getSelectElFromAnchorEl(clickEl);
	if (selectEl != null) {
		var ontologyId = getSelectedOntologyId(selectEl);		
		
		// See http://directwebremoting.org/dwr/browser/extra-data.html
		var callMetaData = { 
				  callback:updateNextOntology, 
				  arg: selectEl				  
				};	
		
		showLoading(clickEl.parentNode);
		Ontology.getChildren(ontologyId, getOntologyName(clickEl.parentNode), callMetaData);		
	}
}


function fetchPreviousOntology(clickEl) {
	showLoading(clickEl.parentNode);
	var ontologyName = getOntologyName(clickEl.parentNode);
	var selectEl = getSelectElFromAnchorEl(clickEl);
	
	// See http://directwebremoting.org/dwr/browser/extra-data.html
	var callMetaData = { 
			  callback:updatePreviousOntology, 
			  arg: selectEl				  
			};		
	
	
	if (selectEl != null) {
		//alert('ontologyPath='+selectEl.ontologyPath);	
		var gettingChildren = false;
		if (selectEl.ontologyPath != null && selectEl.ontologyPath.length > 0) {
			var ontologyId = selectEl.ontologyPath[selectEl.ontologyPath.length - 1];
			if (ontologyId != null && ontologyId != '') {
				gettingChildren = true;
				Ontology.getChildren(ontologyId, ontologyName, callMetaData);
			}
		} 
		
		if (! gettingChildren) {
			// No ontology path, so fetch the roots as the ontology
			//alert('Fetching primaries');
			
			Ontology.findPrimaryOntologies(ontologyName, callMetaData);
		}
	} 
	
	
}

function getSelectElFromAnchorEl(clickEl) {
	var selectEls = clickEl.parentNode.getElementsByTagName('select');
	if (selectEls != null && selectEls.length > 0) {
		var selectEl = selectEls[1];
		return selectEl;
	}
	
	return null;
}

/*
  Finds the previous anchor relative to the Select element
  @param selectEl
  @return
 */
function findPreviousAnchor(selectEl) {
	var prevAnchor = null;
	var curNode = selectEl;
	while (curNode.previousSibling != null) {

		if (curNode.previousSibling.nodeType == 1 && curNode.previousSibling.tagName.toUpperCase().substring(0,1) == 'A') {
			prevAnchor = curNode.previousSibling;			
			break;
		}		
		curNode = curNode.previousSibling;
	}
	return prevAnchor;
}

  /**
   * Finds the next anchor relative to the SElect element
   * @param selectEl
   * @return
   */
function findNextAnchor(selectEl) {
   var nextAnchor = null;
	var curNode = selectEl;
	while (curNode.nextSibling != null) {
	if (curNode.nextSibling.nodeType == 1 && curNode.nextSibling.tagName.toUpperCase().substring(0,1) == 'A') {
		nextAnchor = curNode.nextSibling;	
		break;			}		
		curNode = curNode.nextSibling;
	}
	return nextAnchor;
}

/**
* Finds the question mark image 
* @param selectEl
* @return
*/
function findQuestionMark(selectEl) {
	
	   var questionMark = null;
		var curNode = selectEl;
		while (curNode.nextSibling != null) {
		if (curNode.nextSibling.nodeType == 1 && curNode.nextSibling.tagName.toUpperCase().substring(0,3) == 'IMG') {
			questionMark = curNode.nextSibling;	
			break;			}		
			curNode = curNode.nextSibling;
		}
		return questionMark;
	
}
   



function updateLevelLinks(selectEl) {

	// Find the Next Anchor element
	var nextAnchor = findNextAnchor(selectEl);
	
	// Find the previous Anchor element
	var prevAnchor = findPreviousAnchor(selectEl);
	
	var questionMark = findQuestionMark(selectEl);
	
	// Update the previous link	
	if (selectEl.ontologyPath != null && selectEl.ontologyPath.length > 0)
		prevAnchor.style.visibility='visible';
	else
		prevAnchor.style.visibility='hidden';
	
	// check to see if the selected ontology has any children
	var ontologyId = getSelectedOntologyId(selectEl);	
	// See http://directwebremoting.org/dwr/browser/extra-data.html
	var callNextMetaData = { 
			  callback:updateNextLevel, 
			  arg: nextAnchor
			};
	
	var ontologyName = getOntologyName(selectEl.parentNode);
	
	Ontology.hasChildren(ontologyId, ontologyName, callNextMetaData);
	
	var callTooltipMetaData = { 
			  callback:updateTooltip, 
			  arg: questionMark
			};
	
	showLoading(selectEl.parentNode);
	
	
	
	
	Ontology.getDefinition(ontologyId, ontologyName ,callTooltipMetaData);
	
}

function updateTooltip(definition, tooltipEl) {
	hideLoading(tooltipEl.parentNode);
	
	if (definition != null && definition.length > 0) {
		tooltipEl.style.visibility = 'visible';
		tooltipEl.setAttribute("title", definition)
		reloadTooltips();
	} else {
		tooltipEl.style.visibility = 'hidden';
	}
	
	
}


function updateNextLevel(hasChildren, anchorEl) {
		
	if (hasChildren || hasChildren=='true') {
		anchorEl.style.visibility='visible';
	} else
		anchorEl.style.visibility='hidden';
}

function reloadTooltips() {
	$(document).ready(function() {
	
		$('*[ontology=true]').tooltip({
			track: true, 
		    delay: 0, 
		    showURL: false, 
		    showBody: " - ",
		    extraClass: "tooltip",
		    fade: 250 
		});
	});
}

reloadTooltips();