Test Feedback Option
April 26, 2006 12:00 AM
how long can we post?!?!? here is a working JS code for the trivantis-titlemgr.js/**************************************************Trivantis (http://www.lectora.com)**************************************************/var jTitleManager = new JSTitleMgr();var UNK = -1;var TF = 1;var MC = 2;var SA = 3;var ES = 4;var FB = 5;var MT = 6;var DD = 7;var IN = 8;var HS = 9;var TRN = 0;var TRE = 1;var TRS = 2;function JSTitleMgr(){ this.arVars = new Array(); this.arTests = new Array(); this.bPerUpd = false; this.bIntActs = false; this.bCM = false; this.bIntTxt = false; this.bSCORM = false; this.bAICC = false; this.intCID = -1; this.intLID = -1; this.intSID = -1; this.intTIdx = -1; this.intQIdx = -1; this.cmVers = 0; this.scVers = 0; this.strAiccST = ""; this.strAiccEM = ""; this.strAiccSN = ""; this.strAiccCR = ""; this.strAiccCO = ""; this.strCmBase = ""; this.strRedir = "";}var TMPr=JSTitleMgr.prototypeTMPr.setCoursemillParms = function( li, us, co, bs ){ this.strAiccST = li; this.strAiccSN = us; this.strAiccCO = co; this.strCmBase = bs; if( this.bCM && this.cmVers >= 2 ) this.persistCMVars( false, us );}TMPr.persistCMVars = function( put, vn ) { var bSuccess = true; if( this.bCM undefined if( locIdx < 0 ) { if( put || this.cmVers < 2 ) return false; } if( this.cmVers >= 2 ) urlDest = this.strCmBase + "/persistvars.jsp"; else { if( vn == "AICC_Lesson_Location" ) urlDest = this.strCmBase + "/bookmark.jsp?currpage=" + this.arVars[locIdx].vv; } if( urlDest != null ) { var props = new TrivStr(""); var i; var varB = new TrivStr(""); if( put ) { if( this.cmVers >= 2 ) { props.addparm( "put", "yes" ); for( i = 0; i < this.arVars.length; i++ ) { if( this.arVars.bP ) varB.add( this.arVars.vn + '=' + this.arVars.vv + 'rn' ); } if( locIdx >= 0 ) props.addparm( "loc", this.arVars[locIdx].vv ); props.addparm( "vars", varB.str ); } } else props.addparm( "get", "yes" ); var httpReq = getHTTP( urlDest, this.cmVers >= 2 ? 'POST' : 'GET', props.str ); if(httpReq.status == 200) { var strRet = httpReq.responseText; while( strRet.length > 2 && strRet.indexOf( 'rn' ) == 0 ) { var temp = strRet.substring( 2 ); strRet = temp; } var strErr; if( strRet.length > 3 ) strErr = strRet.substring( 0, 3 ); else strErr = strRet; if( strErr == "200" ) { var loc = strRet.indexOf( 'rn' ); strErr = strRet.substring( loc + 2 ); if( !put ) { for( ; loc != -1 undefined loc = end ) { loc += 2; var end = strRet.indexOf( 'rn', loc ); var equalsPos = strRet.indexOf( '=', loc ); if( equalsPos >= 0 ) { name = strRet.substring( loc, equalsPos ); value = strRet.substring( equalsPos+1, end ); this.setVariable( name, value, "365" ); } } } } else if( strErr == "550" || (strErr == "500" && this.cmVers < 2)) { bSuccess = false; alert( trivstrCMTO ); parent.document.location.href=readCookie('TrivantisBase', '/'); } } } if( put undefined for( i = 0; i < this.arVars.length; i++ ) { var tsl = this.arVars.vn.toLowerCase(); if( tsl == vnl ) return i; } return -1;}TMPr.getVariable = function( vn, dv, nd ){ var val = dv; var i = this.findVariable( vn ); if( i >= 0 ) return this.arVars.vv; return this.addVariable( vn, dv, nd );}TMPr.setVariable = function( vn, dv, nd ){ var i = this.findVariable( vn ); if( this.intTIdx != -1 ) this.arTests[this.intTIdx].SetInteraction( vn, this.intQIdx ); if( i >= 0 ) { if( this.arVars.bP undefined}TMPr.loadTest = function( tn, pn ){ var tIdx = this.getTIdx( tn, 1 ); if( tIdx < 0 ) return false; if( !this.arTests[tIdx].bLoaded ) { var xfn = tn + '.xml'; var httpReq = getHTTP( xfn, 'GET', null ); if( httpReq.status != 200 && httpReq.status != 0 ) { alert( 'You must run this content from a web-based server ' + httpReq.statusText ); return; } var nl = httpReq.responseXML.documentElement; if( !nl undefined } this.intTIdx = -1; if( this.arTests[tIdx].bLoaded undefined if( this.intQIdx != -1 ) this.intTIdx = tIdx; } return true;}TMPr.ResetTest = function( tn ) { var tIdx = this.getTIdx( tn, true ); if( tIdx < 0 ) return false; this.arTests[tIdx].ResetTest(); return true;}TMPr.getTIdx = function( tn, add ) { var i; for( i = 0; i < this.arTests.length; i++ ) { if( this.arTests.strLoadedName == tn ) return i; } if( !add ) return -1; var test = new TrivTest(); this.arTests.push( test ); return this.arTests.length - 1;}TMPr.getRemainingTime = function( tn ) { var tIdx = this.getTIdx( tn, false ); var lRemain = 0; var lCurr = 0; if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; if( this.arTests[tIdx].lStartTime > 0 ) { var now = new Date().getTime(); lCurr = now - this.arTests[tIdx].lStartTime; } lRemain = parseInt((this.arTests[tIdx].iTestTime * 60000 - lCurr - this.arTests[tIdx].lElapsedTime) / 1000, 10); if( lRemain > 0 ) { var strRemain; var temp = parseInt(lRemain/36000, 10); lRemain -= temp * 36000; strRemain = temp + ':'; temp = parseInt(lRemain/60, 10); lRemain -= temp * 60; if( temp <= 9 ) strRemain += '0'; strRemain += temp + ' '; if( lRemain <= 9 ) strRemain += '0'; strRemain += lRemain; return strRemain; } else return null;}TMPr.startTestTimer = function( tn ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return; if( this.arTests[tIdx].lStartTime == 0 ) this.arTests[tIdx].lStartTime = new Date().getTime();}TMPr.stopTestTimer = function( tn ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return; if( this.arTests[tIdx].lStartTime > 0 ) { var now = new Date(); this.arTests[tIdx].lElapsedTime += now.getTime() - this.arTests[tIdx].lStartTime; this.arTests[tIdx].lStartTime = 0; }}TMPr.getRandomPageNumber = function( tn, pn ){ var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return ""; return this.arTests[tIdx].getRandomPageNumber( pn );}TMPr.getRandomSectPageNumber = function( tn, sect, pg ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return ""; return this.arTests[tIdx].getRandomSectPageNumber( sect, pg );}TMPr.getPrevTestPage = function( tn, pg ){ var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; var pp = this.arTests[tIdx].getPrevTestPage( pg ); if( pp != null ) { if( pp.indexOf( '#' ) == 0 ) { var test = pp.substring( 1 ); tIdx = this.getTIdx( test, false ); if( tIdx >= 0 && this.arTests[tIdx].bLoaded ) { var pn = this.arTests[tIdx].iNumPages-1; pp = this.arTests[tIdx].arRTPages[pageNum].name; } } return pp; } else return this.processTest( tn );}TMPr.getNextTestPage = function( tn, pg ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; var np = this.arTests[tIdx].getNextTestPage( pg ); if( np != null ) { if( np.indexOf( '#' ) == 0 ) { var test = np.substring( 1 ); np = this.getNextTestPage( test, "" ); } return np; } else return null;}TMPr.getRandomPage = function( tn, sn ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; return this.arTests[tIdx].getRandomPage( sn );}TMPr.cancelTest = function( tn ){ var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; var dest = this.arTests[tIdx].strFailPage; if( dest.indexOf( '#' ) == 0 ) { var test = dest.substring( 1 ); dest = this.getNextTestPage( test, "" ); } return dest;}TMPr.processTest = function( tn ) { var tIdx = this.getTIdx( tn, false ); var dest; if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; this.stopTestTimer( tn ); this.arTests[tIdx].GradeTest( this.arVars ); this.arTests[tIdx].strTestResult = this.arTests[tIdx].ProcessTest( this.bCM, this.strCmBase, this.strAiccSN, this.strAiccST, this.strAiccEM, this.strAiccCO, this.arVars ); if( this.arTests[tIdx].strTestResult.indexOf( '#' ) == 0 ) { var test = this.arTests[tIdx].strTestResult.substring( 1 ); this.arTests[tIdx].strTestResult = this.getNextTestPage( test, "" ); } if( this.bIntActs ) { var CID; var LID; var SID; if( this.bSCORM ) { if( this.intCID == -1 ) this.intCID = this.findVariable( "cmi.core.course_id" ); if( this.intLID == -1 ) this.intLID = this.findVariable( "cmi.core.lesson_id" ); if( this.intSID == -1 ) this.intSID = this.findVariable( "cmi.core.student_id" ); } else { if( this.intCID == -1 ) this.intCID = this.findVariable( "COURSE_ID" ); if( this.intLID == -1 ) this.intLID = this.findVariable( "LESSON_ID" ); if( this.intSID == -1 ) this.intSID = this.findVariable( "STUDENT_ID" ); } if( this.intCID != -1 ) CID = this.arVars[this.intCID].vv; else CID = this.strAiccCO; if( this.intLID != -1 ) LID = this.arVars[this.intLID].vv; else LID = ""; if( this.intSID != -1 ) SID = this.arVars[this.intSID].vv; else SID = ""; var intStr = new TrivStr(""); this.arTests[tIdx].HandleInteractions( intStr, CID, SID, LID, this.scVers, this.bIntTxt ); if( this.bAICC ) this.PutInteractions( intStr.str ); } return this.arTests[tIdx].strTestResult;}TMPr.getStudentResults = function( tn ) { var tIdx = this.getTIdx( tn, false ); var dest; if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; else return this.arTests[tIdx].strStudentRes;}TMPr.getTestName = function( tn ) { var tIdx = this.getTIdx( tn, false ); var dest; if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; else return this.arTests[tIdx].strTestName;}TMPr.getProcessTestResult = function( tn ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; return this.arTests[tIdx].strTestResult;}TMPr.getProcessTestResponse = function( tn ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return null; return this.arTests[tIdx].strTestSubmit;}TMPr.GetTestScore = function( tn ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return "0"; return this.arTests[tIdx].GradeTest( this.arVars );}TMPr.GetTestSectionScore = function( tn, sect ) { var tIdx = this.getTIdx( tn, false ); if( tIdx < 0 || !this.arTests[tIdx].bLoaded ) return "0"; return this.arTests[tIdx].GradeTestSection( this.arVars, sect );}function TrivVar(){ this.bP = false; this.vn = ""; this.vv = "";}function TrivStr(a){ this.str = a;}TrivStr.prototype.add = function( a ){ this.str += a;}TrivStr.prototype.addparm = function( parm, val ){ if( this.str.length > 0 ) this.str += "undefined}function getNVStr( nl, tag, dv ){ var nv = nl.getElementsByTagName(tag)[0]; if( nv undefined}function getNVInt( nl, tag, dv ){ return parseInt(getNVStr( nl, tag, dv ), 10);}function get_random( lim ){ return Math.round(Math.random()*lim);}function TrivTest(){ this.bLoaded = false; this.strLoadedName = ""; this.strTestName = ""; this.strResults = ""; this.bAutoG = 0; this.bShowRes = 0; this.bShowScOnly = 0; this.iTestTime = 0; this.iNumberRandom = 0; this.iPassGrade = 0; this.bModeGet = 0; this.bIncVar = 0; this.bPromptSuc = 0; this.bPersist = 0; this.iStudScore = 0; this.lStartTime = 0; this.lElapsedTime = 0; this.strFailPage = ""; this.strPassPage = ""; this.strPrevPage = ""; this.strAllowedTM = ""; this.strElapsedTM = ""; this.strTestSubmit = ""; this.arWork = new Array(); this.arPicked = new Array(); this.arLoadedPages = new Array(); this.arSections = new Array(); this.arRTPages = new Array(); this.strStudentRes = "";}var TTPr=TrivTest.prototypeTTPr.loadTestFile = function( nl ){ this.bAutoG = getNVInt( nl, 'grade', this.bAutoG ); this.bShowRes = getNVInt( nl, 'showresults', this.bShowRes ); this.bShowScOnly = getNVInt( nl, 'scoreonly', this.bShowScOnly ); this.bModeGet = getNVInt( nl, 'get', this.bModeGet ); this.bIncVar = getNVInt( nl, 'incvar', this.bIncVar ); this.bPromptSuc = getNVInt( nl, 'promptsuccess', this.bPromptSuc ); this.bPersist = getNVInt( nl, 'persist', this.bPersist ); this.strTestName = getNVStr( nl, 'name', this.strTestName ); this.strResults = getNVStr( nl, 'submitto', this.strResults ); this.iTestTime = getNVInt( nl, 'testtime', this.iTestTime ); this.iNumberRandom = getNVInt( nl, 'numrandom', this.iNumberRandom ); this.iPassGrade = getNVInt( nl, 'passinggrade', this.iPassGrade ); this.strFailPage = getNVStr( nl, 'cancelfail', this.strFailPage ); this.strPassPage = getNVStr( nl, 'passdone', this.strPassPage ); this.strPrevPage = getNVStr( nl, 'prevpage', this.strPrevPage ); var arEle = nl.getElementsByTagName('section'); var i, j, k; for( i = 0; arEle undefined for( i = 0; arEle undefined for( j = 0; j < this.arSections.length; j++ ) { for( k = 0; k < this.arSections[j].arPages.length; k++ ) { if( page.name == this.arSections[j].arPages[k].name ) { bAdd = false; break; } } undefined if( this.iNumberRandom > 0 ) { if( this.arWork.length == 0 ) { for( i = 0; i < this.arSections.length; i++ ) this.arSections.LoadPages( this.arWork, false ); for( i = 0; i < this.arLoadedPages.length; i++ ) this.arWork.push( this.arLoadedPages ); if( this.iNumberRandom > this.arWork.length ) this.iNumberRandom = this.arWork.length; } for( i = 0; i < this.arWork.length; i++ ) { if( this.arPicked.length < i + 1) this.arPicked.push( 0 ); else this.arPicked = 0; } for( i = 0; i < this.iNumberRandom; i++ ) { var sel = get_random( this.arWork.length - i - 1); for( j = 0; j <= sel; j++ ) if( this.arPicked[j] ) sel++; this.arPicked[sel] = 1; this.arRTPages.push( this.arWork[sel] ); } } else { for( i = 0; i < this.arLoadedPages.length; i++ ) this.arRTPages.push( this.arLoadedPages ); for( i = 0; i < this.arSections.length; i++ ) this.arSections.LoadPages( this.arRTPages, true ); }}TTPr.ResetTest = function() { this.arRTPages.length = 0; this.LoadPages(); this.lElapsedTime = 0;}TTPr.GetTestScore = function( arVars ) { var maxScore = 0; var testScore = 0; var mScore = 0; var tScore = 0; var bCanScore = true; for( var idx = 0; idx < this.arRTPages.length; idx++ ) { this.arRTPages[idx].gradeQs( arVars ); if( !this.arRTPages[idx].isScoreable() ) bCanScore = false; mScore = this.arRTPages[idx].getMaxScore(); tScore = this.arRTPages[idx].getScore(); maxScore += mScore; testScore += tScore; } if( bCanScore ) { if( maxScore > 0 ) this.iStudScore = parseInt(testScore * 100.0 / maxScore + 0.5, 10); else this.iStudScore = 100; } else this.iStudScore = -1; return this.iStudScore;}TTPr.GradeTest = function( arVars ) { return this.GetTestScore( arVars ); }TTPr.GradeTestSection = function( arVars, sect ) { var maxScore = 0; var testScore = 0; var mScore = 0; var tScore = 0; var sectScore = 0; var bCanScore = true; for( var idx = 0; idx < this.arRTPages.length; idx++ ) { if( this.arRTPages[idx].iSectionId == sect ) { this.arRTPages[idx].gradeQs( arVars ); if( !this.arRTPages[idx].isScoreable() ) bCanScore = false; mScore = this.arRTPages[idx].getMaxScore(); tScore = this.arRTPages[idx].getScore(); maxScore += mScore; testScore += tScore; } } if( bCanScore ) { if( maxScore > 0 ) sectScore = parseInt(testScore * 100 / maxScore, 10); else sectScore = 100; } else sectScore = -1; return sectScore;}TTPr.ProcessTest = function( bCM, strCMBase, us, id, em, cid, arVars ) { var strDest = null; var bSuccess = true; var secs; var test; var eT; if( this.iTestTime > 0 ) { secs = this.iTestTime * 60; test = parseInt(secs/3600, 10); secs -= (test * 3600); this.strAllowedTM = ""; if( test < 10 ) this.strAllowedTM += "0"; this.strAllowedTM += test + ":"; test = parseInt(secs/60, 10); secs -= (test * 60); if( test < 10 ) this.strAllowedTM += "0"; this.strAllowedTM += test + ":"; if( secs < 10 ) this.strAllowedTM += "0"; this.strAllowedTM += secs; eT = parseInt(this.lElapsedTime / 1000, 10); if( eT > this.iTestTime * 60 || eT < 0) eT = this.iTestTime * 60; test = parseInt(eT/3600, 10); eT = eT - (test * 3600); this.strElapsedTM = ""; if( test < 10 ) this.strElapsedTM += "0"; this.strElapsedTM += test + ":"; test = parseInt(eT/60, 10); eT -= (test * 60); if( test < 10 ) this.strElapsedTM += "0"; this.strElapsedTM += test + ":"; if( eT < 10 ) this.strElapsedTM += "0"; this.strElapsedTM += eT; } document.resWind = null if( this.bShowRes ) { this.strStudentRes = this.CreateTextResults( us, arVars ); document.resWind = ObjLayerActionGoToNewWindow( 'trivantistestresults.html?testname='+this.strLoadedName, 'Trivantis_Popup_Result', 'width=528,height=500,scrollbars=1,resizable=1,menubar=0,too lbar=0,location=0,status=0' ); } if( bCM ) { var urlDest = strCMBase + "/testresults.jsp"; pl = new TrivStr("") if( us ) pl.addparm( "user", us ); if( cid ) pl.addparm( "course", cid ); this.CreateCGIResults( pl, arVars, true ); var httpReq = getHTTP( urlDest, 'POST', pl.str ); if(httpReq.status == 200) { var strRet = httpReq.responseText; while( strRet.length > 2 && strRet.indexOf( 'rn' ) == 0 ) { var temp = strRet.substring( 2 ); strRet = temp; } var strErr; if( strRet.length > 3 ) strErr = strRet.substring( 0, 3 ); else strErr = strRet; var strMsg = ""; if( strErr == "520" ) { bSuccess = false; strMsg = trivstrERRNQ; } else if( strErr == "530" ) { bSuccess = false; strMsg = trivstrERRAS; } else if( strErr == "430" ) { bSuccess = false; strMsg = trivstrERRLI; } else if( strErr != "200" ) { bSuccess = false; strMsg = trivstrERRST; } if( !bSuccess ) { alert( strMsg ); } } } // Determine if a variable macro strDest = this.getVariableMacroValue( this.strResults, arVars ); if( bSuccess && strDest != null ) { if ( strDest != null && strDest.length > 0 ) { var pl = new TrivStr("") pl.addparm( "name", us ); this.CreateCGIResults( pl, arVars, false ); var httpReq = getHTTP( strDest, 'POST', pl.str ); bSuccess = (httpReq.status == 200); this.strTestSubmit = httpReq.responseText; if( bSuccess undefined } } } if( !this.bAutoG || this.iStudScore >= this.iPassGrade || this.iStudScore == -1 ) return this.strPassPage; else return this.strFailPage;}TTPr.CreateTextResults = function( us, arVars ) { var idx; var qNum = 0; var txtRes = new TrivStr("") txtRes.add( this.strTestName + "
"); if( us != null && us.length > 0 ) txtRes.add( trivstrSTUD + us + "
" ); if( this.iStudScore != -1 undefined } if( this.bShowScOnly == 0 ) { for( idx = 0; idx < this.arRTPages.length; idx++ ) qNum = this.arRTPages[idx].createTextResults( txtRes, qNum, this.bAutoG ); } return txtRes.str;}TTPr.CreateCGIResults = function( pl, arVars, bCM ) { var idx; var qNum = 0; var svSID = -1; var numTFTot = 0; var numTFSect = 0; var numTFOnP = 0; var numMCTot = 0; var numMCSect = 0; var numMCOnP = 0; var corrTFTot = 0; var corrTFSect = 0; var corrTFOnP = 0; var corrMCTot = 0; var corrMCSect = 0; var corrMCOnP = 0; pl.addparm( "TestName", this.strTestName); for( idx = 0; idx < this.arRTPages.length; idx++ ) { qNum = this.arRTPages[idx].createCGIResults( pl, qNum ); if( svSID != this.arRTPages[idx].iSectionId ) { if( svSID > 0 undefined } corrTFSect = 0; corrMCSect = 0; numTFSect = 0; numMCSect = 0; svSID = this.arRTPages[idx].iSectionId; } numTFOnP = this.arRTPages[idx].getNumTFQs(); corrTFOnP = this.arRTPages[idx].getNumCorrectTFQs(); numMCOnP = this.arRTPages[idx].getNumMCQs(); corrMCOnP = this.arRTPages[idx].getNumCorrectMCQs(); numTFTot += numTFOnP; numTFSect += numTFOnP; corrTFTot += corrTFOnP; corrTFSect += corrTFOnP; numMCTot += numMCOnP; numMCSect += numMCOnP; corrMCTot += corrMCOnP; corrMCSect += corrMCOnP; } if( !this.bShowScOnly && svSID > 0 undefined } if( this.iStudScore != -1 undefined else if( bCM ) pl.addparm( "Score", "-1" ); if( this.bAutoG || bCM ) { pl.addparm( "PassingGrade", this.iPassGrade ); pl.addparm( "TrueFalse", corrTFTot + "/" + numTFTot ); pl.addparm( "MultipleChoice", corrMCTot + "/" + numMCTot ); } pl.addparm( "NumQuestions", qNum ); if( this.strAllowedTM != "" ) { pl.addparm( "AllowedTime", this.strAllowedTM ); pl.addparm( "ElapsedTestTime", this.strElapsedTM ); } if( this.bIncVar ) { for( idx = 0; idx < arVars.length; idx++ ) { if ((submitValue = this.getVariableSubmitValue( idx, arVars )) == "~~~null~~~") submitValue = trivstrNA pl.addparm( this.getVariableSubmitName( idx, arVars ), submitValue ); } } return true;}TTPr.getRandomPageNumber = function( pg ) { var i; for( i = 0; i < this.arRTPages.length; i++ ) if( this.arRTPages && this.arRTPages.name == pg ) return String(i + 1); return "";}TTPr.getRandomSectPageNumber = function( section, pg ) { var i; var pn = 0; for( i = 0; i < this.arRTPages.length; i++ ) { if( this.arRTPages.iSectionId == section ) pn++; if( this.arRTPages.name == pg ) return String(i + 1); } return "";}TTPr.findTestPage = function( pg ){ var i; for( i = 0; i < this.arRTPages.length; i++ ) if( this.arRTPages.name == pg ) return i; return -1;}TTPr.getPrevTestPage = function( pg ) { var cp = this.findTestPage( pg ); if( cp > 0 ) cp--; else if( cp == 0 ) return this.strPrevPage; else cp = this.arRTPages.length-1; if( cp >= 0 undefined if( cp > -1 undefined else cp = 0; if( cp >= 0 undefined var len = 0; if( pre ) len = pre.length; for( i = 0; i < this.arRTPages.length; i++ ) { var tmp = this.arRTPages.name.substr( 0, len ); if( tmp == pre ) return this.arRTPages.name; } return null;}TTPr.getVariableSubmitName = function( idx, arVars ) { if( arVars[idx].vn.length > 3 ) { var pN = arVars[idx].vn.substring(0, 3 ).toLowerCase(); if( pN == "var" ) return arVars[idx].vn.substring( 3 ); } return arVars[idx].vn;}TTPr.getVariableSubmitValue = function( idx, arVars ) { if( arVars[idx].vv.length > 7 ) { var pV = arVars[idx].vv.substring(0, 7 ); if( pV == "~~f=1~~" || pV == "~~f=2~~" || pV == "~~f=4~~" ) { var slashPos = arVars[idx].vv.indexOf( '|' ); return arVars[idx].vv.substring( slashPos + 1 ); } } else if ( arVars[idx].vv == "~~~null~~~" ) return ""; return arVars[idx].vv;}TTPr.getVariableMacroValue = function( val, arVars ) { var strResult = val; var length = val.length; if( length > 6 ) { var strStart; var strMid; var strEnd; strStart = val.substring( 0, 4 ).toLowerCase(); strMid = val.substring( 4, length - 1 ); strEnd = val.substring( length-1 ); if( strStart == "var(" undefined for( idx = 0; idx < arVars.length; idx++ ) { if( arVars[idx].vn == strMid ) return this.getVariableSubmitValue( idx, arVars ); } } } return strResult;}function TrivTestSection(){ this.iNumberRandom = 0; this.iSectionId = UNK; this.arPages = new Array(); this.arPicked = new Array();}var TSPr=TrivTestSection.prototypeTSPr.load = function( nl ){ this.iSectionId = getNVInt( nl, 'id', this.iSectionId ); this.iNumberRandom = getNVInt( nl, 'numrandom', this.iNumberRandom ); var arEle = nl.getElementsByTagName('page'); for( var i=0; arEle undefined if( this.iNumberRandom > 0 undefined for( i = 0; i < this.arPages.length; i++ ) { if( this.arPicked.length < i + 1) this.arPicked.push( 0 ); else this.arPicked = 0; } for( i = 0; i < this.iNumberRandom; i++ ) { var sel = get_random( this.arPages.length - i - 1); for( j = 0; j <= sel; j++ ) if( this.arPicked[j] ) sel++; this.arPicked[sel] = 1; arr.push( this.arPages[sel] ); } } else { for( i = 0; i < this.arPages.length; i++ ) arr.push( this.arPages ); }}function TrivTestPage(){ this.name = ""; this.iSectionId = UNK; this.arQues = new Array();}var TPPr=TrivTestPage.prototypeTPPr.load = function( sid, nl ){ this.iSectionId = sid; this.name = getNVStr( nl, 'name', this.name ); var arEle = nl.getElementsByTagName('question'); for( var i=0; arEle undefined }}TPPr.gradeQs = function( arVars ){ for( var idx = 0; idx < this.arQues.length; idx++ ) this.arQues[idx].gradeQs( arVars );}TPPr.getNumTFQs = function(){ var numQ = 0; for( var idx = 0; idx < this.arQues.length; idx++ ) numQ += this.arQues[idx].getNumTFQs(); return numQ;}TPPr.getNumCorrectTFQs = function(){ var idx; var numC = 0; for( idx = 0; idx < this.arQues.length; idx++ ) numC += this.arQues[idx].getNumCorrectTFQs(); return numC;}TPPr.getNumMCQs = function(){ var idx; var numQ = 0; for( idx = 0; idx < this.arQues.length; idx++ ) numQ += this.arQues[idx].getNumMCQs(); return numQ;}TPPr.getNumCorrectMCQs = function(){ var idx; var numC = 0; for( idx = 0; idx < this.arQues.length; idx++ ) numC += this.arQues[idx].getNumCorrectMCQs(); return numC;}TPPr.createTextResults = function( txtRes, bQN, bAG ){ for( var idx = 0; idx < this.arQues.length; idx++ ) bQN = this.arQues[idx].createTextResults( txtRes, bQN, bAG ); return bQN;}TPPr.getMaxScore = function(){ var ourMax = 0; for( var idx = 0; idx < this.arQues.length; idx++ ) ourMax += this.arQues[idx].getMaxScore(); return ourMax;}TPPr.getScore = function(){ var ourScore = 0; for( var idx = 0; idx < this.arQues.length; idx++ ) ourScore += this.arQues[idx].getScore(); return ourScore;}TPPr.isScoreable = function(){ for( var idx = 0; idx < this.arQues.length; idx++ ) if( !this.arQues[idx].isScoreable()) return false; return true;}TPPr.createCGIResults = function( pl, bQN ){ var idx; var subidx; var loc; var strTemp; for( idx = 0; idx < this.arQues.length; idx++ ) bQN = this.arQues[idx].createCGIResults( pl, bQN ); return bQN;} function TrivQuestion(){ this.id = 0; this.iSectionId = UNK; this.type = 0; this.weight = 1; this.name = ""; this.varName = ""; this.text = ""; this.corrAns = ""; this.arCorrAns = new Array(); this.choices = ""; this.bAllowMult = 0; this.bPersist = 0; this.bGradeInd = 0; this.strOurAns = ""; this.iOurScore = 0;}var TQPr=TrivQuestion.prototypeTQPr.load = function( sid, nl ){ this.iSectionId = sid; this.id = getNVInt( nl, 'id', this.id ); this.type = getNVInt( nl, 'type', this.type ); this.weight = getNVInt( nl, 'weight', this.weight ); this.name = getNVStr( nl, 'name', this.name ); this.varName = getNVStr( nl, 'var', this.varName ); this.text = getNVStr( nl, 'text', this.text ); this.corrAns = unescape( getNVStr( nl, 'correctans', this.corrAns )); if( this.type == DD || this.type == MT ) { var pos1 = 0 var pos2 pos2 = this.corrAns.indexOf( ',' ) while( pos2 != -1 ) { this.arCorrAns.push( this.corrAns.substring( pos1, pos2 ) ) pos1 = pos2+1 pos2 = this.corrAns.indexOf( ',', pos1 ) } this.arCorrAns.push( this.corrAns.substring( pos1, this.corrAns.length ) ) } this.choices = unescape( getNVStr( nl, 'choices', this.choices )); this.bAllowMult = getNVInt( nl, 'allowmult', this.bllowMult ); this.bPersist = getNVInt( nl, 'persist', this.bPersist ); this.bGradeInd = getNVInt( nl, 'gradeindividual', this.bGradeInd );}TQPr.getMaxScore = function(){ var ourMax = 0; if( this.bGradeInd ) { ourMax = 1; for( var loc = this.corrAns.indexOf( ',' ); loc != -1; loc = this.corrAns.indexOf( ',', loc+1) ) ourMax++; ourMax *= this.weight; } else if( this.type != UNK ) ourMax = this.weight; return ourMax;}TQPr.getScore = function(){ var ourScore = 0; if( this.type != UNK ) ourScore = this.iOurScore; return ourScore;}TQPr.isScoreable = function(){ if( this.type == SA || this.type == ES ) { if( this.weight > 0 ) return false; } return true;}TQPr.isCorrect = function(){ var lastPos; var idx; switch( this.type ) { case TF: if( this.strOurAns != null && this.strOurAns == this.corrAns ) return 1; break; case MC: case HS: if( this.strOurAns != null && this.strOurAns == this.corrAns ) return 1; break; case SA: case ES: return 0; case FB: lastPos = -1; while ( this.strOurAns != null ) { var strTemp; var oAns = this.strOurAns.toString().toLowerCase(); idx = this.corrAns.indexOf( '|', lastPos + 1 ); if( idx != -1 ) strTemp = this.corrAns.substring( lastPos+1, idx ).toLowerCase(); else strTemp = this.corrAns.substring( lastPos+1 ).toLowerCase(); if( oAns == strTemp ) return 1; lastPos = idx; if( idx == -1 ) break; } break; case MT: case DD: if( this.strOurAns != null ) { var tmpOurAns = this.strOurAns + ','; var tmpCorrAns; var iNumCorr = 0; for( var i=0; i 0 ) { for( var i=0; i
Discussions have been disabled for this post