whole_func_string: function init() {
          if (api.initialized) {
              return;
          }
          var testRange;
          var implementsDomRange = false, implementsTextRange = false;
  
          // First, perform basic feature tests
  
          if (isHostMethod(document, "createRange")) {
              testRange = document.createRange();
              if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {
                  implementsDomRange = true;
              }
              testRange.detach();
          }
  
          var body = isHostObject(document, "body") ? document.body : document.getElementsByTagName("body")[0];
  
          if (body && isHostMethod(body, "createTextRange")) {
              testRange = body.createTextRange();
              if (isTextRange(testRange)) {
                  implementsTextRange = true;
              }
          }
  
          if (!implementsDomRange && !implementsTextRange) {
              fail("Neither Range nor TextRange are implemented");
          }
  
          api.initialized = true;
          api.features = {
              implementsDomRange: implementsDomRange,
              implementsTextRange: implementsTextRange
          };
  
          // Initialize modules and call init listeners
          var allListeners = moduleInitializers.concat(initListeners);
          for (var i = 0, len = allListeners.length; i < len; ++i) {
              try {
                  allListeners[i](api);
              } catch (ex) {
                  if (isHostObject(window, "console") && isHostMethod(window.console, "log")) {
                      window.console.log("Init listener threw an exception. Continuing.", ex);
                  }
  
              }
          }
      }
func_code_string: function init() {
          if (api.initialized) {
              return;
          }
          var testRange;
          var implementsDomRange = false, implementsTextRange = false;
  
          // First, perform basic feature tests
  
          if (isHostMethod(document, "createRange")) {
              testRange = document.createRange();
              if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {
                  implementsDomRange = true;
              }
              testRange.detach();
          }
  
          var body = isHostObject(document, "body") ? document.body : document.getElementsByTagName("body")[0];
  
          if (body && isHostMethod(body, "createTextRange")) {
              testRange = body.createTextRange();
              if (isTextRange(testRange)) {
                  implementsTextRange = true;
              }
          }
  
          if (!implementsDomRange && !implementsTextRange) {
              fail("Neither Range nor TextRange are implemented");
          }
  
          api.initialized = true;
          api.features = {
              implementsDomRange: implementsDomRange,
              implementsTextRange: implementsTextRange
          };
  
          // Initialize modules and call init listeners
          var allListeners = moduleInitializers.concat(initListeners);
          for (var i = 0, len = allListeners.length; i < len; ++i) {
              try {
                  allListeners[i](api);
              } catch (ex) {
                  if (isHostObject(window, "console") && isHostMethod(window.console, "log")) {
                      window.console.log("Init listener threw an exception. Continuing.", ex);
                  }
  
              }
          }
      }
func_documentation_string: Initialization