var searchserver = "cgi-bin/searchrater/searcher.cgi?";
var keywords_key = "keywords=";
var target_key = "target=";
var engine_key = "ecode=";
var max_key = "max=";
var google_api_key = "google_api=";

var SearchTableID = "SearchTable";
var ResultColumn = 3; //column results are displayed in

var MSN_Row = 1; //row for MSN search engine
var Baidu_Row = 2; //row for Baidu
var Yahoo_Row = 0; //row for Yahoo
var Sogou_Row = 3; //row for Sogou
var Goo_Row = 4;

var RunningSearches = new Array(10); //collection of current calls

var NotSearchedTxt = "Not searched.";
var SearchRunning = "Searching...";
var SearchFailed = "Request Failed!";

function validate()
{
  //check something in both text boxes
  if(document.searcher.keywords.value == '')
  {
    return false;
  }

  if(document.searcher.target.value == '')
  {
    return false;
  }

  //check not already running
  for (var i = 0; i < RunningSearches.length; i++)
  {
    if( RunningSearches[ i ] != null )
    {
      return false;
    }
  }

  //do the searching by replacing the form action
  startSearch();

  return false; //return false so don't refresh or post action
}

function setCellText( row, col, text )
{
  var x=document.getElementById(SearchTableID).rows[row].cells
  x[col].innerHTML=text
}


//send google request
function sendGoogleRequest( resultRow )
{
  var url = BuildQueryString( "google" );
  //add api key
  url = url + "&" + google_api_key + document.searcher.google_api.value;

  sendAsyncRequest( url, resultRow );
}

//build the query string
function BuildQueryString( engine )
{
  //cope with different base url's mucking up security
  var baseurl = location.href;
  //base url must end with .com
  var comStart = baseurl.indexOf( ".com" );
  var baseurlStart = baseurl.substring( 0, comStart + 5 );
  var url = baseurlStart + searchserver + keywords_key  + encodeURIComponent( document.searcher.keywords.value );
  url = url + "&" + target_key  + document.searcher.target.value;
  url = url + "&" + engine_key  + engine;
  url = url + "&" + max_key + document.searcher.max_search.value;

  return url;
}

//wrap up and send async
function sendAsyncRequest( url, resultRow )
{
  setCellText( resultRow, ResultColumn, SearchRunning );

  var d = MochiKit.Async.doSimpleXMLHttpRequest( url );

  var gotMetadata = function (meta) {
      ProcessResponseText( resultRow, ResultColumn, meta.responseText );
      RunningSearches[ resultRow ] = null;
  };
  var metadataFetchFailed = function (err) {
    setCellText( resultRow, ResultColumn, SearchFailed );
    RunningSearches[ resultRow ] = null;
  };

  d.addCallbacks(gotMetadata, metadataFetchFailed);

  RunningSearches[ resultRow ] = d;
}

//send the search request to the server
function sendSearchRequest( resultRow, engine )
{
  //construct cgi request
  var url = BuildQueryString( engine );

  sendAsyncRequest( url, resultRow );
}

//sort out what happened
function ProcessResponseText( resultRow, ResultColumn, responseText )
{
  //get head
  var stateStart = responseText.indexOf( "<State>" );
  var stateEnd = responseText.indexOf( "</State>" );

  var state = responseText.substring( stateStart + 7, stateEnd );

  if( state.indexOf("OK") != -1 )
  {
    //var keywordStart = responseText.indexOf( "<Keywords>" );
    //var keywordEnd = responseText.indexOf( "</Keywords>" );
    //var keywords = responseText.substring( keywordStart + 10, keywordEnd );

    var resultStart = responseText.indexOf( "<Result>" );
    var resultEnd = responseText.indexOf( "</Result>" );

    //remove [' '] we get
    var rank = responseText.substring( resultStart + 10, resultEnd - 2 );
    setCellText( resultRow, ResultColumn, "<b>" + rank + "<\/b>" );
  }
  else
  {
    setCellText( resultRow, ResultColumn, state );
  }
}

//start the search
function startSearch()
{
  var form = document.searcher;

  //MSN
  if( form.MSN.checked )
  {
    //start search
    sendSearchRequest( MSN_Row, "msn" );
  }
  else
  {
    setCellText( MSN_Row, ResultColumn, NotSearchedTxt );
  }

  //Baidu
  if( form.Baidu.checked )
  {
    sendSearchRequest( Baidu_Row, "baidu" );
  }
  else
  {
    setCellText( Baidu_Row, ResultColumn, NotSearchedTxt );
  }

  if( form.Yahoo.checked )
  {
    sendSearchRequest( Yahoo_Row, "yahoo" );
  }
  else
  {
    setCellText( Yahoo_Row, ResultColumn, NotSearchedTxt );
  }

  if( form.Sogou.checked )
  {
    sendSearchRequest( Sogou_Row, "sogou" );
  }
  else
  {
    setCellText( Sogou_Row, ResultColumn, NotSearchedTxt );
  }

  if( form.Goo.checked )
  {
    sendSearchRequest( Goo_Row, "goo" );
  }
  else
  {
    setCellText( Goo_Row, ResultColumn, NotSearchedTxt );
  }

}
