var SqlIT = {
  sql: new HX.SQL(),
  
  prepareDbtypes: function() {
    var select = $("dbtype");
    while(select.firstChild) select.removeChild(select.firstChild);
    var o;
    for(var p in HX.SQL.Encoders) {
      o = document.createElement("option");
      o.value = p;
      o.text = p.replace(/_/g, " ");
      try {
        select.add(o, null);
      } catch(e) {
        select.add(o);
      }
    }
    select.onchange = this.onChange;
  },
  
  buildParmsUI: function() {
    var sql = $("sql").value;
    var ui = $("parms");
    var fields = [];
    var rx = /@(\w+)/g;
    var id, el;
    for(var m; m = rx.exec(sql);) {
      id = this.name2id(m[1]);
      fields.push($(id) || this.createParmField(id));
    }

    while(ui.firstChild) ui.removeChild(ui.firstChild);
    for(var j = 0; j < fields.length; j++) {
      ui.appendChild(fields[j]);
    }
    $("noparms").style.display = fields.length == 0 ? "block" : "none"; 
    this.preview();
  },
  
  name2id: function(name) { return "parm_" + name; },
  id2name: function(id) { return id.replace(/^parm_/, ""); },
  
  createParmField: function(id) {
    var div = document.createElement("div");
    div.id = id;
    div.className = "field";
    var input_id = id + "_input";
    var name = this.id2name(id);
    var label = div.appendChild(document.createElement("label"));
    label.setAttribute("for", input_id);
    HX.DOM.setText(label, name + ":");
    var input = div.appendChild(HX.DOM.createNamed("textarea", name));
    input.rows = 2;
    input.cols = 80;
    input.value = "";
    input.id = input_id;
    input.onchange = this.onChange;
    return div;
  },
  
  preview: function() {
    var st = this.prepareStatement();
    var url = this.prepareURL(st);
    HX.DOM.setText($("previewSQL"), st);
    HX.DOM.setText($("previewURL"), url);
    document.title = "SQL IT - " + unescape(url).replace(/^https?:\/\//i, '');
    var aa = $("openers").getElementsByTagName("a");
    for(var j = aa.length; j-- > 0;) {
      aa[j].href = url;
    }
    if(this.inited) this.persist();
  },
  
  persist: function() {
    HX.URL.hashPersist($("form"));
  },
  load: function() {
    HX.URL.hashLoad($("form"));
  },
  
  
  prepareURL: function(st) {
    var url = $("url").value;
    var st = HX.URL.encode(st);
    return (/%SQL%/.test(url)) 
      ? url.replace(/%SQL%/, st)
      : url + "%20" + st;
  },
  
  prepareStatement: function() {
    var parms = {};
    var ii = $("parms").getElementsByTagName("textarea");
    for(var j = ii.length; j-- > 0;) {
      parms[ii[j].name] = ii[j].value;
    }
    var dbtype = $("dbtype");
    var sql = new HX.SQL(dbtype.options[dbtype.selectedIndex].value);
    return sql.prepareStatement($("sql").value.replace(/\s/g, " "), parms);
  },
  
  onChange: function() {
    if(this.id == "sql") SqlIT.buildParmsUI();
    SqlIT.preview();
  },
  
  open: function(where) {
    if(window.event) window.event.returnValue = false;
    var url = this.prepareURL(this.prepareStatement());
    if(!/^https?:/i.test(url) || /(javascript|data):/i.test(unescape(url))) {
      alert("Illegal URL");
      return;
    }
    
    var f = $("frame");
    if(f) f.parentNode.removeChild(f);
    
    var target; 
    switch(where) {
      case "win":
        target = "_blank";
        break;
      case "frame":
        f = document.createElement("iframe");
        f.id = "frame";
        f.style.width="99%";
        f.style.height="200px";
        $("openers").appendChild(f);
        target = f;
        break;
      default:
        target = null;
    }
    
    HX.Nav.anonOpen(url, target, $("post").checked);
  },
  
  inited: false,
  init: function() {
    this.prepareDbtypes();
    $("sql").onchange = $("url").onchange = $("post").onclick = this.onChange;
    this.load();
    this.buildParmsUI();
    this.load();
    this.preview();
    this.inited = true;
  }
}

window.onload = function() { SqlIT.init(); };

