﻿if (!window.Luminosity)
	window.Luminosity = {};

PageCompletionEnums = function() {
    this.unlocked = 0;
    this.visited = 1;
    this.complete = 2;
    this.locked = 3;
};

AssessmentState = function() {
    this.id = null;
    this.score = null;
    this.navitemSequence = null;
    this.retrycount = null;
}

AssesmentResults = function() {

    //id of the assesment.
    this.id = -1;
    //score obtained
    this.score = -1;
    //result: pass,fail
    this.passed = false;
    //the navItem associated with the assesment
    this.navItem = null;
};

//ScormPageCompletionStatus
ScormPage_Data = function() {
    this.id=null;//navitem sequence
    this.state=0; //0-incomplete,1-complete
};

PageObject = function() {
    this.objId = -1;
    this.objType = null;
    this.objStatus = null;
    this.navItem = null;
};

Luminosity.PageManager = function() {

    //page states.
    this.pagestates = new PageCompletionEnums();

    //completed navItems.
    this.completedPages = new Array();

    //completed assessments.
    this.completedAsmts = new Array();

    //assessment retries.
    this.asmtsretrylist = new Array();    
    
    //scorm manager.
    this.scormManager = Luminosity.ScormManager.getInstance();

    //navItems.
    this.navItems = parent.navItems;

    //pageobjects on each page.
    this.pageObjList = new Array();     
    

};

Luminosity.PageManager.prototype =
{
    InitNavItems: function(navigationItems) {
        this.navItems = navigationItems;
    },

    AddScormCompletedPage: function(pagedata) {
        var flag = false;
        for (var i = 0; i < this.scormManager.scormCompletedPages.length; i++) {
            if (this.scormManager.scormCompletedPages[i].id == pagedata.id) {
                flag = true;
            }
        }

        if (!flag) {
            this.scormManager.scormCompletedPages.push(pagedata);
        }
    },

    SetPageState: function(navItem, state) {
        navItem.SetState(state);
        if (state == this.pagestates.complete) {
            this.completedPages.push(navItem);
            var pagedata = new ScormPage_Data();
            pagedata.id = navItem.sequence;
            pagedata.state = navItem.state;
            this.AddScormCompletedPage(pagedata);
            this.scormManager.CheckComplete();
        }
    },

    GetAssesmentDataForPage: function(navItem) {
        for (var i = 0; i < this.completedAsmts.length; i++) {
            if (this.completedAsmts[i].navItem.guid == navItem.guid) {
                return this.completedAsmts[i];
            }
        }
        return null;
    },

    //Calls the scorm manager's SetSuspendData
    //by tracking the course progress.
    UpdateSuspendData: function(navItem) {
        try {
            scormManager.SaveLocation(navItem.sequence);
            scormManager.SetSuspendData(this.navItems, this.completedAsmts,
                                        this.asmtsretrylist);
        }
        catch (err) { self.status = "scorm error"; }
    },

    CheckUnlockCriteria: function() {
        var unlockItems = new Array();
        unlockItems = plMgr.CheckUnlockCriteria(this.completedPages, this.completedAsmts);
        if (unlockItems != null) {
            for (var i = 0; i < unlockItems.length; i++) {
                this.SetPageState(unlockItems[i], this.pagestates.unlocked);
            }
        }
    },

    PageChanged: function(navItem) {
        switch (navItem.state) {
            case this.pagestates.locked:
                var arr = this.pageLockManager.GetNavItemstobeUnlocked(navItem);
                ShowDialogModal(courseInfo.Title, "The page you are attempting to navigate to is locked. " +
                "Please make sure that the following pages are completed before you can navigate to this page.", arr);
                break;

            case this.pagestates.unlocked:
                this.SetPageState(navItem, this.pagestates.visited);
                if (navItem.completeOnVisit == true) {
                    this.SetPageState(navItem, this.pagestates.complete);
                    this.CheckUnlockCriteria();
                    CheckActiveHidden(navItem);
                    this.UpdateSuspendData(navItem);
                }
                break;

            case this.pagestates.visited:
                if (navItem.completeOnVisit == true) {
                    this.SetPageState(navItem, this.pagestates.complete);
                    this.CheckUnlockCriteria();
                    CheckActiveHidden(navItem);
                    this.UpdateSuspendData(navItem);
                }
                else {
                    this.SetPageState(navItem, this.pagestates.visited);
                    CheckActiveHidden(navItem);
                    this.UpdateSuspendData(navItem);
                }
                break;

            case this.pagestates.completed:
                this.SetPageState(navItem, this.pagestates.completed);
                CheckActiveHidden(navItem);
                this.UpdateSuspendData(navItem);
                break;
        }
    },

    //Call from assesment objects (seft test and drag and drop)
    //when an assesment is attempted.    
    NotifyAssessmentScore: function(id, score, isPassed, navItem) {
        var adata = new AssesmentResults();
        adata.id = id;
        adata.score = score;
        adata.navItem = navItem;
        adata.passed = isPassed;
        if (isPassed) {
            this.SetPageState(navItem, this.pagestates.complete);
        }
        this.completedAsmts.push(adata);
        this.CheckUnlockCriteria();
        this.UpdateSuspendData(navItem);
    },

    NotifyPageComplete: function(componentId, navItem) {
        if (aaMgr != null) {
            aaMgr.overridePlaybackComplete();
        }

        this.SetPageState(navItem, this.pagestates.complete);
        this.CheckUnlockCriteria()
        this.UpdateSuspendData(navItem);
    },

    RegisterComponent: function(componentId, componentType, componentStatus, navItem) {
        var pageobj = new PageObject();
        pageobj.objId = componentId;
        pageobj.objType = componentType;
        pageobj.objStatus = componentStatus;
        pageobj.navItem = navItem;
        this.pageObjList.push(pageobj);
    },

    GetPageObject: function(objectId) {
        for (var i = 0; i < this.pageObjList.length; i++) {
            if (this.pageObjList[i].objId == objectId) {
                return this.pageObjList[i];
            }
        }
        return null;
    },

    NotifyObjectStatus: function(componentId, componentStatus) {
        var pageobj = this.GetPageObject(componentId);
        if (pageobj != null) {
            //TODO: Component level notification code goes here..
        }
    },

    FindNavItem: function(sequence) {
        for (var i = 0; i < navItems.length; i++) {
            if (navItems[i].sequence == sequence) {
                return navItems[i];
            }
        }
        return null;
    },

    //DeserializeAssmentState
    //Restore assessment score and retry count for each
    //assessment in the course.
    DeserializeAssessmentState: function() {
        if (null != this.scormManager.SuspData_AsmtRetryList) {
            this.asmtsretrylist = this.scormManager.SuspData_AsmtRetryList;
        }
    },

    //DeserializeFromSuspendData is used to deserialize the objects: 
    //this.completedPages and
    //this.completedAsmts from scrom suspend data
    //@SuspData_NavItemStates, @SuspData_ComponentDataList.
    DeserializeFromSuspendData: function(completed) {

        var SuspData_NavItemStates = this.scormManager.SuspData_NavItemStates;
        var SuspData_ComponentDataList = this.scormManager.SuspData_ComponentDataList;
        var resumeLocation = this.scormManager.ResumePage;

        //restore page states
        for (var i = 0; i < navItems.length; i++) {
            if (SuspData_NavItemStates[i] == this.pagestates.complete ||
			   SuspData_NavItemStates[i] == this.pagestates.visited) {
                if (SuspData_NavItemStates[i] == this.pagestates.complete) {
                    navItems[i].completeOnVisit = true;
                }
                SetActiveItem(navItems[i]);
                this.SetPageState(navItems[i], SuspData_NavItemStates[i]);
            }
        }

        //restore page completion information.

        for (i = 0; i < SuspData_ComponentDataList.length; i++) {

            var assesmentScores = SuspData_ComponentDataList[i].assesmentResults;

            for (var j = 0; j < assesmentScores.length; j++) {

                var cdata = new AssesmentResults();
                cdata.id = -1;
                cdata.navItem = this.FindNavItem(SuspData_ComponentDataList[i].navItemSequence);
                cdata.score = assesmentScores[j];
                cdata.passed = false;
                this.completedAsmts.push(cdata);
            }
        }

        //Restore assesment scores and retries for each assessment.
        this.DeserializeAssessmentState();

        if (!completed) {
            //Set resume location and set active.
            var navItem = this.FindNavItem(resumeLocation);
            SetActiveItem(navItem);
        }
        else {
            // Set page one as active page
            var item = FindNavObject(1);
            if (null != item) {
                SetActiveItem(item);
            }
        }
    },

    NotifyScormPageCompletion: function(navitem) {
        var pagedata = new ScormPage_Data();
        pagedata.id = navitem.sequence;
        pagedata.state = 1;
        this.AddScormCompletedPage(pagedata);
        this.scormManager.CheckComplete();
    },

    GetAssmentStateObject: function(navsequence) {
        for (var i = 0; i < this.asmtsretrylist.length; i++) {
            if (this.asmtsretrylist[i].navitemSequence == navsequence) {
                return this.asmtsretrylist[i];
            }
        }
        return null;
    },

    NotifyAssessmentRetry: function(id, score, retrycount, navitem) {
        var asmtobj = this.GetAssmentStateObject(navitem.sequence);

        if (null == asmtobj) {
            asmtobj = new AssessmentState();
            asmtobj.id = id;
            asmtobj.score = score;
            asmtobj.retrycount = (retrycount == null) ? 0 : retrycount;
            asmtobj.navitemSequence = navitem.sequence;
            this.asmtsretrylist.push(asmtobj);
        }

        asmtobj.score = score;
        asmtobj.retrycount = (retrycount == null) ? 0 : retrycount;
        asmtobj.navitemSequence = navitem.sequence;
				
		if(navitem==null)
		{
			navitem = activeNavItem;
		}
		this.UpdateSuspendData(navitem);
    },

    GetAssessmentRetry: function(navitemSequence) {
        for (var i = 0; i < this.asmtsretrylist.length; i++) {
            if (this.asmtsretrylist[i].navitemSequence == navitemSequence) {
                return this.asmtsretrylist[i];
            }
        }
        return null;
    }
}
