var max_engines = 45;
var search_string = "my_query";

function makeArray(n) {
 for (var i = 1; i <= n; i++) {
  this[i] = 0;
 }
 this.maxlen = n;
 this.len = 0;
 return this;
}

var engines = new makeArray(max_engines);

function find_it(what, where) {
 for (var i = 0; i <= where.length - what.length; i++) {
  if (what == where.substring(i, i + what.length))
  return i;
 }
 return false;
}

function engine(name, options, home, search) {
 var found_at = find_it(search_string, search);
 this.name = name;
 this.options = options;
 this.home = home;
 this.search=search;
 this.pre_found_at = search.substring(0, found_at);
 this.post_found_at = search.substring(found_at + search_string.length, search.length);
}

function Add(name, options, home, search) {
 engines.len++;
 if (engines.len <= engines.maxlen) {
  engines[engines.len] = new engine(name, options, home, search)
 }
 else {
  alert("Better increase max_engines to: " + engines.len);
 }
}

/* Search engines:
  syntax: Add("engine name", "<option(s)>",
  "home page url",
  "search engine url");
  options:
 -SELECTED - means this will be the selected engine upon loading.
 -If a search engine uses a POST method, then the name and value (of up to two
    fields) it is searching for goes here.  Example:
  -Entertainment: Cheap CD's looks for a field called artist with the user's query.
     We would use artist={query}.
  -Entertainment: CDNow [actors] looks for a field called string with the user's
     query and a field called index with the letter a as its value.  We would use
     string={query};index=a.  There can be up to two fields (separated by a ;).
*/


Add("AltaVista", "",
 "http://www.altavista.digital.com/",
 "http://www.altavista.digital.com/cgi-bin/query?pg=q&what=web&fmt=.&q=my_query");

Add("Dictionary", "",
 "http://c.gp.cs.cmu.edu:5103/prog/webster",
 "http://work.ucsd.edu:5141/cgi-bin/http_webster?my_query");

Add("TicketMaster","",
 "http://events.ticketmaster.com",
 "http://205.132.175.224/cgi/events/tmquery.idq?CiRestriction=my_query");

Add("Shareware.Com", "",
 "http://www.shareware.com/",
 "http://search.shareware.com/code/engine/Find?logop=and&cfrom=quick&orfile=True&hits=25&search=my_query&category=All-Categories");

Add("DejaNews", "",
 "http://www.dejanews.com/",
 "http://search.dejanews.com/nph-dnquery.xp?query=my_query&defaultOp=AND&svcclass=dncurrent&maxhits=25");


Add("Excite", "",
 "http://www.excite.com/",
 "http://www.excite.com/search.gw?search=my_query&trace=a&collection=web&searchButton.x=32&searchButton.y=11");

Add("HotBot", "",
 "http://www.HotBot.com/",
 "http://www.HotBot.com/search.html?_v=1.0&OP=0&SW=web&SM=MC&MT=my_query&MOD=0&date=WH&DR=newer&DM=1&DD=1&DY=96&DV=10&DU=years&smiley=&RD=AN&RG=NA&domain=&DC=10&FJS=off&FJA=off&FRA=off&FVI=off&FAC=off&FSW=off&FVR=off&FSU=off&FSM=off&OP=0&MOD=0&FS=&search.x=33&search.y=17");

Add("Infoseek", "",
 "http://www.infoseek.com/",
 "http://guide-p.infoseek.com/Titles?qt=my_query&col=WW&sv=IS&lk=noframes");

Add("Lycos", "",
 "http://www.lycos.com/",
 "http://www.lycos.com/cgi-bin/pursuit?cat=lycos&query=my_query&x=46&y=8");

Add("Magellan", "",
 "http://www.mckinley.com/",
 "http://searcher.mckinley.com/searcher.cgi?query=my_query&onlyrr=0");

Add("MetaCrawler", "",
 "http://metacrawler.com",
 "http://metacrawler.com/cgi-bin/nph-metaquery.p?general=my_query&logic=0&searchType=Comprehensive+Search&useCrawlers=AltaVista&useCrawlers=Excite&useCrawlers=Lycos&useCrawlers=WebCrawler&useCrawlers=Yahoo&useCrawlers=HotBot&region=The+World&orgType=Any&maxwait=1&score=Loose");

Add("OpenText", "",
 "http://www.opentext.com/",
 "http://search.opentext.com/omw/simplesearch?mode=phrase&SearchFor=my_query");

Add("SavvySearch", "",
 "http://www.cs.colostate.edu/~dreiling/smartform.html",
 "http://wagner.cs.colostate.edu:1969/nph-search?KW=my_query&classic=on&t1=x&Boolean=AND&Hits=10&Mode=MakePlan&df=normal&AutoStep=on");

Add("Webcrawler", "",
 "http://www.webcrawler.com/",
 "http://www.webcrawler.com/cgi-bin/WebQuery?cookie=%23%23%23%23%23&mode=compact&maxHits=25&searchText=my_query");

Add("Yahoo!", "SELECTED",
 "http://www.yahoo.com/",
 "http://search.yahoo.com/bin/search?p=my_query");

// End of search engines

function doSearch(form) {
 form.submit();
 var new_query = "";
 for (i = 0; i < form.query.value.length; i++) {
  var thischar = form.query.value.charAt(i);
  if (thischar != ' ')
   new_query += thischar;
  else if (lastchar != ' ')
   new_query += '+';
  lastchar = thischar;
 }
 var search_engine = engines[1 + form.service.selectedIndex];
 if ((search_engine.options != "SELECTED") && (search_engine.options != "")) {

  if (search_engine.options.indexOf(";") >= 1) {

   var string = "found ;  in \""+search_engine.options+"\"\n";

   var part1 = search_engine.options.substring(0, search_engine.options.indexOf(";"));
   var part2 = search_engine.options.substring(search_engine.options.indexOf(";") + 1);
   var part1Name = part1.substring(0, part1.indexOf("="));
   var part1Value = part1.substring(part1.indexOf("=") + 1);
   if (part1Value == "{query}") {

    string += "changed text field named query to \""+part1Name+"\"\n";

    form.elements[1].name = part1Name;
   }
   else {
    form.elements[2].name = part1Name;
    form.elements[2].value = part1Value;

    string += "assigned 1st hidden element to \""+part1Name+"="+part1Value+"\"\n";

   }
   var part2Name = part2.substring(0, part2.indexOf("="));
   var part2Value = part2.substring(part2.indexOf("=") + 1);
   if (part2Value == "{query}") {

    string += "changed text field named query to \""+part2Name+"\"\n";

    form.elements[1].name = part2Name;
   }
   else {
    form.elements[3].name = part2Name;
    form.elements[3].value = part2Value;

    string += "assigned 2nd hidden element to \""+part2Name+"="+part2Value+"\"\n";

   }
  }
  else {
   part1 = search_engine.options.substring(0, search_engine.options.indexOf("="));
   form.elements[1].name = part1;

   var string = "only 1 option found, changed text field query to \""+part1+"\"";

  }
  form.method = "post";
  form.action = search_engine.search;

// for debugging:
//  alert(string);
//  alert(form.elements[1].name+"=\""+form.elements[1].value+"\"\n"+form.elements[2].name+"=\""+form.elements[2].value+"\"\n"+form.elements[3].name+"=\""+form.elements[3].value+"\"");

  if (form.elements[1].value != "") {
   form.submit();
  }
  else {
   location.href = search_engine.home;
  }
 }
 else {
  location.href = new_query ? search_engine.pre_found_at + new_query + search_engine.post_found_at : search_engine.home;
 }
}

function clearQuery() {
 document.forms[0].elements[1].value = "";
 document.forms[0].query.focus();
}
