require 'opal'
require 'console'; def console; $console; end

require 'dxopal/constants/colors'
require 'dxopal/font'
require 'dxopal/input'
require 'dxopal/input/key_codes'
require 'dxopal/image'
require 'dxopal/sound'
require 'dxopal/sound_effect'
require 'dxopal/sprite'
require 'dxopal/window'
require 'dxopal/version'
# Enable runtime compilation of Opal code (so that you can make games
# without even install Ruby)
require 'opal-parser'

# Patch to opal-parser
def require_remote(url)
  %x{
    var r = new XMLHttpRequest();
    r.overrideMimeType("text/plain"); // Patch for Firefox + file://
    r.open("GET", url, false);
    r.send('');
  }
  eval `r.responseText`
end

# These libraries will be included in dxopal.js:
require 'pp'

module DXOpal
  include DXOpal::Constants::Colors
  include DXOpal::Input::KeyCodes
  include DXOpal::Input::MouseCodes
  include DXOpal::SoundEffect::WaveTypes

  # Call block and dump backtrace if an exception is raised.
  # Nothing is shown if a tag with `id='dxopal-errors'` does not exist
  def self.dump_error(&block)
    block.call
  rescue Exception => ex
    div = `document.getElementById('dxopal-errors')`
    if `div && !ex.DXOpalPrinted`
      %x{
        div.textContent = "ERROR: " + #{ex.class.name};
        var ul = document.createElement('ul');
        // Note: ex.backtrace may be an Array or a String
        #{Array(ex.backtrace)}.forEach(function(line){
          var li = document.createElement('li');
          li.textContent = line;
          ul.appendChild(li);
        });
        div.appendChild(ul);
        ex.DXOpalPrinted = true;
      }
    end
    raise ex
  end

  # Like `Kernel.p`, but prints only limited times for each `key`
  # This is useful for debugging your game without flooding the
  # developer console.
  #
  # Example:
  #   p_ player_x: @player.x
  #   p_({player_x: @player.x}, 20)
  P_CT = Hash.new{|h, k| h[k] = 0}
  def p_(hash, n=10)
    key = hash.keys.sort.join
    return if P_CT[key] >= n
    `console.log(#{hash.inspect})`
    P_CT[key] += 1
  end
end

%x{
  // Like `console.log`, but prints only limited times.
  // Example:
  //   Opal.DXOpal.p_("player", player)
  (function(){
    var P_CT = {};
    Opal.DXOpal.p_ = function(key, obj, n) {
      n = (n || 10);
      P_CT[key] = (P_CT[key] || 0);
      if (P_CT[key] < n) {
        console.log(key, obj);
        P_CT[key] += 1;
      }
    };
  })();
}

# `require 'dxopal'` will automatically import names like `Window` to the
# toplevel (as `require 'dxruby'` does)
include DXOpal