packages feed

dialog-0.1.0.0: data/html/dialog.js

//------------------------------------------------------------------------------

var ignoreEnter = true;

//------------------------------------------------------------------------------

function addMessage(msgClass, element) {
  var message =
    $("<div>", {class: "message " + msgClass})
      .append(element)
      .hide();
  $("#messages").append(message);
  $(message).fadeIn(300);
  return message;
}

function dialogDisplay(paragraphs) {
  doThenScrollToEnd(function() {
    addMessage("display", createParagraphs(paragraphs))
  });
}

function dialogAskLine(prompt) {
  var input = $("<input>", {type: "text"});
  var layout = 
    $("<table>", {class: "prompt-layout"}).append(
      $("<tr>").append(
        $("<td>", {class: "prompt-message"}).append(prompt),
        $("<td>", {class: "prompt-entry ask-line"}).append(input)));

  var message = addMessage("prompt", layout);

  function pushResult() {
    $(input).prop("disabled", true);
    pushScriptOutput($(input).val());
    $(message).addClass("done");
  }

  $(input).keyup(function(e) {
    if (e.keyCode == 13 && !ignoreEnter) {
      pushResult();
    }
  });

  doThenScrollToEnd(function() {
    $(input).focus()
  });

  ignoreEnter = true;
  setTimeout(function() { ignoreEnter = false; }, 250);
}

function dialogEnd(message) {
  doThenScrollToEnd(function() {
    $("#end-dialog-message").text(message);
    $("#end-dialog").fadeIn(1000);
  });
}

function dialogException(message) {
  doThenScrollToEnd(function() {
    $("#end-dialog-message")
      .addClass("exception")
      .text("Exception: " + message);
    $("#end-dialog").fadeIn(600);
  });
}

function dialogReset() {
  $("#messages").empty();
  $("#end-dialog").removeClass("exception").hide();
}

//------------------------------------------------------------------------------

function doThenScrollToEnd(func) {
  var scrollHeight = $("#dialog")[0].scrollHeight;
  func();
  $("#dialog").prop("scrollHeight", scrollHeight);
  $("#dialog").animate({ scrollTop: $("#dialog")[0].scrollHeight }, 400);
}

//------------------------------------------------------------------------------

function pushScriptOutput(string) {
  $("#script-output")
    .empty()
    .append(document.createTextNode(string))
    .trigger("click");
}

//------------------------------------------------------------------------------

function createParagraphs(paragraphs) {
  return paragraphs.map(createParagraph);
}

//------------------------------------------------------------------------------

function createParagraph(paragraph) {
  var type = paragraph.type;
  if (type == "text") {
    return $("<p>").append(createFormattedText(paragraph.text));
  } else if (type == "picture") {
    return $("<p>").append(createPicture(paragraph.source));
  } else if (type == "list") {
    var tag = paragraph.style == "numbered" ? "<li>"
            : paragraph.style == "bullet"   ? "<ul>"
            : undefined;
    return $(tag).append(paragraph.items.map(function(paragraphs) {
        return $("<li>").append(createParagraphs(paragraphs));
      }));
  } else if (type == "table") {
    var columnCount = 0;

    paragraph.rows.forEach(function(row) {
        if (columnCount < row.length) {
          columnCount = row.length;
        }
      });
  
    var trs = paragraph.rows.map(function(row) {
        return $("<tr>").append(row.map(function(cell) {
            return $("<td>", { class: cell.style })
                      .append(createParagraphs(cell.paragraphs));
          }));
      });

    return $("<table>", { class: "scroll-hack" }).append(
             $("<tbody>").append(
               $("<tr>").append(
                 $("<td>").append(
                   $("<div>", { class: "table-container" }).append(
                     $("<table>", { class: "normal" }).append(
                       $("<tbody>").append(trs)))))));
  }
}

//------------------------------------------------------------------------------

function createFormattedText(text) {
  var type = text.type;
  if (type == "plain") {
    return document.createTextNode(text.text);
  } else if (type == "bold") {
    return $("<b>").append(createFormattedText(text.text));
  } else if (type == "italic") {
    return $("<i>").append(createFormattedText(text.text));
  } else if (type == "underline") {
    return $("<u>").append(createFormattedText(text.text));
  } else if (type == "colored") {
    var colorStr;
    var color = text.color;
    if (color.type == "rgb") {
      colorStr = "rgb(" + color.r + ", " + color.g + "," + color.b + ")";
    }
    return $("<span>", { style: "color: " + colorStr })
              .append(createFormattedText(text.text));
  } else if (type == "size") {
    var size = 10.5 * (text.size / 100);
    return $("<span>", { style: "font-size: " + size + "pt" })
              .append(createFormattedText(text.text));
  } else if (type == "link") {
    return $("<a>", { href: text.url }).append(createFormattedText(text.text));
  } else if (type == "composite") {
    return text.parts.map(createFormattedText);
  }
}

//------------------------------------------------------------------------------

function createPicture(source) {
  if (source.type == "url") {
    return $("<img>", { src: source.url });
  }
}

//------------------------------------------------------------------------------