/*******************************************************************************
**
** Concurrent Technologies Corporation (CTC) grants you ("Licensee") a non-
** exclusive, royalty free, license to use, modify and redistribute this
** software in source and binary code form, provided that i) this copyright
** notice and license appear on all copies of the software; and ii) Licensee does
** not utilize the software in a manner which is disparaging to CTC.
**
** This software is provided "AS IS," without a warranty of any kind.  ALL
** EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
** IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-
** INFRINGEMENT, ARE HEREBY EXCLUDED.  CTC AND ITS LICENSORS SHALL NOT BE LIABLE
** FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
** DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL CTC  OR ITS
** LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
** INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
** CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
** OR INABILITY TO USE SOFTWARE, EVEN IF CTC  HAS BEEN ADVISED OF THE POSSIBILITY
** OF SUCH DAMAGES.
**
*******************************************************************************/

/*********************************************************************
  Modifications copyright (C) 2003 by Macromedia, Inc.
  All rights reserved
**********************/


var _Debug = false;  // set this to false to turn debugging off

// Define exception/error codes
var _NoError = 0;
var _GeneralException = 101; 
var _InvalidArgumentError = 201;
var _NotInitialized = 301;
var _NotImplementedError = 401;


// local variable definitions
var apiHandle = null;



function LMSInitialize() 
{
   var api = getAPIHandle();
   if (api == null)   {
      alert("LMSInitialize failed (unable to locate the SCORM adapter).\n\nNo results will be tracked.");
      return false;
   }

   // call the LMSInitialize function that should be implemented by the API
   var initResult = api.LMSInitialize("");

   if (initResult.toString() != "1")   {
      // LMSInitialize did not complete successfully.

      var err = ErrorHandler();
   }

   return initResult;
   
} 

function LMSFinish()
{
   var api = getAPIHandle();
   if (api == null) {
      window.status = "LMSFinish failed.";
   } else  {
      // call the LMSInitialize function that should be implemented by the API
      api.LMSFinish("");
      var err = ErrorHandler();
   }   
   return;
   
} 

function LMSGetValue(name)
{
   var api = getAPIHandle();
   if (api == null)   {
      window.status = "LMSGetValue failed.";
      return null;
   }   else   {
      var value = api.LMSGetValue(name);
      var err = ErrorHandler();
      // if an error was encountered, then return null, 
      // else return the retrieved value
      if (err != _NoError)
      {
         return null;
      }
      else
      {
         return value.toString();
      }
   }   
}

function LMSSetValue(name, value) {
   var api = getAPIHandle();
   if (api == null)   {
      window.status = "LMSSetValue failed.";
   }   else   {
      api.LMSSetValue(name, value);
      var err = ErrorHandler();
   }   
   return;
}

function LMSCommit(){
   var api = getAPIHandle();
   if (api == null)   {
      window.status = "LMSCommit failed.";
   } else   {
      // call the LMSInitialize function that should be implemented by the API
      api.LMSCommit("");
      var err = ErrorHandler();
   }   
   return;
   
} 

function LMSGetLastError() {
   var api = getAPIHandle();
   if (api == null)   {
      window.status = ("LMSGetLastError failed.");
      //since we can't get the error code from the LMS, return a general error
      return _GeneralError;
   }
   return api.LMSGetLastError().toString();
} 

function LMSGetErrorString(errorCode) {
   var api = getAPIHandle();
   if (api == null)   {
      window.status="LMSGetErrorString failed.";
   } else {
	   return api.LMSGetErrorString(errorCode).toString(); 
   }
   
} 

function LMSGetDiagnostic(errorCode) {
   var api = getAPIHandle();
   if (api == null)   {
      window.status ="LMSGetDiagnostic failed.";
   } else {
      return api.LMSGetDiagnostic(errorCode).toString();
   }
   
} 

function LMSIsInitialized(){
   // there is no direct method for determining if the LMS API is initialized
   // for example an LMSIsInitialized function defined on the API so we'll try
   // a simple LMSGetValue and trap for the LMS Not Initialized Error
   
   var api = getAPIHandle();
   if (api == null)   {
      window.status = "LMSIsInitialized() failed.";
      // no choice but to return false.
      return false;
   }    else   {
      var value = api.LMSGetValue("cmi.core.student_name");
      var errCode = api.LMSGetLastError().toString();
      if (errCode == _NotInitialized) {
           return false;
      } else {
         return true;
      }
   }   
}

function ErrorHandler() {
   var api = getAPIHandle();
   if (api == null)   {
      window.status = "Failed to determine LMS error code.";
      return;
   }

   // check for errors caused by or from the LMS
   var errCode = api.LMSGetLastError().toString();
   if (errCode != _NoError)   {
      // an error was encountered so display the error description
      var errDescription = api.LMSGetErrorString(errCode);
      
      if (_Debug == true)      {
         errDescription += "\n";
         errDescription += api.LMSGetDiagnostic(null);
         // by passing null to LMSGetDiagnostic, we get any available diagnostics
         // on the previous error.
	 alert(errDescription);
      }
   }

   return errCode;
}

function getAPIHandle() {
   if (apiHandle == null)   {
      apiHandle = getAPI();
   } 
   return apiHandle;
}


function findAPI(win) {


   if (_Debug)
   {
      alert("win is: "+win.location.href);
   }


   if (win.API != null)
   {
      if (_Debug)
      {
         alert("found api in this window");
      }
      return win.API;
   }

   if (win.length > 0)  // does the window have frames?
   {
      if (_Debug)
      {
         alert("looking for api in windows frames");
      }

      for (var i=0;i<win.length;i++)
      {

         if (_Debug)
         {
            alert("looking for api in frames["+i+"]");
         }
         var theAPI = findAPI(win.frames[i]);
         if (theAPI != null)
         {
            return theAPI;
         }
      }
   }

   if (_Debug)
   {
      alert("didn't find api in this window (or its children)");
   }
   return null;

}



function getAPI(){

   // start at the topmost window - findAPI will recurse down through
   // all of the child frames
   var theAPI = findAPI(this.top);

   if (theAPI == null)
   {
      // the API wasn't found in the current window's hierarchy.  If the
      // current window has an opener (was launched by another window),
      // check the opener's window hierarchy. 
      if (_Debug)
      {
         alert("checking to see if this window has an opener");
         alert("window.opener typeof is> "+typeof(window.opener));
      }

      if (typeof(this.opener) != "undefined")
      {
         if (_Debug)
         {
            alert("checking this windows opener");
         }
         if (this.opener != null)
         {
            if (_Debug)
            {
               alert("this windows opener is NOT null - looking there");
            }
            theAPI = findAPI(this.opener.top);
         }
         else
         {
            if (_Debug)
            {
               alert("this windows opener is null");
            }
         }
      }
   }

   return theAPI;
}



