// Copyright 2010 Phil Pennock, all rights reserved.
// No warranties, express or implied.
//
// Sure, you grabbed a copy to render in your browser, but please contact me
// if using this on your own site, just as a polite heads-up.  If you want to
// have the JSON callback URL pointing to my server, it's particularly
// anti-social to not let me know what you're doing, and I reserve the right
// to add Referer: checks or other measures if abused.  The default is to query
// an end-point on the server with the same hostname that this is served from.

// PS: I'm not a professional JS programmer, and it shows.

function json_parse(text) {
  /* RFC 4627 */
  var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
     text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');
  return my_JSON_object;
}

function get_xmlrequest_object(url, statecallback, method, methoddata) {
  var ro;
  if ((url === undefined) || (statecallback === undefined)) {
    return false;
  }
  if (window.XMLHttpRequest && !(window.ActiveXObject)) {
    try {
      ro = new XMLHttpRequest();
    } catch(e) {};
  } else if(window.ActiveXObject) {
    try {
      ro = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
	ro = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {};
    };
  }
  if (ro === undefined) {
    return false;
  }
  if (method === undefined) { method = "GET"; };
  if (methoddata === undefined) { methoddata = ""; };
  ro.onreadystatechange = statecallback;
  ro.open(method, url, true);
  ro.send(methoddata);
  return ro;
}

function hook_up_servers(_parent_div, _form_target_name) {
  // http://sks.spodhuis.org/sks-peers/hostnames-json
  // but use https if used to reach us, but not otherwise since it might be
  // a private CA used for the host cert.
  var default_server = window.location.hostname;
  var json_url = window.location.protocol + '//' + window.location.host + '/sks-peers/hostnames-json';
  var json_url_all = json_url + '?all';
  var anchor = document.getElementById(_parent_div);
  var form_target = document.getElementById(_form_target_name);
  if (!anchor) { return false; }
  if (!form_target) { return false; }

  function create_server_list(servers_json) {
    var new_form = document.createElement('form');
    var fieldset = document.createElement('fieldset');
    new_form.appendChild(fieldset);
    var legend = document.createElement('legend');
    legend.appendChild(document.createTextNode('Server'));
    fieldset.appendChild(legend);
    var list = document.createElement('select');
    list.setAttribute('name', 'server');
    var index;
    var d;
    //var servers = ['sks.spodhuis.org', 'gpg-keyserver.de', 'keyserver.stack.nl'];
    var servers = new Array();
    servers.push(default_server);
    servers.push('--');
    servers.push.apply(servers, servers_json['hostnames']);
    for (index in servers) {
      d = document.createElement('option');
      d.setAttribute('value', servers[index]);
      d.appendChild(document.createTextNode(servers[index]));
      list.appendChild(d);
    };

    list.onchange = function(e) {
      if (!e) var e = window.event;
      var server = this.options[this.selectedIndex].value;
      if (server == '--') { server = default_server; };
      var url = 'http://' + server + ':11371/pks/lookup';
      form_target.setAttribute('action', url);
      if (e.stopPropagation) { e.stopPropagation(); };
      e.cancelBubble = true;
      e.returnValue = false;
      return false;
    };

    fieldset.appendChild(list);
    anchor.appendChild(new_form);
  };

  // The 'all' query param attempts to get a list of all peers, but will
  // fail if the list hasn't loaded yet; in which case, we fall back to
  // trying without 'all'.
  var servers_req_obj;
  function create_server_list_wrap() {
    if (servers_req_obj === undefined) { return; };
    if (servers_req_obj.readyState != 4) { return; };
    if (servers_req_obj.status != 200) { return; };
    create_server_list(json_parse(servers_req_obj.responseText));
  };
  function create_server_list_all_wrap() {
    if (servers_req_obj === undefined) { return; };
    if (servers_req_obj.readyState != 4) { return; };
    if (servers_req_obj.status == 200) {
      create_server_list(json_parse(servers_req_obj.responseText));
    } else {
      servers_req_obj = get_xmlrequest_object(json_url, create_server_list_wrap);
    }
  }
  servers_req_obj = get_xmlrequest_object(json_url_all, create_server_list_all_wrap);
};

function handle_drag_over(e) {
  if (e.stopPropagation) { e.stopPropagation() }
  e.preventDefault();
}

function handle_drop(drop_evt) {
  if (drop_evt.stopPropagation) { drop_evt.stopPropagation() }
  drop_evt.preventDefault();

  var files = drop_evt.dataTransfer.files; // FileList of File objects
  for (var i = 0, f; f = files[i]; i++) {
    var reader = new FileReader();

    reader.onload = (function(fn, drop_evt){
      return function(e) {
	if (e.target.result.indexOf("-----BEGIN PGP PUBLIC KEY BLOCK-----") > -1) {
	  drop_evt.target.innerText += e.target.result;
	  drop_evt.target.form.submit();
	} else {
	  if ('placeholder' in drop_evt.target) {
	    drop_evt.target.placeholder += "\r\n\r\n   File \"" + fn.name + "\" does not look like ASCII-armored PGP data.\n";
	  }
	}
      }
    })(f, drop_evt);

    reader.readAsText(f);
  }

  return false;
}

function hook_up_dragging(target_id) {
  if (window.File && window.FileReader) {
    var element = document.getElementById(target_id);
    element.addEventListener('dragover', handle_drag_over, false);
    element.addEventListener('drop', handle_drop, false);
  }
}

// vim: set sw=2 :

