/*
Handle search requests using XMLHttpRequest.
*/

/*
Processes a single search.
prefixUrl: the context path plus the servlet mapping, e.g. /ws/search
*/
function processSearchRequest(prefixUrl) 
{
   var req = null;

   var idField = document.getElementById("searchWords");
   // check for blank field
   var searchCriteria = idField.value;
   if (searchCriteria == null || searchCriteria == "" || searchCriteria == "undefined")
   {
	   alert("Search words must be inserted in the search field.");
	   return;
   }

	// get numRows
	var numRowsElem = document.getElementById("numRows");
	var numRows = numRowsElem.options[numRowsElem.selectedIndex].text;

   var url = prefixUrl + "?searchCriteria=" + encodeURIComponent(searchCriteria);
   url += "&numRows=" + numRows;
   
   if (typeof XMLHttpRequest != "undefined") 
   {
      req = new XMLHttpRequest();
   } 
   else if (window.ActiveXObject) 
   {
      req = new ActiveXObject("Microsoft.XMLHTTP");
   }

   if (req)
   {
      req.open("GET", url, true);
      req.onreadystatechange = 
      function() 
      {
         var elemObj = document.getElementById('searchResults');

         if (req.readyState == 1 || // request has been created
             req.readyState == 2 || // request sent
             req.readyState == 3)   // response not completely loaded
         {
            elemObj.innerHTML = "";    
            document.getElementById("loading").style.visibility = "visible";
         }
         if (req.readyState == 4) // everything's complete
         {
            if (req.status == 200)  // successful HTTP interaction
            {
               document.getElementById("loading").style.visibility = "hidden";
               displaySearchResults(req, elemObj);
            }
         }
      }
   }
   
   req.send(null);
}


/*
Display the search results.
*/
function displaySearchResults(req, elemObj) 
{
   // remove any existing search results
   if (elemObj.hasChildNodes())
   {
     var children = elemObj.childNodes;
     for (var i = children.length-1; i >= 0; i--)
     {
       elemObj.removeChild(elemObj.childNodes[i]);
     }
   }
   
    // display new search results
   if( !document.createElement || !document.childNodes ) 
   {
      window.alert('Your browser is not DOM compliant');
   } 
   else 
   {
      // parse and display xml
      parse(elemObj, req);
   }
}

/*
Parse the response XML.
e.g. format of xml response
<searchResultsList>
   <searchResult>
      <title></title>
      <resId></resId>
      <score></score>
      <hitText>....<em>....</em>....<em>....</em>....</hitText>
   </searchResult>
</searchResultsList>
*/
function parse(divTag, req) 
{
   // check whether the session has timed out
   var rootNode = req.responseXML.getElementsByTagName('searchResultsList')[0];
   var rootNodeAttrs = rootNode.attributes;
   if (rootNodeAttrs != null)
   {
	  var isTimedOut = rootNodeAttrs.getNamedItem("isSessionTimedOut").nodeValue;
	  if (isTimedOut == "true")
	  {
		  // do a redirect to the login page
		  var searchResult = req.responseXML.getElementsByTagName("searchResult")[0]; 
		  var loginUrl = getNodeValue(searchResult, "loginUrl");
		  if (loginUrl != null && loginUrl != "undefined")
		  {
			 window.parent.location.href = loginUrl;
		  }
		  else
		  {
		     var newPara = document.createElement('p');
			  newPara.appendChild(document.createTextNode("Session timeout."));
			  divTag.appendChild(newPara);
		  }
		  return;
	  }
   }

   var results = req.responseXML.getElementsByTagName("searchResult");   
   
   if (results.length == 0)
   {  // display a default message
      var newPara = document.createElement('p');
	   newPara.setAttribute('style', 'width:280px');
	   var message = rootNode.getElementsByTagName("message")[0].firstChild.nodeValue;
	   if (message == null || message == "" || message == "undefined")
	   {
		  message = "No results found.";
	   }
      newPara.appendChild(document.createTextNode(message));
      divTag.appendChild(newPara);
   }
   
   for (var i = 0; i < results.length; i++)
   {
      var newPara = document.createElement('p');
	   newPara.setAttribute('style', 'width:280px');
      
      // href
      var hrefTag = document.createElement('a');
      var link = getNodeValue(results[i], 'resId') + "?mt=text/html&amp;sty=Default";
      hrefTag.href = "javascript:loadFrame('" + link + "', 'contentwin')";
      hrefTag.className = "searchTitle";
      
      // for now, get the title from the TOC tree
      //hrefTag.appendChild(document.createTextNode(getNodeTitle(link)));
      // MC 09-May-2008 :  "title" should now be valid
      if (getNodeValue(results[i], 'title') == null || getNodeValue(results[i], 'title') == "undefined")
          hrefTag.appendChild(document.createTextNode("Untitled"));
      else
          hrefTag.appendChild(document.createTextNode(getNodeValue(results[i], 'title')));
          
      newPara.appendChild(hrefTag);
      newPara.appendChild(document.createElement('br'));
      
      //console.log("hit text = " + getNodeValue(results[i], 'hitText'));

      // hit text
      var hitText = getNodeValue(results[i], 'hitText');
      var spanTag = document.createElement('span');
      spanTag.innerHTML = hitText;
      newPara.appendChild(spanTag);
      
      newPara.appendChild(document.createElement('br'));
      // score
      //newPara.appendChild(document.createTextNode(getNodeValue(results[i], 'score')));
      //newPara.appendChild(document.createElement('br'));
            
      // attach to "div" tag
      divTag.appendChild(newPara);
   }
   
   var divResultCount = document.createElement('div');
   divResultCount.setAttribute('style', 'margin-top:25px');
   divResultCount.appendChild(document.createTextNode('Result count: ' + results.length));
   divTag.appendChild(divResultCount);
}


function getNodeValue(obj, tag)
{
   return obj.getElementsByTagName(tag)[0].firstChild.nodeValue;
}

/*
Use the title from the javascript tree.
*/
function getNodeTitle(link)
{
   var yahooTreeNode = tree.getNodeByProperty('href', link);
   var label;
   if (yahooTreeNode != null && yahooTreeNode != 'undefined')
   {
      label = yahooTreeNode.label;
   }
   if (label != null && label != 'undefined')
      return label;
   
   return "Untitled";
}


