
var Quiz=Class.create({initialize:function(id,quizId,answers,seconds,quizType){this.id=id;this.quizId=quizId;this.quizType=quizType;this.ul=$('quiz_answers_'+id);this.lis=$A(this.ul.select('li.quizItem'));this.answers=answers;this.seconds=seconds;this.timer=$('quiz_timer_'+id);this.input=$('quiz_input_'+id);this.score=$('quiz_score_'+id);this.startButton=$('quiz_start_'+id);this.endButton=$('quiz_end_'+id);this.afterText=$('quiz_after_'+id);this.form=$('form_'+id);this.input.observe('keyup',this.keyup.bindAsEventListener(this));this.startButton.observe('click',this.start.bindAsEventListener(this));this.endButton.observe('click',this.end.bindAsEventListener(this));this.startTime=(new Date).getTime();this.updateTimer(true);this.started=false;this.guessed=[];this.updateScore();switch(this.quizType){case'MATCH_EXACT':this.currentQuestion=null;this.lis.each(function(li,i){li.observe('click',this.selectQuestion.bindAsEventListener(this,i));},this);this.selectQuestion(null,0);break;}},start:function(event){Event.stopAndBlur(event);if(this.started)return;this.started=true;this.startTime=(new Date).getTime();this.interval=window.setInterval(this.updateTimer.bind(this),100);this.timer.removeClassName('disabled');this.startButton.addClassName('hidden');this.endButton.removeClassName('hidden');},end:function(event){Event.stopAndBlur(event);if(this.interval)clearInterval(this.interval);this.input.value='';this.input.disabled=true;this.input.addClassName('disabled');this.endButton.addClassName('hidden');this.afterText.removeClassName('hidden');this.answers.each(function(answer,i){if(!this.guessed[i])this.revealAnswer(i,false);},this);switch(this.quizType){case'MATCH_EXACT':this.selectQuestion(null,null);break;}
var results=this.guessed.toJSON();new Ajax.Request('rpc.php',{parameters:{method:'internal.quiz_scores.save',quiz_id:this.quizId,results:results},onSuccess:(function(transport){this.form.results.value=results;this.form.submit();}).bind(this),onFailure:(function(transport){}).bind(this)});},keyup:function(event){if(!this.started)this.start();var corrects=this.checkAnswer(this.input.value);if(corrects.length){corrects.each(function(i){this.revealAnswer(i,true);},this);this.updateScore();}},selectQuestion:function(event,i){Event.stopAndBlur(event);if(i!==null&&this.guessed[i])return;if(this.currentQuestion!==null)
this.highlight(this.currentQuestion,false);if(i!==null)
this.highlight(i,true);this.currentQuestion=i;if(event)this.input.focus();},highlight:function(i,on){var li=this.lis[i];on?li.addClassName('selected'):li.removeClassName('selected');},updateScore:function(){this.score.value=this.getScore()+'/'+this.answers.length;if(this.getScore()==this.answers.length)this.end();},getScore:function(){var score=0;this.guessed.each(function(g){if(g)score++;});return score;},revealAnswer:function(i,correct){var li=this.lis[i];var liAns=li.down('li.answer');liAns.down('span').removeClassName('hidden');liAns.addClassName(correct?'correct':'wrong');this.input.value='';this.guessed[i]=correct?1:0;switch(this.quizType){case'MATCH_EXACT':if(this.getScore()<this.answers.length)
for(var i=1;i<=this.answers.length;i++){var q=(this.currentQuestion+i)%this.answers.length;if(!this.guessed[q]){this.selectQuestion(null,q);break;}}
break;}},checkAnswer:function(answer){answer=answer.toLowerCase();var corrects=[];var answers=[];switch(this.quizType){case'MATCH_ANY':this.answers.each(function(answer_options,i){answer_options.each(function(answer_option){if(this.compareAnswer(answer_option,answer)){corrects.push(i);}},this);},this);break;case'MATCH_EXACT':this.answers[this.currentQuestion].each(function(answer_option){if(this.compareAnswer(answer_option,answer)){corrects.push(this.currentQuestion);return;}},this);break;}
return corrects;},compareAnswer:function(option,input){option=option.toLowerCase();var matches=option.match(/^\[(.*)\]$/);if(matches)
return input.indexOf(matches[1])!=-1;else
return option==input;},updateTimer:function(start){var elapsed=Math.floor(((new Date).getTime()-this.startTime)/1000);var time=Math.max(this.seconds-elapsed,0);this.timer.value=Math.floor(time/60)+':'+((time%60)/100).toFixed(2).substring(2);if(time==0)this.end();}});