﻿
var activeNavItem = null;
var navItems = new Array();
var pagesVisited = new Array();
var navItems_noHidden = new Array();
var aaMgr;
var plMgr = null;
var scormManager = Luminosity.ScormManager.getInstance();
var pageMgr = null;
var TotalPages = 0;
var activeNavItem = null;
var currentpageIndex = 1;

function Initialize() {
    if (Config === undefined) {
        alert("Error: Unable to find config information.");
        return;
    }

    if (window.Luminosity) {
        pageMgr = new Luminosity.PageManager();
        plMgr = new PLManager.PageLocking();
    }

    pageLockAssesments = function() {
        this.Guid = null;
        this.Passmark = null;
    }

    SetCourseInformation(Config.ProjectInfo);


    //Configure NavItems by setting it's attributes from the
    //JSON 'Config' object.
    jQuery.each(Config.Navigation.Pages, function(guid, page) {
        var item = new Luminosity.NavItem();
        item.guid = guid;
        item.sequence = page.Sequence;
        item.nestingLevel = page.NestingLevel;
        item.title = page.Title;
        item.uri = page.Uri;
        item.isHidden = page.Hidden;
        item.completeOnVisit = page.CompleteOnVisit;
        item.isMediaPage = page.IsMediaPage;
        item.isMediaOnly = page.IsMediaOnly;

        if (page.Locked == true) {

            var unlockNavItems = new Array();
            var unlockAssementMarks = new Array();

            //Read Pages in the LockingCriteria section of the JSON object.
            jQuery.each(page.LockingCriteria.Pages, function(i, unlockPageguid) {
                unlockNavItems.push(unlockPageguid);
            });

            //Read Assessments in the LockingCriteria section of the JSON object.
            jQuery.each(page.LockingCriteria.Assessments, function(i, assesment) {
                var pageLockAssesment = new pageLockAssesments();
                pageLockAssesment.Guid = assesment.Guid;
                pageLockAssesment.Passmark = assesment.PassMark;
                unlockAssementMarks.push(pageLockAssesment);
            });

            plMgr.InitPageLockData(item, unlockNavItems, unlockAssementMarks);

        }

        navItems.push(item);
        if (!item.isHidden) {
            TotalPages++;
        }
    });

    plMgr.ReinitilaizeLockedNavItems();

    SaveNavItemsWithoutHiddenPages();

    $(".lu-chrome-navtree-item").hover(
        function() { $(this).addClass("ui-state-hover"); },
        function() { $(this).removeClass("ui-state-hover"); });

    ArrangeHierarchy();
    updateProgressBar(1);

    if (window.AAManager) {
        aaMgr = new AAManager.AutoAdvance();
    }

    pageMgr.InitNavItems(navItems);
    ConfigureCourse();

}

function ConfigureCourse() {
    if (null !== navItems && navItems.length > 0) {
        if ("tree" === Config.Navigation.Type) {
            for (var i = 0; i < navItems.length; i++) {
                var sequence = i + 1;
                var buttonID = "btn" + sequence;
                var button = document.getElementById(buttonID);
                var navItem = navItems[i];

                if (null !== button) {
                    navItem.LinkToButton(button);
                }
                else {
                    alert("Error: Cannot find button for item sequence " + sequence + " (ID: " + buttonID + ").");
                }
                navItems[i].UpdateVisualCue();
            }
        }

        for (var j = 0; j < navItems.length; j++) {
            navItems[j].UpdateVisualCue();
        }

        // Set page one as active page
        var item = FindNavObject(1);
        SetActiveItem(item);
        //SetActiveFirst(item);
    }
    if ("linear" == Config.Navigation.Type) {
        //SM Fix: hide unwanted scroll bar in 'nav holder'.
        $('#navholder').css("overflow", "hidden");
    }
}

function SetActiveFirst(item) {
    if (null != item) {
        // If not locked, set new page active        
        if (item.state != 3) {
            item.ToggleActive();

            // Toggle old active item
            if (null != activeNavItem) {
                activeNavItem.ToggleActive();
                SetSenderInactive(item);
            }
            activeNavItem = item;
            InitScorm();
        }
        else
            if (item.state == 3) {
            //NOTE: Beefore showing the warning modal dialog for the locked page,
            //we need to check if the current active nav Item is a media page.
            //Modal dialog cannot be overlayed on the windows media player, therefore
            //the ShowDialogModalXY() method is used to display the modal dialog
            //at the [left,top] co-ords of the html window.
            if (activeNavItem.isMediaOnly) {
                var arr = plMgr.GetNavItemstobeUnlocked(item);
                ShowDialogModalXY(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);
            }
            else {
                var arr = plMgr.GetNavItemstobeUnlocked(item);
                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);
            }
        }
    }

}


function SetActiveItem(item) {
    if (null != item) {
        // If not locked, set new page active        
        if (item.state != 3) {
            item.ToggleActive();

            // Toggle old active item
            if (null != activeNavItem) {
                activeNavItem.ToggleActive();
                SetSenderInactive(item);
            }
            activeNavItem = item;
            pageMgr.PageChanged(activeNavItem);
            updateProgressBar(activeNavItem.sequence);
        }
        else
            if (item.state == 3) {
            //NOTE: Beefore showing the warning modal dialog for the locked page,
            //we need to check if the current active nav Item is a media page.
            //Modal dialog cannot be overlayed on the windows media player, therefore
            //the ShowDialogModalXY() method is used to display the modal dialog
            //at the [left,top] co-ords of the html window.
            if (activeNavItem.isMediaOnly) {
                var arr = plMgr.GetNavItemstobeUnlocked(item);
                ShowDialogModalXY(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);
            }
            else {
                var arr = plMgr.GetNavItemstobeUnlocked(item);
                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);
            }
        }
    }
}

function SetActiveAuto(sequence) {
    // Find new item
    var item = FindNavObject(sequence);

    if (null != item) {
        // If not locked, set new page active
        if (item.state != 3) {
            // Toggle old active item
            if (null != activeNavItem) {
                activeNavItem.ToggleActive();
                SetSenderInactive(item);
            }

            item.SetActive();
            activeNavItem = item;
            updateProgressBar(activeNavItem.sequence);
            pageMgr.PageChanged(activeNavItem);
            updateProgressBar(activeNavItem.sequence);

        }
        else {
            var arr = plMgr.GetNavItemstobeUnlocked(item);
            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);
        }
    }
}

function CheckActiveHidden(item) {
    if (item.isHidden || item.isHiddenByParent) {
        if (activeNavItem.isHidden || activeNavItem.isHiddenByParent) {
            item.senderItem = activeNavItem.senderItem;
        }
        else {
            item.senderItem = activeNavItem;
        }

        if (null != item.senderItem) {
            item.senderItem.AppearActive();
        }
    }
}

function SetSenderInactive(item) {
    if (null != activeNavItem.senderItem) {
        if (activeNavItem.senderItem.sequence != item.sequence) {
            activeNavItem.senderItem.AppearInactive();
        }
    }
}

function Forward_OnClick() {
    var currentSequence = parseInt(activeNavItem.sequence);
    var nextSequence = currentSequence + 1;

    if (currentSequence < navItems.length) {
        var nextItem = FindNavObject(nextSequence);

        if (nextItem.isHidden) {
            var visItem = FindNextVisibleItem(currentSequence);
            SetActiveItem(visItem);
        }
        else {
            SetActiveItem(nextItem);
        }
    }
    else {
        var firstItem = FindNavObject(1);
        SetActiveItem(firstItem);
        updateProgressBar(1);
    }
}

function Back_OnClick() {
    var currentSequence = parseInt(activeNavItem.sequence);
    var prevSequence = currentSequence - 1;

    if (currentSequence > 1) {
        var prevItem = FindNavObject(prevSequence);

        if (prevItem.isHidden || prevItem.isHiddenByParent) {
            var visItem = FindPrevVisibleItem(currentSequence);
            SetActiveItem(visItem);
        }
        else {
            SetActiveItem(prevItem);
        }
    }
}

function FindNextVisibleItem(sequence) {
    var item = null;

    for (var i = 0; i < navItems.length; i++) {
        var navItem = navItems[i];
        if (navItem.sequence > sequence) {
            if (!navItem.isHidden && !navItem.isHiddenByParent) {
                item = navItem;
                break;
            }
        }
    }

    return item;
}

function FindPrevVisibleItem(sequence) {
    var item = null;

    for (var i = 0; i < navItems.length; i++) {
        var navItem = navItems[i];
        if (navItem.sequence < sequence) {
            if (!navItem.isHidden && !navItem.isHiddenByParent) {
                item = navItem;
            }
        }
    }

    return item;
}

function FollowUrl(url) {
    if (url.indexOf('page://') === 0) {
        var guid = url.substring(7);
        GoToPage(guid);
    } else {
        window.open(url, "");
    }
}

function GoToPage(guid) {
    if (null != guid && guid != "") {
        var page = null;
        for (var i = 0; i < navItems.length; i++) {
            var navItem = navItems[i];
            if (navItem.guid == guid) {
                page = navItem;
                break;
            }
        }

        if (null != page) {
            var item = FindNavObject(page.sequence);
            SetActiveItem(item);
        }
        else {
            alert("Error: Unable to locate page.");
        }
    }
}

function NavItem_Click(sender) {
    if (null != sender) {
        var id = sender.parentNode.id;
        var sequence = parseInt(id.substr(3));
        var item = FindNavObject(sequence);
        SetActiveItem(item);
        //changeLocation(sender.id);
    }
}

function Expander_OnClick(sender) {
    var id = sender.parentNode.id;
    var sequence = parseInt(id.substr(3));
    var item = FindNavObject(sequence);

    if (null !== item) {
        item.ToggleExpanded();
    }
}

function FindNavObject(sequence) {
    var item = null;
    for (var i = 0; i < navItems.length; i++) {
        var navItem = navItems[i];
        if (navItem.sequence == sequence) {
            item = navItem;
            break;
        }
    }
    return item;
}

function ArrangeHierarchy() {
    var previousItem = null;

    for (var i = 0; i < navItems.length; i++) {
        var item = navItems[i];

        if (null != previousItem) {
            if (item.nestingLevel > previousItem.nestingLevel) {
                previousItem.AddChild(item);
                item.parent = previousItem;
            }
            else if (item.nestingLevel == previousItem.nestingLevel) {
                if (null != previousItem.parent) {
                    previousItem.parent.AddChild(item);
                    item.parent = previousItem.parent;
                }
            }
        }

        previousItem = item;
    }
}

function ChangeContent(uri) {
    configureTranscript("");
    var contentFrame = document.getElementById("contentFrame");
    contentFrame.src = uri;
}

function SaveNavItemsWithoutHiddenPages() {
    for (var i = 0; i < navItems.length; i++) {
        if (navItems[i].isHidden == false) {
            navItems_noHidden.push(navItems[i]);
        }
    }
}

function updateProgressBar(index) {
    var currIndex = index;
    var hidden = true;

    for (var i = 0; i < navItems_noHidden.length; i++) {
        if (navItems_noHidden[i].sequence == index) {
            currIndex = i + 1;
            hidden = false;
            currentpageIndex = currIndex;
            break;
        }
    }
    if (hidden) {
        currIndex = currentpageIndex;
    }

    index = currIndex;

    var progressBar = document.getElementById("progressbar");
    if (progressBar != null && pagesVisited != null) {
        var progressInner = document.getElementById("progressinner");
        var progressFill = document.getElementById("progressfill");
        var progressText = document.getElementById("progresstext");

        var totalWidth = progressInner.style.width;
        totalWidth = totalWidth.replace("px", "");
        var increment = totalWidth / TotalPages;

        progressFill.style.width = (increment * index) + "px";
        progressText.innerHTML = "Page " + index.toString() + " of " + TotalPages.toString();
    }
}

//JScript code for playstate event callback
//EVENT="PlayStateChange(NewState)">
//This only works on FF,Safari,Opera browsers.
function OnDSPlayStateChangeEvt(NewState) {
    if (NewState == 8) {
        parent.pageMgr.NotifyPageComplete("media", parent.activeNavItem);
    }
}

////SM: Refactored from PageFunctions.js.
////PageFunctions.js is no longer used.

//function InternalLink(guid) {
//    if (null != parent) {
//        if (null != parent.GoToPage) {
//            parent.GoToPage(guid);
//        }
//    }
//}

//function AutoAdv(duration) {
//    if (null != parent) {
//        if (null != parent.aaMgr) {
//            parent.aaMgr.configureAutoAdvance(duration);
//            if (activeNavItem.isMediaPage) {
//                aaMgr.overrideTimerWithMediaForced();
//            }
//        }
//    }
//}

// Old content

//var activeButton = {
//    object: null,
//    type: null
//}

////var pagesVisited;
//var transcriptUrl;


//function checkAudioOverride(){
//    if (aaMgr != null)
//    {
//        aaMgr.overridePlaybackComplete();
//    }
//}

//function setPageTracker(count)
//{
//    if (count > 0)
//    {
//        var suspendData = "";
//        var pageHistory = new Array();
//        
//        if (API)
//        {
//            suspendData = doLMSGetValue("cmi.suspend_data");
//        }
//        if (suspendData != "")
//        {
//            if (suspendData.substring("History")){
//                var hString = suspendData.substring(suspendData.lastIndexOf("History["),suspendData.lastIndexOf("]H")+2);
//                var hData = hString.substring(hString.lastIndexOf("[")+1, hString.lastIndexOf("]"));
//                pageHistory = hData.split(",");
//            }
//        }

//        pagesVisited = new Array();

//        for (var i=0; i<count; i++)
//        {
//            if (pageHistory[i] != null)
//            {
//                if (pageHistory[i] == "true")
//                {
//                    pagesVisited[i] = true;
//                    var btn = document.getElementById("btn"+(i+1));
//                    
//                    if (btn)
//                    {
//                        var inactivePrefix = btn.className.substr(0, 14);
//                        if (inactivePrefix != "button_level3_")
//                        {
//                            btn.parentNode.className = inactivePrefix + "off visited";
//                        }
//                        else{
//                            btn.className = inactivePrefix + "off visited";
//                        }
//                    }
//                }
//                else{
//                    pagesVisited[i] = false;
//                }
//            }
//            else
//            {
//                pagesVisited[i] = false;
//            }
//        }
//    }
//    
//    if (activeButton.object != null)
//    {
//        changePage(activeButton.object);
//    }
//}

//function setPageHistory()
//{
//    if (pagesVisited != null && pagesVisited.length > 0)
//    {
//        if (API)
//        {
//            var suspendData = "History[" + pagesVisited.toString() + "]H";           
//            setSuspendData(suspendData, null)
//        }
//    }
//}

//function getFlashMovieObject(movieName)
//{
//  if (window.document[movieName]) 
//  {
//      return window.document[movieName];
//  }
//  if (navigator.appName.indexOf("Microsoft Internet")==-1)
//  {
//    if (document.embeds && document.embeds[movieName])
//      return document.embeds[movieName]; 
//  }
//  else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
//  {
//    return document.getElementById(movieName);
//  }
//}

//function exp_OnClick(index)
//{
//    var holder = document.getElementById(index+"h");
//    var image = document.getElementById(index+"e_img");
//    if (holder.className == ""){
//        holder.className = "collapsedHolder";
//        image.src = "App/ButtonArrow_Collapsed.gif";
//        checkCollapse(index);
//    }
//    else {
//        holder.className = "";
//        image.src = "App/ButtonArrow_Expanded.gif";
//    }
//}

//function changeActiveButton(sender)
//{
//    var inactiveBtn = activeButton.object;
//    if (inactiveBtn)
//    {
//        var inactivePrefix = inactiveBtn.className.substr(0, 14);
//        if (inactivePrefix != "button_level3_")
//        {
//            inactiveBtn.parentNode.className = inactivePrefix + "off visited";
//        }
//        else{
//            inactiveBtn.className = inactivePrefix + "off visited";
//        }
//    }
//    activeButton.object = sender;
//    var prefix = sender.className.substr(0, 14);
//    activeButton.type = prefix;
//    if (prefix != "button_level3_")
//    {
//        sender.parentNode.className = prefix + "on";
//    }
//    else {
//        sender.className = prefix + "on";
//    }
//}

//function autoExpand(sender)
//{
//    var index = sender.id;
//    var holder = document.getElementById(index+"h");
//    var image = document.getElementById(index+"e_img");
//    if (holder){
//        if (holder.className != ""){
//            holder.className = "";
//            image.src = "Images/ButtonArrow_Expanded.gif";
//        }
//    }
//}

//function checkCollapse(index)
//{
//    if (activeButton.object != null)
//    {
//        var hitIndex = index.substr(3);
//        var activeIndex = parseInt(activeButton.object.id.substr(3));
//        
//        if (activeIndex > hitIndex)
//        {
//            if (activeButton.object.className.indexOf("level1") == -1)
//            {
//                var activeLevel;
//                if (activeButton.object.className.indexOf("level2") != -1) activeLevel = 2;
//                else if (activeButton.object.className.indexOf("level3") != -1) activeLevel = 3;
//                
//                var hitLevel;
//                var hitButton = document.getElementById(index);
//                if (hitButton.className.indexOf("level1") != -1) hitLevel = 1;
//                else if (hitButton.className.indexOf("level2") != -1) hitLevel = 2;
//                
//                if (activeLevel > hitLevel)
//                {
//                    var difference = hitLevel - activeLevel;
//                    if (difference == 1)
//                    {
//                        changeActiveButton(hitButton);
//                    }
//                    else
//                    {
//                        var l = hitLevel;
//                        for (var i=hitIndex; i<activeIndex+1; i++)
//                        {
//                            var j = parseInt(i)+1;
//                            var inbetweenBtn = document.getElementById("btn"+j.toString());
//                            if (inbetweenBtn.className.indexOf("level2") != -1) l = 2;
//                            else if (inbetweenBtn.className.indexOf("level3") != -1) l = 3;
//                            
//                            if (l < hitLevel)
//                            {
//                                return;
//                            }
//                        }
//                        changeActiveButton(hitButton);
//                    }
//                }
//            }
//        }
//    }
//}

//function findParentButton(index, targetLevel)
//{
//    if (index > 1)
//    {
//        for (var i=index-1; i>0; i--)
//        {
//            var btn = document.getElementById("btn"+i);
//            var lvl;
//            
//            if (btn != null)
//            {
//                if (btn.className.indexOf("level"+targetLevel) != -1)
//                {
//                    return btn;
//                }
//            }
//        }
//    }
//}

//function getChildElements(node)
//{
//    var childElements = new Array();
//    
//    for (var i=0; i<node.childNodes.length; i++){
//        var element = node.childNodes[i];
//        // If element add to array
//        if (element.nodeType == 1){
//            childElements.push(element);
//        }
//    }
//    
//    return childElements;
//}

//function changePage(sender)
//{
//    if (document.all) 
//    { 
//        sender.fireEvent("onclick"); 
//    } 
//    else 
//    { 
//        var clickEvent = window.document.createEvent("MouseEvent"); 
//        clickEvent.initEvent("click", false, true); 
//        sender.dispatchEvent(clickEvent); 
//    } 
//}

//function transcript_OnClick()
//{
//    var url = transcriptUrl;
//    window.open(url, '', 'width=500, height=400, location=0, status=0, scrollbars=1, resizable=1')
//}

function configureTranscript(url) {
    var btn = document.getElementById("transcript_btn");
    if (btn != null) {
        if (url == null || url == "") {
            if (btn.className == "") {
                btn.className = "hidden";
            }
        }
        else {
            if (btn.className != "") {
                btn.className = "";
            }
        }
    }
    transcriptUrl = url;
}

function GetNavItemwithGUID(guid) {
    for (var i = 0; i < navItems.length; i++) {
        if (navItems[i].guid == guid) {
            return navItems[i];
        }
    }

    return null;
}
