text: window.html2canvas = function(elements, opts) {
    elements = (elements.length) ? elements : [elements];
    var queue,
    canvas,
    options = {
      // general
      logging: false,
      elements: elements,
      background: "#fff",
  
      // preload options
      proxy: null,
      timeout: 0,    // no timeout
      useCORS: false, // try to load images as CORS (where available), before falling back to proxy
      allowTaint: false, // whether to allow images to taint the canvas, won't need proxy if set to true
  
      // parse options
      svgRendering: false, // use svg powered rendering where available (FF11+)
      ignoreElements: "IFRAME|OBJECT|PARAM",
      useOverflow: true,
      letterRendering: false,
      chinese: false,
  
      // render options
  
      width: null,
      height: null,
      taintTest: true, // do a taint test with all images before applying to canvas
      renderer: "Canvas",
      imageType: 'png'
    };
  
    options = _html2canvas.Util.Extend(opts, options);
  
    _html2canvas.logging = options.logging;
    options.complete = function( images ) {
  
      if (typeof options.onpreloaded === "function") {
        if ( options.onpreloaded( images ) === false ) {
          return;
        }
      }
      queue = _html2canvas.Parse( images, options );
  
      if (typeof options.onparsed === "function") {
        if ( options.onparsed( queue ) === false ) {
          return;
        }
      }
  
      canvas = _html2canvas.Renderer( queue, options );
  
      if (typeof options.onrendered === "function") {
        
        if (options.imageType) {
          var _imageType = "image/";
          switch(options.imageType) {
            case "jpg":
            case "jpeg":
              _imageType += "jpeg";
              break;
            default:
              _imageType += "png"; 
              break;
          }
          
          var image = canvas.toDataURL(_imageType);
          options.onrendered( image );
        } else {
          options.onrendered( canvas );
        }
        
      }
  
  
    };
  
    // for pages without images, we still want this to be async, i.e. return methods before executing
    window.setTimeout( function(){
      _html2canvas.Preload( options );
    }, 0 );
  
    return {
      render: function( queue, opts ) {
        return _html2canvas.Renderer( queue, _html2canvas.Util.Extend(opts, options) );
      },
      parse: function( images, opts ) {
        return _html2canvas.Parse( images, _html2canvas.Util.Extend(opts, options) );
      },
      preload: function( opts ) {
        return _html2canvas.Preload( _html2canvas.Util.Extend(opts, options) );
      },
      log: h2clog
    };
  };
  
  window.html2canvas.log = h2clog; // for renderers
  window.html2canvas.Renderer = {
    Canvas: undefined // We are assuming this will be used
  };