<?xml version="1.0" encoding="UTF-16"?>
<!-- This XML file has been created by WebEJS 1.0. Visit http://t.um.es/webejs -->
<!-- Please, open it with WebEJS or save the file to your hard disk on your EJS' user directory and open it with Desktop Ejs 6.01 or later. -->
<Osejs version="7.0" password="">
<Osejs.Information>
<Title><![CDATA[Arrange_Pupill_Math_Simulation]]></Title>
<Copyright><![CDATA[]]></Copyright>
<Keywords><![CDATA[]]></Keywords>
<Password><![CDATA[unused]]></Password>
<Level><![CDATA[]]></Level>
<Language><![CDATA[]]></Language>
<Abstract><![CDATA[]]></Abstract>
<FixedNavigationBar>false</FixedNavigationBar>
<RunAlways>true</RunAlways>
<UseInterpreter>true</UseInterpreter>
<UseDeltaForODE>false</UseDeltaForODE>
<PreviewFullModel>false</PreviewFullModel>
<ModelTab></ModelTab>
<ModelTabTitle><![CDATA[]]></ModelTabTitle>
<ModelName><![CDATA[]]></ModelName>
<CSSFile></CSSFile>
<HTMLHead><![CDATA[<style type="text/css">
.metadata { display: none; }
</style>]]></HTMLHead>
<SaveInXMLFormat>true</SaveInXMLFormat>
<IncludeSource>true</IncludeSource>
<IncludeLibrary>true</IncludeLibrary>
<UglifyJS>false</UglifyJS>
<Logo></Logo>
<Author><![CDATA[]]></Author>
<AuthorLogo></AuthorLogo>
<DetectedFiles><![CDATA[]]></DetectedFiles>
<AuxiliaryFiles><![CDATA[;./lib/xapiwrapper.min.js]]></AuxiliaryFiles>
</Osejs.Information>
<Osejs.Description>
</Osejs.Description>
<Osejs.Model>
<Osejs.Model.FramesPerSecond>20</Osejs.Model.FramesPerSecond>
<Osejs.Model.StepsPerDisplay>1</Osejs.Model.StepsPerDisplay>
<Osejs.Model.RealTimeVariable></Osejs.Model.RealTimeVariable>
<Osejs.Model.Autostart>true</Osejs.Model.Autostart>
<Osejs.Model.Variables>
<Osejs.Model.Variables.Page>
<Type>undefined</Type>
<Name>Var Table 1</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<PageComment><![CDATA[]]></PageComment>
<Variable>
<Name><![CDATA[scenarios]]></Name>
<Value><![CDATA[{}]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[pupils]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[selectedScenario]]></Name>
<Value><![CDATA["Task A"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[roomX]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[roomY]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[pupilX]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[pupilY]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[roomImage]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[pupilImage]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[roomText]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[textX]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[textY]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[selectedPupil]]></Name>
<Value><![CDATA[-1]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[pastAttemptsByScenario]]></Name>
<Value><![CDATA[{}]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[totalScore]]></Name>
<Value><![CDATA[0]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[]]></Name>
<Value><![CDATA[]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
</Content>
</Osejs.Model.Variables.Page>
<Osejs.Model.Variables.Page>
<Type>VARIABLE_EDITOR</Type>
<Name>Var Table 2</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<PageComment><![CDATA[]]></PageComment>
<Variable>
<Name><![CDATA[scenarioStartTime]]></Name>
<Value><![CDATA[""]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[score]]></Name>
<Value><![CDATA[0]]></Value>
<Type><![CDATA[int]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[]]></Name>
<Value><![CDATA[]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
</Content>
</Osejs.Model.Variables.Page>
</Osejs.Model.Variables>
<Osejs.Model.Initialization>
<Osejs.Model.Initialization.Page>
<Type>undefined</Type>
<Name>scenarios</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
scenarios  = {
    "Demonstration": {
        scenario: "There are 7 pupils and there are 2 rooms. Each room cannot take more than 4 pupils.<br/>How should I arrange the pupils in each room?",
        pupils: 7,
        rooms: [
          {
            room: "Music Room",
            image: "Music-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Classroom",
            image: "Class-Room.png",
            max: 4,
            min: 1,
          },
        ],
    },
    "Task A": {
        scenario: "There are 16 pupils and there are 4 rooms. Each room cannot take more than 4 pupils.<br/>How should I arrange the pupils in each room?",
        pupils: 16,
        rooms: [
          {
            room: "Music Room",
            image: "Music-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Classroom",
            image: "Class-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Computer Room",
            image: "Computer-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Art Room",
            image: "Math-Room.png",
            max: 4,
            min: 1,
          },
        ],
    },
     "Task B": {
        scenario: "There are 18 pupils and there are 5 rooms. Each room cannot take more than 4 pupils.<br/>How should I arrange the pupils in each room?<br/>Find as many ways to arrange the students.",
        pupils: 18,
        rooms: [
          {
            room: "Music Room",
            image: "Music-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Classroom",
            image: "Class-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Computer Room",
            image: "Computer-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Art Room",
            image: "Art-Room.png",
            max: 4,
            min: 1,
          },
          {
            room: "Math Room",
            image: "Math-Room.png",
            max: 4,
            min: 1,
          },
        ],
    }
}
]]></Code>
</Content>
</Osejs.Model.Initialization.Page>
<Osejs.Model.Initialization.Page>
<Type>CODE_EDITOR</Type>
<Name>pupils</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
pupils = [
    {
        image: "Chinese-Female.png",
    },
    {
        image: "Chinese-Male.png",
    },
    {
        image: "Eurasian-Female.png",
    },
    {
        image: "Eurasian-Male.png",
    },
    {
        image: "Indian-Female.png",
    },
    {
        image: "Indian-Male.png",
    },
    {
        image: "Malay-Female.png",
    },
    {
        image: "Malay-Male.png",
    },
    {
        image: "Chinese-Female.png",
    },
    {
        image: "Chinese-Male.png",
    },
    {
        image: "Eurasian-Female.png",
    },
    {
        image: "Eurasian-Male.png",
    },
    {
        image: "Indian-Female.png",
    },
    {
        image: "Indian-Male.png",
    },
    {
        image: "Malay-Female.png",
    },
    {
        image: "Malay-Male.png",
    },
        {
        image: "Chinese-Female.png",
    },
    {
        image: "Chinese-Male.png",
    },
]
]]></Code>
</Content>
</Osejs.Model.Initialization.Page>
<Osejs.Model.Initialization.Page>
<Type>CODE_EDITOR</Type>
<Name>init</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
initRooms();
initPupils();
]]></Code>
</Content>
</Osejs.Model.Initialization.Page>
</Osejs.Model.Initialization>
<Osejs.Model.Evolution>
</Osejs.Model.Evolution>
<Osejs.Model.Constraints>
</Osejs.Model.Constraints>
<Osejs.Model.Library>
<Osejs.Model.Library.Page>
<Type>undefined</Type>
<Name>initFunctions</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function initRooms() {
    scenarios[selectedScenario].rooms.forEach(room => room.count = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Chinese-Female.png"] = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Chinese-Male.png"] = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Eurasian-Female.png"] = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Eurasian-Male.png"] = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Malay-Female.png"] = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Malay-Male.png"] = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Indian-Female.png"] = 0);
    scenarios[selectedScenario].rooms.forEach(room => room["Indian-Male.png"] = 0);
    roomX = [];
    roomY = [];
    roomImage = [];
    textX = [];
    textY = [];
    roomText = [];

    let numOfRooms = scenarios[selectedScenario].rooms.length;
    let currentY = 0.85;  
    let roomIndex = 0;

    while (roomIndex < numOfRooms) {
        let roomsInRow = Math.min(3, numOfRooms - roomIndex);
        let xCoords;

        if (roomsInRow === 1) {
            xCoords = [0.5];  
        } else if (roomsInRow === 2) {
            xCoords = [0.3, 0.7]; 
        } else {
            xCoords = [0.15, 0.5, 0.85]; 
        }

        for (let i = 0; i < roomsInRow; i++) {
            roomX.push(xCoords[i]);
            roomY.push(currentY);
            scenarios[selectedScenario].rooms[roomIndex].x = xCoords[i];
            scenarios[selectedScenario].rooms[roomIndex].y = currentY;
            roomImage.push("./rooms/" + scenarios[selectedScenario].rooms[roomIndex].image);  
            textX.push(xCoords[i]);
            textY.push(currentY - 0.15);
            roomText.push(scenarios[selectedScenario].rooms[roomIndex].room);
            roomIndex++;
        }

        currentY -= 0.3;
    }
}

function initPupils() {
    pupils.forEach(pupil => pupil.room = '');
    pupilX = [];
    pupilY = [];
    pupilImage = [];

    let numOfPupils = scenarios[selectedScenario].pupils;
    let currentY = 0.25;
    let pupilIndex = 0;


   while (pupilIndex < numOfPupils) {
        let pupilsInRow = Math.min(9, numOfPupils - pupilIndex);  
        let xCoords = [];
    
        for (let i = 0; i < pupilsInRow; i++) {
            xCoords.push((i + 1) / 10);  
        }
    
        for (let i = 0; i < pupilsInRow; i++) {
            pupilX.push(xCoords[i]);
            pupilY.push(currentY);
            pupils[pupilIndex].x = xCoords[i];
            pupils[pupilIndex].y = currentY;
            pupilImage.push("./pupils/" + pupils[pupilIndex].image);  
            pupilIndex++;
        }
    
        currentY -= 0.15; 
    }
}
]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>onRelease</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function onRelease(x, y, index) {
    let rooms = scenarios[selectedScenario].rooms;
    let currentRoomName = pupils[index].room;

    // console.log(scenarios[selectedScenario].rooms);
    
    if (currentRoomName) {
        for (let i = 0; i < rooms.length; i++) {
            let room = rooms[i];
            let roomX = room.x;
            let roomY = room.y;
            let halfSize = 0.15;

            if (room.room === currentRoomName && x >= roomX - halfSize && x <= roomX + halfSize && y >= roomY - halfSize && y <= roomY + halfSize) {
                return;
            }
        }

        for (let i = 0; i < rooms.length; i++) {
            if (rooms[i].room === currentRoomName && rooms[i].hasOwnProperty('count')) {
                rooms[i].count -= 1;
                rooms[i][pupils[index].image] -= 1;
                pupils[index].room = '';
                break;
            }
        }
    }

    for (let i = 0; i < rooms.length; i++) {
        let room = rooms[i];
        let roomX = room.x;
        let roomY = room.y;
        let halfSize = 0.15;

        if (x >= roomX - halfSize && x <= roomX + halfSize && y >= roomY - halfSize && y <= roomY + halfSize) {
            if (!room.hasOwnProperty('count')) {
                room.count = 0;
                room[pupils[index].image] = 0;
            }

            pupils[index].room = room.room;
            room.count += 1;
            room[pupils[index].image] += 1;
        }
    }
}

]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>check</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function check() {
    let currentAttempt = [];
    let checkCount = 0;
    
    // scenarios[selectedScenario].rooms.forEach(room => {
    //     checkCount += room.count;
    //     currentAttempt.push(`${room.room}: ${room.count} pupils`);
    // });
    
    scenarios[selectedScenario].rooms.forEach(room => {
        checkCount += room.count;
    
        const pupilDescriptions = [];
    
        for (const [key, value] of Object.entries(room)) {
            if (key.endsWith(".png") && value > 0) {
                const [ethnicity, genderWithExt] = key.split("-");
                const gender = genderWithExt.replace(".png", "");
                const shortCode = ethnicity[0] + gender[0]; // e.g. Chinese Female → CF
                pupilDescriptions.push(`${value} ${shortCode}`);
            }
        }
    
        if (pupilDescriptions.length > 0) {
            currentAttempt.push(`${room.room}: ${pupilDescriptions.join(", ")}`);
        }
    });

    
    if (!pastAttemptsByScenario[selectedScenario]) {
        pastAttemptsByScenario[selectedScenario] = {
            attemptsTakenToComplete: 0,
            completed: false,
            log: [],
            timeTakenToComplete: "Did not complete"
          };
      }
      
    if (!pastAttemptsByScenario[selectedScenario].completed) {
        pastAttemptsByScenario[selectedScenario].attemptsTakenToComplete += 1;
    }
    
    pastAttemptsByScenario[selectedScenario].log.push({
        attempt: currentAttempt,
        timeStamp: `${Math.floor((new Date() - scenarioStartTime) / 1000 / 60)}m ${Math.floor((new Date() - scenarioStartTime) / 1000 % 60)}s`,
        correct: false
    })
     
    try {
        if (checkCount != scenarios[selectedScenario].pupils) {
            alert("There is an error. Read the question again!");
            return;
        }
    
        for (let room of scenarios[selectedScenario].rooms) {
            if (room.count < room.min || room.count > room.max) {
                alert("There is an error. Read the question again!");
                return;
            }
        }
    
        alert("Congrats! You did it, now try a different approach or a different scenario!");
        if (!pastAttemptsByScenario[selectedScenario].completed) {
            pastAttemptsByScenario[selectedScenario].completed = true;
            pastAttemptsByScenario[selectedScenario].timeTakenToComplete = pastAttemptsByScenario[selectedScenario].log[pastAttemptsByScenario[selectedScenario].log.length-1].timeStamp
            score += 1;
        }
        
        pastAttemptsByScenario[selectedScenario].log[pastAttemptsByScenario[selectedScenario].log.length-1].correct = true;
        
    } finally {
        console.log(pastAttemptsByScenario);
        let attemptLogHtml = '';
        pastAttemptsByScenario[selectedScenario].log.forEach((log, index) => {
        attemptLogHtml += 'Attempt ' + (index + 1) + 
        ': Pupils Arranged: ' + log.attempt.join(', ') + 
        '; Pupils were arranged ' + 
        (log.correct ? 'correctly' : 'incorrectly') + 
        '; Time Stamp: ' + log.timeStamp + '<br>';
    });
    
    const feedback = 
      '<div>' +
        '<div>' +
          'Total Attempts Taken To Complete: ' + pastAttemptsByScenario[selectedScenario].attemptsTakenToComplete + '<br>' +
          'Managed To Complete: ' + pastAttemptsByScenario[selectedScenario].completed + '<br>' +
          'Total Time Taken to Complete: ' + pastAttemptsByScenario[selectedScenario].timeTakenToComplete + '<br><br>' +
          'Attempt Log:<br>' +
          attemptLogHtml +
        '</div>' +
      '</div>';
        console.log(feedback)
        console.log(score)
        storeState({score, feedback});
        reset();
    }
}

function displayPastAnswers() {
    const pastAnswersDiv = document.getElementById("pastAttempts");
    pastAnswersDiv.innerHTML = "";

    for (let scenario in pastAttemptsByScenario) {
        let scenarioDiv = document.createElement("div");
        scenarioDiv.innerHTML = `<h3 style="margin: 0; font-size: 18px; font-weight: bold;">${scenario}:</h3>`;

        let attemptsContainer = document.createElement("div");
        attemptsContainer.style.display = "flex";
        attemptsContainer.style.flexWrap = "wrap";

        pastAttemptsByScenario[scenario].forEach((attempt, index) => {
            let attemptDiv = document.createElement("div");
            attemptDiv.innerHTML = `<strong style="font-size: 16px;">Attempt ${index + 1}:</strong><br>${attempt.join('<br>')}`;
            attemptDiv.style.padding = "10px";
            attemptDiv.style.width = "200px";
            attemptDiv.style.textAlign = "left";
            attemptsContainer.appendChild(attemptDiv);
        });

        scenarioDiv.appendChild(attemptsContainer);
        pastAnswersDiv.appendChild(scenarioDiv);
    }
}

]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>reset</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function reset() {
    initRooms();
    initPupils();
}
]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>xApi</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
// Using a namespace to prevent global variable clashes
const XAPIUtils = {
  parameters: null, // Parameters store
  getParameters: function () {
    if (!this.parameters) { // Ensure fetch once
      var urlParams = new URLSearchParams(window.location.search);
      var endpoint = urlParams.get('endpoint');
      var auth = urlParams.get('auth');
      var agent = JSON.parse(urlParams.get('agent'));
      var stateId = urlParams.get('stateId');
      var activityId = urlParams.get('activityId');

      // document.querySelector("#cookieId").innerText = "Cookie: " + auth;
      // document.querySelector("#questionId").innerText = "Question ID: " + activityId;
      // document.querySelector("#userId").innerText = "User ID: " + stateId;

      ADL.XAPIWrapper.changeConfig({
        "endpoint": endpoint + "/",
        "auth": `Basic ${auth}`
      });
      this.parameters = {
        agent,
        stateId,
        activityId
      };
    }

    return this.parameters;
  }
};

// Immediately invoke getParameters on page load
document.addEventListener("DOMContentLoaded", function () {
  XAPIUtils.getParameters(); // Fetch parameters once on load
});

function storeState(stateValue) { // Removed async
  try {
    const parameters = XAPIUtils.getParameters(); // Retrieve parameters from store
    const activityId = parameters.activityId;
    const stateId = parameters.stateId;
    const agent = parameters.agent;
    const registration = null;

    ADL.XAPIWrapper.sendState(activityId, agent, stateId, registration, stateValue);
    console.log("Submitted: " + JSON.stringify(stateValue, null, 2));
  } catch (err) {
    console.error("An error has occurred!", err);
  }
}

function getState() {
  try {
    const parameters = XAPIUtils.getParameters(); // Retrieve parameters from store
    const activityId = parameters.activityId;
    const stateId = parameters.stateId;
    const agent = parameters.agent;

    const result = ADL.XAPIWrapper.getState(activityId, agent, stateId);
    document.querySelector("#getState").innerText = "First Load State: " + JSON.stringify(result, null, 2);
    return result;
  } catch (err) {
    console.error("An error has occurred!", err);
    document.querySelector("#getState").innerText = "Error has occurred: " + err;
  }
}

]]></Code>
</Content>
</Osejs.Model.Library.Page>
</Osejs.Model.Library>
<Osejs.Model.Elements>
</Osejs.Model.Elements>
</Osejs.Model>
<Osejs.HtmlView>
<Osejs.HtmlView.Page>
<Type>HTML_VIEW_EDITOR</Type>
<Name>HtmlView</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<SizeOption>0</SizeOption>
<X>0</X>
<Y>0</Y>
<Width>800</Width>
<Height>600</Height>
<KeepHidden>true</KeepHidden>
<RootProperties>
</RootProperties>
<Tree>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[wrapper]]></Name>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[firstRow]]></Name>
<Parent><![CDATA[wrapper]]></Parent>
<Property name="CSS"><![CDATA["{
margin-bottom: 10px
}"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Label</Type>
<Name><![CDATA[currentScenario]]></Name>
<Parent><![CDATA[firstRow]]></Parent>
<Property name="Text"><![CDATA[scenarios[selectedScenario].scenario]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[secondRow]]></Name>
<Parent><![CDATA[wrapper]]></Parent>
<Property name="CSS"><![CDATA["{ margin-bottom: 10px }"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.ComboBox</Type>
<Name><![CDATA[selectScenario]]></Name>
<Parent><![CDATA[secondRow]]></Parent>
<Property name="Options"><![CDATA[["Task A"]]]></Property>
<Property name="OnChange"><![CDATA[var opts = _view.selectScenario.getProperty("SelectedOptions");  
selectedScenario = (opts.length > 0)? opts[0]:"";
initRooms();
initPupils();
scenarioStartTime = "";]]></Property>
<Property name="CSS"><![CDATA["{ margin-right: 10px }"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Button</Type>
<Name><![CDATA[check]]></Name>
<Parent><![CDATA[secondRow]]></Parent>
<Property name="Text"><![CDATA["Check"]]></Property>
<Property name="OnPress"><![CDATA[check()]]></Property>
<Property name="CSS"><![CDATA["{ margin-right: 10px }"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Button</Type>
<Name><![CDATA[reset]]></Name>
<Parent><![CDATA[secondRow]]></Parent>
<Property name="Text"><![CDATA["reset"]]></Property>
<Property name="OnPress"><![CDATA[reset();]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.PlottingPanel</Type>
<Name><![CDATA[plottingPanel]]></Name>
<Parent><![CDATA[wrapper]]></Parent>
<Property name="Width"><![CDATA["100%"]]></Property>
<Property name="Height"><![CDATA["70vh"]]></Property>
<Property name="Enabled"><![CDATA[true]]></Property>
<Property name="Gutters"><![CDATA[[0,0,0,0]]]></Property>
<Property name="AutoScaleY"><![CDATA[false]]></Property>
<Property name="AutoScaleX"><![CDATA[false]]></Property>
<Property name="MaximumX"><![CDATA[1]]></Property>
<Property name="MinimumX"><![CDATA[0]]></Property>
<Property name="MinimumY"><![CDATA[0]]></Property>
<Property name="MaximumY"><![CDATA[1]]></Property>
<Property name="XAutoTicks"><![CDATA[false]]></Property>
<Property name="GridXShow"><![CDATA[false]]></Property>
<Property name="YAutoTicks"><![CDATA[false]]></Property>
<Property name="GridYShow"><![CDATA[false]]></Property>
<Property name="AxisXShow"><![CDATA[false]]></Property>
<Property name="AxisYShow"><![CDATA[false]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.ImageSet2D</Type>
<Name><![CDATA[roomSets]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="NumberOfElements"><![CDATA[scenarios[selectedScenario].rooms.length]]></Property>
<Property name="Sensitivity"><![CDATA[0]]></Property>
<Property name="SizeX"><![CDATA[0.3]]></Property>
<Property name="SizeY"><![CDATA[0.3]]></Property>
<Property name="X"><![CDATA[roomX]]></Property>
<Property name="Y"><![CDATA[roomY]]></Property>
<Property name="ImageUrl"><![CDATA[roomImage]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.TextSet2D</Type>
<Name><![CDATA[roomNameSets]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="NumberOfElements"><![CDATA[scenarios[selectedScenario].rooms.length]]></Property>
<Property name="X"><![CDATA[textX]]></Property>
<Property name="Y"><![CDATA[textY]]></Property>
<Property name="Text"><![CDATA[roomText]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.ImageSet2D</Type>
<Name><![CDATA[pupilSets]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="NumberOfElements"><![CDATA[scenarios[selectedScenario].pupils]]></Property>
<Property name="X"><![CDATA[pupilX]]></Property>
<Property name="Y"><![CDATA[pupilY]]></Property>
<Property name="SizeX"><![CDATA[0.15]]></Property>
<Property name="SizeY"><![CDATA[0.15]]></Property>
<Property name="EnabledPosition"><![CDATA["ENABLED_ANY"]]></Property>
<Property name="ImageUrl"><![CDATA[pupilImage]]></Property>
<Property name="ElementInteracted"><![CDATA[selectedPupil]]></Property>
<Property name="OnRelease"><![CDATA[onRelease(pupilX[selectedPupil], pupilY[selectedPupil],selectedPupil)]]></Property>
<Property name="OnPress"><![CDATA[if (!scenarioStartTime){
scenarioStartTime= new Date();
    console.log(`Timer started for ${selectedScenario} at ${scenarioStartTime}`);
}]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Panel</Type>
<Name><![CDATA[pastAttempts]]></Name>
<Parent><![CDATA[wrapper]]></Parent>
<Property name="ClassName"><![CDATA["pastAttempts"]]></Property>
<Property name="CSS"><![CDATA["{text-align: left}"]]></Property>
</HtmlView.Element>
</Tree>
</Content>
</Osejs.HtmlView.Page>
</Osejs.HtmlView>
</Osejs>