 function senddata(script, status, data, success, failure) {
   if (status)
     status.textContent = 'Loading...';
   var x = new XMLHttpRequest();
   x.open("post", script, true);
   x.onreadystatechange = function () {
     if (x.readyState == 4) {
       if (status)
         status.textContent = '';
       if ((x.status != 200) && (x.status != 304)) {
         failure(x.statusText);
       } else if (!x.responseXML) {
         failure('server-side XML error');
       } else if (x.responseXML.documentElement.tagName == 'error') {
         failure(x.responseXML.documentElement.textContent);
       } else {
         success(x.responseXML);
       }
     }
   }
   x.setRequestHeader("Content-Type", "text/plain");
   datastring = '';
   for (var i in data) {
     datastring += data[i] + "\n";
   }
   x.send(datastring);
 }
 function openCloser(details, callback) {
   return function (event) {
     if (details.hasAttribute('irrelevant')) {
       details.removeAttribute('irrelevant');
       if (callback)
         callback();
     } else {
       details.setAttribute('irrelevant', '');
     }
     if (event)
       event.preventDefault();
   };
 }
 var listener;
 var listenerRestartTimer;
 var listenerRestartTimeout = 500;
 var lastMessageID = -1;
 function startListener() {
   listener = document.createElement('iframe');
   listener.setAttribute('irrelevant', '');
   if (lastMessageID < 0)
     listener.src = 'listen';
   else
     listener.src = 'listen?' + lastMessageID;
   listener.onload = listenerDied;
   listener.onerror = listenerDied;
   document.body.appendChild(listener);
 }
 function listenerDied(event) {
   if (listener.parentNode)
     listener.parentNode.removeChild(listener);
   if (listenerRestartTimer > 0)
     window.clearTimeout(listenerRestartTimer);
   if (listenerRestartTimeout < 1000 * 60)
     listenerRestartTimeout *= 2;
   listenerRestartTimer = window.setTimeout(startListener, listenerRestartTimeout);
 }

