(function() {
  function detectVersion() {
    if (! Array.prototype.indexOf) {
      return "1.6";
    }

    if (! Array.prototype.reduce) {
      return "1.8";
    }

    if (! String.prototype.trim) {
      return "1.8.1";
    }

    return "top";
  }

  function getLoaderScript(doc, html) {
    var scripts = doc.scripts || html.getElementsByTagName("script");

    return scripts[scripts.length - 1];
  }

  var doc = document;
  var html = doc.documentElement;

  var loader = getLoaderScript(doc, html);
  var src = loader.getAttribute("src");
  var settings = new Function("", loader.innerHTML).call() || {};

  var path   = src.split("/").slice(0, -1).join("/") + "/" + detectVersion();
  var source = path + "/elf.js?rev=" + (settings.jcore || 0);

  var userAgent = navigator.userAgent.toLowerCase();
  var isSupported = (/gecko/).test(userAgent) && ! (/compatible|webkit/).test(userAgent) || typeof opera != "undefined";

  if (isSupported) {
    var script = doc.createElement("script");

    script.src     = source;
    script.charset = "UTF-8";
    script.type    = "text/javascript";
    script.onload = function() {
      this.parentNode.removeChild(this);
    };

    var head = html.firstChild;

    script.settings = settings;

    head.insertBefore(script, head.firstChild);

    head.removeChild(loader);
  } else {
    loader.settings = settings;

    doc.write("<script type='text/javascript' charset='UTF-8' src='" + source + "'><\/sc" + "ript>");
  }
})();
