Toolbook Scripts for Generic Quiz

| Book | Background | Results Page | Certificate Page |

Book Scripts


to handle enterBook
    system recentUser,qTries
    put "FALSE" into recentUser
    put 0 into qTries
end enterBook

--------------------------------
-- general navigation scripts
--------------------------------

to handle doQuit
    system theUser
    -- called by quit button

    beep 1
    request word 1 of theUser & ", do you want to quit from the"\
    && quote & "Orient Express" & quote && "?" with "no" or\
    "yes"
    if (it is "yes") then; send exit; end if
end doQuit

| Book | Background | Results Page | Certificate Page |

Background Scripts

These scripts are available to every card that uses the quiz background
to handle enterPage
    -- set up quiz card

    system qPointer,qMax,firstTry

    -- VARIABLES:
    --       qPointer:      current quiz number
    --       qMax:          total number of questions
    --       firstTry:      =0 if user has not tried at least once

    -- update card counter
    put qPointer && "of" && qMax into text of  recordField "count"
     set sysLockScreen to true

    -- show answer fields
    send ansVis TRUE

    -- reset try flag
    put 0 into firstTry

    -- randomly sort the list of answers
    put scrambleItems(4) of this book into fList

    -- reset the location of answer fields
    step i from 1 to 4
        get "ans" && item i of fList
		set the position of recordField it to 430,1200 + i * 900
		set the position of button it of this background to 345, 1110 + i * 900
    end step

    -- hide NEXT button until user tries once
   hide button "next" of this background

    set sysLockScreen to false
end enterPage

to handle leavePage
    -- clean up card
    system reviewList

    send hideHilite
    send hideFb
    send ansVis false
    if the visible of  recordField "help" then 
    	send showHelp FALSE
    end if
end leavePage

to handle ansVis state
    -- toggles visibility of answer fields
    step i from 1 to 4
        set the visible of recordField ("ans" && i) to state
    end step

end ansVis

to handle checkAnswer
    -- compare users response and show correct feedback
    system firstTry,qScore,reviewList

    -- exit if user clicked on last resposne

    if the invert of button (name of the target) of this background then;
    	 break checkAnswer 
    end if


    -- hilite the button
    send hideHilite

    set the invert of button (name of the target) of this background to true
    set sysLockScreen to true
    -- hide all feedback fields
    send hideFB

    -- get name of selected answer and show feeback
    get word 2 of the name of the target

    show recordField ("fb" && it)

   -- score if this was first try
    if firstTry = 0 then;
    
        -- enable NEXT button
        show button "next" of this background
        
        -- check answer with name of current card
        if it=character 3 of the name of this page then;
            increment qScore by 1
        else
            put text of  recordField "topic" & crlf after reviewList
        end if
        
        put 1 into firstTry
    end if
    set sysLockScreen to false

end checkAnswer

to handle hideHilite
    -- turn off all button hilites and reset left of answer fields
    set sysLockScreen to true
    step i from 1 to 4
        set the invert of button ("ans" && i) of this background to FALSE
    end step
    set sysLockScreen to false
end hideHilite

to handle hideFB
    -- hide all feedback fields
    step i from 1 to 4
        hide recordField ("fb" && i)
    end step
end hideFB

to handle setAnswer
    -- flash the text of the field back field and reset the correct answer
    set the name of this page to "qz" & word 2 of the name of the target
    step ht_1 from 1 to 4
        select textLines 1 to 5 of the target
        pause 15 ticks
        select null
    end step
end setAnswer

to handle showHelp state
    -- show help field
    set the sysLockScreen to true
    
    put the objects of this page into objList
    
    step i from 1 to itemCount(objList)
    	set the visible of item i of objList to NOT state
    end step
    
    set the visible of recordField "help" to state
    set the sysLockScreen to FALSE
end showHelp


--------------------------------
-- quiz card scripts
--------------------------------

to handle setUpQuiz
	system qList,qPointer,qMax,qScore,reviewList,qTries

    --    qList:       item list of the question cards
    --    qPointer:    item number of current question
    --    qMax:        total number of questions
    --    reviewList:  names of missed questions
    --    qTries:      number of quiz attempts

    hide button "self-test" of this background
    show button "topics" of this background

    -- initialize variables for quiz section

    put the pageCount of background "quiz" into qMax
    put scrambleItems(qMax) into qList
    put 0 into qPointer
    put 0 into qScore
    increment qTries by 1
    put null into reviewList

end setUpQuiz

to handle nextQuiz
    -- advance to next quiz question
    --    qPointer: current quiz question
    --    qMax:     total number of quiz questions
    --    qList:    item list of quiz questions

    system qPointer,qMax,qList

    if qPointer = qMax then;
        -- if this was last quiz, go to finish screen
        go page "done quiz"
    else
        -- go to quiz card
        increment qPointer by 1
        go page (item qPointer of qList) of background "quiz"

    end if
end nextQuiz

to get scrambleItems nItems
    -- randomly scrambles list of numbers from 1 to nItems

	put null into theList
    step i from 1 to nItems
        push i onto theList
    end step

    step ht_1 from 1 to nItems
        -- random by swapping items in list
        put random (nItems) into firstOne
        put random (nItems) into secondOne
        put item firstOne of theList into temp
        put item secondOne of theList into item firstOne of theList
        put temp into item secondOne of theList
    end step

    return theList
end scrambleItems

| Book | Background | Results Page | Certificate Page |

Results Page

to handle enterPage
    send displayResults
end enterPage

to handle leavePage
    put null into text of field "results"
end leavePage


to handle displayResults
    -- calculate quiz scores

    system qMax,qScore,reviewList,theUser
    -- VARIABLES
    --     qMax:         total number of questions
    --     qScore:       number correct on first answer
    --     reviewList    list of missed questions by topic name

    -- precentage needed to pass
    put 80 into passingScore


    set sysLockScreen to true
    hide button "self-test" of this background
    show button "topics" of this background
    -- calculate score
    put (qScore / qMax * 100) div 1 into userScore

    put "You scored" && qScore && "correct on the first try"\
    && "out of a total of" && qMax && "questions, or" \
    && userScore & "%." & crlf & crlf into text of  field "results"


    if (userScore >= passingScore) then;
        -- user passed minimum
        set the borderStyle of field "results" to rectangle
      --  show button  "certificate" of this page
        hide button  "redo" of this page
        show button  "next" of this page
        put "Since you exceeded " & passingScore & "%, you have passed the requirements"\
        && "for this section of the Orient Express."\
        & crlf & crlf & crlf\
        & "CONGRATULATIONS," && word 1 of theUser && "!" & crlf & crlf\
        & "Click on the arrow button to receive your Orient Express certificate."\
        after text of  field "results"

        set the fontStyle of textline 6 of the text of field "results" to bold
		set the fontSize of textline 6 of the text of  field "results" to 24
        set the fontStyle of word 4 of textline 8 of the text of field "results" to bold

    else
        -- user did not pass minimum

    --    hide  button "certificate" of this page
        show button "redo" of this page
        hide button "next" of this page
        put "Since you scored less than " & passingScore & "%, you should review the information"\
        && "for this unit of the Orient Express. You may now:" & crlf\
        & "     1.  redo the self check (click on the redo button); or" & crlf\
        & "     2.  review the topics listed below (click on the topics button)" & crlf\
        & "------------------------------------------" & crlf\
        & "TOPICS to REVIEW" & crlf\
        & "(You may wish to write down the topics you missed)" & crlf & crlf\
        & reviewList after text of  field "results"
		set the fontStyle of textline 7 of the text of field "results" to BOLD
		set the fontStyle of word 9 of textline 4 of the text of field "results" to BOLD
        set the fontStyle of word 10 of textline 5 of the text of field "results" to BOLD

        if (textLineCount( reviewList) > 3) then;
            set the borderStyle of field "results" to scrolling
        else
            set the borderStyle of field "results" to rectangle
        end if

    end if
    set sysLockScreen to false
end displayResults

| Book | Background | Results Page | Certificate Page |

Certificate Page

to handle enterPage
    send fillCertificate
end enterPage

to handle leavePage
    put null into text of  field "username"
    put null into text of  field "userID"
    put null into text of  field "theDate"
    put null into text of  field "userScore"
end leavePage

to handle fillCertificate
    -- prepare score sheet

    system qScore,qMax,reviewList,theUser,qTries
    set sysLockScreen to true
    hide button "self-test" of this background
    show button "topics" of this background
    if qScore = qMax then;
        -- perfect score
        put " " into missedQuestions
    else
        -- list missed questions
        put "-----------------------------" & crlf\
        & "         Missed Questions" & crlf & reviewList into missedQuestions
    end if

    -- fill data fields

    put theUser into text of  field "username"
    set the sysDateFormat to "M d,y, h:min AMPM"
    put sysDate  into text of  field "theDate"

    put qScore && "correct out of" && qMax &"," \
    && (qScore/qMax * 100) div 1 & "%" & "   N=" && qTries\
    & crlf & missedQuestions into text of  field "userScore"
    set sysLockScreen to false

    select textLine 1 of text of  field "userID"
	send keyDown(keyLeftArrow)

end fillCertificate