// Installs the script by immediately appending a script tag to the body head
// with the src set, to get the script contents. The script contents are then
// installed into a script tag which is added to the install location (because
// the script contents will be wrapped in a call to onScriptDownloaded()).
function installScript(filename) {
  // Provides the setupWaitForBodyLoad() function
  __WAIT_FOR_BODY_LOADED__

  function installCode(code) {
     function removeScript(body, element) {
      // Unless we're in pretty mode, remove the tags to shrink the DOM a little.
      // It should have installed its code immediately after being added.

      __START_OBFUSCATED_ONLY__
	  body.removeChild(element);
      __END_OBFUSCATED_ONLY__
    }

    var doc = getInstallLocationDoc();
    var docbody = doc.body;
    var script;
    // for sourcemaps, we inject textNodes into the script element on Chrome
    if (navigator.userAgent.indexOf("Chrome") > -1 && window.JSON) {
      var scriptFrag = doc.createDocumentFragment()
      // surround code with eval until crbug #90707 
      scriptFrag.appendChild(doc.createTextNode("eval(\""));
      for (var i = 0; i < code.length; i++) {
        // escape newlines, backslashes, and quotes with JSON.stringify
        // rather than create multiple script tags which mess up line numbers, we use 1 tag, multiple text nodes
        var c = window.JSON.stringify(code[i]); 
        // trim beginning/end quotes
        scriptFrag.appendChild(doc.createTextNode(c.substring(1, c.length - 1)));
      }
      // close the eval
      scriptFrag.appendChild(doc.createTextNode("\");"));
      script = doc.createElement('script');
      script.language='javascript';
      script.appendChild(scriptFrag);
      docbody.appendChild(script);
      removeScript(docbody, script);
    } else {
      for (var i = 0; i < code.length; i++) {
        script = doc.createElement('script');
        script.language='javascript';
        script.text = code[i];
        docbody.appendChild(script);
        removeScript(docbody, script);
      }
    }
  }

  // Set up a script tag to start downloading immediately, as well as a
  // callback to install the code once it is downloaded and the body is loaded.
  __MODULE_FUNC__.onScriptDownloaded = function(code) {
    setupWaitForBodyLoad(function() {
      installCode(code);
    });
  };
  sendStats('moduleStartup', 'moduleRequested');
  var script = $doc.createElement('script');
  script.src = filename;
  if (__MODULE_FUNC__.__errFn) {
    script.onerror = function() {
      __MODULE_FUNC__.__errFn('__MODULE_FUNC__', new Error("Failed to load " + code));
    }
  }
  $doc.getElementsByTagName('head')[0].appendChild(script);
}
