
var mode = "passive";
var terms = "";
var lastLinkPopulator = "";
var urls = {};
var commands = [];
var commandHistory = [];
var commandOptions = {};
var commandIndex = -1;
var statementHistory = [];
var statementIndex = -1;
var consoleInputHeight = 22;
var onBackCallback = null;
var blankPage = "about:blank";
var $results = $res = $r = null;
var consoleWelcome = "";
var consoleDocTitle = "w-cons";
var $d = {
  matches : {}
};

var longCommand = "";

var FB_API_KEY = "7e87cd99bc43b48649befa8f07beea32"; // API key for Facebook application                             
var FB_XD_REC = "http://zpoley.net/xd_receiver.html"; // Location of cross-domain receiver  

function resetCommandIndex() { commandIndex = -1; }
function resetStatementIndex() { statementIndex = -1; }

function setResults(results) {
  results.toString = function() {
    return($H(this).toPrettyJSON());
  }
  $results = $res = $r = results;
}

function fbLoggedIn() {
alert("logged in");
  var fb_user_id = FB.Connect.get_loggedInUser();
}
function fbLoggedOut() {
alert("logged out");
}


function loadFacebook() {
  FB_RequireFeatures(['XFBML'], function() {
    FB.init(FB_API_KEY, FB_XD_REC);
    FB.Connect.ifUserConnected(fbLoggedIn, fbLoggedOut);
  });
}

function onLoad() {
  consoleWelcome = $('monitor').innerHTML;
  onResize();
  setDocTitle(consoleDocTitle);
  Event.observe(window, 'resize', onResize);
  Event.observe(document.body, 'click', focusConsoleInput);
  Event.observe($('console-input'), 'keydown', onKey);
  clearConsoleInput();
//  loadFacebook();
}

function onResize() {
  $('monitor').setStyle({ height : (document.viewport.getHeight() - consoleInputHeight) + 'px' });
  $('i-monitor').setStyle({ height : (document.viewport.getHeight() - consoleInputHeight) + 'px' });
  $('page').setStyle({ height : (document.viewport.getHeight() - consoleInputHeight) + 'px' });
}

function onKey(e) {
  if (e.keyCode == 13) {
    if (mode == "passive") {
      processCommand();
      resetCommandIndex();
    }
    else if (mode == "interactive") {
      processStatement();
      resetStatementIndex();
    }
  }
  if (e.keyCode == 85 && e.ctrlKey) {
    // scroll up 
    window.scrollBy(0, -190);
  }
  if (e.keyCode == 68 && e.ctrlKey) {
    // scroll down
    window.scrollBy(0, 190);
  }
  if (e.keyCode == 38) {
    if (mode == "passive") {
      if (commands[commandIndex + 1]) {
        setConsoleInput(commands[++commandIndex]);
      }
    }
    else if (mode =="interactive") {
      if (statementHistory[statementIndex + 1]) {
        setConsoleInput(statementHistory[++statementIndex]);
      }
    }
  }
  if (e.keyCode == 40) {
    if (mode == "passive") {
      if (commands[commandIndex - 1]) {
        setConsoleInput(commands[--commandIndex]);
      }
      else { setConsoleInput(""); }
    }
    else if (mode == "interactive") {
      if (statementHistory[statementIndex - 1]) {
        setConsoleInput(statementHistory[--statementIndex]);
      }
      else { setConsoleInput(""); }
    }
  }
  if (e.keyCode == 9) {
    $A(commandHistory).each(function(c) {
      if (c.match($('console-input').value)) {
        $('console-input').value = c; 
        e.stop();
        throw $break;
      }
    });
  }
}

function setConsoleInput(input) {
  $('console-input').value = input;
}

function history() {

  $('monitor').innerHTML += "<br />Command history: <br /><br />";

  var commandCount = 0;

  $A(commandHistory).each(function(command) {
    $('monitor').innerHTML += "&nbsp;&nbsp;[" + (commandCount++) + "] " + command + "<br />";
  });
}

function enterInteractiveMode() {
  mode = "interactive";
  $('prompt').innerHTML = "$inter >>";
  showIMonitor();
}

function enterPassiveMode() {
  mode = "passive";
  $('prompt').innerHTML = "$w-cons~:";
  showMonitor();
}

function diggSearchCallback(value) {

  $('monitor').innerHTML += "<br />Digg results: <br /><br />";

  urls = {};
  var urlCounter = 0;

  setResults(value);

  $A(value.stories).each(function(result) {
    $('test').innerHTML += $H(result).toJSON();

    urls[urlCounter] = result.link;

    $('monitor').innerHTML += (result.thumbnail ? "<img src='" + result.thumbnail.src + "' />" : "") + result.title + " [" + (urlCounter++) + "] ";
    $('monitor').innerHTML += "<br /><div class='digg-result'>" + result.description + "<br /></div><br /><br />";
  });

  function back() {
    $('page').src = blankPage;
    showMonitor();
  }
  onBackCallback = back;
}

function googleFindFeedCallback(value) {

  $('monitor').innerHTML += "<br />Google Feed results for: " + terms + "<br /><br />";

  urls = {};
  var urlCounter = 0;

  setResults(value.responseData);

  $A(value.responseData.entries).each(function(result) {
    $('test').innerHTML += $H(result).toJSON();

    urls[urlCounter] = result.url;

    var contentSnippet = result.contentSnippet.replace(/<br>/, "");

    $('monitor').innerHTML += result.title + "[" + (urlCounter++) + "] ";
    $('monitor').innerHTML += "<br /><div class='google-result'>" + contentSnippet + "</div>";
    $('monitor').innerHTML += "<br /><div class='google-result'>" + result.url + "<br /></div><br /><br />";
  });

  function back() {
    $('page').src = blankPage;
    showMonitor();
  }
  onBackCallback = back;
}

function googleSearchCallback(value) {

  $('monitor').innerHTML += "<br />Google results for: " + terms + "<br /><br />";

  urls = {};
  var urlCounter = 0;

  setResults(value.responseData.results);

  $A(value.responseData.results).each(function(result) {
    $('test').innerHTML += $H(result).toJSON();

    urls[urlCounter] = result.url;

    $('monitor').innerHTML += "<div class='google-result-title'>" + result.title + "[" + (urlCounter++) + "]</div>";
    $('monitor').innerHTML += "<br /><div class='google-result'>" + result.url + "<br /></div><br /><br />"; //(cached) " + result.cacheUrl + "</div><br /><br />";
  });

  $('monitor').innerHTML += "<div class='google-result'>current page: " + value.responseData.cursor.currentPageIndex + "<br />estimated result count: " + value.responseData.cursor.estimatedResultCount + "</div>";

  if (commandOptions.first) {
    if (value.responseData && value.responseData.results && 
      value.responseData.results[0] && value.responseData.results[0].url) {
      $("page").contentWindow.location = value.responseData.results[0].url;
      showPage();
    }
  }

  function back() {
    $('page').src = blankPage;
    showMonitor();
  }
  onBackCallback = back;
}

function showPage() {
  $('page').onload = function() {
    $('console-input').focus();
  };
  $('page').show();
  $('monitor').hide();
}
function showMonitor() {
  $('page').hide();
  $('i-monitor').hide();
  $('monitor').show();
}
function showIMonitor() {
  $('page').hide();
  $('monitor').hide();
  $('i-monitor').show();
}
function twitterSearchCallback(value) {
  var mon = null;
  if (lastLinkPopulator == "t") {
    mon = $('monitor'); 
  }
  else if (lastLinkPopulator.match(/(gt|wtr)/)) {
    $('monitor').innerHTML += "<div id='monitor2'></div>"
    mon = $('monitor2');
  }
  else {
    mon = $('monitor');
  }

  mon.innerHTML += "<br />Twitter results for: " + terms + "<br /><br />";

  setResults(value);

  $A(value.results).each(function(result) {
    $('test').innerHTML += $H(result).toJSON();

    mon.innerHTML += "<div class='twitter-result-title'><a href='http://twitter.com/" + result.from_user + "'><img src='" + result.profile_image_url + "'/>@" + result.from_user + "</a>: (" + prettyDate(result.created_at) + ")</div>";

    var resultText = result.text.toString();
//alert("wtf is this: " + resultText.match(/^(((http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?))/i));
    if (resultText && (resultText =~ /^((http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?)/i)) {
//alert('it fin amthce');
    }

//    var matches = resultText.match(/^((http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?)/i);
//    $d.matches[resultText] = matches;

    mon.innerHTML += "<br /><div class='twitter-result'>" + result.text + "</div><br /><br />";
  });
}

function twitterTrendsCallback(value) {
  var mon = null;
  if (lastLinkPopulator.match(/(wtr|wtre)/)) {
    $('monitor').innerHTML += "<div id='monitor2'></div>"
    mon = $('monitor2');
  }
  else {
    mon = $('monitor');
  }

  mon.innerHTML += "<br />Twitter trends as of: " + value.as_of + "<br /><br />";

  urls = {};

  setResults(value);

  $A(value.trends).each(function(result) {
    $('test').innerHTML += $H(result).toJSON();

    urls[urlCounter] = result.url;
 
    mon.innerHTML += "<div class='twitter-result-title'><a href='" + result.url + "'>" + result.name + "</a> [" + (urlCounter++) + "]</div><br />";
  });

  function back() {
    $('page').src = blankPage;
    showMonitor();
  }
  onBackCallback = back;
}

function twitterLongTrendsCallback(value) {

  var mon = null;
  mon = $('monitor');
  mon.innerHTML += "<br />Twitter trends: <br /><br />";

  urls = {};
  var urlCounter = 0;

  setResults(value);

  for(var result in value.trends) {

    var newDiv = document.createElement('div');
    newDiv.className = "twitter-result-title";
    newDiv.innerHTML = result;
    mon.appendChild(newDiv);

    newDiv = document.createElement('div');
    newDiv.className = "twitter-trend";

    for(var i = 0; (i < value.trends[result].length); i++) {
      var trend = value.trends[result][i];

      urls[urlCounter] = "http://search.twitter.com/search?q=" + encodeURIComponent(trend.query);
  
      newDiv.innerHTML += "<span><a href='http://search.twitter.com/search?q=" + 
        trend.query + "'>" + trend.name + "</a>[" + (urlCounter++) + "], </span>";
    }

    mon.appendChild(newDiv);
    mon.appendChild(document.createElement('br'));
  }

  function back() {
    $('page').src = blankPage;
    showMonitor();
  }
  onBackCallback = back;
}

function whatTheTrendExplainedCallback(value) {
  var mon = null;
  mon = $('monitor');

  urls = {};
  urls[urlCounter++] = "http://www.whatthetrend.com";

  mon.innerHTML += "<br /><a href='http://www.whatthetrend.com'>www.WhattheTrend.com</a> <span class='color: #fff;'>[0]</span> explained trends:<br /><br />";

  setResults(value);

  var str = '';

  $A(value.api.trends.trend).each(function(result) {
    $('test').innerHTML += $H(result).toJSON();

    urls[urlCounter] = result.links.url;
 
    str = "<div class='wtr-result-title'><a href='" + result.links.url + "'>" + result.name + "</a> [" + (urlCounter++) + "]</div>";
    str += "<br /><div class='wtr-result'>" + 
      "first trend: <span class='wtr-time'>" + (prettyDate(result.dates.firstTrend) || result.dates.firstTrend.replace(/[TZ]/g, " ")) + "</span><br />" +
      "last trend: <span class='wtr-time'>" + (prettyDate(result.dates.lastTrend) || result.dates.lastTrend.replace(/[TZ]/g, " ")) + "</span><br /><div class='wtr-spacer'></div>" +
      result.blurb.text + "<br /></div><br />";

  });

  mon.innerHTML += str;

  function back() {
    $('page').src = blankPage;
    showMonitor();
  }
  onBackCallback = back;
}

function whatTheTrendAllCallback(value) {
  var mon = null;
  mon = $('monitor');

  urls = {};
  urls[urlCounter++] = "http://www.whatthetrend.com";

  mon.innerHTML = "<br /><a href='http://www.whatthetrend.com'>www.WhattheTrend.com</a> <span style='color: #fff;'>[0]</span> all trends:<br /><br />";

  setResults(value);

  $('test').innerHTML = '';

  var str = '';

  $A(value.api.trends.trend).each(function(result) {
    $('test').innerHTML += $H(result).toJSON();

    urls[urlCounter] = result.links.url;
 
    str += "<div class='wtr-result-title'><a href='" + result.links.url + "'>" + result.name + "</a> [" + (urlCounter++) + "]</div>";
    str += "<br /><div class='wtr-result'>" + 
      "first trend: <span class='wtr-time'>" + (prettyDate(result.dates.firstTrend) || result.dates.firstTrend.replace(/[TZ]/g, " ")) + "</span><br />" +
      "last trend: <span class='wtr-time'>" + (prettyDate(result.dates.lastTrend) || result.dates.lastTrend.replace(/[TZ]/g, " ")) + "</span><br /><div class='wtr-spacer'></div>" +
      result.blurb.text + "<br /></div><br />";

  });

  mon.innerHTML += str;

  function back() {
    $('page').src = blankPage;
    showMonitor();
  }
  onBackCallback = back;
}

function ipSearchCallback(result) {

  $('monitor').innerHTML += "IP results for: " + terms + "<br /><br />";

  $('monitor').innerHTML += "ip: " + result.Ip;
  $('monitor').innerHTML += "<br /><div class='ip-result'> status: " + result.Status + 
    "<br />country-code: " + result.CountryCode + 
    "<br />country-name: " + result.CountryName + 
    "<br />region-code: " + result.RegionCode + 
    "<br />region-name: " + result.RegionName + 
    "<br />city: " + result.City + 
    "<br />zip: " + result.ZipPostalCode + 
    "<br />lat: " + result.Latitude + 
    "<br />long: " + result.Longitude + "</div><br /><br />";
}

function clearUrls() {
  urls = {};
}

function processStatement() {

  var inp = $('console-input').value;

  if (inp.match(/^exit$/) || inp.match(/^quit$/) || inp.match(/^q$/)) {
    enterPassiveMode();
    clearConsoleInput();
    return;
  }
  else if (inp.match(/^clear$/)) {
    $('i-monitor').innerHTML = "";
    clearConsoleInput();
    return;
  }
  else if (inp.match(/\\$/)) {
    inp = inp.replace(/\\$/, "");
    longCommand += inp;
    $('i-monitor').innerHTML += inp + "<br />";
    clearConsoleInput();
    return;
  }

  if (!longCommand.blank()) {
    inp = longCommand + inp;
    longCommand = "";
  }

  var output = evalTS(inp);

  if (typeof(output) == 'undefined') {
    $('i-monitor').innerHTML += inp + "<br />";
  }
  else {
    $('i-monitor').innerHTML += output + "<br />";
  }

  if (!inp.match(/^history$/)) {
    statementHistory.unshift($('console-input').value);
  }

  clearConsoleInput();
}

function setDocTitle(docTitle) {
  window.document.title = docTitle;
}

function processCommand() {

  var inp = $('console-input').value;
  lastLinkPopulator = "";


  if (inp.match(/^reload$/) || inp.match(/^refresh$/)) {
    window.location = window.location;
    return;
  }
  else if (inp.match(/^back$/) || inp.match(/^b$/)) {
    if (onBackCallback) {
      setDocTitle(consoleDocTitle);
      onBackCallback();
      clearConsoleInput();
      return;
    }
  }
  else if (inp.match(/help/) || inp.match(/\?/)) {
    $('monitor').innerHTML = $('help').innerHTML;
    showMonitor();
    clearConsoleInput();
    return;
  }
  else if (inp.match(/^\d+$/)) {
    var matches = $A(inp.match(/(\d+)/));
    matches.shift();
    var docTitle = null;
    switch(lastLinkPopulator) {
      case "g" :
        if (urls[matches.first()]) {
          $("page").contentWindow.location = docTitle = urls[matches.first()];
          showPage();
          clearConsoleInput();
          setDocTitle(docTitle);
          return;
        }
        break;
      case "history" :
        if (commandHistory[matches.first()]) {
          $('console-input').value = docTitle = commandHistory[matches.first()];
          processCommand();
          setDocTitle(docTitle);
          return;
        }
        break;
      default:
        if (urls[matches.first()]) {
          $("page").contentWindow.location = docTitle = urls[matches.first()];
          showPage();
          clearConsoleInput();
          setDocTitle(docTitle);
          return;
        }
        break;
    }
  }
  else if (inp.match(/^i$/) || inp.match(/^interactive$/)) {
    enterInteractiveMode(); 
    clearConsoleInput();
    return;
  }

  clearMonitor();
  clearCommandOptions();

  if (inp.match(/^ip (.*)/)) {
    var matches = $A(inp.match(/^ip (.*)/));
    matches.shift();
    terms = matches.first();
    var url = "http://iplocationtools.com/ip_query.php?output=json&callback=ipSearchCallback&ip=" + matches.first();
    loadJSONDoc(url,"");
    showMonitor();
  }
  else if (inp.match(/^(clear|c)$/i)) {
    showMonitor();
  }
  else if (inp.match(/date/)) {
    $('monitor').innerHTML = "<br />Date:<br /><br />&nbsp;&nbsp;" + Date();
    showMonitor();
  }
  else if (inp.match(/^history$/) || inp.match(/^h$/)) {
    if (mode == "passive") {
      lastLinkPopulator = "history";
      history();
    }
    showMonitor();
  }
  else if (inp.match(/^gt (.*)/)) {
    var matches = $A(inp.match(/gt (.*)/));
    matches.shift();
    terms = matches.first();

    var url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&callback=googleSearchCallback&q=" + matches.first();
    loadJSONDoc(url,"");

    var url = "http://search.twitter.com/search.json?callback=twitterSearchCallback&q=" + matches.first();
    loadJSONDoc(url,"");

    lastLinkPopulator = "gt";
    showMonitor();
  }
  else if (inp.match(/^t (.*)/)) {
    var matches = $A(inp.match(/t (.*)/));
    matches.shift();
    terms = matches.first();
    var url = "http://search.twitter.com/search.json?callback=twitterSearchCallback&q=" + matches.first();
    loadJSONDoc(url,"");
    showMonitor();
  }
  else if (inp.match(/^(tr|trends)$/)) {
    urlCounter = 0;
    var url = "http://search.twitter.com/trends.json?callback=twitterTrendsCallback";
    loadJSONDoc(url,"");
    showMonitor();
  }
  else if (inp.match(/^(trd|trends daily|tr daily)$/)) {
    var url = "http://search.twitter.com/trends/daily.json?callback=twitterLongTrendsCallback";
    loadJSONDoc(url,"");
    showMonitor();
  }
  else if (inp.match(/^(trw|trends weekly|tr weekly)$/)) {
    var url = "http://search.twitter.com/trends/weekly.json?callback=twitterLongTrendsCallback";
    loadJSONDoc(url,"");
    showMonitor();
  }
  else if (inp.match(/^(whatthetrendall|wttra|wtra|wtr)$/)) {
    urlCounter = 0;

    var url = "http://www.whatthetrend.com/api/trend/listAll/jsonp/callback=whatTheTrendAllCallback";
    loadJSONDoc(url,"");

    url = "http://search.twitter.com/trends.json?callback=twitterTrendsCallback";
    loadJSONDoc(url,"");

    lastLinkPopulator = "wtr"; 
    showMonitor();
  }
  else if (inp.match(/^(whatthetrendex|wttre|wtre)$/)) {
    urlCounter = 0;

    var url = "http://www.whatthetrend.com/api/trend/listExplained/jsonp/callback=whatTheTrendExplainedCallback";
    loadJSONDoc(url,"");

    url = "http://search.twitter.com/trends.json?callback=twitterTrendsCallback";
    loadJSONDoc(url,"");

    lastLinkPopulator = "wtre"; 
    showMonitor();
  }
  else if (inp.match(/^ff (.*)/)) {
    var matches = $A(inp.match(/^ff (.*)/));
    matches.shift();
    terms = matches.first();

    var url = "http://ajax.googleapis.com/ajax/services/feed/find?v=1.0&callback=googleFindFeedCallback&q=" + matches.first();
    loadJSONDoc(url,"");

    lastLinkPopulator = "g";
    showMonitor();
  }
  else if (inp.match(/^gf (.*)/)) {
    var matches = $A(inp.match(/^gf (.*)/));
    matches.shift();
    terms = matches.first();

    var url = "http://ajax.googleapis.com/ajax/services/feed/find?v=1.0&callback=googleFindFeedCallback&q=" + matches.first();
    loadJSONDoc(url,"");

    lastLinkPopulator = "g";
    showMonitor();
  }
  else if (inp.match(/^(digg p|diggp|digp|dp)$/)) {
    var url = "http://services.digg.com/stories/popular?type=javascript&callback=diggSearchCallback&appkey=http://zpoley.net";
    loadJSONDoc(url,"");

    lastLinkPopulator = "digg";
    showMonitor();
  }
  else if (inp.match(/^(digg u|diggu|digu|du)$/)) {
    var url = "http://services.digg.com/stories/upcoming?type=javascript&callback=diggSearchCallback&appkey=http://zpoley.net";
    loadJSONDoc(url,"");

    lastLinkPopulator = "digg";
    showMonitor();
  }
  else if (inp.match(/^(digg h|diggh|digh|dh)$/)) {
    var url = "http://services.digg.com/stories/hot?type=javascript&callback=diggSearchCallback&appkey=http://zpoley.net";
    loadJSONDoc(url,"");

    lastLinkPopulator = "digg";
    showMonitor();
  }
  else if (inp.match(/^(digg t|diggt|digt|dt)$/)) {
    var url = "http://services.digg.com/stories/top?type=javascript&callback=diggSearchCallback&appkey=http://zpoley.net";
    loadJSONDoc(url,"");

    lastLinkPopulator = "digg";
    showMonitor();
  }
  else if (inp.match(/^map (.*)/)) {
    var matches = $A(inp.match(/^map (.*)/));
    matches.shift();
    terms = matches.first();

    var url = "http://maps.google.com/?q=" + matches.first();
    $('page').contentWindow.location = url;
    showPage();
  }
  else if (inp.match(/^g (.*)/)) {
    if (inp.match(/\-f/)) {
      inp = inp.replace(/\-f/, ""); 
      commandOptions.first = true;
    }

    var matches = $A(inp.match(/^g (.*)/));
    matches.shift();
    terms = matches.first();

    var url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&callback=googleSearchCallback&q=" + matches.first();
    loadJSONDoc(url,"");

    lastLinkPopulator = "g";
    showMonitor();
  }
  else if (inp.match(/^tpb (.*)/)) {
    var matches = $A(inp.match(/^tpb (.*)/));
    matches.shift();

    var url = "http://thepiratebay.org/search/" + matches.first() + "/0/99/0";
    $('page').contentWindow.location = url;
    showPage();
  }
  else if (inp.match(/^gg (.*)/) || inp.match(/^google (.*)/)) {

    var matches = [];
    if (inp.match(/^gg (.*)/)) {
      matches = $A(inp.match(/^gg (.*)/));
    }
    else if (inp.match(/^google (.*)/)) {
      matches = $A(inp.match(/^google (.*)/));
    }

    matches.shift();
    terms = matches.first();

    var url = "http://www.google.com/#hl=en&btnG=Google+Search&aq=0&oq=wh&q=" + matches.first();
    $('page').contentWindow.location = url;
    showPage();
  }
  else if (inp.match(/^(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?$/i)) {
    var url = "";
    if (inp.match(/^(http|https|ftp)/)) {
      $('console-input').value;
    }
    else {
      url = "http://" + $('console-input').value;
    }

    $('page').contentWindow.location = url;
    showPage();
  }
  else if (inp.match(/^(reload|r)$/)) {
    $('monitor').innerHTML += consoleWelcome;
  }
  else if (!inp.match(/^(\d+)$/)) {
    $('monitor').innerHTML += "<br /><br />Sorry! Didn't recognize that command: " + inp;
    clearConsoleInput();
    return;
  }

  if (!inp.match(/^history$/) && !inp.match(/^h$/) && !inp.match(/^\?%/) & !inp.empty()) {
    commands.unshift($('console-input').value);
    commandHistory.push($('console-input').value);
  }

  clearConsoleInput();
}

function focusConsoleInput() {
  $('console-input').focus();
}

function clearConsoleInput() {
  $('console-input').value = "";
  focusConsoleInput();
}

function clearMonitor() {
  $('monitor').innerHTML = "";
  $('page').src = blankPage;
  $('page').hide();
}

function clearCommandOptions() {
  commandOptions = {};
}

function prettyDate(time){
  var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")),
  diff = (((new Date()).getTime() - date.getTime()) / 1000),
   day_diff = Math.floor(diff / 86400);

  if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 )
    return;
  
  return day_diff == 0 && (
    diff < 60 && "just now" ||
    diff < 120 && "1 minute ago" ||
    diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
    diff < 7200 && "1 hour ago" ||
    diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
      day_diff == 1 && "Yesterday" ||
      day_diff < 7 && day_diff + " days ago" ||
      day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
}

function loadJSONDoc(url, content, id) {
  var head = document.getElementsByTagName('head').item(0);
  var old  = document.getElementById(id || 'lastLoadedCmds');
  if (old) {
    try { head.removeChild(old); } catch(ex) {}
    if (Prototype.Browser.isIE6) {
      var bases = document.getElementsByTagName('base');
      for( var i = 0; (i < bases.length); i++) {
        try { base.item(i).removeChild(old); } catch(ex) {}
      }
    }
  }
  var script = document.createElement('script');
  script.src = url + ((content.length > 0) ? "?" + content : '');
  script.type = 'text/javascript';
  script.defer = true;
  script.id = id || 'lastLoadedCmds';
  void(head.appendChild(script));
}

// terminal scope
(function () {

  window.evalTS = function(str) {
    try { 
      return(eval(str));
    }
    catch(ex) {
      return(ex.message);
    }
  };

})();

Object.toString = function() {
alert("here?" + typeof(this));
  if (typeof(this) == "Object") {
    $H(this).toJSON();
  }
};

Object.valueOf = function() {
alert("here?" + typeof(this));
  if (typeof(this) == "Object") {
    $H(this).toJSON();
  }
};

Prototype.JSONIndent = '&nbsp;&nbsp;';

Object.extend(Object, {
  toPrettyJSON : function(object) {
    var type = typeof object;
    switch (type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }

    if (object === null) return 'null';
    if (object.toPrettyJSON) return object.toPrettyJSON();
    if (Object.isElement(object)) return;

    var results = [];
    var indent = Prototype.JSONIndent;

    for (var property in object) {
      var value = Object.toPrettyJSON(object[property]);
      if (!Object.isUndefined(value))
        results.push(property.toPrettyJSON() + ': ' + (value.replace(/^\s*/, '')));  
    }

    return indent + '{<br />' + indent + results.join(',<br />' + indent) + '<br />' + indent + '}'; 
  }
});

Object.extend(Number.prototype, {
  toPrettyJSON: function() {
    return isFinite(this) ? this.toString() : 'null';
  }
});


Object.extend(String.prototype, {
  toPrettyJSON: function() {
    return this.inspect(true);
  }
});

Object.extend(Array.prototype, {
 toPrettyJSON: function() { 
   var results = []; 
   var indent = Prototype.JSONIndent; 
   this.each(function(object) { 
     var value = Object.toPrettyJSON(object); 
     if (!Object.isUndefined(value)) results.push(value.replace(/^\s*/, '')); 
   }); 
   return indent  + '[<br />' + indent + results.join(',<br />' + indent) + '<br />' + indent + ']'; 
  } 
});


Hash.addMethods({
  toPrettyJSON : function() {
    return Object.toPrettyJSON(this.toObject());   
  }
});

