
var _Debug = false; // set this to false to turn debugging off
// and get rid of those annoying alert boxes.

// Define exception/error codes
var _NoError = 0;
var _GeneralException = 101;
var _ServerBusy = 102;
var _InvalidArgumentError = 201;
var _ElementCannotHaveChildren = 202;
var _ElementIsNotAnArray = 203;
var _NotInitialized = 301;
var _NotImplementedError = 401;
var _InvalidSetValue = 402;
var _ElementIsReadOnly = 403;
var _ElementIsWriteOnly = 404;
var _IncorrectDataType = 405;


// local variable definitions
var apiHandle = null;
var API = null;
var findAPITries = 0;


/*******************************************************************************
 **
 ** Function: doLMSInitialize()
 ** Inputs:  None
 ** Return:  CMIBoolean true if the initialization was successful, or
 **          CMIBoolean false if the initialization failed.
 **
 ** Description:
 ** Initialize communication with LMS by calling the LMSInitialize
 ** function which will be implemented by the LMS.
 **
 *******************************************************************************/
function doLMSInitialize() {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSInitialize was not successful.");
        return "false";
    }
	var data = api.cmi.toJSON();
    if (data.suspend_data !== "") {
        glhp.DataLocal.Slide = JSON.parse(data.suspend_data);   
    }
    var result = api.LMSInitialize("");

    if (result.toString() != "true") {
        var err = ErrorHandler();
    }

    return result.toString();
}

/*******************************************************************************
 **
 ** Function doLMSFinish()
 ** Inputs:  None
 ** Return:  CMIBoolean true if successful
 **          CMIBoolean false if failed.
 **
 ** Description:
 ** Close communication with LMS by calling the LMSFinish
 ** function which will be implemented by the LMS
 **
 *******************************************************************************/
function doLMSFinish() {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSFinish was not successful.");
        return "false";
    } else {
        // call the LMSFinish function that should be implemented by the API

        var result = api.LMSFinish("");
        if (result.toString() != "true") {
            var err = ErrorHandler();
        }

    }

    return result.toString();
}

/*******************************************************************************
 **
 ** Function doLMSGetValue(name)
 ** Inputs:  name - string representing the cmi data model defined category or
 **             element (e.g. cmi.core.student_id)
 ** Return:  The value presently assigned by the LMS to the cmi data model
 **       element defined by the element or category identified by the name
 **       input value.
 **
 ** Description:
 ** Wraps the call to the LMS LMSGetValue method
 **
 *******************************************************************************/
function doLMSGetValue(name) {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSGetValue was not successful.");
        return "";
    } else {
        var value = api.LMSGetValue(name);
        var errCode = api.LMSGetLastError().toString();
        if (errCode != _NoError) {
            // an error was encountered so display the error description
            var errDescription = api.LMSGetErrorString(errCode);
            alert("LMSGetValue(" + name + ") failed. \n" + errDescription);
            return "";
        } else {

            return value.toString();
        }
    }
}

/*******************************************************************************
 **
 ** Function doLMSSetValue(name, value)
 ** Inputs:  name -string representing the data model defined category or element
 **          value -the value that the named element or category will be assigned
 ** Return:  CMIBoolean true if successful
 **          CMIBoolean false if failed.
 **
 ** Description:
 ** Wraps the call to the LMS LMSSetValue function
 **
 *******************************************************************************/
function doLMSSetValue(name, value) {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSSetValue was not successful.");
        return;
    } else {
        var result = api.LMSSetValue(name, value);
        if (result.toString() != "true") {
            var err = ErrorHandler();
        }
    }

    return;
}

/*******************************************************************************
 **
 ** Function doLMSCommit()
 ** Inputs:  None
 ** Return:  None
 **
 ** Description:
 ** Call the LMSCommit function 
 **
 *******************************************************************************/
function doLMSCommit() {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSCommit was not successful.");
        return "false";
    } else {
        var result = api.LMSCommit("");
        if (result != "true") {
            var err = ErrorHandler();
        }
    }

    return result.toString();
}

/*******************************************************************************
 **
 ** Function doLMSGetLastError()
 ** Inputs:  None
 ** Return:  The error code that was set by the last LMS function call
 **
 ** Description:
 ** Call the LMSGetLastError function 
 **
 *******************************************************************************/
function doLMSGetLastError() {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSGetLastError was not successful.");
        //since we can't get the error code from the LMS, return a general error
        return _GeneralError;
    }

    return api.LMSGetLastError().toString();
}

/*******************************************************************************
 **
 ** Function doLMSGetErrorString(errorCode)
 ** Inputs:  errorCode - Error Code
 ** Return:  The textual description that corresponds to the input error code
 **
 ** Description:
 ** Call the LMSGetErrorString function 
 **
 ********************************************************************************/
function doLMSGetErrorString(errorCode) {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSGetErrorString was not successful.");
    }

    return api.LMSGetErrorString(errorCode).toString();
}

/*******************************************************************************
 **
 ** Function doLMSGetDiagnostic(errorCode)
 ** Inputs:  errorCode - Error Code(integer format), or null
 ** Return:  The vendor specific textual description that corresponds to the 
 **          input error code
 **
 ** Description:
 ** Call the LMSGetDiagnostic function
 **
 *******************************************************************************/
function doLMSGetDiagnostic(errorCode) {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nLMSGetDiagnostic was not successful.");
    }

    return api.LMSGetDiagnostic(errorCode).toString();
}

/*******************************************************************************
 **
 ** Function LMSIsInitialized()
 ** Inputs:  none
 ** Return:  true if the LMS API is currently initialized, otherwise false
 **
 ** Description:
 ** Determines if the LMS API is currently initialized or not.
 **
 *******************************************************************************/
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) {
        alert("Unable to locate the LMS's API Implementation.\nLMSIsInitialized() failed.");
        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()
 ** Inputs:  None
 ** Return:  The current value of the LMS Error Code
 **
 ** Description:
 ** Determines if an error was encountered by the previous API call
 ** and if so, displays a message to the user.  If the error code
 ** has associated text it is also displayed.
 **
 *******************************************************************************/
function ErrorHandler() {
    var api = getAPIHandle();
    if (api == null) {
        alert("Unable to locate the LMS's API Implementation.\nCannot 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()
 ** Inputs:  None
 ** Return:  value contained by APIHandle
 **
 ** Description:
 ** Returns the handle to API object if it was previously set,
 ** otherwise it returns null
 **
 *******************************************************************************/
function getAPIHandle() {
    if (apiHandle == null) {
        apiHandle = getAPI();
    }

    return apiHandle;
}


/*******************************************************************************
 **
 ** Function findAPI(win)
 ** Inputs:  win - a Window Object
 ** Return:  If an API object is found, it's returned, otherwise null is returned
 **
 ** Description:
 ** This function looks for an object named API in parent and opener windows
 **
 *******************************************************************************/
function findAPI(win) {
    while ((win.API == null) && (win.parent != null) && (win.parent != win)) {
        findAPITries++;
        // Note: 7 is an arbitrary number, but should be more than sufficient
        if (findAPITries > 7) {
            alert("Error finding API -- too deeply nested.");
            return null;
        }

        win = win.parent;

    }
    return win.API;
}



/*******************************************************************************
 **
 ** Function getAPI()
 ** Inputs:  none
 ** Return:  If an API object is found, it's returned, otherwise null is returned
 **
 ** Description:
 ** This function looks for an object named API, first in the current window's 
 ** frame hierarchy and then, if necessary, in the current window's opener window
 ** hierarchy (if there is an opener window).
 **
 *******************************************************************************/
function getAPI() {
    var theAPI = findAPI(window);
    if ((theAPI == null) && (window.opener != null) && (typeof (window.opener) != "undefined")) {
        theAPI = findAPI(window.opener);
    }
    if (theAPI == null) {
        alert("Unable to find an API adapter");
    }
    return theAPI
}
var initWithScorm = false;
var ScormEnum = {
    Name: {
        ScoreMin: 'cmi.core.score.min', //điểm số nhỏ nhất
        ScoreMax: 'cmi.core.score.max', //điểm số lớn nhất
        TotalTimeLMS: 'cmi.total_time', //thời gian kết thức khóa học trong lms
        CoreExit: "cmi.core.exit",
        ScoreRaw: 'cmi.core.score.raw',
        Status: 'cmi.core.lesson_status',
        SesstionTime: 'cmi.core.session_time',
        SuspendData: 'cmi.suspend_data',
		Scale:	'cmi.score.scaled' 
    }
}
var getNameScorm = function (index,name) {
    switch (name) {
        case "StudentRespone":
            return 'cmi.interactions.' + index + '.student_response';
        case "CorrectRespone":
            return 'cmi.interactions.' + index + '.correct_responses.0.pattern';
        case "Result":
            return 'cmi.interactions.' + index + '.result';
        case "CurrentTime":
            return 'cmi.interactions.' + index + '.time';
        case "Id":
            return 'cmi.interactions.' + index + '.id';
        case "ObjectivesId":
            return 'cmi.interactions.' + index + '.objectives.0.id';
		case "Type":
			return 'cmi.interactions.'+index+'.type';
		case "Weight":
			return 'cmi.interactions.'+index+'.weighting';
		case 'Latency': 
			return 'cmi.interactions.'+index+'.latency'; 
        default:
            break;
    }
}
//call scorm 1.2
var ScormModule = function () {
    return {
        //bắt đầu khóa học
        StartLecture: function () {
            var result = doLMSInitialize();
            initWithScorm = result;
            this.SetValue(ScormEnum.Name.CoreExit, "suspend");
        },
        //kết thức khóa học
        EndLecture: function () {
            doLMSFinish();
        },
        Commit: function () {
            doLMSCommit();
        },
        //set giá trị
        SetValue: function (name, value) {
            doLMSSetValue(name, value);
        },
        //get giá trị
        GetValue: function (name) {
            return doLMSGetValue(name);
        }
    }
}();
ScormModule.StartLecture();