var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
  try {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (e2) {
    xmlHttp = false;
  }
}
@end @*/

if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
  xmlHttp = new XMLHttpRequest();
}
var selts = ['class', 'manufacturer', 'model', 'displacement', 'descriptor'];
var checks = ['fuel_type', 'speeds', 'overdrive', 'lockup', 'mode', 'cylinders', 'valves', 'drive'];
var radios = ['guzzler', 'sil', 'ems', 'dc_fw', 'turbo', 'super'];
var texts = ['fuel_cost', 'cty', 'hwy', 'cmb', 'ucty', 'uhwy', 'ucmb'];
var state = [];
//var w = window.open('','json');
function writeO(o, b) {
   var j = JSON.stringify(o);
   j = b ? j.split('],').join('],<br />').split('},').join('},<br />') : j;
   w.document.write(j);
   w.document.close();
}
function writeS(s, b) {
   s = b ? s.split('],').join('],<br />').split('},').join('},<br />') : s;
   w.document.write(s);
   w.document.close();
}
function reset() {
   document.body.style.cursor = 'wait';
   for (var s in selts) {
      var sel = selts[s];
      var oS = o[sel];
      var selNode = document.getElementById(sel);
      var parent = selNode.parentNode;
      parent.removeChild(selNode);
      var opt = selNode.options;
      opt.length = 0;
      for (var i in oS) {
          opt[opt.length] = new Option(oS[i], i, true, true);
      }
      parent.appendChild(selNode);
   }
   for (var t in texts) {
       var text = texts[t];
       document.getElementById('max_' + text).value = o[text].max;
       document.getElementById('min_' + text).value = o[text].min;
   }
   for (var c in checks) {
       var check = document.getElementsByName(checks[c]);
       for (var i = 0; i < check.length; i++) {
           check[i].checked = check[i].defaultChecked;
           check[i].disabled = false;
       }
   }
   for (var r in radios) {
       var but = document.getElementsByName(radios[r]);
       for (var i = 0; i < but.length; i++) {
           but[i].checked = but[i].defaultChecked;
           if (i < 2) but[i].disabled = false;
           else but[i].disabled = true;
       }
   }
   document.body.style.cursor = 'auto';
}
function fill(u) {
   document.body.style.cursor = 'wait';
   //writeO(u, true);
   for (var s in selts) {
      var sel = selts[s];
      var selNode = document.getElementById(sel);
      var p = selNode.parentNode;
      p.removeChild(selNode);
      var opt = selNode.options;
      opt.length = 0;
      var oS = o[sel];
      var uS = u[sel];

      for (var i = 0, uSl = uS.length; i < uSl; ++i) {
         opt[i] = new Option(oS[uS[i]], uS[i], true, true);
      }
      p.appendChild(selNode);
   }
   for (var t = texts.length -1; t >= 0; --t) {
      var text = texts[t];
      document.getElementById('max_' + text).value = u[text].max;
      document.getElementById('min_' + text).value = u[text].min;
   }
   for (var c = checks.length -1; c >= 0; --c) {
      var check = checks[c];
      var box = document.getElementsByName(check);
      var uC = u[check];
      var s = ' ' + uC.join(' , ') + ' ';

      for (var i = box.length -1; i >= 0; --i) {
         var b = box[i];
         if (s.indexOf(' ' + b.value + ' ') > -1) {
            b.checked = true;
            if (uC.length == 1) b.disabled = true;
            else b.disabled = false;
         }
         else {
            b.checked = false;
            b.disabled = true;
         }
      }
   }
   for (var r = radios.length -1; r >= 0; --r) {
      var radio = radios[r];
      var but = document.getElementsByName(radio);
      if (u[radio].length == 2) {
         but[2].checked = true;
         but[0].disabled = but[1].disabled = but[2].disabled = false;
      }
      else if (u[radio][0]) {
         but[0].checked = true;
         but[0].disabled = but[1].disabled = but[2].disabled = true;
      }
      else {
         but[1].checked = true;
         but[0].disabled = but[1].disabled = but[2].disabled = true;
      }
   }
   document.body.style.cursor = 'auto';
}
function updatePage() {
   if (xmlHttp.readyState == 4) {
      if (xmlHttp.status == 200) {
         var text = xmlHttp.responseText;
         //writeS(text, true);
         var u = eval('(' + text + ')');
         fill(u);
         incQueryStep(u);
      }
	   document.body.style.cursor = 'auto';
	   document.getElementById('wait').style.display = 'none';
   }
}
function callServer() {
   document.getElementById('wait').style.display = 'block';
   document.body.style.cursor = 'wait';
   var send = {};
   for (var t = texts.length -1; t >= 0; --t) {
      var text = texts[t];
      send[text] = [];
      send[text][0] = Number(document.getElementById('min_' + text).value);
      send[text][1] = Number(document.getElementById('max_' + text).value);
   }
   for (var s = selts.length -1; s >= 0; --s) {
      var select = selts[s];
      send[select] = [];
      var sS = send[select];
      var opts = document.getElementById(select).options;
      for (var i = opts.length -1; i >= 0; --i) {
         if (opts[i].selected) {
            sS[sS.length] = Number(opts[i].value);
         }
      }
   }
   for (var c = checks.length -1; c >= 0; --c) {
      var check = checks[c];
      send[check] = [];
      var sC = send[check];
      var box = document.getElementsByName(check);
      for (var i = box.length -1; i >= 0; --i) {
         if (box[i].checked) {
            var value = box[i].value;
            if ('cylinders,valves'.indexOf(check) > -1) value = Number(value);
            sC[sC.length] = value;
         }
      }
   }
   for (var r = radios.length -1; r >= 0; --r) {
      var radio = radios[r];
      var but = document.getElementsByName(radio);
      for (var b = but.length -1; b >= 0; --b) {
         if (but[b].checked) {
            var value = but[b].value;
            break;
         }
      }
      if (value == 'both') value = [true, false];
      else if (value == 'yes') value = [true];
      else value = [false];
      send[radio] = value;
   }

   var jsonString = JSON.stringify(send);
   xmlHttp.open("POST", './request.py', true);
   xmlHttp.onreadystatechange = updatePage;
   xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
   xmlHttp.setRequestHeader('Accept-Encoding','gzip, deflate');
   xmlHttp.send("jsonstring=" + jsonString);
}
function incQueryStep(send) {
   state.push(send);
   document.getElementById('qs' + state.length).style.display='inline';
   document.getElementById('qsb' + state.length).checked = true;
}
function decQueryStep() {
   var but = document.getElementsByName('querystep');
   for (var b = but.length -1; b >= 0; --b) {
      if (but[b].checked) {
         var value = but[b].value;
         break;
      }
      document.getElementById('qs' + b).style.display = 'none';
   }
   for (var i = state.length; i > value; i--) state.pop();
   if (state.length === 0) {
       //alert(state.length + ' indo para o Reset');
       reset();
   }
   else {
      fill(state[state.length -1]);
   }
}
function validate(obj) {
    var u;
    if (state.length === 0) u = o;
    else u = state[state.length -1];
    var id = obj.id;
    var pos = id.indexOf('_');
    var pre = id.substring(0, pos);
    var id_name = id.substring(pos +1);
    while (true) {
       if (isNaN(obj.value)) {
          alert('"' + obj.value +'" is not a valid number');
          break;
       }
       if (pre == 'min') {
          if (obj.value < u[id_name].min) {
             alert('If you want a "From" value smaller than ' +
                   u[id_name].min + '\nthen step back or Reset');
             break;
          }
          if (obj.value >= u[id_name].max) {
             alert('"From" must be smaller then "To: ' +  u[id_name].max + '"');
             break;
          }
       }
       else {
          if (obj.value > u[id_name].max) {
             alert('If you want a "To" value bigger than ' +
                   u[id_name].max + '\nthen step back or Reset');
             break;
          }
          if (obj.value <= u[id_name].min) {
             alert('"To" must be bigger than "From: ' + u[id_name].min + '"');
             break;
          }
       }
       callServer();
       return;
    }
    obj.value = u[id_name][pre];
    setTimeout(function () { obj.focus(); }, 100);
    return false;
}
function setHandlers() {
   var textArray = texts;
   for (var i = textArray.length -1; i >= 0; --i) {
      var min = document.getElementById('min_' + textArray[i]);
      var max = document.getElementById('max_' + textArray[i]);
      min.onchange = max.onchange = function() { return validate(this); };
      min.onfocus = max.onfocus =
        function() {
          this.style.backgroundColor = 'yellow';
          this.select();
        };
      min.onblur = max.onblur = function() { this.style.backgroundColor = ''; };
      max.style.textAlign = min.style.textAlign = 'right';
   }
   var labels = document.getElementsByTagName('label');
   for (var l = labels.length -1; l >= 0; --l) {
      labels[l].onmouseover = function () {
         this.style.textDecoration = 'underline';
      };
      labels[l].onmouseout = function () {
         this.style.textDecoration = 'none';
      };
   }
}

