/*
 * Live comment preview JavaScript code
 *
 * Copyright (c) 2006 Alastair J. Houghton
 * All rights reserved.
 *
 */

LivePreviewMgr = function() {
  bindMethods(this);
}

LivePreviewMgr.prototype.initialize = function() {
  connect("comment-text", "onkeyup", this.update_soon);
  connect("comment-text", "onchange", this.update);

  this.update();
}

LivePreviewMgr.prototype.update_soon = function() {
  if (!this.deferred) {
    /* If the user stops typing for a bit, do an update. */
    this.cancel_timer();
    this.timer = callLater(1.0, this.update);
  }
}

LivePreviewMgr.prototype.cancel_timer = function() {
  if (this.timer)
    this.timer.cancel();
  this.timer = null;
}

LivePreviewMgr.prototype.update = function() {
  this.cancel_timer();
  this.submit();
}

LivePreviewMgr.prototype.gotPreview = function(req) {
  var elem = getElement("preview-text");
  var text = req.responseText;

  elem.innerHTML = text;
  this.deferred = null;
}

LivePreviewMgr.prototype.submit = function() {
  var entry_id = getElement("entry-id").value;
  var author = getElement("comment-author").value;
  var email = getElement("comment-email").value;
  var url = getElement("comment-url").value;
  var text = getElement("comment-text").value;

  if (this.deferred) {
    this.deferred.cancel();
  }

  if (!text || !text.length) {
    hideElement("live-preview");
    this.previewHidden = true;
    return;
  } else if (this.previewHidden) {
    var elem = getElement("preview-text");
    elem.innerHTML = "<p>Generating preview, please wait&hellip;</p>";
    showElement("live-preview");
    this.previewHidden = false;
  }

  var req = getXMLHttpRequest();
  req.open("POST", "http://alastairs-place.net/movabletype/mt-comments.cgi", true);
  req.setRequestHeader("Content-Type",
                       "application/x-www-form-urlencoded");

  var keys = ["static", "preview", "entry_id", "author", "email",
              "url", "text", "preview"];
  var values = ["1", "Preview", entry_id, author, email, url, text];
  var data = queryString(keys, values);
  var d = sendXMLHttpRequest(req, data)

  d.addCallback(this.gotPreview);

  var self = this;
  d.addBoth(function (res) {
      self.deferred = null;
      return res;
  });

  this.deferred = d;

  return d;
}

previewMgr = new LivePreviewMgr();
addLoadEvent(previewMgr.initialize);
