title: JavaScript error: "is not a function"
body: <p>It looks like "$smth is not a function" is a very common problem with JavaScript, yet after looking through quite a few threads I still cannot understand what is causing it in my case.</p>
  
  <p>I have a custom object, defined as: </p>
  
  <pre><code>function Scorm_API_12() {
  var Initialized = false;
  
  function LMSInitialize(param) {
      errorCode = "0";
      if (param == "") {
          if (!Initialized) {
              Initialized = true;
              errorCode = "0";
              return "true";
          } else {
              errorCode = "101";
          }
      } else {
          errorCode = "201";
      }
      return "false";
  }
  
  // some more functions, omitted.
  }
  
  var API = new Scorm_API_12();
  </code></pre>
  
  <p>Then in a different script I am trying to use this API in the following way:</p>
  
  <pre><code>var API = null;
  
  function ScormProcessInitialize(){
      var result;
  
      API = getAPI();
  
      if (API == null){
          alert("ERROR - Could not establish a connection with the API.");
          return;
      }
  
      // and here the dreaded error pops up
      result = API.LMSInitialize("");
  
      // more code, omitted
      initialized = true;
  }
  </code></pre>
  
  <p>The getAPI() stuff, looks like this:</p>
  
  <pre><code>var findAPITries = 0;
  
  function findAPI(win)
  {
     // Check to see if the window (win) contains the API
     // if the window (win) does not contain the API and
     // the window (win) has a parent window and the parent window
     // is not the same as the window (win)
     while ( (win.API == null) &amp;&amp;
             (win.parent != null) &amp;&amp;
             (win.parent != win) )
     {
        // increment the number of findAPITries
        findAPITries++;
  
        // Note: 7 is an arbitrary number, but should be more than sufficient
        if (findAPITries &gt; 7)
        {
           alert("Error finding API -- too deeply nested.");
           return null;
        }
  
        // set the variable that represents the window being
        // being searched to be the parent of the current window
        // then search for the API again
        win = win.parent;
     }
     return win.API;
  }
  
  function getAPI()
  {
     // start by looking for the API in the current window
     var theAPI = findAPI(window);
  
     // if the API is null (could not be found in the current window)
     // and the current window has an opener window
     if ( (theAPI == null) &amp;&amp;
          (window.opener != null) &amp;&amp;
          (typeof(window.opener) != "undefined") )
     {
        // try to find the API in the current window�s opener
        theAPI = findAPI(window.opener);
     }
     // if the API has not been found
     if (theAPI == null)
     {
        // Alert the user that the API Adapter could not be found
        alert("Unable to find an API adapter");
     }
     return theAPI;
  }
  </code></pre>
  
  <p>Now, the API is <em>probably</em> found, because I do not get the "Unable to find..." message, the code proceeds to try to initialize it. But firebug tells me <code>API.LMSInitialize is not a function</code>, and if I try to debug it with <code>alert(Object.getOwnPropertyNames(API));</code>, it gives me a blank alert.</p>
  
  <p>What am I missing?</p>