// JavaScript Document
// callSearch.js
// Search Bubbler prototype


var numResultsToFind = 50;   
var numTagsToDisplay = 20;
var origResults;
var filteredResults;

// refineResults:
//  filtername = name of filter parent box, one of addfilter, minusfilter
//  or tagscell.  addfilter : add tagname to query, minus filter:  add "not"
//  tagname from query, tagscell : remove references to tagname from query
function refineResults(filtername, tagname) {
    var newresults = new Array();
    var rescount = 0;
		var resultListHtml = "";
    var strquery = document.getElementById('strquery').value; // get the query string
    var querytags = strquery.split(" "); // split it into tags
    var summary ;
    var tagi, len, qlen, i, j;
    var tagArray = new Array();
    
   // alert(document.getElementById('addfilter').innerHTML)
    
    if (filtername.indexOf("addfilter") == 0) {
      // check if tag was previously in the minus box
      for (j=0, len=querytags.length; j < len; j++) {
        if (querytags[j] == "-" + tagname) {
          querytags[j] = tagname;
          filteredResults = origResults; // reset to filter original result set
      
          break;
          }
        }
      if (j >= querytags.length)
        querytags[querytags.length] = tagname;      
      }
    else if (filtername.indexOf("minusfilter") == 0) {
     // check if tag was previously in the minus box
      for (j=0, len=querytags.length; j < len; j++) {
        if ((querytags[j] == "+" + tagname)|| (querytags[j] == tagname)) {
          querytags[j] = "-" + tagname;
          filteredResults = origResults; // reset to filter original result set
      
          break;
          }
        }
      if (j >= querytags.length)
        querytags[querytags.length] = "-" + tagname; 
        }
    else if (filtername.indexOf("tagscell") == 0) { 
      // check if tag was previously in the minus or plus box
      for (j=0, len=querytags.length; j < len; j++) {
        if (querytags[j] == "+" + tagname) {
          querytags[j] = "";
          break;
          }
        if (querytags[j] == tagname) {
          querytags[j] = "";
          break;
          }
        if (querytags[j] == "-"+tagname) {
          querytags[j] = "";
          break;
          }
        }
      if (j < querytags.length)
        filteredResults = origResults;
      }
    // reassemble the tags as a query string, remove excess spaces
    strquery = querytags.join(" ");
    document.getElementById('strquery').value = strquery.replace(/[ ]+/g," ");
    
    // filter the results based on the new set of tags
    for (i =0,len=filteredResults.length; i < len; i++) {
        var exclude = 0;
        
        qlen = querytags.length;        
        summary = (filteredResults[i].summary + " " + filteredResults[i].title).toLowerCase();
        
        // check for minus/exclude tags first
        for (j=0; j < qlen; j++) {
          if (querytags[j].slice(0,1) == "-") {
            tagi = querytags[j].slice(1).toLowerCase();
            if (summary.indexOf(tagi) >= 0) {
              //alert (tagi + " is in " + summary);
              exclude = 1;
              break;
              }
            }
          }
        if (!exclude) {
          // check for presence of required tags
          for (j=0; j < qlen; j++) {
            tagi = querytags[j].toLowerCase();
            if ((tagi.slice(0,1) == "+") || (tagi.slice(0,1) != "-")) {
              if (tagi.slice(0,1) == "+") 
                tagi = tagi.slice(1).toLowerCase();
              
              if (summary.indexOf(tagi) < 0) {
                //alert (tagi + " not in " + summary);
                exclude = 1;
                break;
                }
              }
            }
          }
          
        // add to result list and assemble new tags
        if (!exclude) {  
          newresults[rescount] = filteredResults[i];
          rescount++;
          uniqueTags( tagArray, filteredResults[i].title + " " + filteredResults[i].summary);
            
          resultListHtml += "<a  target=_blank style='font-size:14px' href=" + filteredResults[i].hurl + ">" +  filteredResults[i].title + "</a><br />" + filteredResults[i].summary + "<br /><span style='color:green'>" + filteredResults[i].hurl+ "</span><br /><br />" ;
          }
        }      

	  document.getElementById('resultlist').innerHTML = resultListHtml;
    document.getElementById('refinedCount').innerHTML = rescount + " matches shown ";
    filteredResults = newresults;  // save current set of results
    tagArray = topNTags(numTagsToDisplay, tagArray);
	  //tagArray = tagArray.sort();
	   
	  // display new set of tags to choose from
	  document.getElementById('tagscell').innerHTML = writeTagSpans(tagArray);
	  createTagDraggables(tagArray);
}

// parseResult
//  jsonData is the Result set returned from Yahoo! search, convert it to
//  a results list and set of tags
function parseResult(jsonData) {
      var tagArray = new Array();
      var resliststr = "";
      //var reslisttext = "";
      var currResult;
      var title, hurl, summary;
      

		  if (jsonData == null){
			  alert("There was a problem parsing search results.");
			  return;
		    }
		
		  document.getElementById('refinedCount').innerHTML = jsonData.ResultSet.totalResultsReturned + " matches shown";
      document.getElementById('resultCount').innerHTML = "from top " + jsonData.ResultSet.totalResultsReturned + " results returned";
      document.getElementById('resultTotal').innerHTML = "of about " + jsonData.ResultSet.totalResultsAvailable + " results available";
		  
      var results = jsonData.ResultSet.Result;
			filteredResults = new Array();
			origResults = new Array();
			
      for (var i=0; i < results.length; i++) {
          currResult = results[i];
					title = currResult.Title;
					hurl = currResult.Url;
					summary = currResult.Summary;
 
          if (summary != null) {
            // reslisttext += " " + title + " " + summary;
            uniqueTags(tagArray, title + " " + summary);
            }
          else { 
            uniqueTags(tagArray, title);
          //  reslisttext += " " + title;
            summary = title;
            }
          filteredResults[i] = {title:title, hurl:hurl, summary:summary};
          origResults[i] = filteredResults[i];
                           
					resliststr += "<a target=_blank style='font-size:14px' href=" + hurl + ">" +  title + "</a><br />" + summary + "<br /><span style='color:green'>" +  hurl+ "</span><br /><br />" ;
	       	}
	   document.getElementById('resultlist').innerHTML = resliststr;
	   //callTermExtraction(reslisttext);
	   
	  tagArray = topNTags(numTagsToDisplay,  tagArray);
	  //tagArray = tagArray.sort();
	  
	  document.getElementById('tagscell').innerHTML = writeTagSpans(tagArray);
	  createTagDraggables(tagArray);
	   	   
    // Remove the script tag
    aObj.removeScriptTag();
    
} //parseResult



// Cross platform xmlhttprequest
// Create xmlhttprequest object
var xmlhttp = null;

function callWS(target) 
{
  if (window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
    //make sure that Browser supports overrideMimeType
    if ( typeof xmlhttp.overrideMimeType != 'undefined') { 
      xmlhttp.overrideMimeType('text/xml'); 
      }
    } else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }  else {
        alert('Perhaps your browser does not support xmlhttprequests?');
    }
       
    // Create an HTTP GET request
    xmlhttp.open('GET', target, true);

    // Set the callback function
    xmlhttp.onreadystatechange = function() 
      {
      if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        //alert(xmlhttp.responseText)
        parseResult(xmlhttp.responseText);
      } else {
        document.getElementById('resultlist').innerHTML =  "Loading...";
        document.getElementById('tagscell').innerHTML = "";
	      document.getElementById('addfilter').innerHTML = "";
	      document.getElementById('minusfilter').innerHTML = "";
	      document.getElementById('resultCount').innerHTML = "";
	      document.getElementById('resultTotal').innerHTML = "";
        }
      };
  // Make the actual request
  xmlhttp.send(null);

}


var aObj;

function callSearch() {
      var query = document.getElementById("strquery").value;
      
      if (query == "") {
        alert("No search query entered");
        return;
        }
      query = query.replace(/\$/g,"%24");
      query = query.replace(/\+/g,"%2B");
      query = query.replace(/\!/g,"%21");
      query = query.replace(/\'/g,"%27");
      query = query.replace(/\(/g,"%28");
      query = query.replace(/\)/g,"%29");
      query = query.replace(/\,/g,"%2C");
      query = query.replace(/\"/g,"%22");
      query = query.replace(/[ ]+/g,"\+");
      
      var path = 'WebSearchService/V1/webSearch?appid=BeachBub&query=' + query + '&results=' + numResultsToFind;
      // The full path to the PHP proxy
      var uri = 'http://localhost/php_proxy_simple.php?yws_path=' + encodeURIComponent(path);
   
      document.getElementById('resultlist').innerHTML =  "Loading...";
        
      //var uri = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=dantheurer&location=" + query;
      //callWS(uri);
    
    // choose the search engine JSON request for Yahoo, AJAX SOAP request for Googl
    if (document.getElementById("engineY").checked == true) {
      // Create a new script object
      document.getElementById('addfilter').innerHTML = "";
  	  document.getElementById('minusfilter').innerHTML = "";
      uri='http://api.search.yahoo.com/'+ path;
      //alert (uri+"&output=json&callback=parseResult");
      aObj = new JSONscriptRequest(uri+"&output=json&callback=parseResult");
      // Build the script tag
      aObj.buildScriptTag();
      // Execute (add) the script tag
      aObj.addScriptTag();
      }
    else {
      callGoogle(document.getElementById("strquery").value);
      }
}



