function hide(eltname) {
  var elt = document.getElementById(eltname);
  if (elt) elt.style.display = 'none';
}

function hideVis(eltname) {
  var elt = document.getElementById(eltname);
  if (elt) elt.style.visibility = 'hidden';
}

function resetSearch() {
  var f = document.forms.srch;
  f.mfg.selectedIndex=f.types.selectedIndex=f.poles.selectedIndex=f.amperages.selectedIndex=0;f.voltages.selectedIndex=0;
  hide('status');
  hide('greenlftlg');
  hide('results');
  hideVis('total');
  hideVis('reset');
  propagate("none");
}

function retrieveURL(url) {
  if (window.XMLHttpRequest) { // Non-IE browsers
    req = new XMLHttpRequest();
    req.onreadystatechange = processStateChange;
    try {
      req.open("GET", url, true);
    } catch (e) {
      alert(e);
    }
    req.send(null);
  } else if (window.ActiveXObject) { // IE
    try {
      req = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        req = false;
      }
    }
    if (req) {
      req.onreadystatechange = processStateChange;
      req.open("GET", url, true);
      req.send();
    }
  }
}

function processStateChange() {
  if (req.readyState == 4) { // Complete
    if (req.status == 200) { // OK response
//    alert("GOT: " + req.responseText);
      updateSelects(req.responseText);
    } else {
      alert("Problem: " + req.status + "/" + req.statusText);
    }
  }
}

function updateSelects(txt) {
  var lines = txt.split("\n");
  var i;
  var f = document.forms.srch;
//alert("Txt: " + txt);
  for (i = 0; i < 7; i++) {
//  alert("Line " + i + ": " + lines[i]);
    var items = lines[i].split("|");
    var opts = [];
    for (var j = 1; j < items.length; j++) 
      opts[j-1] = items[j];
    switch (items[0]) {
      case "mfg": setSelect(f.mfg, opts, "Any Manufacturer"); break; 
      case "poles": setSelect(f.poles, opts, "All Poles"); break; 
      case "voltages": setSelect(f.voltages, opts, "All Voltages"); break; 
      case "amperages": setSelect(f.amperages, opts, "All Amperages"); break; 
      case "types": setSelect(f.types, opts, "All Types"); break; 

      case "total":
        document.getElementById('total').innerHTML = opts[0] + " Product" + (opts[0] == 1 ? "" : "s") + " Found"; break;
    }
  }

  // interpret remainder as html
  var htmlLines = lines.slice(6);
  var html = htmlLines.join("\n");
  updateSearch(html);
}

var id_status = -1;
var status_amount = 0;

function setStatus(amount) {
  if (amount < 0) amount = ++status_amount;
  var imgs = document.getElementById('statusbar').getElementsByTagName('img');
  amount %= imgs.length;
  for (var j = 0; j < imgs.length; j++) {
    imgs[j].style.visibility = j < amount ? 'visible' : 'hidden';
  }
}

var ss_counter = 0;

function startSearch() {
  if (!ss_counter++) return;
  searchStarted = 1;
  document.getElementById('status').style.display = '';
  document.getElementById('status').style.visibility = 'visible';
  document.getElementById('statusbar').style.visibility = 'visible';
  document.getElementById('statushdr').style.visibility = 'visible';
  status_amount = 0;
  setStatus(0);
  clearInterval(id_status);
  id_status = setInterval('setStatus(-1)', 50);
}

var us_counter = 0;

function updateSearch(html) {
  if (!us_counter++) return;
  if (!searchStarted) return;
  document.getElementById('results').innerHTML = html;
  document.getElementById('results').style.display = '';
  document.getElementById('greenlftlg').style.display = '';
  clearInterval(id_status);
  setStatus(0);
  document.getElementById('statusbar').style.visibility = 'hidden';
  document.getElementById('statushdr').style.visibility = 'hidden';
  document.getElementById('total').style.visibility = 'visible';
  document.getElementById('reset').style.visibility = 'visible';
  
}

function setLoading(sbox) {
  var si = sbox.selectedIndex;
  for (var i = sbox.options.length - 1; i >= 0; i--) {
    sbox.options[i] = null;
  }
  sbox.options[0] = new Option("Loading...", -1);
  sbox.options[0].selected = false;
}

function encodeHiddenField(name, hf) {
  var qs = "";
  var values = hf.value.split(",");
  for (var i = 0; i < values.length; i++) {
    qs += "&" + name + "[]=" + escape(values[i]);
  }
  return qs;
}

function encodeModifyDropdown(name, dd, threshold) {
  var qs = "";
  var opts = 0;
  for (var i = threshold; i < dd.options.length; i++) {
    if (dd.options[i].selected) {
      qs += "&" + name + "[]=" + escape(dd.options[i].value);
      opts++;
    }
  }
  if (opts == 0) {
    // nothing selected - so set to Loading...
    setLoading(dd);
  }
  return qs;
}

function loadSelects(src,f) { 

  searchStarted = 0;
  if (src != "none")
    startSearch();

 // if no selection has yet been made, update text to "Loading..."
 // f.mfg poles voltages amperages

 // find all items with a selection & serialize.
 var url = "ds_xml.php";
 var qs = "";
 if (f.mfg && f.mfg.options) qs += encodeModifyDropdown("mfg", f.mfg, 0);
 else if (f.mfg) qs += encodeHiddenField("mfg", f.mfg);
// if (src != "mfg") {
   qs += encodeModifyDropdown("types", f.types, 1);
   qs += encodeModifyDropdown("poles", f.poles, 1);
   qs += encodeModifyDropdown("amperages", f.amperages, 1);
   qs += encodeModifyDropdown("voltages", f.voltages, 1);
// }
 if (f.keywords.value != "") qs += "&keywords=" + escape(f.keywords.value);

// if (qs != "") {
   url += "?" + qs.substring(1);
//   alert("Request: |" + url + "|");
   retrieveURL(url);
// }

 // do search in parallel

}

function loadAllSelects() {
  // called from search results "Narrow Your Search" page
  var f = document.forms.srch;
  if (f && f["types[]"] && f["poles[]"] && f["voltages[]"] && f["amperages[]"]) {
    loadSelects("types", f);
    loadSelects("poles", f);
    loadSelects("voltages", f);
    loadSelects("amperages", f);
  }
}

function propagate(src) {
  loadSelects(src,document.forms.srch);

}

function defselect(sbox, string) {
  var si = sbox.selectedIndex;
  for (var i = sbox.options.length - 1; i >= 0; i--) {
    sbox.options[i] = null;
    sbox.options[0] = new Option(string, 0);
  }
  sbox.options[0].selected = true;
}
    
/*
function getSelection(sbox) {
  var a = Array();
  var j = 0;
  if (sbox.options[0].selected) 
    return a;

  for (i = 1; i < sbox.options.length; i++) {
    if (sbox.options[i].selected) {
      a[j++] = sbox.options[i].value;
    }
  }
  return a;
}
*/

function optName(s) {
  if (s.indexOf('=') == -1) return s;
  return s.substr(0, s.indexOf('='));
}

function optValue(s) {
  if (s.indexOf('=') == -1) return s;
  return s.substr(s.indexOf('=')+1);
}



function setSelect(sbox, opts, defaultValue) {
  var name = defaultValue;
  var si = sbox.selectedIndex;
  var j = 0;
  var orig = Array();
  var z = 0;
  var selIdx = 0;
  var hassel = 0;

  for (var x = 0; x < sbox.options.length; x++) {
    if (sbox.options[x].selected) 
      orig[z++] = sbox.options[x].value;
  }
  
// TODO
// if (isSelf && opts.length < sbox.options.length) return;

  for (var i = sbox.options.length - 1; i >= 0; i--)
    sbox.options[i] = null;
  sbox.options[0] = new Option(name, 0);
  if (orig.length == 0 || orig[0] == 0) {
    sbox.options[0].selected = true;
    hassel = 1;
  }

  for (j = 0; j < opts.length; j++) {
    var value = "";
    sbox.options[j+1] = new Option(optName(opts[j]), optValue(opts[j])); 
    value = optValue(opts[j]); 
    for (x = 0; x < orig.length; x++) {
      if (value == orig[x]) break;
    }
    if (x != orig.length) {
      sbox.options[j+1].selected = true;
      hassel = 1;
    }
  }
  if (!hassel) {
    sbox.options[0].selected = true;
  }
}

function resetsearch() {
  resetSearch();
  return;

  var mfg = document.forms["srch"].mfg;
  var types = document.forms["srch"].types;
  var poles = document.forms["srch"].poles;
  var amps = document.forms["srch"].amperages;
  var volts = document.forms["srch"].voltages;

  mfg.selectedIndex = types.selectedIndex = poles.selectedIndex =
  amps.selectedIndex = volts.selectedIndex = 0;
  propagate("");
}
