/**
 * Console for debug.
 *
 * @author clonedoppelganger(at)gmail.com
 *         http://clonedoppelganger.net/
 *
 * ex: <script type="text/javascript" src="Console.js"></script>
 *     Console.print(foo);       // print toString() value.
 *     Console.print(foo, true); // print analyzed object.
 * 
 */
var Console = {

  id: "____CONSOLE_AREA____",

  cue: [],

  breakTag: "<br>",

  enabled: true,

  loadTime: 50,

  waitTime: 10,

  minWidth: 300,

  minHeight: 180,

  maxWidth: 800,

  maxHeight: 500,

  print: function(value, parse) {
    if (!this.enabled) return;
    parse = (parse === true) ? true : false;
    this.cue[this.cue.length] = {
      "value": value,
      "parse": parse
    };
    this.printing();
  },

  printing: function() {
    if (!document.body) {
      setTimeout("Console.printing()", this.loadTime);
    } else {
      setTimeout("Console.out()", this.waitTime);
    }
  },

  out: function() {
    var cue = this.cue;
    if (cue.length == 0) return;
    var value = this.cue[0]["value"];
    var parse = this.cue[0]["parse"];
    var tmpCue = [];
    for (var i = 1, n = cue.length; i < n; i++) {
      tmpCue[i - 1] = cue[i];
    }
    this.cue = tmpCue;
    var id = this.id;
    var area = document.getElementById(id);
    if (!area) {
      var body = document.getElementsByTagName("body").item(0);
      var div = document.createElement("div");
      div.setAttribute("id", id);
      div.style.position = "absolute";
      div.style.top = "0";
      div.style.right = "0";
      div.style.width = this.minWidth + "px";
      div.style.zIndex = "100";
      var buttonStyle = ' style="font-family:Arial; font-size:11px; border:1px solid #bbb;'
        + 'border-top:none; border-left:none; width:32px; background-color:#F9F9F9;" ';
      div.innerHTML = ""
        + '<form style="margin:0px;padding:0px;">'
        + '<input type="button" value="&lt;" onclick="Console.move(\'left\')"' + buttonStyle + '>'
        + '<input type="button" value="^" onclick="Console.move(\'top\')"' + buttonStyle + '>'
        + '<input type="button" value="_" onclick="Console.move(\'bottom\')"' + buttonStyle + '>'
        + '<input type="button" value="&gt;" onclick="Console.move(\'right\')"' + buttonStyle + '>'
        + '<input type="button" value=")(" onclick="Console.min()"' + buttonStyle + '>'
        + '<input type="button" value="()" onclick="Console.max()"' + buttonStyle + '>'
        + '<input type="button" value="Clear" onclick="Console.clear()"' + buttonStyle + '>'
        + '<input type="button" value="X" onclick="Console.close()"' + buttonStyle + '>'
        + '</form>'
        + '<div style="height:' + this.minHeight + 'px; font-size:12px; '
        + 'font-family:Consolas,Courier New; color:#ddd; background-color:#000; '
        + 'border:1px solid #ddd; padding:2px; overflow:auto;"></div>';
      body.appendChild(div);
      area = div;
    }
    var innerDiv = area.getElementsByTagName("div").item(0);
    if (parse) {
      innerDiv.innerHTML += this.createParsedValue(value);
    } else {
      innerDiv.innerHTML += this.escape(value) + this.breakTag;
    }
    innerDiv.scrollTop = innerDiv.scrollHeight - innerDiv.offsetHeight + 2;
    if (cue.length > 0) {
      setTimeout("Console.out()", this.waitTime);
    }
  },

  parseTmp: null,
  createParsedValue: function(value) {
    this.parseTmp = "";
    var out = "";
    this.parse(value, 0);
    return this.parseTmp;
  },
  parse: function(obj, level) {
    var nowLevel = level + 1;
    if (nowLevel > 3) {
      return;
    }
    var indent = "";
    for (var i = 1; i < nowLevel; i++) indent += "&nbsp;&nbsp;";
    for (k in obj) {
      if (typeof obj[k] == "object") {
        this.parseTmp += indent + "[" + this.escape(k)+ "] --------" + this.breakTag;
        this.parse(obj[k], nowLevel);
      } else {
        this.parseTmp += indent + "[" + this.escape(k)
          + "] => "+ this.escape(obj[k]) + this.breakTag;
      }
    }
  },

  clear: function() {
    if (!this.enabled) return;
    var area = document.getElementById(this.id);
    var innerDiv = area.getElementsByTagName("div").item(0);
    innerDiv.innerHTML = "";
  },

  move: function(pos) {
    if (!this.enabled) return;
    var area = document.getElementById(this.id);
    switch (pos) {
      case "top":
        area.style.bottom = "";
        area.style.top = "0";
        break;
      case "right":
        area.style.left = "";
        area.style.right = "0";
        break;
      case "bottom":
        area.style.top = "";
        area.style.bottom = "0";
        break;
      case "left":
        area.style.right = "";
        area.style.left = "0";
        break;
      default:
        break;
    }
  },

  min: function() {
    if (!this.enabled) return;
    var area = document.getElementById(this.id);
    var innerDiv = area.getElementsByTagName("div").item(0);
    area.style.width = this.minWidth + "px";
    innerDiv.style.height =  this.minHeight + "px";
  },

  max: function() {
    if (!this.enabled) return;
    var area = document.getElementById(this.id);
    var innerDiv = area.getElementsByTagName("div").item(0);
    area.style.width = this.maxWidth + "px";
    innerDiv.style.height = this.maxHeight + "px";
  },

  close: function() {
    if (!this.enabled) return;
    var body = document.getElementsByTagName("body").item(0);
    var area = document.getElementById(this.id);
    body.removeChild(area);
  },

  escape: function(value) {
    var t = document.createElement("div");
    t.appendChild(document.createTextNode(value));
    return t.innerHTML;
  }

}
