|
Server : Apache/2.4.62 System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64 User : www ( 80) PHP Version : 8.3.8 Disable Function : NONE Directory : /domains/thewalshgroup/2014/ |
Upload File : |
/**************************************************
Trivantis (http://www.trivantis.com)
**************************************************/
var jTitleManager = new JSTitleMgr();
var TINCAN = 2013;
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 LK = 10;
var OR = 11;
var LT = 12;
var NE = 13;
var MR = 14;
//var RS = 15;
var TRN = 0;
var TRE = 1;
var TRS = 2;
var EQU = 1;
var BT_INC = 2;
var BT_EXC = 3;
var GRT = 4;
var GTE = 5;
var LST = 6;
var LSTE = 7;
var NEQU = 8;
function JSTitleMgr()
{
this.arVars = new Array();
this.arTests = new Array();
this.bPerUpd = false;
this.bIntActs = false;
this.bCM = false;
this.bIntTxt = false;
this.bForceTF = true;
this.bSCORM = false;
this.bTinCan = 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.bAddTimeStamp = true;
this.strAiccST = new String( "" );
this.strAiccEM = new String( "" );
this.strAiccSN = new String( "" );
this.strAiccCR = new String( "" );
this.strAiccCO = new String( "" );
this.strCmBase = new String( "" );
this.strRedir = new String( "" );
}
var TMPr=JSTitleMgr.prototype
TMPr.setCoursemillParms = function( li, us, co, bs )
{
this.strAiccST = new String( li );
this.strAiccSN = new String( us );
this.strAiccCO = new String( co );
this.strCmBase = new String( bs );
if( this.bCM && this.cmVers >= 2 )
this.persistCMVars( false, us );
}
TMPr.persistCMVars = function( put, vn )
{
var bSuccess = true;
if( this.bCM && (this.bPerUpd || !put))
{
var urlDest = null;
var locIdx = this.findVariable( "AICC_Lesson_Location" );
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[i].bP )
varB.add( this.arVars[i].vn + '=' + this.arVars[i].vv + '\r\n' );
}
if( locIdx >= 0 )
props.addparm( "loc", this.arVars[locIdx].vv, true );
props.addparm( "vars", varB.str, true );
}
}
else
props.addparm( "get", "yes" );
props.str = props.str.replace(/\+/g, '%2B');
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( '\r\n' ) == 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( '\r\n' );
strErr = strRet.substring( loc + 2 );
if( !put )
{
for( ; loc != -1 && loc < strRet.length; loc = end )
{
loc += 2;
var end = strRet.indexOf( '\r\n', 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;
trivAlert( 'CM_SUBVARSERR', 'CourseMill', trivstrCMTO );
parent.document.location.href=readCookie('TrivantisBase', '/');
}
}
}
if( put && bSuccess )
this.bPerUpd = false;
}
return bSuccess;
}
TMPr.setUserInfo = function( us, em )
{
this.strAiccSN = new String( us );
this.strAiccEM = new String( em );
}
TMPr.findVariable = function( vn )
{
var i;
var vnl = vn.toLowerCase();
for( i = 0; i < this.arVars.length; i++ )
{
var tsl = this.arVars[i].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[i].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[i].bP && this.arVars[i].vv != dv )
this.bPerUpd = true;
this.arVars[i].vv = dv;
if( vn == 'cmi.core.student_name' ) this.strAiccSN = new String( dv );
if( this.bCM )
this.persistCMVars( true, vn );
return;
}
this.addVariable( vn, dv, nd );
}
TMPr.addVariable = function( vn, dv, nd )
{
if( dv == null )
dv = "";
var nVar = new TrivVar();
nVar.vn = vn;
nVar.vv = dv;
if( nd )
{
nVar.bP = true;
this.bPerUpd = true;
}
this.arVars.push(nVar);
if( vn == 'cmi.core.student_name' ) this.strAiccSN = new String( dv );
if( this.bCM )
this.persistCMVars( true, vn );
return dv;
}
TMPr.loadTest = function( fn, tn, pn )
{
var tIdx = this.getTIdx( tn, 1 );
if( tIdx < 0 )
return false;
if( !this.arTests[tIdx].bLoaded )
{
var xfn = fn + '.xml';
var httpReq = getHTTP( xfn, 'GET', null );
if( httpReq.status != 200 && httpReq.status != 0 )
{
trivAlert( 'LOADTESTERR', tn, 'You must run this content from a web-based server ' + httpReq.statusText );
return;
}
var nl;
if(httpReq.responseXML == null){
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(httpReq.response, "application/xml");
nl = xmlDoc.documentElement;
} else {
nl = httpReq.responseXML.documentElement;
}
if( !nl && window.ActiveXObject)
{
nl=new ActiveXObject("Microsoft.XMLDOM")
nl.async="false"
nl.load(xfn)
}
else
nl.normalize();
this.arTests[tIdx].strLoadedName = tn;
this.arTests[tIdx].loadTestFile( nl );
}
this.intTIdx = -1;
if( this.arTests[tIdx].bLoaded && this.bIntActs )
{
this.intQIdx = this.arTests[tIdx].StartInteractions( pn );
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[i].strLoadedName == tn ) return i;
}
if( !add ) return -1;
var test = new TrivTest();
this.arTests.push( test );
return this.arTests.length - 1;
}
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, this.bAddTimeStamp, this.bForceTF );
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";
var score = this.arTests[tIdx].GradeTest( this.arVars );
if( !this.arTests[tIdx].bAutoG || score >= this.arTests[tIdx].iPassGrade || score == -1 )
this.arTests[tIdx].strTestResult = this.arTests[tIdx].strPassPage;
else
this.arTests[tIdx].strTestResult = this.arTests[tIdx].strFailPage;
return score;
}
TMPr.GetIfTestPassed = function( tn )
{
var tIdx = this.getTIdx( tn, false );
if( tIdx < 0 || !this.arTests[tIdx].bLoaded )
return false;
var score = this.arTests[tIdx].GradeTest( this.arVars );
if( !this.arTests[tIdx].bAutoG || score >= this.arTests[tIdx].iPassGrade || score == -1 )
return true;
else
return false;
}
TMPr.GetQuestionList = function( tn )
{
var tIdx = this.getTIdx( tn, false );
if( tIdx < 0 || !this.arTests[tIdx].bLoaded )
return "0";
return this.arTests[tIdx].getQuestionList();
}
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 );
}
TMPr.getVariableNameAt = function( atVal )
{
if( atVal >= 0 && atVal < this.arVars.length )
return this.arVars[atVal].vn;
return "";
}
TMPr.getVariableValueAt = function ( atVal )
{
if(atVal >= 0 && atVal < this.arVars.length)
return this.arVars[atVal].vv;
return "";
}
TMPr.getNumVariables = function(){
return this.arVars.length;
}
TMPr.isWeb20Enabled = function()
{
return trivWeb20Popups;
}
function TrivVar()
{
this.bP = false;
this.vn = "";
this.vv = "";
}
function TrivStr(a)
{
this.str = a;
this.count=0;
}
TrivStr.prototype.add = function( a )
{
this.str += a;
}
TrivStr.prototype.addparm = function( parm, val, noEnc )
{
if( this.str.length > 0 )
this.str += "&"
if( noEnc )
this.str += parm + "=" + val;
else
this.str += encodeURI(parm) + "=" + encodeURI(val);
this.count++;
}
function getNVStr( nl, tag, dv )
{
var nv = nl.getElementsByTagName(tag)[0];
if( nv && nv.firstChild ) return unJUN(nv.firstChild.data);
else return dv;
}
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.iShowRes = 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.bSurvey = 0;
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.prototype
TTPr.loadTestFile = function( nl )
{
this.bSurvey = getNVInt( nl, 'survey', this.bSurvey );
this.bAutoG = getNVInt( nl, 'grade', this.bAutoG );
this.iShowRes = getNVInt( nl, 'showresults', this.iShowRes );
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 );
this.bGDocs = getNVInt( nl, 'gdocs', this.bGDocs );
var arEle = nl.getElementsByTagName('section');
var i, j, k;
for( i = 0; arEle && i < arEle.length; i++ )
{
var sect = new TrivTestSection();
sect.load( arEle[i] );
this.arSections.push( sect );
}
arEle = nl.getElementsByTagName('page');
for( i = 0; arEle && i < arEle.length; i++ )
{
var page = new TrivTestPage();
var bAdd = true
page.load( UNK, arEle[i] );
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;
}
}
}
if( bAdd )
this.arLoadedPages.push( page );
}
this.LoadPages();
this.bLoaded = true;
}
TTPr.LoadPages = function()
{
var i;
var j;
if( this.iNumberRandom > 0 )
{
if( this.arWork.length == 0 )
{
for( i = 0; i < this.arSections.length; i++ )
this.arSections[i].LoadPages( this.arWork, false );
for( i = 0; i < this.arLoadedPages.length; i++ )
this.arWork.push( this.arLoadedPages[i] );
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[i] = 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
{
var tmpArr = new Array();
for( i = 0; i < this.arLoadedPages.length; i++ )
this.arRTPages[this.arLoadedPages[i].index] = this.arLoadedPages[i];
for( i = 0; i < this.arSections.length; i++ )
this.arSections[i].LoadPages( this.arRTPages, true );
for( i = 0; i < this.arRTPages.length; i++ )
{
if( this.arRTPages[i] != null )
tmpArr.push( this.arRTPages[i] );
}
this.arRTPages = tmpArr;
}
}
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.getQuestionList = function()
{
var ql = '';
for( var idx = 0; idx < this.arRTPages.length; idx++ )
{
var ques = this.arRTPages[idx].getQuestionList();
if( ques.length != 0 )
ql += ques;
}
return ql;
}
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;
}
window.resWind = null
if( this.iShowRes )
{
this.strStudentRes = this.CreateTextResults( us, arVars );
}
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, false );
pl.str = pl.str.replace(/\+/g, '%2B');
var httpReq = getHTTP( urlDest, 'POST', pl.str );
if(httpReq.status == 200)
{
var strRet = httpReq.responseText;
while( strRet.length > 2 && strRet.indexOf( '\r\n' ) == 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 )
{
trivAlert( 'CM_HTTPERR', this.strLoadedName, 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("")
if( this.bGDocs )
{
var i=strDest.indexOf("key=");
if(i>=0){
var str=strDest.substr(i+4);
i=str.indexOf('#');
if(i>=0)
str=str.substr(0,i);
pl.addparm( "key", str );
}else{
i=strDest.indexOf("formKey=");
if(i>=0){
var str=strDest.substr(i+8);
i=str.indexOf('#');
if(i>=0)
str=str.substr(0,i);
pl.addparm( "formKey", str );
}
}
strDest="https://spreadsheets.google.com/formResponse";
}
if( this.bGDocs ) pl.addparm( 'entry.'+(pl.count-1)+'.single', us );
else pl.addparm( "name", us );
this.CreateCGIResults( pl, arVars, false, this.bGDocs );
pl.str = pl.str.replace(/\+/g, '%2B');
if( this.bGDocs ){
if( is.ie ){
var request = strDest + '?' + pl.str;
var head = document.getElementsByTagName("head").item(0);
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", request);
head.appendChild(script);
}else
getHTTP( strDest, 'GET', pl.str );
this.strTestSubmit = '';
bSuccess = true;
}else{
var httpReq = getHTTP( strDest, ((this.bModeGet)?'GET':'POST'), pl.str );
bSuccess = (httpReq.status == 200);
this.strTestSubmit = httpReq.responseText;
}
if( bSuccess && this.bPromptSuc )
{
var subTxt;
if( !this.bSurvey )
subTxt = trivstrTRSUB;
else
subTxt = trivstrSUSUB;
if( !trivWeb20Popups )
{
if( window.resWind != null )
window.resWind.alert( subTxt );
else
alert( subTxt );
}
else
{
var fn = null;
if ( window.trivActFBCnt != 'undefined' && window.trivActFBCnt != null )
{
window.trivActFBCnt++;
fn =(function(){ window.trivActFBCnt--;});
}
trivAlert( 'SUBERR', this.strLoadedName, subTxt, fn );
}
}
}
}
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 + "<br /><br />");
if( us != null && us.length > 0 )
txtRes.add( trivstrSTUD + us + "<br /><br />" );
if( this.iStudScore != -1 && this.bAutoG )
{
txtRes.add( trivstrSCORE + this.iStudScore + "%<br />" );
if( this.iStudScore >= this.iPassGrade )
txtRes.add( trivstrPASS );
else
txtRes.add( trivstrFAIL );
txtRes.add( "<br /><br />" );
}
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, bGD )
{
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;
if( !bGD )
{
if( this.bSurvey )
pl.addparm( "SurveyName", this.strTestName);
else
pl.addparm( "TestName", this.strTestName);
}
for( idx = 0; idx < this.arRTPages.length; idx++ )
{
qNum = this.arRTPages[idx].createCGIResults( pl, qNum, bGD );
if( svSID != this.arRTPages[idx].iSectionId )
{
if( svSID > 0 && this.bAutoG )
{
var strSSN = "TrueFalseSection" + svSID;
var strSSV = corrTFSect + "/" + numTFSect;
if( !bGD ) pl.addparm( strSSN, strSSV );
strSSN = "MultipleChoiceSection" + svSID;
strSSV = corrMCSect + "/" + numMCSect;
if( !bGD ) pl.addparm( strSSN, strSSV );
}
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 && this.bAutoG )
{
var strSSN = "TrueFalseSection" + svSID;
var strSSV = corrTFSect + "/" + numTFSect;
if( !bGD ) pl.addparm( strSSN, strSSV );
strSSN = "MultipleChoiceSection" + svSID;
strSSV = corrMCSect + "/" + numMCSect;
if( !bGD ) pl.addparm( strSSN, strSSV );
}
if( this.iStudScore != -1 && this.bAutoG )
{
if( bGD ) pl.addparm( 'entry.'+(pl.count-1)+'.single', this.iStudScore );
else pl.addparm( "Score", this.iStudScore );
}
else if( bCM )
pl.addparm( "Score", "-1" );
if( this.bAutoG || bCM )
{
if( !bGD ) pl.addparm( "PassingGrade", this.iPassGrade );
if( !bGD ) pl.addparm( "TrueFalse", corrTFTot + "/" + numTFTot );
if( !bGD ) pl.addparm( "MultipleChoice", corrMCTot + "/" + numMCTot );
}
if( !bGD ) pl.addparm( "NumQuestions", qNum );
if( this.strAllowedTM != "" )
{
if( !bGD ) pl.addparm( "AllowedTime", this.strAllowedTM );
if( !bGD ) pl.addparm( "ElapsedTestTime", this.strElapsedTM );
}
if( this.bIncVar && !bGD )
{
for( idx = 0; idx < arVars.length; idx++ ) {
if ((submitValue = this.getVariableSubmitValue( idx, arVars )) == "~~~null~~~") submitValue = trivstrNA
pl.addparm( this.getVariableSubmitName( idx, arVars ), submitValue, true );
}
}
return true;
}
TTPr.getRandomPageNumber = function( pg )
{
var i;
for( i = 0; i < this.arRTPages.length; i++ )
if( this.arRTPages[i] && this.arRTPages[i].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[i].iSectionId == section )
pn++;
if( this.arRTPages[i].name == pg )
return String(pn);
}
return "";
}
TTPr.findTestPage = function( pg )
{
var i;
for( i = 0; i < this.arRTPages.length; i++ )
if( this.arRTPages[i].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 && cp < this.arRTPages.length )
return this.arRTPages[cp].name;
return null;
}
TTPr.getNextTestPage = function( pg )
{
var cp = this.findTestPage( pg );
if( cp > -1 && cp < this.arRTPages.length )
cp++;
else
cp = 0;
if( cp >= 0 && cp < this.arRTPages.length )
return this.arRTPages[cp].name;
return null;
}
TTPr.getRandomPage = function( pre )
{
var i;
var len = 0;
if( pre ) len = pre.length;
for( i = 0; i < this.arRTPages.length; i++ )
{
var tmp = this.arRTPages[i].name.substr( 0, len );
if( tmp == pre )
return this.arRTPages[i].name;
}
return null;
}
TTPr.getVariableSubmitName = function( idx, arVars )
{
var vn = arVars[idx].vn;
if( vn == null )
vn = "";
if( vn.length > 3 )
{
var pN = vn.substring(0, 3 ).toLowerCase();
if( pN == "var" )
return vn.substring( 3 );
}
return vn;
}
TTPr.getVariableSubmitValue = function( idx, arVars )
{
var vv = arVars[idx].vv;
if( vv == null )
vv = "";
if( vv.length > 7 )
{
var pV = vv.substring(0, 7 );
if( pV == "~~f=1~~" ||
pV == "~~f=2~~" ||
pV == "~~f=4~~" )
{
var slashPos = vv.indexOf( '|' );
return vv.substring( slashPos + 1 );
}
}
else if ( vv == "~~~null~~~" )
return "";
return 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(" &&
strEnd == ")" )
{
var idx;
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.index = UNK;
this.arPages = new Array();
this.arPicked = new Array();
}
var TSPr=TrivTestSection.prototype
TSPr.load = function( nl )
{
this.iSectionId = getNVInt( nl, 'id', this.iSectionId );
this.iNumberRandom = getNVInt( nl, 'numrandom', this.iNumberRandom );
this.index = getNVInt( nl, 'index', this.index );
var arEle = nl.getElementsByTagName('page');
for( var i=0; arEle && i < arEle.length; i++ )
{
var page = new TrivTestPage();
page.load( this.iSectionId, arEle[i] );
this.arPages.push( page );
}
}
TSPr.LoadPages = function( arr, rand )
{
var i;
var j;
var sIdx = this.index;
if( this.iNumberRandom > 0 && rand )
{
if( this.iNumberRandom > this.arPages.length ) this.iNumberRandom = this.arPages.length;
for( i = 0; i < this.arPages.length; i++ )
{
if( this.arPicked.length < i + 1)
this.arPicked.push( 0 );
else
this.arPicked[i] = 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[sIdx++] = this.arPages[sel];
}
for( i = 0; i < ( this.arPages.length - this.iNumberRandom ); i++ )
arr[sIdx++] = null;
}
else
{
for( i = 0; i < this.arPages.length; i++ )
arr[this.arPages[i].index] = this.arPages[i];
}
}
function TrivTestPage()
{
this.index = UNK;
this.name = "";
this.iSectionId = UNK;
this.arQues = new Array();
}
var TPPr=TrivTestPage.prototype
TPPr.load = function( sid, nl )
{
this.iSectionId = sid;
this.index = getNVInt( nl, 'index', this.index );
this.name = getNVStr( nl, 'name', this.name );
var arEle = nl.getElementsByTagName('question');
for( var i=0; arEle && i < arEle.length; i++ )
{
var quest = new TrivQuestion();
quest.load( this.iSectionId, arEle[i] );
this.arQues.push( quest );
}
}
TPPr.gradeQs = function( arVars )
{
for( var idx = 0; idx < this.arQues.length; idx++ )
this.arQues[idx].gradeQs( arVars );
}
TPPr.getQuestionList = function()
{
var ql = '';
for( var idx = 0; idx < this.arQues.length; idx++ )
{
if( (this.arQues[idx].type == DD || this.arQues[idx].type == MT) && this.arQues[idx].bGradeInd )
{
var subidx;
for( subidx = 0; subidx < this.arQues[idx].arCorrAns.length; subidx++ )
ql += this.arQues[idx].id + '-' + (subidx+1) + ';';
}
else if( (this.arQues[idx].type == MC || this.arQues[idx].type == MR || this.arQues[idx].type == HS) && this.arQues[idx].bGradeInd )
{
var subidx;
for( subidx = 0; subidx < this.arQues[idx].arChoices.length; subidx++ )
ql += this.arQues[idx].id + '-' + (subidx+1) + ';';
}
else
ql += this.arQues[idx].id + ';';
}
return ql;
}
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, bGD )
{
var idx;
var subidx;
var loc;
var strTemp;
for( idx = 0; idx < this.arQues.length; idx++ )
bQN = this.arQues[idx].createCGIResults( pl, bQN, bGD );
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.arChoices = new Array();
this.arAddedInfo = new Array();
this.choices = "";
this.bAllowMult = 0;
this.bPersist = 0;
this.bGradeInd = 0;
this.bSurvey = 0;
this.strOurAns = "";
this.iOurScore = 0;
this.bAnyAnswer = 0;
this.bCaseSensitive = 0;
this.separator = "";
this.arRel = new Array();
}
var TQPr=TrivQuestion.prototype
TQPr.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 = getNVStr(nl, 'correctans', this.corrAns);
this.bAnyAnswer = getNVInt(nl, 'anyanswer', this.bAnyAnswer);
this.bCaseSensitive = getNVInt(nl, 'casesensitive', this.bCaseSensitive);
this.separator = getNVStr(nl, 'separator', this.separator);
if (this.type == DD || this.type == MT || this.type == MC || this.type == HS || this.type == MR || this.type == OR) {
var pos1 = 0
var 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))
}
if (this.type == FB) {
var pos1 = 0
var 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))
}
if (this.type == NE) {
var rel = getNVStr(nl, 'relationship', rel);
var pos1 = 0
var pos2 = rel.indexOf('|')
while (pos2 != -1)
{
this.arRel.push(rel.substring(pos1, pos2))
pos1 = pos2 + 1
pos2 = rel.indexOf('|', pos1)
}
this.arRel.push(rel.substring(pos1, rel.length))
pos1 = 0;
var sepLen = this.separator.length;
pos2 = this.corrAns.indexOf(this.separator)
while (pos2 != -1)
{
this.arCorrAns.push(this.corrAns.substring(pos1, pos2))
pos1 = pos2 + sepLen;
pos2 = this.corrAns.indexOf(this.separator, pos1)
}
this.arCorrAns.push(this.corrAns.substring(pos1, this.corrAns.length))
}
this.choices = getNVStr(nl, 'choices', this.choices);
if (this.type == MC || this.type == HS || this.type == MR || this.type == DD || this.type == MT || this.choices.indexOf('|') >= 0)
{
var pos1 = 0
var pos2 = this.choices.indexOf('|')
while (pos2 != -1)
{
this.arChoices.push(this.choices.substring(pos1, pos2))
pos1 = pos2 + 1
pos2 = this.choices.indexOf('|', pos1)
}
this.arChoices.push(this.choices.substring(pos1, this.choices.length))
}
var ai = getNVStr(nl, 'addedinfo', null);
if( ai )
{
var pos1 = 0
var pos2 = ai.indexOf('|')
while (pos2 != -1)
{
this.arAddedInfo.push(ai.substring(pos1, pos2))
pos1 = pos2 + 1
pos2 = ai.indexOf('|', pos1)
}
this.arAddedInfo.push(ai.substring(pos1, ai.length))
}
this.bAllowMult = getNVInt(nl, 'allowmult', this.bllowMult);
this.bPersist = getNVInt(nl, 'persist', this.bPersist);
this.bGradeInd = getNVInt(nl, 'gradeindividual', this.bGradeInd);
this.bSurvey = getNVInt(nl, 'surveyquestion', this.bSurvey);
}
TQPr.getMaxScore = function()
{
var ourMax = 0;
if( !this.bSurvey )
{
if( this.bGradeInd )
{
if (this.type == MR || this.type == HS || this.type == MC)
ourMax = this.arChoices.length;
else if( this.arCorrAns.length > 0 )
ourMax = this.arCorrAns.length;
else
{
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.bSurvey )
{
if( this.type != UNK )
ourScore = this.iOurScore;
}
return ourScore;
}
TQPr.isScoreable = function()
{
if( !this.bSurvey )
{
if( this.type == SA || this.type == ES )
{
if( this.weight > 0 )
return false;
}
}
return true;
}
TQPr.isCorrect = function()
{
var idx;
if( !this.bSurvey )
{
if( this.strOurAns == null || this.strOurAns.length == 0 )
return 0;
switch( this.type )
{
case TF:
if( this.strOurAns == this.corrAns )
return 1;
break;
case MC:
case HS:
case MR:
case OR:
if( this.bGradeInd )
{
var bSel, bCorr;
var iNumCorr = 0;
for( var i=0; i<this.arChoices.length; i++ )
{
if( this.type == OR ){
var indObj = {i:-1};
bSel = IsChoiceSelected( this.arChoices[i], this.strOurAns, indObj );
if( this.isCorrectSub(this.arChoices[i],indObj) > 0)
bCorr = true;
else
bCorr = false;
if( ( bCorr && bSel ) )
iNumCorr++;
}
else{
bSel = IsChoiceSelected( this.arChoices[i], this.strOurAns );
if( this.isCorrectSub(this.arChoices[i]) > 0)
bCorr = true;
else
bCorr = false;
if( ( bCorr && bSel ) || ( !bCorr && !bSel ) )
iNumCorr++;
}
}
return iNumCorr;
}
else if( this.strOurAns == this.corrAns )
return 1;
break;
case SA:
case ES:
return 0;
case FB:
var strTemp;
var oAns;
var brc = 0;
if (!this.bCaseSensitive) oAns = this.strOurAns.toString().toLowerCase();
else oAns = this.strOurAns.toString();
for (var i = 0; i < this.arCorrAns.length; i++) {
if (!this.bCaseSensitive) strTemp = this.arCorrAns[i].toLowerCase();
else strTemp = this.arCorrAns[i];
if (this.bAnyAnswer) { if (oAns == strTemp) return 1; }
else { if (oAns.indexOf(strTemp) == -1) return 0; else brc = 1; }
}
return brc;
break;
case NE:
var oAns = parseInt(this.strOurAns);
var brc = 0;
for (var i = 0; i < this.arRel.length; i++) {
switch (parseInt(this.arRel[i])) {
case EQU: if (oAns == parseInt(this.arCorrAns[i])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
case BT_INC: if (oAns >= parseInt(this.arCorrAns[i]) && oAns <= parseInt(this.arCorrAns[i + 1])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
case BT_EXC: if (oAns > parseInt(this.arCorrAns[i]) && oAns < parseInt(this.arCorrAns[i + 1])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
case GRT: if (oAns > parseInt(this.arCorrAns[i])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
case GTE: if (oAns >= parseInt(this.arCorrAns[i])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
case LST: if (oAns < parseInt(this.arCorrAns[i])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
case LSTE: if (oAns <= parseInt(this.arCorrAns[i])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
case NEQU: if (oAns != parseInt(this.arCorrAns[i])) { if (this.bAnyAnswer) return 1; else brc = 1; } else { brc = 0; } break;
}
if( this.separator == 'and' && !brc )
break;
}
return brc;
break;
case MT:
var tmpOurAns = this.strOurAns + ',';
var tmpCorrAns;
var iNumCorr = 0;
for( var i=0; i<this.arCorrAns.length; i++ )
{
tmpCorrAns = this.arCorrAns[i] + ',';
if( tmpOurAns.indexOf( tmpCorrAns ) != -1 )
iNumCorr += 1;
else
{
if( !this.bGradeInd )
return 0;
}
}
if( this.bGradeInd )
return iNumCorr;
else
return 1;
break;
case DD:
var tmpOurAns = this.strOurAns + ',';
var tmpCorrAns;
var iNumCorr = 0;
for( var i=0; i<this.arCorrAns.length; i++ )
{
tmpCorrAns = this.arCorrAns[i];
var possibleCorr = tmpCorrAns.split('|');
var bFound = false;
for( var j=0; j<possibleCorr.length && !bFound; j++ )
{
var tmpAns = possibleCorr[j];
if( tmpOurAns.indexOf( tmpAns ) != -1 )
bFound = true;
}
if( bFound )
iNumCorr += 1;
else
{
if( !this.bGradeInd )
return 0;
}
}
if( this.bGradeInd )
return iNumCorr;
else
return 1;
break;
case IN:
return 1;
}
}
return 0;
}
function GetMatchingPairStr( strQNum, inp )
{
var strFormat = ",";
var strTemp = ",";
var strPair = "";
var loc;
var next;
strTemp += inp + ",";
strFormat += strQNum + "-";
loc = strTemp.indexOf( strFormat );
if( loc < 0 )
return strPair;
next = strTemp.indexOf( ",", loc+1);
strPair = strTemp.substring( loc+1, next );
return strPair;
}
function IsChoiceSelected( strCho, inp, indObj )
{
var spl = inp.split(',');
var i;
for( i=0; i<spl.length; i++ )
{
if( spl[i]==strCho )
break;
}
if( indObj )
{
if( i<spl.length )
indObj.i = i;
else
indObj.i = -1;
}
if( i >= spl.length )
return false;
return true;
}
TQPr.isCorrectSub = function( oc, indObj )
{
if( !this.bSurvey )
{
if( oc != null && oc.length > 0 )
{
for( var i=0; i<this.arCorrAns.length; i++ )
{
if( oc == this.arCorrAns[i] )
{
if( indObj )
{
indObj.correcti=i;
if( indObj.i == i )
return 1;
else
return 0;
}
else
return 1;
}
}
}
}
return 0;
}
TQPr.getNumTFQs = function()
{
if( !this.bSurvey )
{
if( this.type == TF )
return this.weight;
}
return 0;
}
TQPr.getNumCorrectTFQs = function()
{
if( !this.bSurvey )
{
if( this.type == TF )
return this.isCorrect() * this.weight;
}
return 0;
}
TQPr.getNumMCQs = function()
{
var numQ = 0;
if( !this.bSurvey )
{
switch( this.type )
{
case MC:
case FB:
case HS:
case NE:
case MR:
case DD:
case MT:
numQ = 1;
if( this.bGradeInd )
numQ = this.arChoices.length;
break;
}
numQ *= this.weight;
}
return numQ;
}
TQPr.getNumCorrectMCQs = function()
{
var numC = 0;
if( !this.bSurvey )
{
switch( this.type )
{
case MC:
case FB:
case HS:
case DD:
case MT:
case NE:
case MR:
numC = this.isCorrect();
break;
}
numC *= this.weight;
}
return numC;
}
TQPr.gradeQs = function( arVars )
{
var idx;
this.strOurAns = "";
this.iOurScore = 0;
if( this.type != UNK )
{
for( idx = 0; idx < arVars.length; idx++ )
{
if( arVars[idx].vn == this.varName )
{
this.strOurAns = arVars[idx].vv;
break;
}
}
if( !this.bSurvey )
{
this.iOurScore = this.isCorrect();
this.iOurScore *= this.weight;
}
}
}
TQPr.createTextResults = function (txtRes, bQN, bAG) {
var subidx;
var strTemp;
if (this.type != UNK) {
bQN++;
txtRes.add(trivstrQ + bQN + "<br />" + this.text + "<br />");
switch (this.type) {
case TF:
case MC:
case HS:
case LK:
case OR:
case LT:
case MR:
if (bAG && !this.bSurvey) {
if (this.bGradeInd) {
var bSel;
var strChoice;
for (subidx = 0; subidx < this.arChoices.length; subidx++) {
strChoice = this.arChoices[subidx];
if( this.type==OR )
{
var indObj = { i:-1, correcti:-1};
bSel = IsChoiceSelected(strChoice, this.strOurAns, indObj);
if ( this.isCorrectSub(strChoice,indObj) > 0) {
txtRes.add(trivstrYAC + strChoice + "=" + (indObj.i+1).toString() + "<br />");
}
else {
txtRes.add(trivstrYA);
if (!bSel)
txtRes.add(trivstrNA);
else
txtRes.add(strChoice + "=" + (indObj.i+1).toString() );
txtRes.add("<br />" + trivstrCA + (indObj.correcti+1).toString() + "<br />");
}
}
else
{
bSel = IsChoiceSelected(strChoice, this.strOurAns);
if ( this.isCorrectSub(strChoice) > 0 ) {
if (bSel)
txtRes.add(trivstrYACS + strChoice + "<br />");
else
txtRes.add(trivstrYAINS + strChoice + "<br />");
}
else {
if (bSel)
txtRes.add(trivstrYAIS + strChoice + "<br />");
else
txtRes.add(trivstrYACNS + strChoice + "<br />");
}
}
if (subidx < this.arChoices.length - 1) {
bQN++;
txtRes.add("<br />" + trivstrQ + bQN + "<br />" + this.text + "<br />");
}
}
}
else {
if (this.isCorrect() > 0)
txtRes.add(trivstrYAC + this.strOurAns + "<br />");
else {
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else
txtRes.add(this.strOurAns);
txtRes.add("<br />" + trivstrCA + this.corrAns + "<br />");
}
}
}
else {
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else
txtRes.add(this.strOurAns);
txtRes.add("<br />");
}
break;
case FB:
if (bAG && !this.bSurvey) {
if (this.isCorrect() > 0)
txtRes.add(trivstrYAC + this.strOurAns + "<br />");
else
{
var sepRep;
if( this.bAnyAnswer )
sepRep = " " + trivstrOr + " ";
else
sepRep = " " + trivstrAnd + " ";
strTemp = this.corrAns.replace(/\|/g, sepRep );
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else
txtRes.add(this.strOurAns);
txtRes.add("<br />" + trivstrCA + strTemp + "<br />");
}
}
else {
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else
txtRes.add(this.strOurAns);
txtRes.add("<br />");
}
break;
case NE:
if (bAG && !this.bSurvey) {
if (this.isCorrect() > 0)
txtRes.add(trivstrYAC + this.strOurAns + "<br />");
else {
strTemp = this.getNEResult();
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else
txtRes.add(this.strOurAns);
txtRes.add("<br />" + trivstrCA + strTemp + "<br />");
}
}
else {
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else
txtRes.add(this.strOurAns);
txtRes.add("<br />");
}
break;
case ES:
case SA:
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else
txtRes.add(this.strOurAns);
txtRes.add("<br />");
break;
case DD:
case MT:
{
if (bAG) {
var strQNum;
if (this.bGradeInd) {
for (subidx = 0; subidx < this.arCorrAns.length; subidx++) {
strQNum = this.arCorrAns[subidx].substring(0, this.arCorrAns[subidx].indexOf('-'));
strTemp = GetMatchingPairStr(strQNum, this.strOurAns);
if (this.isCorrectSub(strTemp) > 0)
txtRes.add(trivstrYAC + strTemp + "<br />");
else {
txtRes.add(trivstrYA);
if (strTemp == null || strTemp.length == 0)
txtRes.add(trivstrNA);
else
txtRes.add(strTemp);
txtRes.add("<br />" + trivstrCA + this.arCorrAns[subidx] + "<br />");
}
if (subidx < this.arCorrAns.length - 1) {
bQN++;
txtRes.add("<br />" + trivstrQ + bQN + "<br />" + this.text + "<br />");
}
}
}
else {
if (this.isCorrect() > 0)
txtRes.add(trivstrYAC + this.corrAns + "<br />");
else {
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else {
for (subidx = 0; subidx < this.arCorrAns.length; subidx++) {
strQNum = this.arCorrAns[subidx].substring(0, this.arCorrAns[subidx].indexOf('-'));
strTemp = GetMatchingPairStr(strQNum, this.strOurAns);
if (strTemp == null || strTemp.length == 0)
txtRes.add(trivstrNA);
else
txtRes.add(strTemp);
if (subidx < this.arCorrAns.length - 1)
txtRes.add(",");
}
}
txtRes.add("<br />" + trivstrCA + this.corrAns + "<br />");
}
}
}
else {
if (this.bGradeInd) {
for (subidx = 0; subidx < this.arCorrAns.length; subidx++) {
strQNum = this.arCorrAns[subidx].substring(0, this.arCorrAns[subidx].indexOf('-'));
strTemp = GetMatchingPairStr(strQNum, this.strOurAns);
txtRes.add(trivstrYA);
if (strTemp == null || strTemp.length == 0)
txtRes.add(trivstrNA);
else
txtRes.add(strTemp);
txtRes.add("<br />");
if (subidx < this.arCorrAns.length - 1) {
bQN++;
txtRes.add("<br />" + trivstrQ + bQN + "<br />" + this.text + "<br />");
}
}
}
else {
txtRes.add(trivstrYA);
if (this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~")
txtRes.add(trivstrNA);
else {
for (subidx = 0; subidx < this.arCorrAns.length; subidx++) {
strQNum = this.arCorrAns[subidx].substring(0, this.arCorrAns[subidx].indexOf('-'));
strTemp = GetMatchingPairStr(strQNum, this.strOurAns);
if (strTemp == null || strTemp.length == 0)
txtRes.add(trivstrNA);
else
txtRes.add(strTemp);
if (subidx < this.arCorrAns.length - 1)
txtRes.add(",");
}
}
txtRes.add("<br />" + trivstrCA + this.corrAns + "<br />");
}
}
break;
}
}
txtRes.add("<br />");
}
return bQN;
}
TQPr.createCGIResults = function( pl, bQN, bGD )
{
var subidx;
var loc;
var strTemp;
var sQText = "";
var sAnswer = "";
var sCAnswer = "";
var sQType = "";
var sQID = "";
var sSection = "";
var sCurr;
bQN++;
sCurr = bQN;
sQText = "Question" + sCurr;
sAnswer = "Answer" + sCurr;
sCAnswer = "CorrectAnswer" + sCurr;
sQType = "QuestionType" + sCurr;
sQID = "QuestionID" + sCurr;
sSection = "Section" + sCurr;
if( !bGD ) pl.addparm( sQText, this.text );
if( !bGD ) pl.addparm( sQType, this.type );
if( !bGD ) pl.addparm( sQID, this.id );
if( this.iSectionId > 0 && !bGD )
pl.addparm( sSection, this.iSectionId );
switch( this.type )
{
case TF:
case MC:
case HS:
case LK:
case OR:
case LT:
case MR:
if( this.bGradeInd )
{
for( subidx = 0; subidx < this.arChoices.length; subidx++ )
{
if( this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~" )
strTemp = trivstrNA;
else
{
if( IsChoiceSelected( this.arChoices[subidx], this.strOurAns ) )
strTemp = this.arChoices[subidx];
else
strTemp = trivstrNA + ', ' + this.arChoices[subidx];
}
if( bGD ) pl.addparm( 'entry.'+(pl.count-1)+'.single', strTemp );
else pl.addparm( sAnswer, strTemp );
if( !bGD ) pl.addparm( sCAnswer, this.corrAns );
if( subidx < this.arChoices.length - 1 )
{
bQN++;
sCurr = bQN;
sQText = "Q" + sCurr;
sAnswer = "Answer" + sCurr;
sCAnswer = "CorrectAnswer" + sCurr;
sQType = "QuestionType" + sCurr;
sQID = "QuestionID" + sCurr;
sSection = "Section" + sCurr;
if( !bGD ) pl.addparm( sQText, this.text );
if( !bGD ) pl.addparm( sQType, this.type );
if( !bGD ) pl.addparm( sQID, this.id );
if( this.iSectionId > 0 && !bGD )
pl.addparm( sSection, this.iSectionId );
}
}
}
else
{
if( this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~" )
strTemp = trivstrNA;
else
strTemp = this.strOurAns;
if( bGD ) pl.addparm( 'entry.'+(pl.count-1)+'.single', strTemp );
else pl.addparm( sAnswer, strTemp );
if( !this.bSurvey && !bGD )
pl.addparm( sCAnswer, this.corrAns );
}
break;
case FB:
case NE:
if( this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~" )
strTemp = trivstrNA;
else
strTemp = this.strOurAns;
if( bGD ) pl.addparm( 'entry.'+(pl.count-1)+'.single', strTemp );
else pl.addparm( sAnswer, strTemp );
if( !this.bSurvey && !bGD )
{
loc = this.corrAns.indexOf( '|' );
if( loc >= 0 )
strTemp = this.corrAns.substring( 0, loc );
else
strTemp = this.corrAns;
pl.addparm( sCAnswer, strTemp );
}
break;
case ES:
case SA:
if( this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~" )
strTemp = trivstrNA;
else
strTemp = this.strOurAns;
if( bGD ) pl.addparm( 'entry.'+(pl.count-1)+'.single', strTemp );
else pl.addparm( sAnswer, strTemp );
break;
case DD:
case MT:
var strQNum;
if( this.bGradeInd )
{
for( subidx = 0; subidx < this.arCorrAns.length; subidx++ )
{
strQNum = this.arCorrAns[subidx].substring( 0, this.arCorrAns[subidx].indexOf( '-' ) );
strTemp = GetMatchingPairStr( strQNum, this.strOurAns );
if( strTemp == null || strTemp.length == 0 )
strTemp = trivstrNA;
pl.addparm( sAnswer, strTemp );
if( !bGD ) pl.addparm( sCAnswer, this.arCorrAns[subidx] );
if( subidx < this.arCorrAns.length - 1 )
{
bQN++;
sCurr = bQN;
sQText = "Q" + sCurr;
sAnswer = "Answer" + sCurr;
sCAnswer = "CorrectAnswer" + sCurr;
sQType = "QuestionType" + sCurr;
sQID = "QuestionID" + sCurr;
sSection = "Section" + sCurr;
if( !bGD ) pl.addparm( sQText, this.text );
if( !bGD ) pl.addparm( sQType, this.type );
if( !bGD ) pl.addparm( sQID, this.id );
if( this.iSectionId > 0 && !bGD )
pl.addparm( sSection, this.iSectionId );
}
}
}
else
{
if( this.strOurAns == null || this.strOurAns.length == 0 || this.strOurAns == "~~~null~~~" )
strTemp = trivstrNA;
else
{
var strTemp2;
strTemp = "";
for( subidx = 0; subidx < this.arCorrAns.length; subidx++ )
{
strQNum = this.arCorrAns[subidx].substring( 0, this.arCorrAns[subidx].indexOf( '-' ) );
strTemp2 = GetMatchingPairStr( strQNum, this.strOurAns );
if( strTemp2 == null || strTemp2.length == 0 )
strTemp += trivstrNA;
else
strTemp += strTemp2;
if( subidx < this.arCorrAns.length - 1 )
strTemp += ",";
}
}
if( bGD ) pl.addparm( 'entry.'+(pl.count-1)+'.single', strTemp );
else pl.addparm( sAnswer, strTemp );
if( !bGD ) pl.addparm( sCAnswer, this.corrAns );
}
break;
}
return bQN;
}
TQPr.getNEResult = function () {
var strTemp = "";
var y = 0;
for (var i = 0; i < this.arRel.length; i++) {
var rel;
var sep = " " + this.separator + " ";
if (i == 0) sep = "";
switch (parseInt(this.arRel[i])) {
case EQU: strTemp += sep + "= " + this.arCorrAns[y]; break;
case BT_INC:
strTemp += sep;
if( this.separator != trivstrAnd )
strTemp += "( ";
strTemp += ">= " + this.arCorrAns[y] + " " + trivstrAnd + " <= " + this.arCorrAns[y + 1];
if( this.separator != trivstrAnd )
strTemp += " )";
y++;
break;
case BT_EXC:
strTemp += sep;
if( this.separator != trivstrAnd )
strTemp += "( ";
strTemp += "> " + this.arCorrAns[y] + " " + trivstrAnd + " < " + this.arCorrAns[y + 1];
if( this.separator != trivstrAnd )
strTemp += " )";
y++;
break;
case GRT: strTemp += sep + "> " + this.arCorrAns[y]; break;
case GTE: strTemp += sep + ">= " + this.arCorrAns[y]; break;
case LST: strTemp += sep + "< " + this.arCorrAns[y]; break;
case LSTE: strTemp += sep + "<= " + this.arCorrAns[y]; break;
case NEQU: strTemp += sep + "!= " + this.arCorrAns[y]; break;
}
y++;
}
return strTemp;
}