/*Copyright © 2001-2012 The University of Auckland - 22/02/2012 5:38:24 p.m. */
var bcFiles={
template:'/html2/bctemplates.v1.10.min.htm',
template_noframe:'/html2/bctemplates_noframe.min.v1.2.htm'};
var _gaq=_gaq||[];
_gaq.push(['_setAccount','UA-795378-1']);
_gaq.push(['_setSiteSpeedSampleRate',5]);
_gaq.push(['_trackPageview']);(function(){
if($.browser.msie){
var ieVersion=parseInt($.browser.version,10);
if(ieVersion<9&&!$("body").hasClass("login")){
document.write('<script src="http://static.bestchoice.net.nz/scripts/excanvas.min.js"></script>');}
if(ieVersion<7){
$('html').addClass('ie6');
$.browser.ie6=true;}
if(ieVersion<8){
$('html').addClass('ielt8');
$.browser.ielt8=true;}}
$.browser.apple=/iPad|iPod|iPhone/.test(navigator.userAgent);
$.browser.iPad=/iPad/.test(navigator.userAgent);
$.browser.android=/Android/.test(navigator.userAgent);
if($.browser.iPad){
$('html').addClass('iPad');}
if($.support.touch){
$('html').addClass('touch');}else{
$('html').addClass('notTouch');}
var bcInParent=false;
try{
if(parent&&parent.window.bc){
bcInParent=true;}}catch(err){}
if(bcInParent){
bc=parent.bc;
document.title=parent.document.title;}})();
function toggleinline(toggleId){
fun.toggleinline(toggleId);}
var fun={
MONTHNAMES:["January","February","March","April","May","June","July","August","September","October","November","December"],
DAYNAMES:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
getCacheSeconds:function(url,query,numSecs){
top.urlCacheSeconds=top.urlCacheSeconds||{};
top.urlCacheSeconds[url]=top.urlCacheSeconds[url]||{};
query=query||'all';
var secsNow=Math.floor(new Date()/1000),
cache=top.urlCacheSeconds[url];
if(!cache[query]||((cache[query]+numSecs)<secsNow)){
cache[query]=secsNow;}
return cache[query];},
clearCacheSeconds:function(url){
if(top.urlCacheSeconds){
top.urlCacheSeconds[url]=null;}},
log:function(data){
if(window.console&&window.console.log){
window.console.log(data);}},
evalObjectString:function(objectString){
objectString=$.trim(objectString);
if(!objectString){
return null;}
if(objectString.substr(0,1)!="{"){
objectString="{"+objectString+"}";}
var qwerty='}';
var fn=new Function("return "+objectString);
return fn();},
csvToArray:function(data){
var arr;
data=$.trim(data);
data=data.replace(/\r/g,"],[");
if(data.charAt(data.length-1)!=='"'){
data+='"';}
data='[['+data+']]';
eval('arr = '+data);
return arr;},
getUTCSecondsSince1970:function(date){
return Math.floor((date.getTime())/1000);},
getTimeString:function(value){
var hour=value.getHours(),
minute=value.getMinutes(),
second=value.getSeconds();
if(hour<10){
hour+='0';}
if(minute<10){
minute+='0';}
if(second<10){
second+='0';}
return hour+':'+minute+':'+second;},
daysToDate:function(days){
var d=new Date();
if(days){
d.setTime(bc.MSPERDAY*days);}
return d;},
dateStampYearMonth:function(){
var dt=new Date();
var year=String(dt.getFullYear());
var month=String(dt.getMonth()+1);
if(month.length===1){
month="0"+month;}
return year.substr(2,2)+month;},
prettyTimeDiff:(function(){
var ints={
second:1,
minute:60,
hour:3600,
day:86400,
week:604800,
year:31536000};
return function(aTime,bTime,timeGap,depth){
var maxDepth=1;
if(!timeGap){
aTime=+new Date(aTime);
bTime=bTime===undefined?+new Date():+new Date(bTime);
timeGap=Math.abs(bTime-aTime)/1000;}
var i,amount,measure,remainder,smallest;
for(i in ints){
if(timeGap>ints[i]&&ints[i]>(ints[measure]||0)){
measure=i;}
if(!smallest||ints[i]<smallest){
smallest=ints[i];}}
if(!measure){
return '';}
amount=Math.floor(timeGap/ints[measure]);
if(timeGap>31536000){
timeGap-=Math.floor(ints[measure]*amount/ 31536000/ 4)*86400;}
amount+=' '+measure+(amount>1?'s':'');
if(!depth||depth<maxDepth){
remainder=timeGap%ints[measure];
if(remainder>=smallest){
amount+=', '+arguments.callee(+new Date()-remainder*1000,undefined,false,1);}}
return amount;};})(),
dateDiff:function(startDate,endDate){
var msInDay=1000*60*60*24;
return((endDate.getTime()-startDate.getTime())/msInDay);},
queryStringToObject:function(integerParams){
var i,parms,pos,key,val,queryParams={};
var qs=window.location.href;
var qs1=qs.indexOf("?");
if(qs1<0){
qs1=qs.indexOf("#");}
if(qs1<0){
return queryParams;}
qs=qs.substr(qs1+1);
qs=qs.replace('#','&');
qs=qs.replace(/\+/g,' ');
parms=qs.split('&');
for(i=0;i<parms.length;i++){
pos=parms[i].indexOf('=');
if(pos>0){
key=parms[i].substring(0,pos);
val=unescape(parms[i].substring(pos+1));
if(integerParams&&$.inArray(key,integerParams)>=0){
queryParams[key]=parseInt(val,10);}else{
queryParams[key]=val;}}}
return queryParams;},
stripeTable:function(){
$("table.stripe tbody").each(function(i){
$(this).find("tr:odd").addClass("r1").end().find("tr:even").addClass("r2").end();});},
lastclickButton:false,
disableButton:function(){
if(fun.lastclickButton){
fun.lastclickButton.disabled=true;
if(fun.lastclickButton.href){fun.lastclickButton.href="#";}
if(fun.lastclickButton.onclick){fun.lastclickButton.onclick="return false;";}}},
setDisableButton:function(btn){
fun.lastclickButton=btn;
window.setTimeout(fun.disableButton,100);},
confirmAction:function(obj,msg,color,disableButton){
if(color){obj.style.backgroundColor=color;}
if(confirm(msg)){
if(disableButton){
fun.lastclickButton=obj;
window.setTimeout(fun.disableButton,100);}
return true;}else{
obj.style.backgroundColor='';
return false;}},
confirmAction2:function(msg){
if(confirm(msg)){
return true;}else{
return false;}},
getHashFromArray:function(arr){
var i,hash={};
for(i=0;i<arr.length;i++){
hash[arr[i][0]]=arr[i][1];}
return hash;},
loadSelectDefaultOptions:{
valueIndex:0,
textIndex:1,
classIndex:2,
startOptions:'',
startText:null,
filterFn:null},
getSelectOptionsHtmlFromArray:function(itemArr,options){
var o=$.extend({},fun.loadSelectDefaultOptions,options);
var i,item,html='';
for(i=0;i<itemArr.length;i++){
item=itemArr[i];
if(!o.filterFn||o.filterFn(item)){
html+='<option value="'+item[o.valueIndex]+'"';
if(o.classIndex&&item[o.classIndex]){
html+=' class="'+item[o.classIndex]+'"';}
html+='>'+item[o.textIndex]+'</option>';}}
return html;},
loadSelect:function(selectId,itemArr,val,options){
var o=$.extend({},fun.loadSelectDefaultOptions,options);
var html,drop=$('#'+selectId);
if(!drop.length){
return;}
o.startOptions=o.startOptions||'';
if(o.startText!==null){
o.startOptions='<option value="">'+o.startText+'</option>'+o.startOptions;}
html=o.startOptions;
html+=fun.getSelectOptionsHtmlFromArray(itemArr,o);
drop.html(html);
if(val!==null&&val!==undefined){
drop.val(val);}
if($.browser.msie&&parseInt($.browser.version,10)<7){drop.focus();}},
displaynone:function(objname){
if(document.getElementById(objname)){
document.getElementById(objname).style.display='none';}},
displayblock:function(objname){
document.getElementById(objname).style.display='block';},
displayinline:function(objname){
document.getElementById(objname).style.display='inline';},
toggleinline:function(objName){
var thisobj=document.getElementById(objName);
thisobj.style.display=(thisobj.style.display=="inline")?"none":"inline";},
popWindow:function(url,w,h,wid){
var fmt='toolbar=no,menubar=no,resizable=yes,scrollbars=yes';
if(w){fmt+=',width='+w;}
if(h){fmt+=',height='+w;}
wid=window.open(url,wid,fmt);
wid.focus();},
gotoUrl:function(url,windowObj){
if(bc.isMobile){
fun.gotoUrlMobile(url);
return;}
if(!windowObj){return;}
windowObj.location.replace(url);},
MOBILECLASSNAMES:'welcome topicindex scoresurvey contents bcpage',
gotoUrlMobile:function(url,windowObj){
var fileName=url.toLowerCase().split("?")[0].split("#")[0].split('/').pop();
if(/p[0-9]+\.htm/.test(fileName)){
fileName='bcpage';}else if(/topics[0-9]+\.htm/.test(fileName)){
fileName='topicindex';}
window.bcp=null;
switch(fileName){
case "bcpage":
$.ajax({
url:jsFiles[3],
dataType:"script",
async:false,
cache:true,
success:function(){}});
break;}
url+=' #divWrapper';
$('#divWrapperParent').load(url,complete);
window.scrollTo(0,0);
function complete(responseText,textStatus,XMLHttpRequest){
$('body').removeClass(fun.MOBILECLASSNAMES);
$(responseText).filter('script.ajax').each(function(){
var js=this.text||this.textContent||this.innerHTML||'';
$.globalEval(js);});
bc2.runPageLoadFunction();
switch(fileName){
case "bcpage":
$('body').addClass('bcpage');
bcp.setup();
break;
case "topicindex":
$('body').addClass('topicindex');
break;
case "scoresurvey.htm":
$('body').addClass('scoresurvey bcpage');
break;
case "bcwelcome.aspx":
$('body').addClass('welcome');
bc.setLocationHash("#action=popular",false,'popular');
break;}}},
htmlFraction:function(nominator,denominator,attribs,dpRound){
if(dpRound){
nominator=fun.dpRound(nominator,dpRound);
denominator=fun.dpRound(denominator,dpRound);}
return '<sup '+attribs+'>'+nominator+'</sup><span>/</span><sub '+attribs+'>'+denominator+'</sub>';},
formatFractionPercent:function(a,b,custom){
var tmp,p=0;
var options={
subsuperScript:false,
showPercent:true,
noRound:false,
dpRound:0};
if(custom){
$.extend(options,custom);}
if(!a||isNaN(a)){a=0;}
if(!b||isNaN(b)){b=0;}
if(a>0&&b>0&&options.showPercent){
p=100*a/b;
p=(p>=10)?Math.round(p):Math.round(10*p)/10;}
if(options.dpRound){
a=fun.dpRound(a,options.dpRound);
b=fun.dpRound(b,options.dpRound);}else if(!options.noRound){
a=Math.round(a);
b=Math.round(b);}
if(options.subsuperScript){
tmp='<sup>'+a+'</sup>'+" / "+'<sub>'+b+'</sub>';}else{
tmp=a+" / "+b;}
if(options.showPercent&&p>0){
tmp+=" = "+p+"%";}
return tmp;},
dpRound:function(val,dp){
if(!dp||isNaN(dp)){dp=0;}
var d=parseFloat(val);
var a=Math.pow(10,dp);
return(Math.round(d*a)/a);},
sign:function(x){
return x>0?1:x<0?-1:0;},
isInteger:function(num){
return !(isNaN(num)||(num%1));},
randomOrder:function(){
return(Math.round(Math.random())-0.5);},
numericOrder:function(a,b){
return(a-b);},
numericOrderDesc:function(a,b){
return(b-a);},
errorSpan:function(html){
return "<span class='error'>"+html+"</span>";},
splitJoin:function(string,joinString){
return string.split('').join(joinString);},
selectElementContents:function(el){
var body=document.body,range,sel;
if(body.createTextRange){
range=body.createTextRange();
range.moveToElementText(el);
range.select();
range.execCommand('Copy');}else if(document.createRange&&window.getSelection){
range=document.createRange();
range.selectNodeContents(el);
sel=window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
sel.execCommand('Copy');}},
jalert:function(msg,caption){
msg="<div>"+msg+"</div>";
if(!caption){caption=document.title;}
var $dialog=$(msg).dialog({
resizable:false,
title:caption,
modal:true,
autoOpen:true,
buttons:{
'primary':{
text:'Ok',
"class":"large green bcbutton",
click:function(){$(this).dialog('close');}}}});},
showWaitMsg:function(msg){
var waitMsgDiv='<div class="waitMsg boxShadow"></div>';
var $waitDiv,pos;
if(!msg){
msg='Please wait';}
fun.clearWaitMsg();
$waitDiv=$(waitMsgDiv).html(msg).appendTo("body");
if($.ui){
$waitDiv.position({
my:"center",at:"center",of:"body"});}else{
pos={left:$(window).width()/2 - 100, top: $(window).height()/2-100};
$waitDiv.offset(pos);}},
clearWaitMsg:function(){
$(".waitMsg").remove();}};
Array.prototype.sum=function(){
var i,sum;
for(i=0,sum=0;i<this.length;sum+=this[i++]){}
return sum;};
Date.prototype.ShortDate=function(){
return this.getDate()+" "+fun.MONTHNAMES[this.getMonth()].substr(0,3)+" "+this.getFullYear();};
if(!window.bc){
window.bc={
MSPERDAY:86400000,
MAXCOMMENTS:5,
MAXDEMOCOMMENTS:2,
Const:{
SUBSCRIBEPAGE:'/subscribe/bcshop.aspx',
testMsg:"You have only one attempt per question! Click \"Submit Test\" to save each question.",
RegExpWhiteSpace:/^\s*$/,
RegExpHtmlTag:/<[^>]*>/g,
RegExpValidInputChars:/^[0-9a-zA-Z,\.\/\?;:'\[\]\{\}\|\\~!@\#\$%\^&\*\(\)_\+\-=\040]*$/,
RegExpValidInputChars2:/^[0-9a-zA-Z,\.\/\?;:'\[\]\{\}\|\\~!@\#\$%\^&\*\(\)_\+\-=\040"\<\>\n\r\t]*$/,// as above, plus "<>,new line,carriage return,-for eg textarea comment
RegExpValidInputCharsErrorMsg:'Invalid character (eg <>)',
RegExpTagWithSpace:/<[^>]*[^>]*>/,
scoreBarTitle:[' right first time. ',' right after error. ',' gave up. ',' untried. '],
pageSlideMenuBar:'',
defaultTestStyle:0,
defaultUserMode:1,
lineSparkGraphSettings:{type:'line',height:'23px',spotRadius:'1.5',defaultPixelsPerValue:'4',spotColor:'',lineColor:'#003366',fillColor:'#fff4c0'},
qflags:'qdone qtried quntried',
listItemSelectedClass:"selected"},
config:{
showScoreBar:true,
showSparkLines:true,
useTooltipPlugin:true,
smallScreen:false},
svg:{
canvas:{},
element:{},
props:{}},
institutionid:0,
subjectareaid:0,
courseid:0,
csid:0,
subtopicid:0,
regionVariable:{},
subjectarea:{},
course:{},
subtopic:{},
topic:{},
coursesubtopic:{},
user:{
scores:{
course:{},
courseRank:{},
cs:{},
pp:{}},
config:{
showHistory:true,
useHardMode:false,
expandPageFooterToolbar:true},
courseclass:{},
ccArray:[],
coursesubtopic:{}},
mode:"",
custom:{css:''},
currentCourse:null,
currentTopic:null,
currentCS:null,
printFooter:'',
documentTitlePrefix:'Bestchoice > ',
CourseClass:function(id,name,courseid,message,defaultUserMode,testStyle,numUsers,currentRank,marksObj,hideTopics,customTopicsArr){
var i,hideNodes,nodeType,nodeId;
this.id=id;
this.name=name;
this.courseid=courseid;
this.message=message;
this.defaultUserMode=defaultUserMode;
bc.course[courseid].userMode=defaultUserMode;
this.testStyle=testStyle;
if(testStyle>bc.course[courseid].testStyle){
bc.course[courseid].testStyle=testStyle;}
this.numUsers=numUsers;
this.currentRank=currentRank;
this.userMarks=marksObj;
if(hideTopics==='ALL'){
if(!bc.user.ccArray.length&&!bc.user.isAdmin){
bc.custom.hideAllMenuNodes=true;}}else if(hideTopics){
hideNodes=hideTopics.split(',');
for(i=0;i<hideNodes.length;i++){
nodeType=hideNodes[i].substring(0,1);
nodeId=hideNodes[i].substring(1);
if(nodeType==='s'){
bc.coursesubtopic[nodeId].isPrivate=true;}else if(nodeType==='t'){
bc.topic[nodeId].isPrivate=true;}}}
this.customTopicsArr=customTopicsArr;
bc.user.ccArray.push(id);
bc.user.lastCourseClass=this;},
ClassTopic:function(topicid,csid,showLink,message,userMode,highlightColor,sortOrder,customName){
this.topicid=topicid;
this.csid=csid;
this.showLink=showLink;
this.message=message;
this.userMode=userMode;
this.highlightColor=highlightColor;
this.sortOrder=sortOrder;
this.customName=customName;
var name,node;
if(csid){
name="cs"+csid;
node=bc.coursesubtopic[csid];}else{
name="t"+topicid;
node=bc.topic[topicid];}
$.extend(node,{
hasCustomSettings:true,
userMode:userMode,
bgColor:highlightColor,
customOrder:sortOrder});
if(customName){
node.name=customName;}
if(highlightColor){
bc.custom.css+='.'+name+'{border-color:'+highlightColor+'  !important;}';}},
Subject:function(id,name,courseGroupArr,courseArr){
this.id=id;
this.name=name;
this.courseGroupArr=courseGroupArr;
this.courseArr=courseArr;
bc.subjectarea[id]=this;},
Course:Class.extend({
topics:null,
userMode:null,
testStyle:0,
init:function(id,name,isDemo,regionid,numSubtopics,totMarks){
this.id=id;
this.name=name;
this.isDemo=isDemo;
this.regionid=regionid;
this.numSubtopics=numSubtopics;
this.totMarks=totMarks;
bc.user.scores.course[id]=new bc.Marks(0,0,0,this.totMarks);
bc.course[id]=this;}}),
Topic:Class.extend({
hasCustomSettings:false,
customOrder:0,
nodeType:"t",
init:function(id,parentId,name,cssFormat,cssClass,childArray){
this.idCode="t"+id;
this.id=id;
this.parentId=parentId;
this.name=name;
this.cssFormat=cssFormat;
this.cssClass=cssClass;
this.childArray=childArray;
this.numChildren=childArray.length;
bc.topic[id]=this;}}),
CourseSubtopic:Class.extend({
hasCustomSettings:false,
status:1,
customOrder:0,
nodeType:"s",
init:function(id,parentId,name,cssFormat,cssClass,subtopicid,
totalMarks,coreMarks,numQuestions,numCoreQuestions,numPages,numCorePages,
sa,sa_subtopic,isMobile,isPrivate,mustSubscribe,randomOrder,userMode,QMode,showQA,canAsk,canAnswer,csPageRangeArray){
var i,pr,prObj;
this.idCode="s"+id;
this.id=id;
this.subtopicid=subtopicid;
this.topicid=parentId;
this.name=name;
this.cssFormat=cssFormat;
this.cssClass=cssClass;
this.totMarks=totalMarks;
this.coreMarks=coreMarks;
this.numQuestions=numQuestions;
this.numCoreQuestions=numCoreQuestions;
this.numPages=numPages;
this.numCorePages=numCorePages;
this.sa=sa;
this.sa_subtopic=sa_subtopic;
this.isMobile=isMobile;
this.isPrivate=isPrivate;
this.mustSubscribe=mustSubscribe;
this.randomOrder=randomOrder;
this.userMode=userMode;
this.QMode=QMode;
this.canChooseQMode=(this.QMode===0);
this.showQA=showQA;
this.canAsk=canAsk;
this.canAnswer=canAnswer;
this.canShowExtraQuestions=false;
this.pageRangeArr=[];
for(i=0;i<csPageRangeArray.length;i++){
pr=csPageRangeArray[i];
prObj={
startPage:Math.max(pr[0],1),
endPage:pr[1],
subsetSize:pr[2],
pageStyleId:pr[2]};
this.pageRangeArr.push(prObj);
if(prObj.subsetSize>0){
this.canShowExtraQuestions=true;}}
this.pageGroupArr=[];
bc.user.scores.cs[id]=new bc.Marks(0,0,0,this.totMarks);
bc.coursesubtopic[id]=this;},
setup:function(){
this.topic=bc.topic[this.topicid];
this.isPrivate=(this.isPrivate||(this.topic&&this.topic.isPrivate)||bc.custom.hideAllMenuNodes);
if(this.isPrivate&&!(this.hasCustomSettings||this.topic.hasCustomSettings)){
this.status=-1;}else if(this.mustSubscribe&&bc.mustSubscribe&&!bc.user.isSubscribed){
this.status=0;}}}),
Page:Class.extend({
init:function(pageid,pagestyleid,pageTitle,dropdownText,subtopiclinkText,hasHardModeQuestions,ppArray){
this.id=pageid;
this.pageid=pageid;
this.pagestyleid=pagestyleid;
this.pageTitle=pageTitle;
this.dropdownText=dropdownText;
this.linkTitle=subtopiclinkText;
this.hasHardMode=(hasHardModeQuestions>0)?true:false;
this.ppArr=ppArray;
this.numpp=ppArray.length;
this.pp=[];
var i,nq=0,nm=0;
for(i=0;i<ppArray.length;i++){
if(ppArray[i][1]>0){
nq++;
nm+=ppArray[i][1];
this.pp.push(new bc.Pagepart(ppArray[i][0],ppArray[i][1]));}}
this.totMarks=nm;
this.numQuestions=nq;
this.pageType=(nq>0)?'q':'r';},
setTitleScoreHtml:function(){
this.titleScoreHtml='<span class="pagetitle">'+this.dropPrefix+'</span>';
if(this.totMarks>0){
this.titleScoreHtml+=': <span class="pagemark">'+this.markPercent+'</span>';}}}),
Pagepart:function(pagepartid,totMarks){
this.ppid=pagepartid;
this.totMarks=totMarks;},
Marks:Class.extend({
init:function(totalMarks,firstrightMarks,giveupMarks,outOfMarks,firstTimeDays,lastTimeDays){
this.totalMarks=totalMarks||0;
this.firstrightMarks=firstrightMarks||0;
this.giveupMarks=giveupMarks||0;
this.outOf=outOfMarks||0;
this.startDays=firstTimeDays||0;
this.endDays=lastTimeDays||0;},
wrongRightMarks:function(){
return(this.totalMarks-this.firstrightMarks);},
grandTotalMarks:function(){
return(this.totalMarks+this.giveupMarks);},
zeroMarks:function(){
this.totalMarks=0;
this.firstrightMarks=0;
this.giveupMarks=0;},
marksArray:function(){
var untriedMarks=0;
if(this.outOf){
untriedMarks=this.outOf-(this.totalMarks+this.giveupMarks);}
return[this.firstrightMarks,this.wrongRightMarks(),this.giveupMarks,untriedMarks];},
totalPercent:function(){
return this.percent(this.totalMarks);},
firstrightPercent:function(){
return this.percent(this.firstrightMarks);},
percent:function(numerator){
if(this.outOf){
var p=100*numerator/this.outOf;
if(p>100){p=100;}
return(p>=10)?Math.round(p):Math.round(10*p)/10;}else{
return 0;}},
fractionString:function(supsub){
var numerator=Math.round(this.totalMarks),
denominator=Math.round(this.outOf);
if(supsub){
return numerator+" / "+denominator;}else{
return numerator+" / "+denominator;}},
fractionPercentString:function(options){
return fun.formatFractionPercent(this.totalMarks,this.outOf,options);},
dateRangeString:function(){
var date='';
if(this.endDays){
if(this.startDays&&this.endDays!=this.startDays){
date+=fun.daysToDate(this.startDays).ShortDate()+" - ";}
date+=fun.daysToDate(this.endDays).ShortDate();}
return date;},
dateString:function(){
var date='';
if(this.endDays){
date=fun.daysToDate(this.endDays).ShortDate();}else	if(this.startDays){
date=fun.daysToDate(this.startDays).ShortDate();}
return date;},
addMarksObj:function(bcMarksObj,subtract){
if(subtract){
this.totalMarks-=bcMarksObj.totalMarks;
this.firstrightMarks-=bcMarksObj.firstrightMarks;
this.giveupMarks-=bcMarksObj.giveupMarks;}else{
this.totalMarks+=bcMarksObj.totalMarks;
this.firstrightMarks+=bcMarksObj.firstrightMarks;
this.giveupMarks+=bcMarksObj.giveupMarks;}},
validateZero:function(){
this.totalMarks=Math.max(0,this.totalMarks);
this.firstrightMarks=Math.max(0,this.firstrightMarks);
this.giveupMarks=Math.max(0,this.giveupMarks);},
validate:function(){
this.validateZero();
if(this.outOf){
if(this.totalMarks>this.outOf){
this.totalMarks=this.outOf;}}
if(this.firstrightMarks>this.totalMarks){
this.firstrightMarks=this.totalMarks;}
if(this.outOf){
if((this.totalMarks+this.giveupMarks)>this.outOf){
this.giveupMarks=this.outOf-this.totalMarks;}}}})};
$.extend(bc,{
tooltipSettings:{
navToolbar:{
position:{
my:"right bottom",
at:"left top",
offset:"8 -5"},
tooltipClass:"navbarTooltip"},
navLinks:{
position:{
my:"right top",
at:"center bottom",
offset:"0 0"},
tooltipClass:"navbarTooltip"},
menu:{
items:"a",
content:function(){
return $(this).data("tooltip");},
position:{
offset:"15 0"},
tooltipClass:"boxShadow menuTooltip"},
listPages:{
items:"a",
content:function(){
return $(this).data("tooltip");},
position:{
my:"right center",
at:"left center",
offset:"-10 0"},
tooltipClass:"boxShadow menuTooltip"},
navScorebar:{
position:{
my:"right center",
at:"left center",
offset:"-10 0"},
tooltipClass:"scorebarTooltip"},
surveyPageScore:{
position:{
my:"right center",
at:"left center",
offset:"-3 0"},tooltipClass:"scorebarTooltip"}},
logout:function(){
bc.savePageScore();
if(confirm("Log out of Bestchoice?")){
top.location.href='/handlers/logout.ashx';}},
layoutPlugin:{
northPaneCaption:"Bestchoice",
southPaneCaption:"Bestchoice",
eastPaneCaption:fun.splitJoin('Contact','<br>')+'<br><b>&#171;</b>',
eastPaneCaption_subtopic:fun.splitJoin('Pages','<br>')+'<br><b>&#171;</b>',
westPaneCaption:fun.splitJoin('Courses','<br>')+'<br><b>&#187;</b>',
westPaneCaption_course:fun.splitJoin('Topics','<br>')+'<br><b>&#187;</b>',
hasEastPane:((screen.width>1000)&&!$.support.touch&&!bc.isMobile),
hasWestPane:(!bc.isMobile),
hasSouthPane:((screen.height>600)&&!$.support.touch&&!bc.isMobile),
closedPaneSize:$.support.touch?16:11,
setup:function(){
var windowWidth=$(window).width();
var showEastPane=(windowWidth>1280),
showSouthPane=($(window).height()>760);
if(bc.isMobile){
$('html').removeClass('notTouch').addClass('touch');
$('body').addClass('mobile');
bc.Layout={};
return;}
if(!showEastPane){
$("body").addClass("eastClosed");}
if(!showSouthPane){
$("body").addClass("southClosed");}
bc.user.layoutOpen={north:true,west:true,east:showEastPane,south:showSouthPane};
bc.Layout=$('body').layout({
applyDefaultStyles:false,
defaults:{
fxName:"slide",
fxSpeed:"slow",
spacing_open:8,
spacing_closed:this.closedPaneSize,
togglerLength_closed:180,
togglerAlign_closed:"middle",
onresize:this.paneResize,
onclose:this.paneClose,
onopen:this.paneOpen},
north:{
resizable:false,
size:54,
spacing_closed:this.closedPaneSize+1,
togglerContent_closed:this.northPaneCaption},
west:{
size:Math.max(140+($.support.touch?30:0),windowWidth/10),
minSize:90,maxSize:200,
togglerContent_open:"&lt;",
togglerContent_closed:this.westPaneCaption},
east:{
size:Math.max(140,windowWidth/10),
minSize:70,maxSize:250,
togglerContent_open:"&gt;",
togglerContent_closed:this.eastPaneCaption,
initClosed:!bc.user.layoutOpen.east},
south:{
resizable:false,
size:25,
spacing_closed:this.closedPaneSize+1,
togglerContent_closed:this.southPaneCaption,
initClosed:!bc.user.layoutOpen.south}});
this.paneResize("west","",bc.Layout.state.west,null);},
paneResize:function(paneName,paneElement,paneState,paneOptions){
$(".layout-"+paneName+"-size").css("width",paneState.size+"px");
switch(paneName){
case "east":
bc.nav.showSubtopicScoreBar(bc.nav.visibleCsMarks);
break;
case "west":
$(".layout-west-padding-left").css("padding-left",(paneState.size+5)+"px");
$("#courseTotal_pieGraph").css("width",(paneState.size-31)+"px");
if(paneState.size<140){
$(".ui-layout-west").addClass("narrow");}else{
$(".ui-layout-west").removeClass("narrow");}
break;}},
paneClose:function(paneName,paneElement,paneState,paneOptions){
$("body").addClass(paneName+"Closed");},
paneOpen:function(paneName,paneElement,paneState,paneOptions){
$("body").removeClass(paneName+"Closed");},
swapWestEast:function(){
$("#nav2Footer, #totalCourseMarks").toggleClass("layout-east-size layout-west-size");
$("body").toggleClass("layoutSwapWE");
bc.Layout.swapPanes('east','west');},
swapNorthSouth:function(){
$("body").toggleClass("layoutSwapNS");
bc.Layout.swapPanes('north','south');},
toggleFullScreen:function(){
if(!bc.Layout){
var url="/?";
if(bc.subjectareaid){
url+="s="+bc.subjectareaid+"&";}
if(document.location.search){
url+=document.location.search.substr(1)+"&";}
if(bc.nav.pageid){
url+="pageid="+bc.nav.pageid+"&";}
bc.savePageScore();
document.location=url;
return false;}
var state=bc.Layout.state;
var l={
north:!state.north.isClosed,
west:!state.west.isClosed,
east:this.hasEastPane&&!state.east.isClosed,
south:this.hasSouthPane&&!state.south.isClosed};
if(l.west||l.east||l.north||l.south){
bc.user.layoutOpen=l;
bc.Layout.close("west");
bc.Layout.close("east");
bc.Layout.close("north");
bc.Layout.close("south");}else{
l=bc.user.layoutOpen;
if(l.west){bc.Layout.open("west");}
if(l.east){bc.Layout.open("east");}
if(l.north){bc.Layout.open("north");}
if(l.south){bc.Layout.open("south");}}},
setPaneCaption:function(pane,htmlCaption){
var selector=".ui-layout-toggler-"+pane+" span.content-closed";
$(selector).html(htmlCaption);}},
loadUserInfo:function(){
var i,t,csid,courseid,outOfMarks;
if(bc.user.csScoresArr){
for(i=0;i<bc.user.csScoresArr.length;i++){
t=bc.user.csScoresArr[i];
csid=t[0];
outOfMarks=(bc.coursesubtopic[csid]&&bc.coursesubtopic[csid].totMarks)?bc.coursesubtopic[csid].totMarks:0;
bc.user.scores.cs[csid]=new bc.Marks(t[1],t[2],t[3],outOfMarks,t[4],t[5]);
if(bc.isClassReportMode){
bc.user.scores.cs[csid].numUsers=t[6];}}
delete bc.user.csScoresArr;}
if(bc.user.courseScoresArr){
for(i=0;i<bc.user.courseScoresArr.length;i++){
t=bc.user.courseScoresArr[i];
courseid=t[0];
bc.user.scores.course[courseid]=new bc.Marks(t[1],t[2],t[3],t[4],t[5],t[6]);
bc.user.scores.courseRank[courseid]=t[7];}
delete bc.user.courseScoresArr;}
bc.user.details='Bestchoice User: <b>'+bc.user.userName+'</b>';
if(bc.user.fullName){bc.user.details+=', Full Name: <b>'+bc.user.fullName+'</b>';}
if(bc.user.studentCode){bc.user.details+=', ID: <b>'+bc.user.studentCode+'</b>';}
if(bc.user.isSubscribed){bc.user.details+=', <i>Licenced</i>';}
if(bc.user.isAdmin){
$("#menuAdminLinks").append(bc.template.getHtmlById("adminLinks")).css("display","block");}else if(bc.user.isReportuser){
$("#menuAdminLinks").append(bc.template.getHtmlById("reportLinks")).css("display","block");}
if(bc.user.isDemo){
$("body").addClass("isDemo");}
$("#userName").text(bc.user.displayName);
if(bc.reportUser){
$("#userName").prepend(bc.reportUser.userName+' <i>as</i> ');}},
displaySubscriptionStatus:function(){
var tmp,showIcon=false,$linkSubs=$("#linkSubscribe");
if(!bc.user.isSubscribed){
$linkSubs.html("Get Licence").addClass("important").attr("title","Obtain licence for all Bestchoice content");
if(bc.user.lastActiveDaysAgo<0||bc.user.lastActiveDaysAgo>3){
bc.showSubscribeDialog();}}else{
tmp="Licenced to use Bestchoice content";
$linkSubs.text("Licenced");
if(bc.user.subExpireDate){
tmp+=" until "+bc.user.subExpireDate.ShortDate();
if(fun.dateDiff(new Date(),bc.user.subExpireDate)<8){
$linkSubs.addClass("important");}}
if(bc.user.isStaff||bc.user.isReportuser){
tmp+='<br>Click to purchase a site licence.';
$linkSubs.attr("href","/subscribe/bcshop.aspx?i="+bc.institutionid).attr("target","_top");
showIcon=true;}
$linkSubs.attr("title",tmp);}
if($linkSubs.hasClass("important")){
$linkSubs.attr("href","javascript:bc.showSubscribeDialog();");}
if(showIcon){
$linkSubs.prepend('<span class="ui-icon ui-icon-cart"></span>');}},
template:{
$master:null,
loaded:{},
loadMaster:function(){
$.ajax({
type:"GET",
url:bcFiles.template,
dataType:'text',
cache:true,
async:false,
success:function(data){
bc.template.$master=$("<div />",{"html":data});}});},
getById:function(templateId,contents){
if(!bc.template.$master){
this.loadMaster();}
var $template=this.loaded[templateId];
if(!$template){
$template=this.$master.find("#"+templateId);
this.loaded[templateId]=$template;}
if(!$template.length){
return null;}else if(contents){
return $template.contents().unwrap();}else{
return $template;}},
getHtmlById:function(templateId){
var $template=this.getById(templateId);
if($template){
return $template.html();}else{
return '';}}},
setupBC_javascript:function(){
$.each(bc.coursesubtopic,function(i,cs){
cs.setup();});
bc.clientStartTime=new Date();
bc.courseGroupArr=bc.subjectarea[bc.subjectareaid].courseGroupArr;
bc.courseArr=bc.subjectarea[bc.subjectareaid].courseArr;
bc.subjectName=bc.subjectarea[bc.subjectareaid].name;
if(bc.courseid&&!bc.course[bc.courseid]){
bc.courseid=0;}},
setupBC_mobile:function(htmlData){
if(bc.isMobile){
$.support.touch=true;}
bc.layoutPlugin.hasEastPane=false;
bc.layoutPlugin.hasSouthPane=false;
bc.setupBC(htmlData);
if($.browser.apple){
$("#navFooter").css("position","static");}
return;},
loadMobileHome:function(){
var menuTitle,$homePageHeader=bc.template.getById("homePageHeader").clone();
$('body').removeClass(fun.MOBILECLASSNAMES).addClass("welcome");
$('#divWrapperParent').empty().append($homePageHeader);
if(bc.courseid){
menuTitle="Topics for "+bc.currentCourse.name;}else{
menuTitle="Available Courses";}
$("#menuTitle").html(menuTitle);
bc2.courseid=bc.courseid;
bc2.displayEnrolledClassInfo();},
setupBC:function(htmlData){
var homeRef;
bc.setupBC_javascript();
bc.template.$master=$("<div />",{"html":htmlData});
var $homeFrameTemplate=bc.template.getById("bcHomeFrame");
if(bc.institutionContacts){
$homeFrameTemplate.find("#customContacts").html(bc.institutionContacts);}
if(bc.institutionLogoLinks){
$homeFrameTemplate.find("#divLogoLinks").html(bc.institutionLogoLinks);}
if(!bc.layoutPlugin.hasEastPane){
$homeFrameTemplate.find(".ui-layout-east").remove();}
if(!bc.layoutPlugin.hasSouthPane){
$homeFrameTemplate.find(".ui-layout-south").remove();}
bc2.injectCustomCss();
$("#divWrapper").remove();
$("body").prepend($homeFrameTemplate.html());
bc.$menuTree=$('#menuTree');
bc.$dropPages=$("#dropPages");
if(bc.layoutPlugin.hasEastPane){
bc.$listPages=$('#listPages');}
bc.layoutPlugin.setup();
if(bc.courseid){
homeRef="/?c="+bc.courseid;}else{
homeRef="/?i="+bc.institutionid+"&s="+bc.subjectareaid;}
$("#logoLink").attr("href",homeRef);
bc.loadUserInfo();
if(bc.mustSubscribe&&bc.courseid){
bc.displaySubscriptionStatus();}
if(bc.config.useTooltipPlugin){
bc.$menuTree.tooltip(bc.tooltipSettings.menu);
$("#navToolbar .iconRow").find("a,span,button").tooltip(bc.tooltipSettings.navToolbar);
$("#NavFrame .navLinks").find("a,button").tooltip(bc.tooltipSettings.navLinks);
$("#totalCourseMarks").tooltip({
tooltipClass:"boxShadow menuTooltip"});
if(bc.layoutPlugin.hasEastPane){
bc.$listPages.tooltip(bc.tooltipSettings.listPages);}
$(".important").tooltip("open");}
bc2.configureFormValidation();
bc.gotoCourseId(bc.courseid);
window.setTimeout(bc.preloadScriptFiles,2000);
if(location.hash){
bc.windowHashChange();}
if(bc.isMobile){
bc.loadMobileHome();}else if(!bc.pagemainIsLoading){
bc.loadWelcomePage();}
window.onhashchange=bc.windowHashChange;
window.onbeforeunload=function(){
bc.savePageScore(false,true);};
if($.browser.iPad){
$(window).bind('orientationchange',bc.windowOrientationChange);}
bc.setRefreshTimeout();},
setLocationHash:function(newHash,replace,logMsg){
var oldHash=window.top.location.hash||"#";
logMsg=logMsg||'';
if(newHash.substr(0,1)!=="#"){
newHash="#"+newHash;}
if(newHash!=oldHash){
bc.codeHashChange=true;
if(replace){
window.top.location.replace(newHash);}else{
window.top.location.hash=newHash;}}},
windowHashChange:function(event){
bc.setRefreshTimeout();
if(bc.codeHashChange){
bc.codeHashChange=false;
return;}
var qs=fun.queryStringToObject(['t','cs']);
if(location.hash===""){
bc.closeSubtopic(true);}else if(qs.t){
bc.pagemainIsLoading=true;
bc.gotoTopicId(qs.t);}else if(qs.cs){
if(qs.cs===bc.csid&&bc.nav.dropPages){
if(qs.p){
bc.nav.dropPages.value=qs.p;
bc.nav.loadPage();}}else{
bc.pagemainIsLoading=true;
bc.gotoSubtopicId(qs.cs,qs.p);}}else if(qs.action){
bc.pagemainIsLoading=true;
switch(qs.action){
case "showscores":
bc.showUserResults();
break;
case "popular":
bc.loadWelcomePage();
break;}}else{}},
setRefreshTimeout:function(){
var TIMEOUTMS=60*60000;
if(bc.isMobile){
return;}
if(top.bcRefreshTimeout){
top.clearTimeout(top.bcRefreshTimeout);}
top.bcRefreshTimeout=top.setTimeout(bc.forceRefreshPage,TIMEOUTMS);},
forceRefreshPage:function(){
var msg='One hour since last recorded activity.\nPage will be refreshed.\nYou may need to login again.';
if(bc.user.isAdmin){
return;}
alert(msg);
top.history.go(0);},
windowOrientationChange:function(event){
bc.windowResize();},
windowResize:function(event){
if(bc.csid&&bc.nav.slider){
bc.nav.slider.width(bc.nav.getSliderWidth());}},
preloadScriptFiles:function(){
var i,cs,userScore,customTopicsArr,numPreloaded=0,preloadFiles=[];
if(bc.user.lastCourseClass&&bc.user.lastCourseClass.customTopicsArr){
customTopicsArr=bc.user.lastCourseClass.customTopicsArr;
for(i=0;i<customTopicsArr.length;i++){
if(numPreloaded<3&&customTopicsArr[i].csid){
cs=bc.coursesubtopic[customTopicsArr[i].csid];
userScore=bc.user.scores.cs[customTopicsArr[i].csid];
if(cs&&!userScore.endDays){
preloadFiles.push(bc.nav.getSubtopicJavascriptFile(cs.sa_subtopic,cs.subtopicid));
numPreloaded++;}}}}
preloadFiles.unshift('/html2/blank.v1.1.min.htm');
preloadFile();
function preloadFile(){
var url=preloadFiles.shift();
$.ajax({
url:url,
cache:true,
timeout:30000,
dataType:"text",
beforeSend:function(xhr){
xhr.preLoad=true;}});
if(preloadFiles.length){
window.setTimeout(preloadFile,100);}}}});
$.extend(bc,{
loadWelcomePage:function(){
var url='/bcwelcome.aspx?s='+bc.subjectareaid+'&i='+bc.institutionid;
if(bc.courseid){
url+='&c='+bc.courseid;}
fun.gotoUrl(url,parent.pagemain);},
gotoCourseId:function(newcourseid,gotoHome){
var url;
newcourseid=newcourseid||0;
bc.courseid=newcourseid;
bc.currentCourse=(newcourseid)?bc.course[newcourseid]:null;
if(bc.svg.canvas.coursePie){
bc.svg.canvas.coursePie.clear();}
if(newcourseid){
$("body").addClass("isCourse");
if(bc.course[newcourseid].topics){
bc.closeSubtopic(gotoHome);
bc.setupMenu();}else{
url="/?c="+newcourseid;
fun.showWaitMsg("Loading course...");
top.document.location=url;}}else{
$("body").removeClass("isCourse");
$("#courseTotal").html("");
bc.closeSubtopic(gotoHome);
bc.setupMenu();}},
gotoTopicId:function(topicid,toggle){
var url,locationHash="#t="+topicid;
bc.currentTopic=bc.topic[topicid];
bc.highlightCurrentMenuNode("at"+topicid);
bc.closeSubtopic();
top.document.title=bc.documentTitlePrefix+' > Topics';
bc.toggleTopic(topicid,toggle);
url=bc.nav.getCourseIndexHtmlFile(bc.subjectareaid,bc.courseid);
if(!$.browser.iPad){}
fun.gotoUrl(url,parent.pagemain);
bc.setLocationHash(locationHash,false,'gotoTopic');},
toggleTopic:function(topicid,toggle){
var $topic=$("#at"+topicid),
$topicBranch=$("ul#t"+topicid+"branch");
if($topicBranch.css("display")!="none"&&toggle){
$topicBranch.slideUp();
$topic.find(".treeRoot").html(bc.Const.treeRootClosed);}else{
$topicBranch.slideDown();
$topic.find(".treeRoot").html(bc.Const.treeRootOpen);}},
gotoSubtopicIdNoFrame:function(csid,pageid){
var url,subtopicid=bc.coursesubtopic[csid].subtopicid;
if(!(bc.subjectareaid&&bc.courseid&&subtopicid)){return;}
url=bc.nav.getPageHtmlFile(bc.subjectareaid,subtopicid,pageid);
url+='?i='+bc.institutionid+'&c='+bc.courseid+'&cs='+csid;
document.location=url;},
gotoNextSubtopic:function(){
if(bc.csid&&bc.coursesubtopic[bc.csid]&&bc.coursesubtopic[bc.csid].nextCsid){
bc.gotoSubtopicId(bc.coursesubtopic[bc.csid].nextCsid);}},
gotoSubtopicId:function(csid,pageid){
var userdataFile='/handlers/getuserdata.ashx',url,userScore=bc.user.scores.cs[csid];
var csAlreadyTried=!!(userScore.endDays);
$("a:focus").blur();
pageid=pageid||'';
if(!bc.Layout&&!bc.isMobile){
bc.gotoSubtopicIdNoFrame(csid,pageid);
return;}
if(!(bc.subjectareaid&&bc.courseid&&bc.coursesubtopic[csid])){return;}
if(bc.coursesubtopic[csid].status<=0){
bc.showSubscribeDialog();
return;}
if(bc.csid==csid){
return;}
if(!bc.user.isDemo&&csAlreadyTried&&!bc.user.coursesubtopic[csid]){
if(bc.isClassReportMode){
url=userdataFile+"?action=subtopicreport&csid="+csid+"&cc="+bc.ccid;}else if(bc.reportUser){
url=userdataFile+"?action=subtopic&csid="+csid+"&u="+bc.reportUser.userid;}else{
url=userdataFile+"?action=subtopic&csid="+csid;}
fun.showWaitMsg("Loading topic...");
$.ajax({
type:"GET",
url:url,
dataType:'script',
cache:false,
success:function(){
bc.gotoSubtopicId(csid,pageid);},
beforeSend:function(xhr){
xhr.retryLimit=2;}});
return;}else{
bc.user.coursesubtopic[csid]=bc.user.coursesubtopic[csid]||{};}
bc.closeSubtopic();
bc.startCsid=csid;
bc.csid=csid;
bc.currentCS=bc.coursesubtopic[csid];
bc.subtopicid=bc.currentCS.subtopicid;
bc.currentTopic=bc.topic[bc.currentCS.topicid];
bc.highlightCurrentMenuNode("acs"+csid);
bc.expandCsTopic(csid);
bc.setNavbarTitle();
bc.setPrintFooter();
$("body").addClass("isSubtopic");
$.extend(bc.nav,{
csid:csid,
startPageid:pageid,
csAlreadyTried:csAlreadyTried});
if(bc.currentCS.pageGroupArr.length){
bc.nav.setupNavbar();}else{
fun.showWaitMsg("Loading topic...");
url=bc.nav.getSubtopicJavascriptFile(bc.currentCS.sa_subtopic,bc.currentCS.subtopicid);
$.ajax({
type:"GET",
url:url,
dataType:'script',
cache:true,
success:bc.setupCoursesubtopicPages,
beforeSend:function(xhr){
xhr.retryLimit=2;}});}},
setupCoursesubtopicPages:function(){
var cs=bc.coursesubtopic[bc.csid],
subtopic=bc.subtopic[cs.subtopicid];
var i,p,pageRange,groupPagesArr=[],lastpageType='';
if(!subtopic){return;}
if(!cs.pageRangeArr.length){
pageRange={
startPage:1,
endPage:subtopic.pageArr.length,
subsetSize:0,
pageStyleId:0};
cs.pageRangeArr.push(pageRange);}
for(i=0;i<cs.pageRangeArr.length;i++){
pageRange=cs.pageRangeArr[i];
for(p=pageRange.startPage;p<=pageRange.endPage;p++){
if(lastpageType&&subtopic.pageArr[p-1].pageType!=lastpageType){
pageGroupComplete();}
lastpageType=subtopic.pageArr[p-1].pageType;
groupPagesArr.push(subtopic.pageArr[p-1]);}
pageGroupComplete();}
bc.nav.setupNavbar();
function pageGroupComplete(){
if(cs.randomOrder){groupPagesArr.sort(fun.randomOrder);}
var pageGroup={
subsetSize:pageRange.subsetSize,
pages:groupPagesArr};
cs.pageGroupArr.push(pageGroup);
groupPagesArr=[];
lastpageType='';}},
closeSubtopic:function(gotoHome){
$("body").removeClass("isSubtopic isFirstPage isFinalPage isTest isForwardOnly");
$(".ui-tooltip").remove();
if(bc.preloadPageTimeout){
clearTimeout(bc.preloadPageTimeout);}
bc.savePageScore();
if(!bc.Layout&&!bc.isMobile){
bc.goHomeNoFrames();
return;}
bc.currentCS=null;
bc.csid=0;
bc.subtopicid=0;
$.extend(bc.nav,bc.nav.defaults);
if(bc.nav.slider){
bc.nav.slider.slider('destroy').html('');
bc.nav.slider=null;}
bc.$dropPages.html('');
$("#navStatus").html("").attr("title","");
if(bc.$listPages){
bc.$listPages.html('');}
bc.setNavbarTitle();
bc.setPrintFooter();
bc.layoutPlugin.setPaneCaption("south",bc.layoutPlugin.southPaneCaption);
if(gotoHome){
if(bc.isMobile){
bc.loadMobileHome();}else{
bc.loadWelcomePage();}
bc.setLocationHash("#",false,'closeSubtopic');
if($.support.touch&&bc.Layout&&!bc.isMobile){
bc.Layout.open("west");}}},
setNavbarTitle:function(){
var titleLinks='',titleLinks2='',endTitle='',nav2Title='',northPaneCaption='',pageHeadTitle='Bestchoice - ',courseTitle='';
var eastPaneCaption=bc.csid?bc.layoutPlugin.eastPaneCaption_subtopic:bc.layoutPlugin.eastPaneCaption;
var westPaneCaption=bc.courseid?bc.layoutPlugin.westPaneCaption_course:bc.layoutPlugin.westPaneCaption;
if(bc.isClassReportMode){
pageHeadTitle+="Class "+bc.user.userName+" - "+bc.nu+" users";}else if(bc.reportUser){
pageHeadTitle+=bc.reportUser.userName+" as "+bc.user.userName;}else{
pageHeadTitle+=bc.user.userName;}
pageHeadTitle+=' > ';
if(bc.courseid){
titleLinks='<a href="#" onclick="bc.gotoCourseId(0, true);return false;" title="Change course">'+bc.subjectName+'</a> > ';
courseTitle=bc.currentCourse.name;
if(bc.csid){
titleLinks2+='<a href="#" onclick="bc.closeSubtopic(true);return false;" title="Course home" >'+courseTitle+'</a> > ';
titleLinks2+=bc.currentCS.name+' > ';
nav2Title=bc.currentCS.name;
$("#footerTitle").html('<b>'+nav2Title+'</b> : ');}else{
endTitle=courseTitle;}
northPaneCaption=(endTitle||nav2Title);}else{
northPaneCaption=bc.subjectName;
endTitle=bc.subjectName+': '+bc.institutionName;}
pageHeadTitle+=(titleLinks2||titleLinks)+endTitle;
bc.documentTitlePrefix=pageHeadTitle.replace(/<.+?>/g,"");
document.title=bc.documentTitlePrefix;
if($.support.touch){
if(bc.csid){
titleLinks='';
titleLinks2=bc.currentCS.name+' > ';}}else{
$("#nav2Title").html('<b>'+(nav2Title||endTitle)+'</b>');
bc.layoutPlugin.setPaneCaption("east",eastPaneCaption);}
if(!bc.isMobile){
titleLinks2+='<span class="navEndTitle">'+endTitle+'</span>';}
$("#navTitle").html(titleLinks+titleLinks2);
bc.layoutPlugin.setPaneCaption("north",northPaneCaption);
bc.layoutPlugin.setPaneCaption("west",westPaneCaption);
$("a:focus").blur();},
setPrintFooter:function(){
if(bc.isMobile){
bc.printFooter='';
return;}
bc.printFooter=bc.subjectName+': '+bc.institutionName;
if(bc.courseid){
bc.printFooter+=' > '+bc.currentCourse.name;
if(bc.csid){
bc.printFooter+=' > '+bc.currentTopic.name+' > '+bc.currentCS.name;}}
bc.printFooter='<div id="printFooter" class="printonly"><span>'+bc.user.details+'</span>'+bc.printFooter+'</div>';},
printPage:function(){
if(frames.pagemain){
frames.pagemain.focus();
frames.pagemain.print();}
else if(window.print){
window.print();}},
showHideToolBar:function(){
var bar=$("#navToolbar");
var link=bar.find("#linkToggleFooterMenu");
if(bar.hasClass("closed")){
link.html('&#187;').attr('title','Hide menu');
bar.removeClass("closed");}else{
link.html('&#171;').attr('title','Show menu');
bar.addClass("closed");}},
loadToolbarNoFrames:function(){
$.get(bcFiles.template_noframe,function(data){
$(data).find("#navToolbar").appendTo('body').find(".button");});},
goHomeNoFrames:function(){
var url;
if(bc.institutionid){
if(bc.courseid&&(window.bcp||bc.Layout)){
url=bc.nav.getCourseIndexHtmlFile(bc.subjectareaid,bc.courseid);}else{
url="/html/i"+bc.institutionid+".htm#sa"+bc.subjectareaid;}}else{
url="/subjectarea.aspx?noframe=1";}
document.location=url;
return false;},
loadUserPpScores:function(ppArr){
var i,t,ppid;
for(i=0;i<ppArr.length;i++){
t=ppArr[i];
ppid=t[0];
bc.user.scores.pp[ppid]=new bc.Marks(t[1],t[2],t[3]);
$.extend(bc.user.scores.pp[ppid],{
isLocked:t[4],
answerStates:t[5].split(""),
endDays:t[6],
startDays:t[7]||null});}},
loadUserCS:function(csid,rating,commentsArr){
bc.user.coursesubtopic[csid]={
rating:rating,
comments:commentsArr||null};},
loadCourseClassCS:function(csid,csobj){
bc.user.coursesubtopic[csid]=csobj;},
savePageScore:function(saveTest,synchronous){
var bcp2,url,method,dataString,pageframe=top.window.frames.pagemain,async=true;
if(synchronous){
async=false;}
if(window.bcp){
bcp2=window.bcp;}else if(pageframe&&pageframe.bcp){
bcp2=pageframe.bcp;}else{
return false;}
bcp2.pageStartDateTime=null;
if(bcp2.isAdminPreview||(bcp2.isTest&&!saveTest)||!bcp2.csid||!bcp2.scoreChanged||bc.isClassReportMode||bc.isPreview||bc.user.isDemo||(bc.nav.currentPage&&bc.nav.currentPage.userAllQuestionsLocked&&!bcp2.isTest)){
return false;}
bcp2.scoreChanged=false;
dataString='obj='+bcp2.getPageScoreDataString();
if(bc.reportUser){
fun.jalert(dataString,"User report - Would have sent:");
return;}
url='/handlers/saveuserdata.ashx?cs='+bcp2.csid+'&p='+bcp2.pageid;
method="POST";
$.ajax({
type:method,
cache:false,
url:url,
data:dataString,
dataType:"text",
async:async,
beforeSend:function(xhr){
xhr.bcCsid=bc.csid;
xhr.bcPageid=bc.nav.pageid;
xhr.retryLimit=3;}});},
showMobileOptionsDialog:function(){
if(!bc.$mobileOptionsDialog){
var $html=bc.template.getById("mobileOptionsDialog");
bc.$mobileOptionsDialog=$html
.dialog({
resizable:true,
modal:false,
autoOpen:false,
width:200,
maxWidth:400});}
bc.$mobileOptionsDialog.dialog('open');
$('#mobileOptionsDialog').click(
function(){
bc.$mobileOptionsDialog.dialog('close');});},
showResourceDialog:function(){
if(!bc.$resourceDialog){
if(!bc.resourceArray){return;}
var i,nr=bc.resourceArray.length,res='';
for(i=0;i<nr;i++){
if(bc.resourceArray[i][4]==bc.subjectareaid){
res+='<a href="javascript:bc.popupResource('+(i+1)+');">'+bc.resourceArray[i][0]+'</a>';}}
if(bc.courseid){
res+='<a href="/bcsearch.aspx?courseid='+bc.courseid+'" title="Search Bestchoice for specific information" target="bcsearch">Search Bestchoice</a>';}
res='<div id="divResourcePopup" title="Bestchoice Resources">'+res+'</div>';
bc.$resourceDialog=$(res)
.dialog({
resizable:true,
modal:false,
autoOpen:false,
width:200,
maxWidth:400});}
bc.$resourceDialog.dialog('open');},
popupResource:function(i){
if(bc.$resourceDialog){
bc.$resourceDialog.dialog('close');}
if(!bc.resourceArray){return;}
var res=bc.resourceArray[i-1];
var winid="rw"+i;
var url=res[1],w=res[2],h=res[3];
if(!w){w=400;}
if(!h){h=400;}
if(!window[winid]||window[winid].closed){
window[winid]=window.open(url,winid,'menubar =no,toolbar=no,status=no,scrollbars=yes,resizable=yes,width='+w+',height='+h);}
window[winid].focus();},
showCommentDialog:function(){
var commentMsg="Any feedback, corrections, criticisms or suggested improvements to Bestchoice are appreciated.";
if(!bc.$commentDialog){
bc.$commentDialog=bc.template.getById("divCommentDialog")
.dialog({
resizable:false,
modal:false,
autoOpen:false,
width:Math.min(400,screen.width-50),
buttons:{
'primary':{
text:'Send Comment',
"class":"large green bcbutton",
click:prepareSaveComment},
'secondary':{
text:'Close',
"class":"palered bcbutton",
click:function(){bc.$commentDialog.dialog('close');}}}});
bc.commentFormValidator=$("#commentForm").validate();
$("#txtComment").rules("add",{minlength:2,maxlength:2000});}
bc.$commentDialog.find("#commentDialogMsg").html(commentMsg);
bc.$commentDialog.find("#txtComment, #categoryid").val("");
bc.commentFormValidator.resetForm();
bc.$commentDialog.dialog('open');
function prepareSaveComment(){
var categoryid=$(this).find("#categoryid").val();
var comment=$.trim($(this).find("#txtComment").val());
$(this).find("#txtComment").val(comment);
comment=comment.replace(/&/g,"%26");
if($("#commentForm").valid()){
var dataObj={
catid:categoryid,
comment:comment,
csid:bc.csid,
s:bc.subtopicid,
pageid:bc.nav.pageid||0};
var json='obj='+JSON.stringify(dataObj);
bc.saveComment(json,bc.$commentDialog.find("#commentDialogMsg"));}}},
saveComment:function(queryParams,jqMsgObj){
if(bc.reportUser){
fun.jalert(queryParams,"User report - Would have sent:");
return;}
fun.showWaitMsg("Saving your feedback...");
$.ajax({
type:"POST",
url:"/handlers/saveuserdata.ashx?action=feedback",
cache:false,
data:queryParams,
dataType:"text",
success:saveCommentSuccess,
headers:{
"User-Agent":navigator.userAgent},
beforeSend:function(xhr){
xhr.retryLimit=3;}});
function saveCommentSuccess(msg){
fun.clearWaitMsg();
jqMsgObj.html("Thank you for your feedback.");
setTimeout(closeCommentDialog,1500);}
function closeCommentDialog(){
if(bc.$commentDialog){bc.$commentDialog.dialog("close");}}},
showSubscribeDialog:function(){
if(bc.isMobile){
return;}
if(!bc.$subscribeDialog){
bc.$subscribeDialog=bc.template.getById("subscribeRequiredMsg")
.dialog({
resizable:false,
modal:true,
autoOpen:false,
width:400,
buttons:{
'primary':{
html:'<span class="ui-icon white ui-icon-cart"></span>Buy Licence',
"class":"large green bcbutton",
click:function(){
var url=bc.Const.SUBSCRIBEPAGE;
if(bc&&bc.institutionid){url+='?i='+bc.institutionid;}
top.document.location=url;}},
'secondary':{
text:'Enter Codes',
"class":"large green bcbutton",
click:function(){
var url='/ed_user.aspx#licence';
top.document.location=url;}},
'cancel':{
text:'Cancel',
"class":"palered bcbutton",
click:function(){$(this).dialog('close');}}}});}
bc.$subscribeDialog.dialog('open');},
scoreColorBar:function(m,totMarks,barwidth,custom){
if(!bc.config.showScoreBar){
return '';}
var config={
numBars:3,
showSlider:false,
showIcon:true,
barClass:null,
jqBar:null,
jqBarId:null,
jqTooltip:false,
showOverlay:false};
if(custom){
$.extend(config,custom);}
if(!config.jqBar&&config.jqBarId){
config.jqBar=("#"+config.jqBarId);}
var i,p=[];
var colorBar='',barCssClass,barTitle='',sliderLeft=0;
if(m[0]>totMarks){m[0]=totMarks;}
if((m[0]+m[1])>totMarks){m[1]=totMarks-m[0];}
if((m[0]+m[1]+m[2])>totMarks){m[2]=totMarks-(m[0]+m[1]);}
m[3]=m[3]||(totMarks-(m.sum()));
var fraction=barwidth/totMarks;
for(i=0;i<=3;i++){
m[i]=parseInt(m[i]*100,10)/100;
p[i]=Math.round(m[i]*fraction,0);}
var remainder=barwidth-(p.sum());
if(remainder){
var offset=(remainder>=0)?0:-remainder;
for(i=config.numBars;i>=0;i--){
if(p[i]>offset){
p[i]+=remainder;
break;}}}
for(i=0;i<=3;i++){
if(m[i]>0){
if(barTitle&&config.jqTooltip){
barTitle+='<br>';}
barTitle+=m[i]+" mark"+((m[i]>1)?"s":"")+bc.Const.scoreBarTitle[i];}}
if(config.showSlider){
if((m[0]+m[1])>0&&(m[2]+m[3])>0){
sliderLeft=p[0]+p[1]-4;}else{
sliderLeft=0;}}
if(config.jqBar){
animateScoreBar();}else{
if(!config.barClass){config.barClass="scorebar";}
if(sliderLeft>0){
colorBar+="<div style=\"left:" + sliderLeft + "px\" class=\"scorebarmark\"></div>";}
for(i=0;i<=3;i++){
barCssClass='qscorebar'+(i+1)+(config.showIcon?' qscorebar'+(i+1)+'pic':'');
colorBar+="<div style=\"width:"+p[i]+"px;\" class=\"" + barCssClass + "\"></div>";}
colorBar="<div class=\"" + config.barClass + "\" style=\"width:" + barwidth + "px\" title=\"" + barTitle + "\">"+colorBar+"</div>";
return colorBar;}
function animateScoreBar(){
var barkids;
if(!config.jqBar.html()){
for(i=0;i<config.numBars;i++){
barCssClass='qscorebar'+(i+1);
if(config.showIcon){barCssClass+=' qscorebar'+(i+1)+'pic';}
colorBar+="<div style=\"width:0px;\" class=\"" + barCssClass + "\"></div>";}
if(config.showSlider){
colorBar+="<div style=\"left:0px;\" class=\"scorebarmark\"></div>";}
if(config.showOverlay){
colorBar+="<div class=\"overlay\">&nbsp;</div>";}
if(config.barClass){
colorBar="<div class=\"" + config.barClass + "\" style=\"width:" + barwidth + "px\">"+colorBar+"</div>";}
config.jqBar.html(colorBar).css("visibility","visible");}
if(config.barClass){
barkids=config.jqBar.find("div."+config.barClass).find("div");}else{
barkids=config.jqBar.find("div");}
if(config.showSlider){
var tickMarkDiv=config.jqBar.find("div.scorebarmark");
if(sliderLeft>0){
tickMarkDiv.css("left",sliderLeft+"px").show();}else{
tickMarkDiv.hide();}}
for(i=0;i<config.numBars;i++){
barkids.eq(i).animate({width:p[i]+"px"},300);}
config.jqBar.attr("title",barTitle);
if(config.jqTooltip&&bc.config.useTooltipPlugin){
config.jqBar.tooltip({
position:{
offset:"3 0"},
tooltipClass:"scorebarTooltip"});}}},
pageScoreLink:function(scoreHtml,csid){
return "<a title=\"Page Scores\" href=\"javascript:bc.gotoSubtopicId(" + csid + ",'SCORE')\" class=reslink>"+scoreHtml+"</a>";}});
$.extend(bc,{
highlightCurrentMenuNode:function(itemid){
bc.$menuTree.find(".current").removeClass("current");
bc.$menuTree.find("#"+itemid).addClass("current").parents("li.topic").addClass("current");},
showAllMenuBranches:function(action){
if(action=='hide'){
bc.$menuTree.find("ul.branch").hide(300);
bc.$menuTree.find(".treeRoot").html(bc.Const.treeRootClosed);}else{
bc.$menuTree.find("ul.branch").show(300);
bc.$menuTree.find(".treeRoot").html(bc.Const.treeRootOpen);}},
expandCsTopic:function(csid){
if(!bc.coursesubtopic[csid]){return;}
var topicid=bc.coursesubtopic[csid].topicid;
bc.toggleTopic(topicid);},
displayMenuCourseTotalMarks:function(){
var courseMarks=bc.visibleCourseMarks,
pieMarksArray=courseMarks.marksArray();
var totalUserMarks=courseMarks.totalMarks+courseMarks.giveupMarks;
var i,barTitle='';
var caption=bc.currentCourse.name+"<br />";
caption+='<span id="courseTotal_marks">';
caption+=courseMarks.fractionString()+' = '+courseMarks.totalPercent()+'%</span>';
$("#courseTotal").html(caption);
if(!bc.config.showSparkLines||bc.isMobile){
return;}
for(i=0;i<=3;i++){
if(pieMarksArray[i]>0){
barTitle+=Math.round(pieMarksArray[i])+" mark"+((pieMarksArray[i]>1)?"s":"")+bc.Const.scoreBarTitle[i]+"<br>";}}
$("#totalCourseMarks").attr('title',barTitle);
if(totalUserMarks>0){
var x=35,y=35,r=34;
var values=pieMarksArray,
labels=[],
sliceColors=['#66FF99','#CCFFCC','#FFFFCC','#c0c0c0'],
sliceColors2=['#255D38','#6F8B6F','#A2A282','#343434'];
if(!bc.svg.canvas.coursePie){
bc.svg.canvas.coursePie=Raphael("courseTotal_pieGraph_svg",70,70);}
bc.svg.canvas.coursePie.ellipse(x,y,r,r).attr({stroke:"none",fill:"r(.5,0.1)#ccc-#ccc",opacity:0});
bc.svg.canvas.coursePie.pieChart(x,y,r,values,labels,sliceColors,sliceColors2,"none").attr({opacity:0.5});}},
updateMenuScore:function(csid,deltaMarks){
bc.updateMenuSubtopicDisplay(csid);
bc.visibleCourseMarks.addMarksObj(deltaMarks);
bc.displayMenuCourseTotalMarks();},
updateMenuSubtopicDisplay:function(csid){
var node=$.extend({},bc.coursesubtopic[csid]),
userScore=bc.user.scores.cs[csid],
$csnode=bc.$menuTree.find("#acs"+csid);
var html=bc.renderMenuSubtopicNode(node,userScore);
$csnode.replaceWith(html);},
getMarkBarOffset:function(userMarks,totMarks){
var MARKBARHEIGHT=13,zeroYOffset=-7;
var fraction,markbar1;
fraction=userMarks/totMarks;
if(fraction>1){fraction=1;}
markbar1=Math.floor(fraction*MARKBARHEIGHT);
if(userMarks>0&&markbar1===0){markbar1=1;}
return(zeroYOffset-markbar1);},
qStatusClass:function(marks,outOf){
if(marks<=0){
return 'quntried';}else if(marks>=outOf){
return 'qdone';}else{
return 'qtried';}},
setupMenu:function(){
var menuHtml,$treeBranches=bc.$menuTree.find('ul.tree');
bc.visibleCourseMarks=new bc.Marks();
if(bc.courseid){
bc.rv=bc.regionVariable[bc.currentCourse.regionid];
$("#menuCourseName").text(bc.currentCourse.name);
menuHtml=bc.getSubtopicMenuTree(bc.courseid);
bc.displayMenuCourseTotalMarks();}else{
$("#menuCourseName").text("Select Course:");
menuHtml=bc.getCourseMenuTree();}
bc.$menuTree.html('<ul class="tree borderbottom ">'+menuHtml+'</ul>');
$treeBranches=bc.$menuTree.find('ul.tree');
$treeBranches.find('li:last-child').addClass('last');
if($.browser.ielt8){
$treeBranches.find('a.topic').css("display","inline");}
if(bc.courseid){
$treeBranches.find('ul').hide();
if(bc.startCsid){
if(bc.startPageid){
bc.gotoSubtopicId(bc.startCsid,bc.startPageid);
bc.startPageid=0;}else{
bc.highlightCurrentMenuNode("acs"+bc.startCsid);
bc.expandCsTopic(bc.startCsid);}}}
fun.clearWaitMsg();},
getSubtopicMenuTree:function(courseid){
var rootMenuArray=bc.course[courseid].topics;
if(!rootMenuArray){return 'Failed to load menu';}
return makeMenu(rootMenuArray,0);
function sortMenuArray(a,b){
var x=a.customOrder,y=b.customOrder;
if(x==y){
var x2=a.defaultOrder,y2=b.defaultOrder;
return(x2<y2)?-1:1;}
var sx=fun.sign(x),sy=fun.sign(y);
if(sx!=sy){return((sx>sy)?-1:1);}
return((x<y)?-1:1);}
function makeMenu(menuArr,depth){
var i,userScore,rows='';
var templateId=$.support.touch?"courseMenu_topicTemplate_touch":"courseMenu_topicTemplate";
var $topicTemplate=bc.template.getById(templateId);
i=0;
var nodeArray=$.map(menuArr,function(node,i){
switch(node.nodeType){
case "t":
if(!node.childArray){return null;}
break;
case "s":
if(node.status<0){return null;}
break;}
node.defaultOrder=i;
i++;
return node;});
nodeArray.sort(sortMenuArray);
$.each(nodeArray,function(i,node){
if(node.nodeType==="t"){
node.depth=depth||0;
node.children=$.trim(makeMenu(node.childArray,(node.depth+1)));
if(node.children){
rows+=$topicTemplate.render(node);}}else{
userScore=bc.user.scores.cs[node.id];
bc.visibleCourseMarks.addMarksObj(userScore);
bc.visibleCourseMarks.outOf+=node.totMarks;
rows+=bc.renderMenuSubtopicNode(node,userScore);
if(bc.lastMenuNodeCsid){
bc.coursesubtopic[bc.lastMenuNodeCsid].nextCsid=node.id;}
bc.lastMenuNodeCsid=node.id;}});
return rows;}},
renderMenuSubtopicNode:function(node,userScore){
var templateId=$.support.touch?"courseMenu_subtopicTemplate_touch":"courseMenu_subtopicTemplate";
var $template=bc.template.getById(templateId);
node.name=node.name.replace("/"," / ");
node.statusClass=(node.status>0)?'':'disabled';
if(node.id===bc.csid){
node.statusClass+=" current";}
node.date=bc.isClassReportMode?userScore.dateRangeString():userScore.dateString();
node.fraction=userScore.fractionString();
node.percent=userScore.totalPercent();
node.yOffset=bc.getMarkBarOffset(userScore.totalMarks,userScore.outOf);
node.qStatusClass=bc.qStatusClass(userScore.totalMarks,userScore.outOf);
return $template.render(node);},
getCourseMenuTree:function(){
var i,outputCourseGroupArr=[],courseListHTML;
if(!bc.courseArr){return;}
if(bc.courseGroupArr){
for(i=0;i<bc.courseGroupArr.length;i++){
outputCourseGroupArr[i]={
name:bc.courseGroupArr[i],
courses:makeCourseList(bc.courseArr[i])};}
courseListHTML=bc.template.getById("institutionMenu_courseGroupTemplate").render(outputCourseGroupArr);}else{
courseListHTML=makeCourseList(bc.courseArr);}
return courseListHTML;
function makeCourseList(courseArr){
var rows,userScore,outputCourseArr=courseArr.slice(0);
var templateId=$.support.touch?"institutionMenu_courseTemplate_touch":"institutionMenu_courseTemplate";
var $template=bc.template.getById(templateId);
$.each(outputCourseArr,function(i,course){
userScore=bc.user.scores.course[course.id];
if(userScore){
course.fraction=userScore.fractionString();
course.percent=userScore.totalPercent();
course.date=userScore.dateString();
course.yOffset=bc.getMarkBarOffset(userScore.totalMarks,userScore.outOf);
course.qStatusClass=bc.qStatusClass(userScore.totalMarks,userScore.outOf);}});
rows=$template.render(outputCourseArr);
return rows;}},
setupSubtopicContents:function(){
var url='/html2/blank.v1.1.min.htm';
if(bc.isMobile){
bc.setupSubtopicContents2();}else{
bc.onBlankPageLoaded=bc.setupSubtopicContents2;
fun.gotoUrl(url,parent.pagemain);}},
setupSubtopicContents2:function(){
var contentsHtml="";
var $subtopicContentsTemplate=bc.template.getById("subtopicContents").clone();
var $rowTemplate=bc.template.getById("subtopicContents_pageRowTemplate");
$subtopicContentsTemplate.find("tfoot .totalFraction").html(bc.nav.visibleCsMarks.fractionString());
$subtopicContentsTemplate.find("tfoot .totalPercent").html(bc.nav.visibleCsMarks.totalPercent()+'%');
var pageArray=$.map(bc.nav.csPageDropArray,
function(page,i){
if(!i){return null;}
page.stripeClass='r';
if(i==bc.nav.numPages){
page.markPercent=bc.nav.cs.userScore.fractionPercentString({dpRound:1});}else{
page.pageTitle=page.pageTitle||page.dropSuffix||' ';}
page.courseid=bc.courseid;
if(!bc.nav.isForwardOnly){
page.pageCode=isNaN(page.pageid)?"'"+page.pageid+"'":page.pageid;}
if(page.totMarks>0){
page.fraction=fun.dpRound(page.marks.totalMarks,2)+' / '+page.totMarks;
page.percent=Math.round((page.marks.totalMarks/page.totMarks)*100,2)+'%';
page.lastDate=page.marks.dateString();}
return page;});
$subtopicContentsTemplate.find("ul").append(
$rowTemplate.render(pageArray)).find('li:last').addClass('footerrow');
contentsHtml=$subtopicContentsTemplate.html();
var	heading=bc.currentCS.name+' - Contents';
var scoreTarget,targetTable;
if(bc.isMobile){
$('body').addClass("contents bcpage");
scoreTarget=$("#divWrapperParent").empty().append('<div id="divWrapper"></div>').find('#divWrapper');
targetTable=$(contentsHtml);}else{
scoreTarget=$("body",frames.pagemain.document).removeClass().addClass("contents bcpage").empty().append('<div id="divWrapper"></div>').find('#divWrapper');
targetTable=$(contentsHtml,frames.pagemain.document);}
targetTable.appendTo(scoreTarget);
if(!bc.nav.isForwardOnly){
scoreTarget.find('table tbody tr').hoverLink();}
scoreTarget.prepend("<h1>"+heading+"</h1><br />").append(bc.printFooter);
var btnCaption='First page';
var btnNextPage='<button title="First page" class="button forward ui-corner-all bcPageButton" onclick="bc.nav.gotoNextPage();" style="margin-top:5px; clear:right;"><span class="ui-icon white ui-icon-seek-next" style="float:left;" ></span>'+btnCaption+'</button>';
scoreTarget.append(btnNextPage);
fun.clearWaitMsg();},
showUserResults:function(allcourses){
var url='/html2/blank.v1.1.min.htm';
if(allcourses){
bc.onBlankPageLoaded=bc.showUserResults2All;}else{
bc.onBlankPageLoaded=bc.showUserResults2;}
fun.gotoUrl(url,parent.pagemain);},
showUserResults2All:function(){
bc.showUserResults2(true);},
showUserResults2:function(allcourses){
var scoreTableHTML='',jqScoreTable,heading='';
var	link='',preheading='';
var scoreTarget=$("body",frames.pagemain.document).removeClass().addClass("scores").empty();
bc.closeSubtopic();
top.document.title=bc.documentTitlePrefix+' > My Scores';
bc.setLocationHash("#action=showscores",false,'showUserResults');
if(!allcourses&&bc.courseid){
link="<a href='javascript:bc.showUserResults(true);' title='Show scores for all courses'>Course Scores</a>";
heading+=bc.currentCourse.name+" Scores for "+bc.user.displayName;
scoreTableHTML=bc.getSubtopicScoreTable();
jqScoreTable=$(scoreTableHTML,frames.pagemain.document);
jqScoreTable.find(".reportOnly").remove();
jqScoreTable=bc2.formatSubtopicsTable(jqScoreTable,true,null);}else{
heading=bc.subjectName+': '+bc.institutionName+" - Scores for "+bc.user.displayName;
scoreTableHTML=bc.getCourseScoreTable();
jqScoreTable=$(scoreTableHTML,frames.pagemain.document);
jqScoreTable=bc2.formatCourseTable(jqScoreTable,true,null);}
jqScoreTable.appendTo(scoreTarget);
scoreTarget.prepend(preheading+"<div class='header'><h1>"+heading+"</h1>"+link+"</div>").append(bc.printFooter);},
getCourseScoreTable:function(narrow){
var tableclass,tableRows='',scoreHTMLTable=bc.template.getHtmlById("courseMarksTable");
var groupindex,groupname,courseArr;
var percent,grandTotUserCourseMarks=0,grandTotCourseMarks=0;
if(!bc.courseArr){return;}
if(bc.courseGroupArr){
for(groupindex=0;groupindex<bc.courseGroupArr.length;groupindex++){
groupname=bc.courseGroupArr[groupindex];
tableRows+="<tr class='subheading'><td colspan=6 class='alignLeft'>"+groupname+'</td></tr>';
courseArr=bc.courseArr[groupindex];
tableRows+=makeCourseScoresTable(courseArr,narrow);}}else{
courseArr=bc.courseArr;
tableRows+=makeCourseScoresTable(courseArr,narrow);}
tableclass=(narrow)?"narrowCourse":"wideCourse";
scoreHTMLTable=scoreHTMLTable.replace("##TABLECLASS##",tableclass).replace("##DATETITLE##",(narrow?'Last Used':'Dates Used'));
percent=100*grandTotUserCourseMarks/grandTotCourseMarks;
if(percent>100){
percent=100;}else if(isNaN(percent)){
percent=0;}else{
percent=(percent>=10)?Math.round(percent):Math.round(10*percent)/10;}
grandTotUserCourseMarks=Math.round(grandTotUserCourseMarks);
grandTotCourseMarks=Math.round(grandTotCourseMarks);
scoreHTMLTable=scoreHTMLTable.replace("##TOTALUSERMARKS##",grandTotUserCourseMarks).replace("##TOTALOUTOFMARKS##",grandTotCourseMarks).replace("##TOTALPERCENT##",percent);
scoreHTMLTable=scoreHTMLTable.replace(/\<tbody\>\<\/tbody\>/i,tableRows);
return scoreHTMLTable;
function makeCourseScoresTable(courseArr,narrow){
var rows,userScore,markbarsize=200;
var outputCourseArr=courseArr.slice(0);
$.each(outputCourseArr,function(i,course){
userScore=bc.user.scores.course[course.id];
if(userScore){
grandTotUserCourseMarks+=userScore.totalMarks;
grandTotCourseMarks+=userScore.outOf;
course.outOf=Math.round(userScore.outOf);
course.fraction=userScore.fractionString();
if(userScore.totalMarks){
course.percent=userScore.totalPercent()+"%";
course.colorBar=bc.scoreColorBar(userScore.marksArray(),userScore.outOf,markbarsize,{barClass:'userscoremarksbar',showIcon:false});}
course.rank=bc.user.scores.courseRank[course.id];
course.date=(!narrow)?userScore.dateRangeString():userScore.dateString();}});
rows=bc.template.getById("courseMarksTable_rowTemplate").render(outputCourseArr);
return rows;}},
getSubtopicScoreTable:function(){
var tableRows,scoreHTMLTable=bc.template.getHtmlById("csMarksTable");
var numCsTried=0,numTopicsTried=0;
var rootMenuArray=bc.course[bc.courseid].topics;
tableRows=makeSubtopicScoresTable(rootMenuArray,0,0);
if(bc.visibleCourseMarks){
var percent=bc.visibleCourseMarks.totalPercent(),
totalMarks=Math.round(bc.visibleCourseMarks.totalMarks,1),
outofMarks=Math.round(bc.visibleCourseMarks.outOf);
scoreHTMLTable=scoreHTMLTable.replace("##TOTALUSERMARKS##",totalMarks).replace("##TOTALOUTOFMARKS##",outofMarks).replace("##TOTALPERCENT##",percent);
scoreHTMLTable=scoreHTMLTable.replace("##NUMCSTRIED##",numCsTried).replace("##NUMTOPICSTRIED##",numTopicsTried);}
scoreHTMLTable=scoreHTMLTable.replace(/\<tbody\>\<\/tbody\>/i,tableRows);
return scoreHTMLTable;
function makeSubtopicScoresTable(menuArr,depth){
var userScore,rows,markbarwidth=200;
var nodeArray=$.map(menuArr,function(node,i){
switch(node.nodeType){
case "t":
if(!node.childArray){return null;}
break;
case "s":
if(node.status<0){return null;}
if(!bc.user.scores.cs[node.id]){return null;}
break;}
return node;});
$.each(nodeArray,function(i,node){
if(node.nodeType==="t"){
node.depth=depth||0;
node.children=$.trim(makeSubtopicScoresTable(node.childArray,(node.depth+1)));
if(node.children){
node.isTopic=true;
numTopicsTried+=1;}}else{
node.isSubtopic=true;
numCsTried+=1;
userScore=bc.user.scores.cs[node.id];
node.userScore=userScore;
node.statusClass=(node.status>0)?'':'disabled';
node.date=userScore.dateRangeString();
node.fraction=userScore.fractionString();
node.percent=userScore.totalPercent();
if(node.percent){
node.percent+="%";}
if(node.totMarks&&userScore.totalMarks>0){
node.colorBar=bc.scoreColorBar(userScore.marksArray(),node.totMarks,markbarwidth,{barClass:'userscoremarksbar',showIcon:false});}}});
rows=bc.template.getById("csMarksTable_rowTemplate").render(nodeArray);
return rows;}}});
bc.nav={
dropPages:null,
showHistory:false,
historyCheckVisible:false,
useHardMode:false,
isHardMode:false,
showExtraQ:false,
numPages:null,
csPageDropArray:null,
visibleCsMarks:null,
defaults:{
currentPage:null,
cs:null,
pageIndex:null,
clientStartTime:null,
startPageid:false,
cmd:'',
pageid:0,
preloadPageid:0,
subtopicTimeout:null,
timeWaited:0,
showFeedback:true,
showHint:true,
showGiveup:true,
userMode:bc.Const.defaultUserMode,
isTest:false,
showHistoryCheckbox:true,
canChooseQMode:true,
testStyle:bc.Const.defaultTestStyle,
isForwardOnly:false},
testDefaults:{
showGiveup:false,
showHint:false,
showFeedback:false,
showHistoryCheckbox:false,
showHistory:true,
canShowExtraQuestions:false,
showQA:false},
mobileDefaults:{
showHistoryCheckbox:false,
canChooseQMode:false,
canShowExtraQuestions:false,
showQA:false},
setupNavbar:function(){
bc.nav.cs=bc.currentCS;
bc.nav.cs.userScore=bc.user.scores.cs[bc.csid];
if(bc.nav.cs.sa_subtopic){
bc.nav.cs.safolder=bc.nav.cs.sa_subtopic;}else{
bc.nav.cs.safolder=bc.subjectareaid;}
bc.nav.dropPages=document.getElementById("dropPages");
if(bc.nav.cs.userMode){
bc.nav.userMode=bc.nav.cs.userMode;}else if(bc.currentTopic&&bc.currentTopic.userMode){
bc.nav.userMode=bc.currentTopic.userMode;}else if(bc.courseid&&bc.course[bc.courseid].userMode){
bc.nav.userMode=bc.course[bc.courseid].userMode;}
if(!bc.user.isAdmin){
if(bc.nav.status<=0){
bc.closeSubtopic(true);
return;}}
setupNavbarOptions();
bc.nav.setupNavbarDropdown();
function setupNavbarOptions(){
bc.nav.showHistory=bc.user.config.showHistory;
bc.nav.useHardMode=bc.user.config.useHardMode;
switch(bc.nav.userMode){
case 1:
break;
case 2:
bc.nav.showGiveup=false;
break;
case 3:
bc.nav.showGiveup=false;
bc.nav.showHint=false;
break;
case 4:
bc.nav.isTest=true;
bc.nav.useHardMode=false;
break;
case 5:
bc.nav.isTest=true;
bc.nav.useHardMode=true;
break;}
if(bc.isMobile){
$.extend(bc.nav,bc.nav.mobileDefaults);}
if(bc.nav.isTest){
$("body").addClass("isTest");
$('<span class="testFlag" title="'+bc.Const.testMsg+'">Test</span>').click(function(){
fun.jalert(bc.Const.testMsg,"Bestchoice Test");}).appendTo("#navTitle");
fun.jalert(bc.Const.testMsg,"Bestchoice Test");
$.extend(bc.nav,bc.nav.testDefaults);
if(bc.currentCourse&&bc.currentCourse.testStyle){
bc.nav.testStyle=bc.currentCourse.testStyle;}
if(bc.nav.testStyle===1){
bc.nav.isForwardOnly=true;}}
if(bc.isClassReportMode){
$("#divHistory, #divChooseQMode").hide();
bc.nav.historyCheckVisible=false;
bc.nav.showHistoryCheckbox=false;}
if(bc.nav.showHistoryCheckbox){
$('input#chkHistory').prop('checked',bc.nav.showHistory);}
if(bc.nav.canChooseQMode){
$('input#chkHard').prop('checked',bc.nav.useHardMode);}
if(bc.nav.canShowExtraQuestions){
$("#divExtraQ").css("display","inline-block");}
bc.nav.clientStartTime=new Date();}},
gotoPreviousPage:function(){
if(bc.nav.isForwardOnly||!bc.nav.dropPages.selectedIndex){return;}
bc.nav.dropPages.selectedIndex-=1;
bc.nav.loadPage();},
gotoNextPage:function(){
if(bc.nav.dropPages.selectedIndex>=(bc.nav.dropPages.options.length-1)){return;}
bc.nav.dropPages.selectedIndex+=1;
bc.nav.loadPage();},
gotoFirstPage:function(){
if(bc.nav.isForwardOnly||!bc.nav.dropPages.selectedIndex){return;}
bc.nav.dropPages.selectedIndex=0;
bc.nav.loadPage();},
gotoFinalPage:function(){
if(bc.nav.isForwardOnly||bc.nav.dropPages.selectedIndex>=(bc.nav.numPages-1)){return;}
bc.nav.dropPages.selectedIndex=(bc.nav.numPages);
bc.nav.loadPage();},
gotoQA:function(){
if(bc.nav.showQA){
bc.nav.dropPages.selectedIndex=(bc.nav.dropPages.options.length-1);
bc.nav.loadPage();}},
gotoPageId:function(pageid){
if(pageid){
bc.nav.dropPages.value=pageid;
bc.nav.loadPage();}},
setHardMode:function(isChecked){
bc.user.config.useHardMode=isChecked;
bc.nav.useHardMode=isChecked;
bc.nav.loadPage(true);},
setHistory:function(isChecked){
bc.user.config.showHistory=isChecked;
bc.nav.showHistory=isChecked;
bc.nav.loadPage(true);},
setExtraQ:function(isChecked){
bc.nav.showExtraQ=isChecked;
bc.nav.setupNavbarDropdown();},
preloadPage:function(){
if(bc.nav.preloadPageid){
var url=bc.nav.getPageHtmlFile(bc.nav.cs.safolder,bc.nav.cs.subtopicid,bc.nav.preloadPageid);
$.ajax({
type:"GET",
url:url,
cache:true,
timeout:30000,
dataType:"text",
beforeSend:function(xhr){
xhr.preLoad=true;}});}},
loadPage:function(reLoad){
var url,pageCode,newPageIndex,locationHash,locationReplace;
if(!bc.subtopicid||!bc.nav.dropPages||!bc.nav.dropPages.options.length){
return;}
newPageIndex=bc.nav.dropPages.selectedIndex+1;
if(bc.nav.pageIndex===newPageIndex){
if(!reLoad){return;}}
bc.savePageScore();
bc.nav.pageIndex=newPageIndex;
bc.nav.currentPage=bc.nav.csPageDropArray[newPageIndex-1];
pageCode=bc.nav.currentPage.pageid;
if(bc.nav.slider){
bc.nav.slider.slider("value",newPageIndex);}
if(bc.$listPages){
var nav2Title=bc.$listPages.find('.current').removeClass('current')
.end().find('#nav_p'+pageCode).addClass('current');}
$(".navEndTitle").html(bc.nav.currentPage.titleScoreHtml).removeClass(bc.Const.qflags).addClass(bc.nav.currentPage.cssClass);
document.title=bc.documentTitlePrefix+bc.nav.currentPage.dropPrefix;
var paneCaption=bc.$dropPages.find("option:selected").text().split("|")[0];
bc.layoutPlugin.setPaneCaption("south",paneCaption);
bc.nav.preloadPageid=0;
if(bc.preloadPageTimeout){
clearTimeout(bc.preloadPageTimeout);}
if(newPageIndex<bc.nav.numPages&&!bc.isPreview){
bc.nav.preloadPageid=bc.nav.csPageDropArray[newPageIndex].id;
bc.preloadPageTimeout=setTimeout(bc.nav.preloadPage,4000);}
bc.nav.pageid=isNaN(pageCode)?0:pageCode;
bc.nav.configureHistoryCheckbox();
if(bc.nav.canChooseQMode){
document.getElementById("divChooseQMode").style.display=((bc.nav.pageid>0)&&bc.nav.currentPage.hasHardMode)?'inline-block':'none';}
if(newPageIndex==1){
$("body").addClass("isFirstPage");}else{
$("body").removeClass("isFirstPage");}
if(newPageIndex>bc.nav.numPages){
$("body").addClass("isFinalPage");}else{
$("body").removeClass("isFinalPage");}
locationHash="#cs="+bc.nav.csid+"&p="+pageCode;
locationReplace=false;
bc.setLocationHash(locationHash,locationReplace,'loadPage');
switch(pageCode){
case 'CONTENTS':
bc.setupSubtopicContents();
if(bc.isMobile){
window.scrollTo(0,0);}
return;
case 'SCORE':
url='/html2/scoresurvey.v1.8.min.htm?q';
break;
case 'QA':
url='/userqa.aspx?csid='+bc.nav.csid;
break;
default:
if(!bc.nav.pageid||bc.nav.pageid<0){return;}
bc.nav.isHardMode=(bc.nav.useHardMode&&bc.nav.currentPage.hasHardMode);
if(bc.isPreview){
url='/bcpage.aspx?pageid='+bc.nav.pageid;}else{
url=bc.nav.getPageHtmlFile(bc.nav.cs.safolder,bc.nav.cs.subtopicid,bc.nav.pageid);}
break;}
fun.gotoUrl(url,parent.pagemain,true);},
getCourseIndexHtmlFile:function(subjectareaid,courseid){
var url="/html/sa"+subjectareaid+"/topics"+courseid+".htm";
return url;},
getPageHtmlFile:function(subjectareaid,subtopicid,pageid){
var url='/html/sa'+subjectareaid+'/main/s'+subtopicid;
if(pageid){
url+='/p'+pageid+'.htm';}else{
url+='/index.htm';}
return url;},
getSubtopicJavascriptFile:function(subjectareaid,subtopicid,version){
var url='/html/js/sa'+subjectareaid+'/s'+subtopicid;
if(!version&&bc.subtopicVersions){
version=bc.subtopicVersions[subtopicid];}
if(!version){
version=Math.floor($.now()/bc.MSPERDAY);}
url+='.v'+version+'.js';
return url;},
getCourseJavascriptFile:function(subjectareaid,courseid,version){
var url='/html/js/sa'+subjectareaid+'/c'+courseid;
if(!version){
version=fun.dateStampYearMonth();}
url+='.v'+version+'.js';
return url;},
getInstitutionJavascriptFile:function(institutionid,version){
var url='/html/js/i'+institutionid;
if(!version){
version=fun.dateStampYearMonth();}
url+='.v'+version+'.js';
return url;},
configureHistoryCheckbox:function(){
if(bc.nav.showHistoryCheckbox){
bc.nav.historyCheckVisible=((bc.nav.pageid>0)&&bc.nav.currentPage.totMarks>0&&bc.nav.currentPage.userAllQuestionsLocked&&!bc.nav.isTest);
document.getElementById("divHistory").style.display=bc.nav.historyCheckVisible?'inline-block':'none';}},
showSubtopicScoreBar:function(userScore){
if(!bc.isMobile&&userScore&&bc.Layout){
var barWidth=bc.Layout.state.east.size-20;
var colorbar=bc.scoreColorBar(userScore.marksArray(),userScore.outOf,barWidth,{barClass:'scorebarshort',showIcon:false});
$("#nav2Scorebar").html(colorbar);
$("#nav2Score, #footerScore").html(userScore.fractionPercentString());}},
updateSubtopicScore:function(pageMarksObj){
if(bc.nav.historyCheckVisible){return;}
var newEndDays=$.now()/bc.MSPERDAY;
var deltaPageMarks=$.extend({},pageMarksObj);
deltaPageMarks.addMarksObj(bc.nav.currentPage.marks,true);
if(!deltaPageMarks.totalMarks&&!deltaPageMarks.giveupMarks){return;}
bc.nav.currentPage.marks.addMarksObj(deltaPageMarks);
bc.nav.currentPage.marks.endDays=newEndDays;
bc.nav.updateNavPageDisplay(bc.nav.pageIndex-1,bc.nav.currentPage);
bc.user.lastActiveDaysAgo=0;
if(bc.nav.csid>0){
if(bc.nav.cs.userScore){
bc.nav.cs.userScore.addMarksObj(deltaPageMarks);
bc.nav.cs.userScore.endDays=newEndDays;}
bc.nav.visibleCsMarks.addMarksObj(deltaPageMarks);
if(bc.currentCourse){
var userScore=bc.user.scores.course[bc.courseid];
userScore.addMarksObj(deltaPageMarks);
userScore.endDays=newEndDays;
if(!bc.nav.currentPage.userAllQuestionsLocked){
bc.updateMenuScore(bc.nav.csid,deltaPageMarks);}}}
bc.nav.dropPages.options[bc.nav.numPages].text=bc.nav.getScoreDropdown(bc.nav.visibleCsMarks.totalMarks,bc.nav.visibleCsMarks.outOf);
bc.nav.showSubtopicScoreBar(bc.nav.visibleCsMarks);
if((pageMarksObj.totalMarks+pageMarksObj.giveupMarks)>=pageMarksObj.outOf){
bc.nav.currentPage.userAllQuestionsLocked=true;
bc.nav.configureHistoryCheckbox();}},
setupNavbarDropdown:function(){
var numReviewPages=0;
var csInfo=bc.user.coursesubtopic[bc.csid];
var firstPageDropdownTitle=bc.isMobile?'Contents':bc.currentCS.name;
var listPagesHtml='',dropPagesHtml='<option value="CONTENTS" class="total">'+firstPageDropdownTitle+'</option>';
bc.nav.totSubtopicMarks=0;
if(bc.nav.dropPages){
bc.nav.dropPages.options.length=0;}
if(!bc.nav.cs||!bc.nav.cs.pageGroupArr.length){return;}
bc.nav.csPageDropArray=[];
bc.nav.visibleCsMarks=new bc.Marks();
bc.nav.csPageDropArray[0]={
dropPrefix:bc.currentCS.name,
pageid:'CONTENTS',
titleScoreHtml:'Topic Contents'};
loadPages();
bc.nav.numPages=bc.nav.csPageDropArray.length;
bc.nav.visibleCsMarks.outOf=bc.nav.totSubtopicMarks;
if(bc.nav.dropPages){
bc.$dropPages.html(dropPagesHtml);
bc.nav.dropPages.options[bc.nav.numPages]=new Option(bc.nav.getScoreDropdown(bc.nav.visibleCsMarks.totalMarks,bc.nav.visibleCsMarks.outOf),"SCORE");
bc.nav.dropPages.options[bc.nav.numPages].className='total';}
bc.nav.csPageDropArray[bc.nav.numPages]={
dropPrefix:"TOTAL",
pageTitle:"Score and Survey",
pageid:'SCORE',
titleScoreHtml:'Topic Score and Survey'};
if(bc.$listPages){
bc.$listPages.append(bc.template.getById("nav_pCONTENTS").find("a").attr("href","#cs="+bc.csid+"&p=CONTENTS").end())
.append(listPagesHtml)
.append(bc.template.getById("nav_pSCORE").find("a").attr("href","#cs="+bc.csid+"&p=SCORE").end());
if(bc.nav.isForwardOnly){
bc.$listPages.find("[onclick]").removeAttr("onclick");}}
if(numReviewPages){
var reviewLink="/bc.aspx?action=subtopicreviews&i="+bc.institutionid+"#sa="+bc.nav.cs.safolder+"&s="+bc.nav.cs.subtopicid;
$(".linkAllReviews").attr("href",reviewLink).show();}else{
$(".linkAllReviews").hide();}
if(bc.nav.dropPages){
if(bc.nav.showQA){
bc.nav.dropPages.options[bc.nav.numPages+1]=new Option(" --- Q & A --- ","QA");}
if(bc.nav.startPageid){
bc.nav.dropPages.value=bc.nav.startPageid;}
if(bc.nav.dropPages.selectedIndex<=0){
if(bc.nav.visibleCsMarks.totalMarks>0){
bc.nav.dropPages.selectedIndex=0;}else{
bc.nav.dropPages.selectedIndex=1;}}
bc.nav.numDropPages=bc.nav.dropPages.options.length;}
if(!bc.isMobile){
bc.nav.setupNavSlider();
bc.nav.showSubtopicScoreBar(bc.nav.visibleCsMarks);
if(bc.config.useTooltipPlugin){
$("#nav2Scorebar").find('.navScorebar2').tooltip(bc.tooltipSettings.navScorebar);}
if($.support.touch){
bc.Layout.close("west");}}
if(bc.nav.isForwardOnly){
$("body").addClass("isForwardOnly");
bc.$dropPages.prop('disabled',true);}else{
bc.$dropPages.prop('disabled',false);}
bc.nav.loadPage();
function loadPages(){
var i,pg,page,thisPage;
var pageTitle1,pageTitle2;
var pageNum=0,pageNumb=0,ppid,pp;
var userScore,pageUserMarks;
var userAllQuestionsLocked;
var maxPageUsers;
for(pg=0;pg<bc.nav.cs.pageGroupArr.length;pg++){
var pageGroup=bc.nav.cs.pageGroupArr[pg],
gpSize=pageGroup.subsetSize;
var numGroupPages=(gpSize===0||bc.nav.showExtraQ)?pageGroup.pages.length:gpSize;
for(i=1;i<=numGroupPages;i++){
page=pageGroup.pages[i-1];
bc.nav.totSubtopicMarks+=page.totMarks;
maxPageUsers=0;
if(bc.nav.isTest&&page.pagestyleid==2){continue;}
if(gpSize>0&&i>gpSize){
pageNumb+=1;}else{
pageNum+=1;
pageNumb=0;}
pageTitle1='Page '+pageNum;
if(pageNumb>0){
pageTitle1+='.'+pageNumb;}
switch(page.pagestyleid){
case 1:
break;
case 2:
pageTitle1+=': Review';
numReviewPages++;
break;
default:
break;}
pageTitle2=page.linkTitle||page.dropdownText||'';
pageUserMarks=new bc.Marks(0,0,0,page.totMarks);
userAllQuestionsLocked=true;
for(pp=0;pp<page.numQuestions;pp++){
ppid=page.pp[pp].ppid;
userScore=bc.user.scores.pp[ppid];
if(userScore){
pageUserMarks.addMarksObj(userScore);
if(!userScore.isLocked){userAllQuestionsLocked=false;}
if(userScore.endDays>pageUserMarks.endDays){
pageUserMarks.endDays=userScore.endDays;}}else{
userAllQuestionsLocked=false;}
if(bc.isClassReportMode&&csInfo){
var rptpp=csInfo['pp'+ppid];
if(rptpp&&rptpp[0]>maxPageUsers){
maxPageUsers=rptpp[0];}}}
if((pageUserMarks.totalMarks+pageUserMarks.giveupMarks)>=page.totMarks){
userAllQuestionsLocked=true;}
bc.nav.visibleCsMarks.addMarksObj(pageUserMarks);
thisPage=$.extend(page,{
dropPrefix:pageTitle1,
dropSuffix:pageTitle2,
userAllQuestionsLocked:userAllQuestionsLocked,
marks:pageUserMarks});
bc.nav.csPageDropArray.push(thisPage);
listPagesHtml+=bc.nav.renderPageListNode(thisPage);
var dropText=thisPage.dropPrefix;
if(thisPage.totMarks){
dropText+=": "+(bc.isMobile?thisPage.marks.fractionString():thisPage.markPercent);}
if(maxPageUsers){
dropText+=" - "+maxPageUsers+" users";}
if(!bc.isMobile&&thisPage.dropSuffix){
dropText+=' | '+thisPage.dropSuffix;}
dropPagesHtml+='<option value="'+thisPage.pageid+'" class="'+thisPage.cssClass+'">'+dropText+'</option>';}}}},
getSliderWidth:function(){
return $(window).width()-390;},
setupNavSlider:function(){
var sliderWidth=bc.nav.getSliderWidth(),
maxNumTicks=sliderWidth/15;
var tick,tickVisibleIncrement,scale;
if(sliderWidth<250){
$('#navSliderControl').width(0);
return;}
if(maxNumTicks>bc.nav.numPages){
tickVisibleIncrement=1;}else{
tickVisibleIncrement=Math.ceil(bc.nav.numPages/maxNumTicks);}
var pageCaptions=$.map(bc.nav.csPageDropArray,function(page,tick){
if(tick>0&&tick<bc.nav.numPages&&((tick)%tickVisibleIncrement===0)){
return{
cssLeft:(tick/(bc.nav.numPages)*100).toFixed(2)+'%',
caption:tick,
title:"Page "+tick,
cssClass:page.cssClass};}else{
return null;}});
scale=bc.template.getById("navBarSliderCaptionTicks_template").render(pageCaptions);
var $scale=bc.template.getById("navBarSliderCaption_template").clone().find("li:first").after(scale).end();
bc.nav.slider=$('#navSliderControl').width(sliderWidth).append($scale)
.slider({
min:1,
max:bc.nav.numPages+1,
range:"max",
value:bc.nav.dropPages.selectedIndex+1,
slide:function(event,ui){
var page=bc.nav.csPageDropArray[ui.value-1];
bc.nav.dropPages.selectedIndex=ui.value-1;
$(".navEndTitle").html(page.titleScoreHtml).removeClass(bc.Const.qflags).addClass(page.cssClass);},
stop:function(event,ui){
bc.nav.loadPage();}});
$(".ui-slider .ui-slider-handle").html('<span class="ui-icon ui-icon-grip-dotted-vertical"></span>');
if(bc.nav.isForwardOnly){
bc.nav.slider.slider('disable');}else{
bc.nav.slider.slider('enable');}},
getScoreDropdown:function(userMarks,outOfMarks){
if(outOfMarks>0){
return "TOTAL: "+fun.formatFractionPercent(userMarks,outOfMarks,{dpRound:1,showPercent:!bc.isMobile})+"";}else{
return " -- Survey -- ";}},
updateNavPageDisplay:function(pageIndex,page){
var listPage=bc.nav.renderPageListNode(page),
dropText=page.dropPrefix;
if(page.totMarks){
dropText+=": "+(bc.isMobile?page.marks.fractionString():page.markPercent);}
if(page.dropSuffix&&!bc.isMobile){
dropText+=' | '+page.dropSuffix;}
bc.nav.dropPages.options[pageIndex].text=dropText;
bc.nav.dropPages.options[pageIndex].className=page.cssClass;
bc.layoutPlugin.setPaneCaption("south",dropText);
if(bc.$listPages){
bc.$listPages.find('#nav_p'+page.pageid).replaceWith(listPage);
if(page.pageid===bc.nav.currentPage.pageid){
bc.$listPages.find('#nav_p'+page.pageid).addClass('current');}}
$(".navEndTitle").html(page.titleScoreHtml).removeClass(bc.Const.qflags).addClass(page.cssClass);},
renderPageListNode:function(page){
var userScore=page.marks;
if(page.totMarks>0){
page.cssClass=bc.qStatusClass(userScore.totalMarks,page.totMarks);
page.markPercent=userScore.fractionPercentString({dpRound:1});}else{
page.cssClass="review";}
page.date=userScore.dateString();
page.tipTitle=page.pageTitle||page.dropPrefix;
page.csid=bc.csid;
page.setTitleScoreHtml();
if(bc.isMobile){
return '';}else{
return bc.template.getById("subtopicPageLinks_template").render(page);}}};}
var bc2={
injectCustomCss:function(){
if(bc.custom.css){
$('head').append('<style id="injectedCss" type="text/css">'+bc.custom.css+'</style>');}},
runPageLoadFunction:function(){
if(window.bcPageOnLoad){
bcPageOnLoad();
window.bcPageOnLoad=null;}},
configureFormValidation:function(){
if(!$.validator){return;}
$.validator.addMethod("validChars",
function(value,element){
return(this.optional(element)||bc.Const.RegExpValidInputChars.test(value));},
bc.Const.RegExpValidInputCharsErrorMsg);
$.validator.addMethod("validChars2",
function(value,element){
return(this.optional(element)||bc.Const.RegExpValidInputChars2.test(value));},
bc.Const.RegExpValidInputCharsErrorMsg);
var vforms=$("form.validate");
vforms.find("input.text").addClass("validChars");
vforms.find("textarea").addClass("validChars2");
vforms.find(".required").prevAll('label').append(' <span class="requiredStar">*</span>');
vforms.validate();
vforms.data("isDirty",false).each(function(i){
var formid=this.id;
$(this).find("input, select").change(function(){
$("#"+formid).data("isDirty",true);});});},
submitted:false,
loading:false,
setupLoginPage:function(){
if((parent)&&(parent.frames.length)){
parent.location.href=window.location.href;
return;}
var qs=fun.queryStringToObject();
if(qs.user){$("#username").val(qs.user);}
$("#forgotPw").click(function(){
$('#pwClue').css('display','block');});
$("#institutionid").attr("onclick","bc2.setLoginInstitution(this);");
bc2.setLoginInstitution($("#institutionid")[0]);
$("#Form1").submit(function(e){
e.preventDefault();
bc2.submitLogin();
return false;}).validate();
if(window.jsPreload){
var ga=document.createElement('script');
ga.src=jsPreload;
var ss=document.getElementsByTagName('script');
var s=ss[ss.length-1];
s.parentNode.insertBefore(ga,s);}},
setLoginInstitution:function(drop){
$("#loginPrompt").html(loginPromptArray[drop.selectedIndex]+'&nbsp;');},
submitLogin:function(mode){
var msg1="Validating user...",
msg2="Loading Bestchoice...",
$loginMsg=$("#loginMsg");
$("#password").rules(mode?"remove":"add","required");
if(!bc2.submitted&&$("#Form1").valid()){
bc2.submitted=true;
fun.showWaitMsg(msg1);
var url='/handlers/verify_user.ashx',d=$("#Form1").serialize();
d+='&'+window.location.search.substring(1);
if(mode){
url+="?mode="+mode;}else if(bc.sso){
url+="?mode=sso";}
$.ajax({
url:url,
data:d,
dataType:'text',
cache:false,
type:'post',
success:loginSuccess,
error:function(){
$loginMsg.html(fun.errorSpan("Error. Please try again."));},
complete:function(){
fun.clearWaitMsg();
if(bc2.loading){
fun.showWaitMsg(msg2);}else{
bc2.submitted=false;}}});}
function loginSuccess(rawdata){
var data=$.parseJSON(rawdata);
switch(data.action){
case "msg":
$loginMsg.html(data.param);
break;
case "invalid":
$loginMsg.html(fun.errorSpan("Incorrect user name or password. Please try again."));
break;
case "pwclue":
$loginMsg.html(data.param+"<br><i>Still can't remember your password?</i> Click <a href=\"javascript:bc2.submitLogin('pwreset')\">Reset Password</a>.");
break;
case "redirect":
bc2.loading=true;
document.location=data.param;
break;}}},
setupWelcome:function(){
var scoreMsg="",lastDate='',courseid,csid,userScore;
var td1,td2;
if(!bc.isMobile&&document.location==top.document.location){
document.location="/"+document.location.search;
return;}
bc2.injectCustomCss();
$("#linkUserResults").click(bc.showUserResults);
$("#linkChangeCourse").click(function(){bc.gotoCourseId(0,true);});
if(bc.config.showSparkLines){
$(".sparkGraph").show().flotSparkline();}
fun.stripeTable();
if(bc2.courseid){
var userCourseScore=bc.user.scores.course[bc.courseid],
courseRank=bc.user.scores.courseRank[bc.courseid];
$("table#topSubtopics tbody tr").each(function(i){
csid=this.id.substr(1);
td1=$(this).find("td:first").addClass("leftEdge hoverHighlight");
td2=$(this).find("td:last").addClass("rightEdge alignCenter");
if(bc.coursesubtopic[csid]){
if(bc.coursesubtopic[csid].status>0){
userScore=bc.user.scores.cs[csid];
td2.html(userScore.fractionString(true));}else{
td1.find("a").addClass("disabled");}
$(this).hoverLink().click(function(x){
return function(){bc.gotoSubtopicId(x);};}(csid));}});
if(userCourseScore){
if(userCourseScore.endDays){
lastDate=fun.prettyTimeDiff(userCourseScore.endDays*bc.MSPERDAY,undefined,false,1);}
scoreMsg="<div class='topicScore'>"+userCourseScore.fractionPercentString()+"</div><br />";}}else{
if(bc.user.lastActiveDaysAgo>0){
lastDate=fun.prettyTimeDiff(0,0,bc.user.lastActiveDaysAgo*24*60*60,1);}
$("table#topSubtopics tbody tr").each(function(i){
courseid=this.id.substr(1);
td1=$(this).find("td:first").addClass("leftEdge hoverHighlight");
td2=$(this).find("td:last").addClass("rightEdge alignCenter");
userScore=bc.user.scores.course[courseid];
td2.html(userScore.fractionString(true));
$(this).hoverLink().click(function(cx){
return function(){bc.gotoCourseId(cx,true);};}(courseid));});}
if(!bc.isMobile){
bc2.displayEnrolledClassInfo();}
$("#linkUserResults").prepend(scoreMsg);
if(lastDate){
$('.welcomeSidebar .sparkFrame').after('<span class="lastDate">Your last answer was '+lastDate+' ago</span>');}
$('body').append(bc.printFooter);},
displayEnrolledClassInfo:function(){
var info='',classStats='';
var $divClassInfo=$("#welcomeClassInfo");
if(!bc2.courseid||!bc.user.ccArray.length){
$divClassInfo.prepend('<h2>Welcome to Bestchoice <b>'+bc.user.displayName+'</b></h2><br>');
if(!bc.isMobile){
info=' <a class="button ui-corner-all bcPageButton" href="/ed_user.aspx" target="_top" title="Change my profile details or enrol in a class"><span class="ui-icon ui-icon-person"></span>Profile</a>';
info+='<span style="font-size:14px;">Change your details or enrol in a class &rarr; </span><br clear=right><br>';
info+='<button id=btnComment title="Send comment or suggestion" class="button ui-corner-all bcPageButton" onclick="bc.showCommentDialog();" style="margin-top:-5px;"><span class="ui-icon white ui-icon-lightbulb"></span>Comment</button>';
info+='<span style="font-size:14px;">Please make suggestions, or report spelling, content or technical errors. &rarr; </span>';
$divClassInfo.append(info);}
return;}
var classArray=$.map(bc.user.ccArray,function(ccid,i){
return(bc.user.courseclass[ccid])?bc.user.courseclass[ccid]:null;});
$.each(classArray,function(i,cc){
cc.avgMarks=Math.round(cc.userMarks.totalMarks,1);
cc.topicChildren=getClassCustomTopicHtml(cc.customTopicsArr);});
info=bc.template.getById("welcomePage_courseclassTemplate").render(classArray);
$divClassInfo.append('<h2>Enrolled Classes for <b>'+bc.user.displayName+'</b></h2>'+info);
if(info&&!bc.user.isAdmin){
$("#popSubtopics").hide();}
$divClassInfo.find(".welcomeClass_topic").each(function(i){
var p=this.id.split("_"),
topicid=p[1].substr(1),
csid=p[2].substr(1);
$(this).find("a:first").addClass("hoverHighlight");
if(csid>0){
$(this).click(function(x){
return function(){bc.gotoSubtopicId(x);};}(csid));}else{
$(this).click(function(x){
return function(){bc.gotoTopicId(x);};}(topicid));}
$(this).hoverLink();});
function getClassCustomTopicHtml(customTopicsArr){
var topicArray=$.map(customTopicsArr,function(topic,i){
return(topic.showLink)?topic:null;});
$.each(topicArray,function(i,topic){
topic.isTest=(topic.userMode==4);
if(bc.topic[topic.topicid]){
topic.name=bc.topic[topic.topicid].name;}
if(topic.csid){
userScore=bc.user.scores.cs[topic.csid];
if(userScore){
topic.fraction=userScore.fractionString();
topic.percent=userScore.totalPercent();}
if(bc.coursesubtopic[topic.csid]){
topic.name+=' - '+bc.coursesubtopic[topic.csid].name;}
topic.linkClass="cs"+topic.csid;}else{
topic.linkClass="t"+topic.topicid;}});
return bc.template.getById("welcomePage_courseclassTopicTemplate").render(topicArray);}},
setupInstitutionIndex:function(){
bc.loadToolbarNoFrames();
$("div.centerColWide").removeClass("centerColWide").addClass("centerCol");
$("li").hoverLink("a").click(function(){
document.location=$(this).find("a").attr("href");}).find("a").click(function(event){
event.preventDefault;});
$("div.subject:even").addClass("r1");
$("div.subject:odd").addClass("r2");},
setupTopicindex:function(){
var csid,cs,pageid,link,scoreHtml;
if(!bc.course[bc.courseid]||!bc.course[bc.courseid].topics){
var url=bc.nav.getCourseJavascriptFile(bc.subjectareaid,bc.courseid);
$.ajax({
type:"GET",
url:url,
dataType:'text',
cache:true,
async:false,
success:function(data){
$.globalEval(data);}});}
if(!bc.Layout){
bc.loadToolbarNoFrames();}
bc2.injectCustomCss();
if($.browser.iPad&&bc.currentTopic){
$('div.topic:not("#topic'+bc.currentTopic.id+'")').remove();}
$(".topic").each(function(i){
var topicid=this.id.substr(5),
topic=bc.topic[topicid];
if(topic){
$(this).find("h2").html(topic.name);}
$(this).find(".subtopic").each(function(i){
csid=this.id.substr(2);
cs=bc.coursesubtopic[csid];
if(cs&&cs.status>=0){
$(this).show().find("h3 a").html(cs.name);
if(cs.status===0){
$(this).find("h3,a").addClass("disabled").attr("href","javascript:bc.showSubscribeDialog();");}else{
var stTitleDiv=$(this).find("div:first");
if(cs&&cs.totMarks>0){
scoreHtml='<div class="csscore">'+getSubtopicScore(csid,cs.totMarks)+'</div>';
stTitleDiv.prepend(scoreHtml);}
link=$(this).find("h3 a");
stTitleDiv.hoverLink("h3")
.click(function(x){
return function(){bc.gotoSubtopicId(x);};}(csid));
$(this).find("li").each(
function(i){
link=$(this).find("a");
pageid=link.attr("href").split("/").pop().split(".")[0].substr(1);
$(this).hoverLink("a").click(function(x,y){
return function(){bc.gotoSubtopicId(x,y);};}(csid,pageid));});}}});
$(this).find("a").removeAttr("href");});
$('body').append(bc.printFooter);
function getSubtopicScore(csid,csTotMarks){
var score,csUserMarks=0,ret='',colorbar='';
var userScore=bc.user.scores.cs[csid];
if(userScore){
csUserMarks=userScore.totalMarks;
if(userScore.endDays){
ret="Last Used: "+userScore.dateString()+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";}
colorbar=bc.scoreColorBar(userScore.marksArray(),csTotMarks,200,{barClass:'scorebarshort',showIcon:false});}
score=fun.formatFractionPercent(csUserMarks,csTotMarks);
ret="<div class=floatRight>"+ret+score+"</div>"+colorbar;
return ret;}},
setupSubtopicReviews:function(){
var qs=fun.queryStringToObject(['s','sa']);
var i,url,safolder,st,page,pageTitle,pageids=[],pageid,bodyHtml;
url=bc.nav.getSubtopicJavascriptFile(qs.sa,qs.s);
$.ajax({
async:false,
type:"GET",
url:url,
dataType:'script',
cache:true});
st=bc.subtopic[qs.s];
if(!st){return;}
bodyHtml='<h1>'+st.name+' Review Pages</h1><div class="divMain">';
for(i=0;i<st.pageArr.length;i++){
page=st.pageArr[i];
if(page.pagestyleid===2){
bodyHtml+='<div class="reviewPage">';
pageTitle=page.pageTitle||page.linkTitle||page.dropdownText||'';
if(pageTitle){
bodyHtml+='<h2>'+pageTitle+'</h2>';}
bodyHtml+='<div id="p'+page.id+'"></div>';
bodyHtml+='</div>';
pageids.push(page.id);}}
bodyHtml+='</div>';
$("body").addClass("subtopicreviews");
$("#divWrapper").prepend(bodyHtml);
for(i=0;i<pageids.length;i++){
pageid=pageids[i];
safolder=st.sa_subtopic||st.sa;
url=bc.nav.getPageHtmlFile(safolder,qs.s,pageid);
$('#p'+pageid).load(url+' #divWrapper .review');}
window.focus();
$("body").prepend(bc.template.getHtmlById("pageToolbarPrint"));},
setupCourseUsage:function(){
var isFrame=false;
var myTable=$("table#topSubtopics");
if((parent)&&(parent.frames.length)){
isFrame=true;
$("body").addClass("isFrame");
myTable.find("tr:first th:last").html("My Score /<br>Total Marks");}
if(bc2.courseid){
myTable=bc2.formatSubtopicsTable(myTable,isFrame,"td:last");}else{
$("#linkAllCourses").hide();
myTable=bc2.formatCourseTable(myTable,isFrame,"td:last");}
window.focus();
if(bc.config.showSparkLines){
myTable.find(".sparkGraph").show().flotSparkline();}
if(bc.printFooter){
$('body').append(bc.printFooter);}},
formatCourseTable:function(jqTableObj,canShowLink,cellMarksSelector){
var courseid,row,cell1,cellLast,cellMarks,stripeClass,userScore;
jqTableObj.find("tr:gt(0)").each(function(i){
row=$(this);
if(this.id){
courseid=this.id.substr(1);
cell1=row.find("td:first");
cell1.addClass("leftEdge hoverHighlight").html('<a>'+cell1.html()+'</a>');
cellLast=row.find("td:last").addClass("rightEdge");
if(cellMarksSelector){
cellMarks=row.find(cellMarksSelector);}
if(canShowLink){
row.click(function(x){
return function(){bc.gotoCourseId(x);};}(courseid));}else{
row.click(function(x){
return function(){fun.gotoUrl("bccourseusage.aspx?c="+x,window);};}(courseid));}
row.addClass(stripeClass);
stripeClass=(stripeClass=='r1')?'r2':'r1';
$(this).hoverLink();
if(cellMarks){
if(canShowLink){
userScore=bc.user.scores.course[courseid];
cellMarks.html(userScore.fractionPercentString()).addClass("alignCenter");}else{
cellMarks.append(' marks').addClass("padRight30");}}}else{
stripeClass='r1';}});
return jqTableObj;},
formatSubtopicsTable:function(jqTableObj,canShowLink,cellMarksSelector){
var p,topicid,csid;
var row,cell1,cellLast,cellMarks,showLink,stripeClass,userScore;
jqTableObj.find("tbody tr").each(function(i){
if(!this.id){
return false;}
p=this.id.split("_");
row=$(this);
cell1=row.find("td:first");
cellLast=row.find("td:last");
if(cellMarksSelector){
cellMarks=row.find(cellMarksSelector);}
topicid=p[0].substr(1);
if(p[1]){
csid=p[1].substr(1);
showLink=(canShowLink&&(bc.coursesubtopic[csid].status>0));
if(bc.coursesubtopic[csid]&&bc.coursesubtopic[csid].status===0){
cell1.find("a").addClass("disabled");}
row.addClass(stripeClass);
stripeClass=(stripeClass=='r1')?'r2':'r1';
if(cellMarks){
if(canShowLink){
userScore=bc.user.scores.cs[csid];
cellMarks.html(userScore.fractionPercentString()).addClass("alignCenter");}else{
cellMarks.append(' marks').addClass("padRight30");}}}else if(topicid>0){
csid=0;
showLink=canShowLink;
stripeClass='r1';}else{
return false;}
if(showLink){
cell1.addClass("leftEdge hoverHighlight").html('<a>'+cell1.html()+'</a>');
cellLast.addClass("rightEdge");
$(this).hoverLink();
if(csid){
row.click(function(x){
return function(){bc.gotoSubtopicId(x);};}(csid));}else{
row.click(function(x){
return function(){bc.gotoTopicId(x);};}(topicid));}}});
return jqTableObj;},
setupSearch:function(){
window.focus();
document.forms[0].search.focus();},
setupChooseSubjectInstitution:function(){
$("table#chooseSubjectInst tr:even").addClass("r1");
$("table#chooseSubjectInst tr:odd").addClass("r2");
$('div.sa').hoverLink('h3').each(function(i){
$(this).attr('title',$(this).parents('tr').find('h2').text()+' at '+$(this).find('h3').text());});
if(bc.config.showSparkLines){
$(".sparkGraph").show().flotSparkline();}},
setupNewuser:function(institutionid){
var i,inst;
if((parent)&&(parent.frames.length)){
parent.location.href=window.location.href;
return;}
institutionObj={};
for(i=0;i<institutionArray.length;i++){
inst=institutionArray[i];
institutionObj[inst[0]]=inst;}
if(institutionid>0){
inst=institutionObj[institutionid];
$("#institutionidLabel").html(inst[1]);
$("#institutionid").removeClass();
fun.loadSelect("institutionid",institutionArray,institutionid,{classIndex:null});
bc2.loadNewUserInstitution(institutionid);}else{
fun.loadSelect("institutionid",institutionArray,null,{startText:'- Choose Institution -',classIndex:null});
$("#institutionid").change(function(){
var instid=$(this).val();
bc2.loadNewUserInstitution(instid);});}
$("#countryid").change(bc2.setCountry);
if(bc.sso){
$("#Form1").submit(function(){
bc2.submitUpdateUser('newuser_sso');
return false;});}else{
$("#Form1").submit(function(){
bc2.submitUpdateUser('newuser');
return false;});}
bc2.configureFormValidation();},
loadNewUserInstitution:function(institutionid){
if(institutionid>0){
var inst=institutionObj[institutionid],version=inst[2];
var url=bc.nav.getInstitutionJavascriptFile(institutionid,version);
$.ajax({
type:"GET",
url:url,
dataType:'script',
cache:true,
success:bc2.setNewUserInstitution});}else{
$.extend(bc,{subinstitutionArray:[],subinstitutionPrompt:'',subjectArray:[]});
bc2.setNewUserInstitution();}},
setNewUserInstitution:function(){
fun.loadSelect("countryid",bc.countryArray,bc.countryid,{startText:''});
$("#countryid").change(bc2.setCountry);
$("#rCountryid").show();
bc2.setCountry();
if(bc.subinstitutionArray.length){
fun.loadSelect("subinstitutionid",bc.subinstitutionArray,null,{startText:''});
$("#rSubinstitutionid").show();}else{
$("#rSubinstitutionid").hide().find("#subinstitutionid").html("");}
if(bc.subinstitutionPrompt){
$("#rSubinstitution").show().find('label').html(bc.subinstitutionPrompt);}else{
$("#rSubinstitution").hide().find("#subinstitution").val("");}
fun.loadSelect("subjectid",bc.subjectArray,1,{valueIndex:"id",textIndex:"name"});
if(bc.subjectArray.length>1){
$("#rSubject").show();}else{
$("#rSubject").hide();}},
setupEdituser:function(){
fun.loadSelect("countryid",bc.countryArray,bc.user.countryid,{startText:''});
$("#countryid").change(bc2.setCountry);
if(bc.subinstitutionArray.length){
fun.loadSelect("subinstitutionid",bc.subinstitutionArray,bc.user.subinstitutionid,{startText:''});
$("#rSubinstitutionid").show();}else{
$("#rSubinstitutionid").hide().find("#subinstitutionid").html("");}
bc2.setCountry();
$("form").submit(function(){
return false;});
$("#btnAddClass").click(function(){
bc2.enrolUserClass();});
$("#btnRegister").click(function(){
bc2.enrolUserLicence();});
if(bc.user.isStaff){
var subTable=$("table#tblLicence");
subTable.find("tr:first").append("<th></th>");
subTable.find("tbody tr").each(function(i){
var subid=$(this).find("td:first").text(),
url="/subscribe/sub.aspx?subid="+subid,
links=' <a href="'+url+'">View</a>';
if($(this).hasClass('site')&&$(this).hasClass('current')){
var url2="/subscribe/bcshop.aspx?upgradesubid="+subid;
links+='&nbsp; <a href="'+url2+'">Upgrade</a>';}
$(this).find("td:last").after('<td>'+links+'</td>');});
$("<a />",{
text:"Purchase Licence",
"class":"floatRight",
href:"/subscribe/bcshop.aspx?i="+bc.user.i,
title:"Purchase site licence for all Bestchoice content"}).prependTo("#FormLicence fieldset");}
var classRows=$("table#tblClass tbody tr");
if(classRows.length){
classRows.each(function(i){
var ccid=$(this).find("td:first").text(),
url="javascript:bc2.deleteUserClass("+ccid+");";
var delLink=$(this).find("td:last a");
$(this).addClass("cc"+ccid);
delLink.attr("href",url);});}
fun.stripeTable();
if($('#rPassword').length){
if(bc.user.mustResetPW){
$("#passwordnew, #passwordnew2").addClass("required");}else{
$("#msg").html("You must enter password to make changes.");}}
bc2.configureFormValidation();
window.focus();},
submitUpdateUser:function(mode){
if($("#Form1").data("isDirty")&&$("#Form1").valid()){
var d=$("#Form1").serialize();
var url='/handlers/updateuser.ashx';
if(mode){url+="?mode="+mode;}
$("#Form1").data("isDirty",false);
fun.showWaitMsg("Saving details...");
$.ajax({
url:url,
data:d,
dataType:'text',
cache:false,
type:'post',
success:function(rawdata){
var data=$.parseJSON(rawdata);
fun.clearWaitMsg();
switch(data.action){
case "error":
$("#msg").html(fun.errorSpan(data.param));
break;
case "userexists":
$("#msg").html("Username \"" + $("#username").val() + "\" already exists.");
$("#username").focus().addClass("error");
break;
case "ok":
$("#msg").html("User details saved.");
break;
case "redirect":
document.location=data.param;
break;}}});}},
setCountry:function(){
if($('#countryid').val()=='0'){
$('#rCountry').show();}else{
$('#rCountry').hide().find('#country').val('');}},
deleteUserClass:function(classid){
var classRow=$("table#tblClass tr.cc"+classid);
classRow.addClass("active");
if(!confirm("Remove yourself from this class?")){
classRow.removeClass("active");
return;}
var d='classid='+classid;
fun.showWaitMsg("Removing class...");
$.ajax({
url:'/handlers/updateuser.ashx?mode=delclass',
data:d,
dataType:'text',
cache:false,
type:'post',
success:function(rawdata){
var data=$.parseJSON(rawdata);
fun.clearWaitMsg();
switch(data.action){
case "error":
$("#classMsg").html(fun.errorSpan(data.param));
break;
case "ok":
classRow.remove();
break;}}});},
enrolUserClass:function(){
var classid,t,alreadyEnrolled=false;
if(!$("#FormClass").data("isDirty")||!$("#FormClass").valid()){return;}
classid=$("#classid").val();
$("table#tblClass tbody tr").each(function(i){
t=$(this).find("td:first").text();
if(t==classid){
alreadyEnrolled=true;
return false;}});
if(alreadyEnrolled){
alert("Already enrolled in class!");
return;}
if(confirm("Enrol in this class?")){
var d=$("#FormClass").serialize();
$("#FormClass").data("isDirty",false);
fun.showWaitMsg("Adding class...");
$.ajax({
url:'/handlers/updateuser.ashx?mode=addclass',
data:d,
dataType:'text',
cache:false,
type:'post',
success:function(rawdata){
var data=$.parseJSON(rawdata);
fun.clearWaitMsg();
switch(data.action){
case "error":
$("#classMsg").html(fun.errorSpan(data.param));
break;
case "ok":
var cd=eval(data.param);
var cr='<td>'+classid+'</td><td>'+cd[0]+'</td><td>'+cd[1]+'</td><td>'+cd[2]+'</td><td>'+cd[3]+'</td><td><i>Added</i></td>';
$("<tr/>",{
"class":"active",
html:cr}).appendTo("table#tblClass tbody");
$("#divClass").show();
$("#FormClass input:text").val("");
break;}}});}
return false;},
enrolUserLicence:function(){
var subid,t,alreadyEnrolled=false;
if(!$("#FormLicence").data("isDirty")||!$("#FormLicence").valid()){return;}
subid=$("#subid").val();
$("table#tblLicence tbody tr").each(function(i){
t=$(this).find("td:first").text();
if(t==subid){
alreadyEnrolled=true;
return false;}});
if(alreadyEnrolled){
alert("Already enrolled under this licence!");
return;}
if(confirm("Enrol under this licence?")){
var d=$("#FormLicence").serialize();
$("#FormLicence").data("isDirty",false);
fun.showWaitMsg("Enrolling...");
$.ajax({
url:'/handlers/updateuser.ashx?mode=licence',
data:d,
dataType:'text',
cache:false,
type:'post',
success:function(rawdata){
var data=$.parseJSON(rawdata);
fun.clearWaitMsg();
switch(data.action){
case "error":$("#regMsg").html(fun.errorSpan(data.param));break;
case "ok":document.location="/";break;}}});}},
setupShopForm:function(){
var txtSubcode;
fun.stripeTable();
$("a").each(function(i){
if(!$(this).attr("title")){$(this).attr("title",$(this).text());}});
if(document.forms.payForm){
if(bc.subinstitutionArray.length){
fun.loadSelect("dropSubinst",bc.subinstitutionArray,userSubinstitutionid,{startText:''});
$("#rSubinstitutionid").show();
$("#dropSubinst").addClass("required");}
bc2.configureFormValidation();
txtSubcode=$("#txtSubcode");
if(txtSubcode.length){
$("#payForm").submit(bc2.submitShopForm);}
$("#Form1").submit(function(){
bc2.submitShopForm;
return false;});}},
submitShopForm:function(){
var dropSubinst=$("#dropSubinst"),txtSubinst=$("#txtSubinst"),txtSubcode=$("#txtSubcode");
var	hidCustom=document.forms.payForm.custom;
if($("#Form1").valid()){
var si=0,si2='',sc='';
var cf="u="+userid;
sc=txtSubcode.val();
if(dropSubinst.length){si=dropSubinst.val();}
if(txtSubinst.length){si2=txtSubinst.val();}
if(upgradeSubId>0){cf+="&upgradesubid="+upgradeSubId;}
if(si>0){cf+="&si="+si;}
if(si2){cf+="&si2="+si2;}
if(sc){cf+="&sc="+sc;}
hidCustom.value=cf;
return true;}else{
return false;}},
blankPageLoaded:function(){
if(bc.onBlankPageLoaded){
bc.onBlankPageLoaded();
bc.onBlankPageLoaded=null;}},
setupScoreSurveyPage:function(){
var csInfo=bc.user.coursesubtopic[bc.csid]||{};
var userScore=bc.user.scores.cs[bc.csid];
if(!csInfo.comments){csInfo.comments=[];}
top.fun.clearWaitMsg();
if(bc.user.isDemo){
bc.MAXCOMMENTS=bc.MAXDEMOCOMMENTS;}
document.forms.Form1.csid.value=bc.csid;
document.forms.Form1.s.value=bc.subtopicid;
$("#Form1").submit(function(event){
event.preventDefault();
return false;});
$("#btnGo").click(bc2.confirmSaveSurvey);
if(!bc.isMobile){
$("#comment").resizable({
handles:"se",maxWidth:450});}
showPageScores();
if(bc.csid&&!bc.user.isDemo&&!bc.isMobile){
showSubtopicStats();}
if(userScore){
document.getElementById("msg2").innerHTML=userScore.dateRangeString();}
if(bc.ccid){
showClassTotalRatings();}else{
$("#radioScore-wrapper").stars({cancelShow:false});
if(csInfo.rating){
$("#radioScore-wrapper").stars("select",csInfo.rating);}}
showPastComments();
if(bc.nav){
$('body').append(bc.printFooter);}
bc2.configureFormValidation();
$("#comment").rules("add",{minlength:2,maxlength:2000});
function showPageScores(){
var scoremsg="",msg="",pageScoresHtml="";
var totComplete=0,totIncomplete=0,totUnTried=0;
var csTotMarks,csCoreMarks,showExtraQ;
var $tableBody=$("#pageScores table tbody");
var questionPageArray=$.map(bc.nav.csPageDropArray,function(page,i){
return(page.totMarks)?page:null;});
csTotMarks=bc.nav.cs.totMarks;
csCoreMarks=bc.nav.cs.coreMarks;
showExtraQ=bc.nav.showExtraQ;
var csMarksOutOf=bc.nav.totSubtopicMarks;
if(questionPageArray.length&&!bc.isMobile){
$.each(questionPageArray,function(i,page){
page.stripeClass=(i%2)?'r1':'r2';
page.percent=Math.round((page.marks.totalMarks/page.totMarks)*100,2);
page.lastDate=page.marks.dateString();
page.colorBar=bc.scoreColorBar(page.marks.marksArray(),page.totMarks,130,{barClass:'pagescorebar',jqTooltip:true});
if(page.marks.totalMarks>=page.totMarks){
totComplete++;}else if(page.marks.totalMarks>0){
totIncomplete++;}else{
totUnTried++;}});
if(!$.support.touch){
$tableBody.html(
$("#pageScoresTemplate").render(questionPageArray));
if(bc.config.useTooltipPlugin){
$tableBody.find(".pagescorebar").tooltip(bc.tooltipSettings.surveyPageScore);}
$tableBody.find('tr').hoverLink().end();}}else{
document.getElementById("pageScores").style.display='none';}
msg='';
if(totComplete){
msg+='<span class="qdone"><b>'+totComplete+'</b> page'+((totComplete>1)?'s':'')+' complete. </span>';}
if(totIncomplete){
msg+='<span class="qtried"><b>'+totIncomplete+'</b> page'+((totIncomplete>1)?'s':'')+' incomplete. </span>';}
if(totUnTried){
msg+='<span class="quntried"><b>'+totUnTried+'</b> page'+((totUnTried>1)?'s':'')+' untried. </span>';}
document.getElementById('pagescoreTots').innerHTML=msg+'<br />';
if(csMarksOutOf>0){
var csMarks=bc.nav.visibleCsMarks.totalMarks;
if(bc.ccid){
scoremsg=bc.user.userName+" Average: <sup class=topicScore>"+fun.dpRound(csMarks,2)+"</sup>/<sub class=topicScore>"+csTotMarks+"</sub> = "+(Math.round(10000*csMarks/ csTotMarks)/100)+"%";}else{
scoremsg="<sup class=topicScore>"+(Math.round(100*csMarks)/100)+"</sup>/<sub class=topicScore>"+csMarksOutOf+"</sub>="+Math.round(100*csMarks / csMarksOutOf)+"%";}}else{
scoremsg="";
document.getElementById("scoreBar").style.display='none';}
document.getElementById("scoreHeader").innerHTML=scoremsg;
document.getElementById("subtopicHeader").innerHTML=bc.currentCS.name+' - Score: ';
$("#scoreBar .xMax").html(csMarksOutOf);
bc.scoreColorBar(bc.nav.visibleCsMarks.marksArray(),csMarksOutOf,446,{barClass:'subtopicscorebar',showIcon:true,showOverlay:true,jqBar:$("#colorbar"),numBars:4,jqTooltip:true});}
function showSubtopicStats(){
var url="/handlers/getbcdata.ashx?action=subtopic&csid="+bc.csid;
$.getJSON(url,function(data){
if(data.numFinished){
var tmp="Previously completed by "+data.numFinished+" users.<br />";
tmp+="First ";
if(data.firstFinishDate){
var firstFinishDate=new Date(data.firstFinishDate);
tmp+=" on "+firstFinishDate.ShortDate();}
if(data.location){tmp+=" from "+data.location;}
$("#pastCompleted").html(tmp);}});}
function showPastComments(){
var i,numComments=0,pastComments="",commentCaption;
if(csInfo.comments){numComments=csInfo.comments.length;}
if(numComments>0){
if(bc.ccid&&csInfo.commentDates){
for(i=0;i<numComments;i++){
pastComments+="<tr><td width=70>"+csInfo.commentDates[i]+'<br />'+csInfo.commentUsers[i]+"</td><td>"+csInfo.comments[i]+"</td></tr>";}
pastComments="<table class=grid border=1 cellspacing=0 cellpadding=2 width=100% style='font-size:12px;'><tbody>"+pastComments+"</tbody></table>";
if(numComments==20){
commentCaption="<br /><h2>Latest "+numComments+" Comments</h2>";}else{
commentCaption="<br /><h2>"+numComments+" Comments</h2>";}}else{
commentCaption='<b>Past Comments</b>';
for(i=0;i<numComments;i++){
pastComments+="<div>"+csInfo.comments[i]+"</div>";}}
$("#pastComments").show().html(commentCaption+pastComments);}
if(numComments>=bc.MAXCOMMENTS||bc.ccid){
$("#divNewComment").hide();}}
function showClassTotalRatings(){
var i;
if(!csInfo.classRating){return;}
var classr="",r1="<tr><td>Rating</td>",r2="<tr><td>Votes</td>";
document.getElementById("divSubmit").style.display='none';
for(i=1;i<=6;i++){
r1+="<td width=35>"+i+"</td>";
r2+="<td>"+csInfo.classRating[i]+"</td>";}
r1+="<td width=35>Avg</td>";
r2+="<td>"+(Math.round(100*csInfo.rating)/100) + "</td>";
r1+="</tr>";
r2+="</tr>";
classr="<table class=grid  border=1 cellspacing=0 cellpadding=2 style='font-size:12px;'>"+r1+r2+"</table>";
classr+="<br /><b>"+csInfo.classRating[0]+" ratings</b>";
if(csInfo.rDate1){classr+=" from "+csInfo.rDate1;}
if(csInfo.rDate2){classr+=" to "+csInfo.rDate2;}
document.getElementById("divRadio").innerHTML=classr;}},
confirmSaveSurvey:function(){
var rating,surveyChanged,newComment,starOptions;
var queryString,replyDiv;
var csInfo=bc.user.coursesubtopic[bc.csid]||{};
var $radioScore=$("#radioScore-wrapper");
if($radioScore.length&&$radioScore.data("stars")){
starOptions=$radioScore.data("stars").options;
if(starOptions){
rating=starOptions.value;}}
surveyChanged=(rating>0&&csInfo.rating!=rating&&!bc.user.isDemo);
document.forms.Form1.surveychanged.value=surveyChanged;
newComment=$.trim(document.forms.Form1.comment.value);
document.forms.Form1.comment.value=newComment;
$("#catid").rules((!newComment)?"remove":"add","required");
if($("#Form1").valid()){
if(newComment||surveyChanged){
replyDiv=$("#divSurveyMsg");
var formObj=$("#Form1").serializeObject();
if(!formObj.catid){
formObj.catid=0;}
formObj.comment=formObj.comment.replace(/&/g,"%26");
var json="obj="+JSON.stringify(formObj);
bc.saveComment(json,replyDiv);
if(surveyChanged==1){
csInfo.rating=rating;}
if(newComment){
var numComments=csInfo.comments.length;
csInfo.comments[numComments]=newComment;
document.forms.Form1.comment.value='';
$("#pastComments").show().append("<div>"+newComment+"</div>");
if(numComments>=bc.MAXCOMMENTS){
$("#divNewComment").hide();}}}}
return false;},
bodyOnloadEvent:function(){
bc2.setupGoogleAnalytics2();},
setupGoogleAnalytics2:function(){
if(bc.googleAnalyticsLoaded){
return;}
var ga=document.createElement('script');
ga.type='text/javascript';ga.async=true;
ga.src=('https:'==document.location.protocol?'https://ssl':'http://www')+'.google-analytics.com/ga.js';
var s=document.getElementsByTagName('script')[0];
if(s){
s.parentNode.insertBefore(ga,s);}
bc.googleAnalyticsLoaded=true;},
setupGeneric:function(){
$(".r:odd").addClass("r1");
$(".r:even").addClass("r2");
if((parent)&&(parent.frames.length)){
$("body").addClass("isFrame");}else{
window.focus();}}};
$.extend(bc,{
showTestScore:function(pageindex,mark,outOf,msg){
parent.pagemain.document.getElementById("score"+pageindex).innerHTML='<sup class=score>'+mark+'</sup>/<sub class=score>'+outOf+'</sub>';}});
if(window.Raphael){
Raphael.fn.pieChart=function(cx,cy,r,values,labels,sliceColors,sliceColors2,stroke){
if(!stroke){stroke='none';}
var i,ii,paper=this,
rad=Math.PI/180,
chart=this.set();
function sector(cx,cy,r,startAngle,endAngle,params){
var x1=cx+r*Math.cos(-startAngle*rad),
x2=cx+r*Math.cos(-endAngle*rad),
y1=cy+r*Math.sin(-startAngle*rad),
y2=cy+r*Math.sin(-endAngle*rad);
return paper.path(["M",cx,cy,"L",x1,y1,"A",r,r,0,+(endAngle-startAngle>180),0,x2,y2,"z"]).attr(params);}
var angle=90,
total=0,
process=function(j){
var value=values[j],
angleplus=360*value/total,
color=sliceColors[j];
var opt={stroke:stroke,"stroke-width":3};
if(!sliceColors2){
opt.fill=color;}else{
opt.gradient="90-"+sliceColors2[j]+"-"+color;}
var p=sector(cx,cy,r,angle,angle+angleplus,opt);
angle+=angleplus;
chart.push(p);};
for(i=0,ii=values.length;i<ii;i++){
total+=values[i];}
for(i=0;i<ii;i++){
process(i);}
return chart;};}(function($){
$.fn.hoverLink=function(hoverHighlightSelector){
$(this).css('cursor','pointer')
.hover(function(){
$(this).addClass("hover");},function(){
$(this).removeClass("hover");}).mousedown(function(){
$(this).addClass("active");}).bind('mouseleave',function(){
$(this).removeClass('active');});
if(hoverHighlightSelector){
$(this).find(hoverHighlightSelector).addClass("hoverHighlight");}
return $(this);};
$.fn.imageEvent=function(options){
return this.each(function(){
$(this).attr('src0',$(this).attr('src'));
if($(this).hasClass("rollover")){
if($(this).attr('src2')){
$(this).hover(function(){
$(this).attr('src',$(this).attr('src2'));},function(){
$(this).attr('src',$(this).attr('src0'));});}
if($(this).attr('src3')){
$(this).mousedown(function(){
$(this).attr('src',$(this).attr('src3'));}).mouseup(function(){
$(this).attr('src',$(this).attr('src2')?$(this).attr('src2'):$(this).attr('src0'));});}}
if($(this).hasClass("toggle")){
if($(this).attr('src2')){
$(this).toggle(function(){
$(this).attr('src',$(this).attr('src2'));},function(){
$(this).attr('src',$(this).attr('src0'));});}}});};
$.fn.svg=function(options){
return this.each(function(){
var myId=this.id,w=$(this).width(),h=$(this).height(),dims;
var imgsrc=$(this).attr('src'),
path=$(this).attr('path'),
text=$(this).attr('text'),
attr=$(this).attr('attr')||options;
var attrObj={};
var svg=Raphael(myId,w,h),svgPath,svgImg,svgText;
var set=svg.set();
bc.svg.canvas[myId]=svg;
if(path){
svgPath=svg.path(path);
if(attr.indexOf("scale")==-1){
dims=svgPath.getBBox();
var scalex=w/Math.ceil(dims.width+1), scaley = h/Math.ceil(dims.height+1);
if(attr.indexOf("rotation")>-1){
scalex=Math.min(scalex,scaley);
scaley=scalex;}
svgPath.scale(scalex,scaley,0,0);}
set.push(svgPath);}
if(imgsrc){
svgImg=svg.image(imgsrc,0,0,w,h);
set.push(svgImg);}
if(text){
svgText=svg.text(w/2, h/2,text);
set.push(svgText);}
if(attr){
eval("attrObj={"+attr+"}");
set.attr(attrObj);}
bc.svg.element[myId+"set"]=set;});};
$.fn.flotgraph=function(data,options){
var defaultOptions={
xaxis:{min:0,tickDecimals:0,autoscaleMargin:0.01},
yaxis:{min:0,tickDecimals:0},
grid:{
borderWidth:1,
backgroundColor:{colors:["#fff","#ddd"]},
hoverable:false},
series:{
bars:{show:false,barWidth:0.6,align:"center",lineWidth:0,fill:0.8},
lines:{show:false},
points:{show:false},
shadowSize:0},
colors:['#003366'],
crosshair:{mode:null}};
if(options){
$.extend(true,defaultOptions,options);}
return this.each(function(){
if($(this).hasClass("done")){return true;}
var w=$(this).width(),
h=$(this).height(),
w0=w,h0=h;
var htmlOptions=fun.evalObjectString($(this).attr('options'))||{};
var i,flotData=[];
if(w0<=0||h0<=0){
return true;}
$.extend(true,htmlOptions,{
series:{
bars:{show:$(this).hasClass("bar")},
lines:{show:$(this).hasClass("line")},
points:{show:$(this).hasClass("points")}}});
var fi,flotOptions=$.extend(true,{},defaultOptions,htmlOptions);
var title=$(this).attr('title')||flotOptions.title,
titlex=$(this).attr('titlex')||$(this).attr('xtitle')||flotOptions.titlex||flotOptions.xtitle,
titley=$(this).attr('titley')||$(this).attr('ytitle')||flotOptions.titley||flotOptions.ytitle;
if(flotOptions.tooltip){
flotOptions.grid.hoverable=true;}
var htmldata=$.trim($(this).attr('data'));
if(htmldata){
htmldata=htmldata.replace(/\(/g,"[").replace(/\)/g,"]");
if(htmldata.indexOf("{")==-1){
htmldata=htmldata.replace(bc.Const.RegExpHtmlTag,"");
while(htmldata.substr(0,3)!="[[["){
htmldata="["+htmldata;}
while(htmldata.slice(-3)!="]]]"){
htmldata+="]";}}
try{
flotData=eval(htmldata);}catch(err){}}else if(data){
flotData=data;}
if(flotOptions.fn){
if(!$.isArray(flotOptions.fn)){
flotOptions.fn=[flotOptions.fn];}
var minx=flotOptions.minx||flotOptions.xaxis.min||0,
maxx=flotOptions.maxx||flotOptions.xaxis.max,
numx=flotOptions.numx||w;
var x,deltax=(maxx-minx)/numx;
for(fi=0;fi<flotOptions.fn.length;fi++){
if(flotOptions.fn[fi]){
var fndata=[];
var fn=new Function("x","return "+flotOptions.fn[fi]);
for(x=minx;x<=maxx;x+=deltax){
fndata.push([x,fn(x)]);}
if(!flotData[fi]){
flotData[fi]={};}
flotData[fi].data=fndata;}}}
if(!flotData.length){return;}
var ticks=[],ds,si;
for(si=0;si<flotData.length;si++){
ds=flotData[si];
ds=ds.data||ds;
for(i=0;i<ds.length;i++){
if(ds[i][2]){
ticks.push([ds[i][0],ds[i][2]]);}}}
if(ticks.length){
$.extend(true,flotOptions,{xaxis:{ticks:ticks}});}
$(this).html("").attr("title","").addClass("ui-corner-all done");
if(title){h-=17;}
if(titlex){h-=15;}
if(titley){w-=14;}
if(title){
$(this).addClass("hasTitle");
$("<div />",{
"class":"plotTitle",html:title}).appendTo($(this));}
$("<div />",{
"class":"flot2",width:w,height:h}).appendTo($(this));
if(titlex){
$(this).addClass("hasTitleX");
$("<div />",{
"class":"xAxisTitle","html":titlex}).appendTo($(this));}
if(titley){
$(this).addClass("hasTitleY");
$("<div />",{"class":"flotSvg",width:w0,height:h0}).prependTo($(this));
var svg=Raphael($(this).find(".flotSvg").get(0),w0,h0);
if($.browser.msie&&parseInt($.browser.version,10)<9){
$(this).find("div:first").css({"position":"absolute",left:"2px"});}
var titleyHPos=h/2 + (title ? 10 : 0);//-(titlex?5:0);
var ty=svg.text(7,titleyHPos,titley).attr({font:'11px Arial,Helvetica,sans-serif'}).attr({rotation:-90});}
$.plot($(this).find(".flot2"),flotData,flotOptions);
if(flotOptions.tooltip){
var tooltipClass="flotTooltip";
$(this).find(".flot2").bind("plothover",function(event,pos,item){
if(item){
if($(this).data("previousPoint")!=item.datapoint.toString()){
$(this).data("previousPoint",item.datapoint.toString());
$("."+tooltipClass).remove();
var x=fun.dpRound(item.datapoint[0],3),
y=fun.dpRound(item.datapoint[1],3);
var caption=x+", "+y;
$('<div />',{
"class":tooltipClass,
opacity:0.80,
html:caption}).css({top:item.pageY-9,left:item.pageX+7})
.appendTo("body").show();}}else{
$("."+tooltipClass).remove();
$(this).data("previousPoint",null);}});}});};
$.fn.flotSparkline=function(data,options){
var flotOptions={
xaxis:{min:null,autoscaleMargin:null},
yaxis:{min:null,autoscaleMargin:null},
grid:{show:false,borderWidth:0},
series:{
lines:{show:true,lineWidth:1,fill:1,fillColor:{colors:["#fff","#005588"]}},
shadowSize:0},
colors:['#003366']};
if(options){
$.extend(true,flotOptions,options);}
return this.each(function(){
var flotData=$.trim($(this).attr('data')||$(this).text()||data);
if($(this).hasClass("done")||!flotData){return true;}
flotData=[csvToFlotData(flotData)];
$(this).html("").addClass("done");
$.plot($(this),flotData,flotOptions);});};
function csvToFlotData(values){
var val=$.trim(values).split(",");
var i,n=val.length;
var data=[];
for(i=0;i<n;i++){
data.push([i,parseFloat(val[i])]);}
return data;}
$.fn.interact=function(options){
var defaultOptions={
cursor:'move',
stack:".draggable, .draggable2",
aspectRatio:true,
autoHide:true};
if(options){
$.extend(true,defaultOptions,options);}
return this.each(function(){
var htmlOptions,uiOptions;
if($(this).hasClass("draggable")){
htmlOptions=fun.evalObjectString($(this).attr('options-draggable'))||{};
uiOptions=$.extend(true,{},defaultOptions,htmlOptions);
if($(this).hasClass("draggable-x")){
uiOptions.axis='x';}else if($(this).hasClass("draggable-y")){
uiOptions.axis='y';}
$(this).draggable(uiOptions);}
if($(this).hasClass("resizable")){
htmlOptions=fun.evalObjectString($(this).attr('options-resizable'))||{};
uiOptions=$.extend(true,{},defaultOptions,htmlOptions);
$(this).resizable(uiOptions);}});};})(jQuery);
$(document).ready(function(){
$(document).mousedown(bc.setRefreshTimeout);
$(document).keydown(bc.setRefreshTimeout);
if($(document).touchstart){
$(document).touchstart(bc.setRefreshTimeout);}
$(window).resize(bc.windowResize);
$(document).ajaxError(bc.ajaxErrorGlobal);
$.ajaxSetup({
headers:{
"Accept":'',
"Accept-Charset":'',
"Accept-Language":'',
"User-Agent":'ajax'},
timeout:15000});
$("html").addClass("js");
$(".resizable, .draggable").interact();
$('img.rollover, img.toggle').imageEvent();
$('div.svg').svg();
if(bc.isMobile||screen.width<530){
$.extend(bc.config,{
showScoreBar:false,
showSparkLines:false,
useTooltipPlugin:false,
smallScreen:true});}
if($.support.touch){
bc.config.useTooltipPlugin=false;
bc.Const.treeRootClosed='<span class="ui-icon ui-icon-plusthick"></span>';
bc.Const.treeRootOpen='<span class="ui-icon ui-icon-minusthick"></span>';}else{
bc.Const.treeRootClosed="+";
bc.Const.treeRootOpen="-";}
if(!$('body').tooltip){
bc.config.useTooltipPlugin=false;}
bc2.runPageLoadFunction();});
$.extend(bc,{
ajaxErrorGlobal:function(e,jqxhr,settings,error){
var msg,retryLimit,tryCount,i,url,fileName,
errCode=(jqxhr.status||''),
errMsg=errCode+' '+(jqxhr.statusText||''),
file=settings.url,
details='data='+(settings.data||'');
var ajaxFileOptions={
"/handlers/saveuserdata.ashx":{
msg:"Try to save again?"},
"/handlers/getuserdata.ashx":{
msg:"Click ok to try again,or cancel to continue without loading your past data.",
runSuccessOnCancel:true}};
fun.clearWaitMsg();
if(errCode==401){
alert("Could not access user records.\nReloading Bestchoice.\nYou may need to log in again.");
url='/?s='+bc.subjectareaid+'%26i='+bc.institutionid;
if(bc.courseid){
url+='&c='+bc.courseid;}
if(jqxhr.bcCsid){
url+='&cs='+jqxhr.bcCsid;}else if(bc.csid){
url+='&cs='+bc.csid;}
if(jqxhr.bcPageid){
url+='&p='+jqxhr.bcPageid;}else if(bc.nav&&bc.nav.pageid){
url+='&p='+bc.nav.pageid;}
if(bc.user&&bc.user.userName){
url+='&user='+bc.user.userName;}
top.location=url;
return;}
if(jqxhr.preLoad){
return;
details='preload. '+details;}
retryLimit=jqxhr.retryLimit;
if(retryLimit&&isRetryErrorCode(errCode)){
tryCount=(jqxhr.tryCount||0)+1;
settings.beforeSend=function(xhr){
xhr.tryCount=tryCount;
xhr.retryLimit=retryLimit;};
if(settings.url.indexOf("?")<0){
settings.url+="?";}
settings.url=settings.url.replace("&retry="+(tryCount-1),"")+"&retry="+tryCount;
if(tryCount<retryLimit){
if(file.indexOf('saveuserdata.ashx')<0){
fun.showWaitMsg('Difficulty in contacting server.  Trying again...');}
$.ajax(settings);}else{
msg='Failed to contact server after '+tryCount+' attempts.\nPlease check your internet connection.\nTry again?';
if(confirm(msg)){
fun.showWaitMsg('Trying to contact server again...');
$.ajax(settings);}else{}
bc.logError('ajax',errMsg,file,0,details);}
return;}
bc.logError('ajax',errMsg,file,0,details);
function isRetryErrorCode(errCodetoTest){
var RETRYERRORCODES=[502,504,12007,12029,12030,12031];
if(!errCodetoTest||$.inArray(errCodetoTest,RETRYERRORCODES)>=0){
return true;}
if(errCodetoTest.indexOf("NS_ERROR_NOT_AVAILABLE")>=0){
return true;}
return false;}},
logError:function(errType,errMsg,errUrl,lineNo,details){
var ERRORLOGGERURL='/handlers/logError.ashx',
SITEROOTREGEX=/http:\/\/[.a-z]*bestchoice.net.nz/;
var bcInfo,bcInfo2,userInfo,dataString;
var i,errorKey=errMsg+lineNo;
top.errorsSubmitted=top.errorsSubmitted||[];
if(bc.user.isDemo||!bc.logClientErrors||(typeof errUrl=="undefined")||!errUrl||top.errorsSubmitted.length>2){
return;}
if(errType=='window'&&!(lineNo>2)){
return;}
var excludeFiles=[
"ComponentArtScript.axd",
"cloudfront.net",
"Jmol.js",
"google-analytics.com",
"/jquery.",
"/jqueryall.",
ERRORLOGGERURL];
for(i=0;i<excludeFiles.length;i++){
if(errUrl.indexOf(excludeFiles[i])>-1){
return;}}
if(errType!=='ajax'&&$.inArray(errorKey,top.errorsSubmitted)>=0){
return;}else{
top.errorsSubmitted.push(errorKey);}
var errFile=errUrl.replace(SITEROOTREGEX,''),
errPageTop,errPage=document.location.href.replace(SITEROOTREGEX,'');
if(document.location!=top.document.location){
errPageTop=top.document.location.href.replace(SITEROOTREGEX,'');}
var errObj={
type:errType,
errFile:errFile,
line:lineNo,
message:errMsg,
details:details,
page:errPage,
topPage:errPageTop};
if(bc){
bcInfo={
i:bc.institutionid,
s:bc.subjectareaid,
c:bc.courseid,
cs:bc.csid,
st:bc.subtopicid,
cc:bc.ccid,
pageid:bc.nav?(bc.nav.pageid||null):null};
bcInfo2={
screen:screen.width+'x'+screen.height};
if(bc.nav){
if(bc.nav.pageIndex){
bcInfo2.pageIndex=bc.nav.pageIndex;}
if(bc.nav.dropPages){
bcInfo2.dropPagesLength=bc.nav.dropPages.options.length;}}
errObj.bcInfo=$.param(bcInfo);
errObj.bcInfo2=$.param(bcInfo2);}
if(bc.user){
userInfo={
name:bc.user.userName,
i:bc.user.i,
ccIds:bc.user.ccArray.join(',')};
errObj.userInfo=$.param(userInfo);}
dataString='obj='+JSON.stringify(errObj,function(key,value){
return(!value)?undefined:value;});
dataString=dataString.replace(/&/g,"%26");
$.ajax({
type:"POST",
cache:true,
timeout:30000,
url:ERRORLOGGERURL,
data:dataString,
dataType:"text",
global:false,
headers:{
"User-Agent":navigator.userAgent}});}});
window.onerror=function(errMsg,file,lineNo){
bc.logError('window',errMsg,file,lineNo);};


