// suggestionlist

var zoe_geenterm = "Helaas, geen afbeeldingen gevonden die aan de zoekopdracht voldoen.";
var selectObject = null;
var selColor = "#769d70";
var typedLength = 0;
var mousemovechange = false;

function checkLocalForm(form) {
	
	var sInput = document.getElementById("searchString");
	var tLength = document.getElementById("typedlength");

	switch (form.id) {
		case "formSearchSpecies":
			return true;
			break;
		case "formFreeSearch":					
			if (sInput.value == "") {				
				
				if (!HasClassName(sInput, "field-error")) {
					AddClassName(sInput, "field-error");
				}
				sInput.focus();
				//alert(zoe_geenterm);
				return false;
			} 
			else {				
				RemoveClassName(sInput, "field-error");
				tLength.value = typedLength;
				return true;
			}
			break;		
	}	
}

var prevSearch = "";
var activeList;
var activeInput;
var itsFormId = "";

function updateWordList(e, obj, formId, indexAlias, fields, list, operator, aspLink, siteAlias, viewAlias) {
	//if (!e) var e = window.event;

	var objSuggestList = document.getElementById(list);

	if (obj.value.length < 2) {//according to the user
		objSuggestList.style.display = "none";
		prevSearch = obj.value;
		//Remove className
		RemoveClassName(obj, "ajax-loading");
		return(true);
	} else {
		RemoveClassName(obj, "field-error");
	}

	if ((e.keyCode == 40) || (e.keyCode == 38)){
		selectSuggestionItem(e, objSuggestList);
		return(true);
	}

	if (prevSearch == obj.value) {
		return(true);
	}

	itsFormId = formId;
	activeInput = obj;
	typedLength = activeInput.value.length;
	activeList = list;
	
	prevSearch = obj.value;
	
	var preSuggest = obj.value;

	if (document.getElementById(operator) != null) {
		var operand = document.getElementById(operator).value;
			
		switch (operand) {
			case "is": 
				preSuggest += "*";
				break;
			case "contains": 
				preSuggest = "*" + preSuggest + "*";
				break;
			case "startsWith": 
				preSuggest += "*";
				break;
			case "endsWith": 
				preSuggest = "*" + preSuggest;
				break;
			default: 
				preSuggest += "*";
		}
	}
	else {
		preSuggest += "*";
	}
	
	//Add loading className	
	if (!HasClassName(obj, "ajax-loading")) {
		AddClassName(obj, "ajax-loading");
	}	
	
	getServerData(aspLink + "?alias=" + viewAlias + "&view=" + viewAlias + "&id=i000097" + "&indexAlias=" + indexAlias + "&word=" + preSuggest + "&fields=" + fields, updateSuggestList);
	//getServerData(aspLink + "?alias=" + siteAlias + "&view=" + viewAlias + "&id=i000097" + "&indexAlias=" + indexAlias + "&word=" + preSuggest + "&fields=" + fields, updateSuggestList);
	//frames["suggest"].document.location = aspLink + "?alias=" + siteAlias + "&view=" + viewAlias + "&id=i000097&word=" + obj.value;//

	selectObject = null;
	return(true);
}

function updateSuggestList(html) {
  var objSuggestList = document.getElementById(activeList);
	objSuggestList.style.display = "block";
  objSuggestList.innerHTML = html;
  
  //Remove className
  RemoveClassName(activeInput, "ajax-loading");

	selectObject = null;
}

function selectTextRange(obj, start, end){
	if (obj.createTextRange) {
		var itsTextRange = obj.createTextRange();
		itsTextRange.moveStart("character", start);
		itsTextRange.moveEnd("character", end);
		itsTextRange.select();
	} 
	
	if (obj.setSelectionRange){
		obj.setSelectionRange(start, end);	
	}
}

function eventMouseMove(obj, value){
	if (selectObject != null) {
		selectObject.className = "suggestionItem";
	}
	selectObject = obj;
	selectObject.className = "suggestionItemSelected";

	if (mousemovechange == true){
		activeInput.value = value;
		selectTextRange(activeInput, typedLength, value.length);
	}
	
	if (activeInput != null) activeInput.focus();
}

function eventMouseClick(obj, value){
	activeInput.value = value;
	selectTextRange(activeInput, typedLength, value.length);
	var objForm = document.getElementById(itsFormId);	
	objForm.submit();
}

function getnextSibling(obj){
	var sNodeName = "";
	var currNode = obj;
	var nextNode = null;
	
	while (sNodeName != obj.nodeName){
		var nextNode = currNode.nextSibling;
		if (nextNode == null) return(obj);

		currNode = nextNode;	
		sNodeName = currNode.nodeName;
	}

	return(currNode);
}

function getpreviousSibling(obj){
	var sNodeName = "";
	var currNode = obj;
	var prevNode = null;
	
	while (sNodeName != obj.nodeName){
		var prevNode = currNode.previousSibling;
		if (prevNode == null) return(obj);

		currNode = prevNode;	
		sNodeName = currNode.nodeName;
	}

	return(currNode);
}

function selectSuggestionItem(e, objSuggestList){
	if (selectObject == null){
		var objFirstChild = objSuggestList.firstChild;
		if ((objFirstChild != null) && (objFirstChild.id != "geenSuggesties")){
			
			selectObject = objFirstChild;
			activeInput.value = getSpanSearchString(selectObject);
			selectTextRange(activeInput, typedLength, activeInput.value.length);
			
			selectObject.className = "suggestionItemSelected";
			if (selectObject.scrollIntoView) selectObject.scrollIntoView(false);
		}
		return;
	}
	
	if (e.keyCode == 40) {//arrow down
		var myNextSibling = getnextSibling(selectObject);

		selectObject.className = "suggestionItem";
		
		selectObject = myNextSibling;
		activeInput.value = getSpanSearchString(selectObject);
		selectTextRange(activeInput, typedLength, activeInput.value.length);
		
		selectObject.className = "suggestionItemSelected";
		if (selectObject.scrollIntoView) selectObject.scrollIntoView(false);

		return;
	}

	if (e.keyCode == 38) {//arrow up
		var myPreviousSibling = getpreviousSibling(selectObject);
		
		selectObject.className = "suggestionItem";
		
		selectObject = myPreviousSibling;
		activeInput.value = getSpanSearchString(selectObject);
		selectTextRange(activeInput, typedLength, activeInput.value.length);

		selectObject.className = "suggestionItemSelected";
		if (selectObject.scrollIntoView) selectObject.scrollIntoView(false);
		return;
	}
}

function getSpanSearchString(selectObject){
	var objFirstChild = selectObject.firstChild;
	if (objFirstChild != null) {
	  return(objFirstChild.innerHTML);
	}
	else {
	  return ("")
	}
}


// ----------------------------------------------------------------------------
// HasClassName
//
// Description : returns boolean indicating whether the object has the class name
//    built with the understanding that there may be multiple classes
//
// Arguments:
//    objElement              - element to manipulate
//    strClass                - class name to add
//
function HasClassName(objElement, strClass)
   {

   // if there is a class
   if ( objElement.className )
      {

      // the classes are just a space separated list, so first get the list
      var arrList = objElement.className.split(' ');

      // get uppercase class for comparison purposes
      var strClassUpper = strClass.toUpperCase();

      // find all instances and remove them
      for ( var i = 0; i < arrList.length; i++ )
         {

         // if class found
         if ( arrList[i].toUpperCase() == strClassUpper )
            {

            // we found it
            return true;

            }

         }

      }

   // if we got here then the class name is not there
   return false;

   }
// 
// HasClassName
// ----------------------------------------------------------------------------


// ----------------------------------------------------------------------------
// AddClassName
//
// Description : adds a class to the class attribute of a DOM element
//    built with the understanding that there may be multiple classes
//
// Arguments:
//    objElement              - element to manipulate
//    strClass                - class name to add
//
function AddClassName(objElement, strClass, blnMayAlreadyExist)
   {

   // if there is a class
   if ( objElement.className )
      {

      // the classes are just a space separated list, so first get the list
      var arrList = objElement.className.split(' ');

      // if the new class name may already exist in list
      if ( blnMayAlreadyExist )
         {

         // get uppercase class for comparison purposes
         var strClassUpper = strClass.toUpperCase();

         // find all instances and remove them
         for ( var i = 0; i < arrList.length; i++ )
            {

            // if class found
            if ( arrList[i].toUpperCase() == strClassUpper )
               {

               // remove array item
               arrList.splice(i, 1);

               // decrement loop counter as we have adjusted the array's contents
               i--;

               }

            }

         }

      // add the new class to end of list
      arrList[arrList.length] = strClass;

      // add the new class to beginning of list
      //arrList.splice(0, 0, strClass);
      
      // assign modified class name attribute
      objElement.className = arrList.join(' ');

      }
   // if there was no class
   else
      {

      // assign modified class name attribute      
      objElement.className = strClass;
   
      }

   }
// 
// AddClassName
// ----------------------------------------------------------------------------


// ----------------------------------------------------------------------------
// RemoveClassName
//
// Description : removes a class from the class attribute of a DOM element
//    built with the understanding that there may be multiple classes
//
// Arguments:
//    objElement              - element to manipulate
//    strClass                - class name to remove
//
function RemoveClassName(objElement, strClass)
   {

   // if there is a class
   if ( objElement.className )
      {

      // the classes are just a space separated list, so first get the list
      var arrList = objElement.className.split(' ');

      // get uppercase class for comparison purposes
      var strClassUpper = strClass.toUpperCase();

      // find all instances and remove them
      for ( var i = 0; i < arrList.length; i++ )
         {

         // if class found
         if ( arrList[i].toUpperCase() == strClassUpper )
            {

            // remove array item
            arrList.splice(i, 1);

            // decrement loop counter as we have adjusted the array's contents
            i--;

            }

         }

      // assign modified class name attribute
      objElement.className = arrList.join(' ');

      }
   // if there was no class
   // there is nothing to remove

   }
// 
// RemoveClassName
// ----------------------------------------------------------------------------
