var LOADING_JS_FILES = new Array();

// Can require both javascript and css files.
function require(url, onLoadCallback) {
  if (!window.includedJsUrls) {
    window.includedJsUrls = new Array();
  }
  if (includedJsUrls[url]) {
    _executeRequireCallback(onLoadCallback, url);
    return;
  }

  var newNode, isJsFile = true;
  if (url.match(/\.css$/i)) { // It's a css file
    isJsFile = false;
    newNode = document.createElement("link");
    newNode.setAttribute( "rel",  "stylesheet" );
    newNode.setAttribute( "type", "text/css"   );
    newNode.setAttribute( "href", url          );
  }
  else { // Let's just assume it's a javascript file
    LOADING_JS_FILES[url] = true;
    var newNode = document.createElement("script");
    newNode.setAttribute( "type", "text/javascript" );
    newNode.setAttribute( "src",  url               );
  }
  document.getElementsByTagName("head").item(0).appendChild(newNode);
  if (isJsFile) { // Firefox doesn't fire any of these events when a css file is included, so there's no way to know the exact time it was included in those cases.
    newNode.onreadystatechange = function() { // IE
      if (newNode.readyState === "complete" || newNode.readyState === "loaded") {
        delete LOADING_JS_FILES[url];
        _executeRequireCallback(onLoadCallback, url);
      }
    };
    newNode.onload = function() { // Firefox
      delete LOADING_JS_FILES[url];
      _executeRequireCallback(onLoadCallback, url);
    }
  }
  includedJsUrls[url] = true;
}

function hasBeenRequired(url) {
  return includedJsUrls[url];
}

function _executeRequireCallback(onLoadCallback, url) {
  if (onLoadCallback) {
    onLoadCallback.call(this, url);
  }
}

function allRequiredJsFilesLoaded() {
  var count = 0;
  for (var key in LOADING_JS_FILES) {
    return false;
  }
  return true;
}

