// Simple Quiz Processor 1.0
// (c) Mikaella Klyueva, 2007

var DebugInfo='';
var Totals=0;
var StrTotals='';
var MemSum=0;
var MemStr='';
var Results=new Array();
var StrResults=new Array();
var StepCount=0;
var ExtraResults=new Array();

function rand(AMin, AMax) {
   AMax++;
   var Range=AMax - AMin;
   var xResult=Math.floor(Math.random() * Range) + AMin;
   return xResult;
}

function randFromStr(AStr) {
   AStr=AStr.replace(/ /, '');
   AStr=AStr.replace(/rand\(/, '');
   AStr=AStr.replace(/\)/, '');
   var xValues=AStr.split(',');
   var xMin=parseInt(xValues[0]);
   var xMax=parseInt(xValues[1]);
   if (isNaN(xMin)) { xMin=0; }
   if (isNaN(xMax)) { xMax=xMin+1; }
   return rand(xMin, xMax);
}

function ClearQuestion(AQIndex, ACmdIndex) {
   var xAnsName='answer' + ACmdIndex;
   var frm=document.forms['TestFrm'];
   if (frm==null) { alert('FATAL ERROR: "Form" element not found!'); return 0; }
   for (var i=0; i<frm.elements.length; i++) { 
      if ((frm.elements[i].name==xAnsName) && (frm.elements[i].checked)) {
         frm.elements[i].checked=false;
      }
   }
   var xel=frm.elements['from' + ACmdIndex];
   if (xel!=null) {
      xel.value=AQIndex;
   }
   return 1;
}

function FocusNext(AQIndex) {
   var xel=MyGetElementByID('qw' + AQIndex);
   if (xel!=null) {
      if (xel.style.display=="block") {
         xel=document.forms['TestFrm'].elements['next' + AQIndex];
         if (xel!=null) {
            xel.focus();
         }
      }
   }
   return 1;
}

function GetFrom(AQIndex) {
   var xel=document.forms['TestFrm'].elements['from' + AQIndex];
   if (xel!=null) {
      var xFrom=parseInt(xel.value);
      if (isNaN(xFrom)) {
         return -1;
      } else {
         return xFrom;
      }
   } else { return -1; }
}

function AddResult(AQIndex) {
   var xAnsName='answer' + AQIndex;
   var frm=document.forms['TestFrm'];
   if (frm==null) { alert('FATAL ERROR: "Form" element not found!'); return 0; }
   var xWeight=0;
   var xWeightStr='';
   var xID='';
   for (var i=0; i<frm.elements.length; i++) { 
      if ((frm.elements[i].name==xAnsName) && (frm.elements[i].checked)) {
         xWeightStr=frm.elements[i].value;
         if (xWeightStr.indexOf('rand(')>=0) {
            xWeight=randFromStr(xWeightStr);
         } else {
            xWeight=parseInt(xWeightStr);
         }
         if (isNaN(xWeight)) { 
            xWeight=0;
            StrTotals=StrTotals + ':' + frm.elements[i].value;
         }
         Totals=Totals + xWeight;
      }
      if (IsExtra==1) {
         if (frm.elements[i].name==xAnsName) {
            xID=frm.elements[i].id;
            xID=parseInt(xID.replace(/rd/gi, ''));
            if (!isNaN(xID)) {
               if (frm.elements[i].checked) { ExtraResults[xID]=1; } else { ExtraResults[xID]=0; }
            }  
         }
      }
   }
   DebugInfo='Current result: <b>'+Totals+'</b><br /><br />';
   if (StrTotals!='') { DebugInfo=DebugInfo + 'Current string result: <b>'+StrTotals+'</b><br /><br />'; }
   StepCount=AQIndex;
   Results[StepCount]=Totals;
   StrResults[StepCount]=StrTotals;
   return 1;
}

function SubResult(AQIndex) {
   StepCount=AQIndex;
   var xWeight=Results[StepCount];
   if (isNaN(xWeight)) { xWeight=0; }
   Totals=xWeight;
   xWeight=StrResults[StepCount];
   if (typeof(xWeight)=='undefined') { xWeight=''; }
   StrTotals=xWeight;
   DebugInfo='Current result: <b>'+Totals+'</b><br /><br />';
   if (StrTotals!='') { DebugInfo=DebugInfo + 'Current string result: <b>'+StrTotals+'</b><br /><br />'; }
   return 1;
}

function UpdateTotals(AValue) {
   var xValue=parseInt(AValue);
   if (isNaN(xValue)) { xValue=0; }
   if ((AValue.indexOf('+')>=0) || (AValue.indexOf('-')>=0)) {
      Totals=Totals + xValue;
   } else {
      Totals=xValue;
   }
   Results[StepCount]=Totals;
}

function GetQIndex(ALabel) {
   var xQIndex=QArr.length - 1;
   for (var qi=0; qi<QArr.length; qi++) {
      if (QArr[qi][2]==ALabel) {
         return qi;
      }
   }
   DebugInfo=DebugInfo + '<span style="color: red">ERROR: Label not found: "' + ALabel + '"</span><br />';
   return xQIndex;
}

function IsStrInMem(AStr) {
   if (AStr=='') { return 0; }
   var xStrs=AStr.split(',');
   var xFound=0;
   for (var yi=0; yi<xStrs.length; yi++) { 
      if (MemStr.indexOf(':' + xStrs[yi])>=0) {
         xFound++;
      }
   }
   if (xFound==xStrs.length) { return 1; } else { return 0; }
}

function NextBy(AQIndex) {
   for (var xi=AQIndex; xi<QArr.length; xi++) {
      if (QArr[xi][0]=='null') {
         return xi;
      }
   }
   return AQIndex;
}

function PrevBy(AQIndex) {
   var xPrevIndex=GetFrom(AQIndex);
   //if (xPrevIndex<0) {
   //   for (var xi=AQIndex; xi>=0; xi--) {
   //      if (QArr[xi][0]=='null') {
   //         return xi;
   //      }
   //   }
   //}
   return xPrevIndex;
}

function NextByJump(AQIndex) {
   var xTestIndex=QArr[AQIndex][1]+1;
   var xMin=0;
   var xMax=0;
   var xStr='';
   var xStrRange='';
   var xLabel='';
   var xWeight=0;
   var xIsSet=0;
   var xStyle='';
   DebugInfo=DebugInfo + '<span style="color: red">' + QArr[AQIndex][2] + ': </span><b>' + QArr[AQIndex][0] + '</b><br />';
   for (var xi=xTestIndex; xi<AArr.length; xi++) {
      xStyle='';
      if (typeof(AArr[xi])=='object') {
         // Parsing Jump Entry
         xMin=AArr[xi][0];
         xMax=AArr[xi][1];
         xStr=AArr[xi][2];
         xStrRange=AArr[xi][3];
         xLabel=AArr[xi][4];
         xWeight=AArr[xi][5];
         if (xIsSet==0) {
            if (isNaN(xMin)) {
               // String Range
               if (xMin=='else') {
                  xIsSet=1;
               } else {
                  xIsSet=IsStrInMem(xMin);
               }
            } else {
               // Numeric Range
               if ((xMin<=Totals) && (Totals<=xMax)) {
                  xIsSet=1;
                  if (xStr!='') {
                     xIsSet=IsStrInMem(xStr);
                  }
               }
            }
         } else {
            xIsSet=2;
         }
         if (xIsSet==1) { 
            AQIndex=GetQIndex(xLabel);
            if (xWeight!='radio') { UpdateTotals(xWeight); }
            xStyle=' style="color: red"';
         }
         DebugInfo=DebugInfo + '<span' + xStyle + '>&nbsp;&nbsp;&nbsp;Range: <b>' + xStrRange + '</b>, Label: <b>' + xLabel + '</b>';
         if (xWeight!='radio') { DebugInfo=DebugInfo + ', Weight: <b>' + xWeight + '</b>'; }
         DebugInfo=DebugInfo + '</span><br />';
      } else {
         break;
      }
   }
   if (xIsSet==0) { AQIndex=NextBy(AQIndex); }
   return AQIndex;
}

function NextByCmd(AQIndex) {
   var xIsSet=0;
   DebugInfo=DebugInfo + '<span style="color: red">' + QArr[AQIndex][2] + ': </span><b>' + QArr[AQIndex][0] + '</b><br />';
   var xCmd=QArr[AQIndex][0];
   var xStr=QArr[AQIndex][2];
   if        (xCmd=='cmd(sumadd)') {
      MemSum=MemSum + Totals;
      DebugInfo=DebugInfo + '<br />In memory: <b>' + MemSum + '</b><br />';
      xIsSet=1;
   } else if (xCmd=='cmd(sumget)') {
      Totals=Totals + MemSum;
      xIsSet=1;
   } else if (xCmd=='cmd(sumreset)') {
      MemSum=0;
      DebugInfo=DebugInfo + '<br />In memory: <b>' + MemSum + '</b><br />';
      xIsSet=1;
   } else if (xCmd=='cmd(stradd)') {
      var xStrs=xStr.split(',');
      for (var yi=0; yi<xStrs.length; yi++) {
         if (MemStr.indexOf(':' + xStrs[yi])<0) {
            MemStr=MemStr + ':' + xStrs[yi];
         }
      }
      xIsSet=2;
   } else if (xCmd=='cmd(strsub)') {
      var xsIndex=MemStr.indexOf(':'+xStr);
      if (xsIndex>=0) {
         MemStr=MemStr.substr(0,xsIndex) + MemStr.substr(xsIndex + xStr.length + 1);
      }
      xIsSet=2;
   } else if (xCmd=='cmd(strreset)') {
      MemStr='';
      xIsSet=2;
   }
   if (xIsSet==1) {
      AQIndex++;
   } else if (xIsSet==2) {
      AQIndex++;
      DebugInfo=DebugInfo + '<br />In memory string: <b>' + MemStr + '</b><br />';
   } else {
      AQIndex=NextBy(AQIndex);
   }
   return AQIndex;
}

function NextQuestion(AQIndex) {
   AddResult(AQIndex);
   var xPrevID = "qw" + AQIndex;
   var xNextID = "qw" + (AQIndex+1);
   var xCmd=QArr[AQIndex+1][0];
   var xCmdIndex=AQIndex+1;
   while (xCmd!='null') {
      if (xCmd=='cmd(jump)') {
         xCmdIndex=NextByJump(xCmdIndex);
      } else {
         xCmdIndex=NextByCmd(xCmdIndex);
      }
      xNextID = "qw" + xCmdIndex;
      DebugInfo=DebugInfo + '<br />New result: <b>'+Totals+'</b><br /><br />';
      xCmd=QArr[xCmdIndex][0];
   }
   ClearQuestion(AQIndex, xCmdIndex);
   var el=MyGetElementByID(xPrevID);
   if (el!=null) {
      el.style.display="none";
      el=MyGetElementByID(xNextID);
      if (el!=null) {
         el.style.display="block";
         FocusNext(xCmdIndex);
      }
   }
   el=MyGetElementByID('DebugInfo');
   if (el!=null) {
      el.innerHTML='<code>'+DebugInfo+'</code>';
   }
   return 1;
}

function PrevQuestion(AQIndex) {
   var xQIndex=AQIndex-1;
   var xFromIndex=PrevBy(AQIndex);
   var xPrevID = "qw" + (xFromIndex);
   var xNextID = "qw" + (AQIndex);
   SubResult(PrevBy(xFromIndex));
   var el=MyGetElementByID(xNextID);
   if (el!=null) {
      el.style.display="none";
      el=MyGetElementByID(xPrevID);
      if (el!=null) {
         el.style.display="block";
         FocusNext(xFromIndex);
      }
   }
   el=MyGetElementByID('DebugInfo');
   if (el!=null) {
      el.innerHTML='<code>'+DebugInfo+'</code>';
   }
   return 1;
}

function LastQuestion(AQIndex) {
   AddResult(AQIndex);
   var xExtra='';
   if (IsExtra==1) {
      for (var ri=0; ri<ExtraResults.length; ri++) {
          if (ExtraResults[ri]==1) {
             xExtra=xExtra + ri + ':1;';
          }
      }
   }
   var frm=document.forms['TestFrm'];
   if (frm==null) { alert('FATAL ERROR: "Form" element not found!'); return 0; }
   if ((Totals==0) && (StrTotals!='')) {
      frm.totals.value=StrTotals;
   } else {
      frm.totals.value=Totals;
   }
   frm.memsum.value=MemSum;
   if (IsExtra==1) { frm.extra.value=xExtra; }
   if (IsExport==1) {   
      //sndForm('tar', '', 'aeternaTest', frm);
      var html_doc = document.getElementById('aeternaTest');
      var js = document.createElement('script');
      js.setAttribute('language', 'javascript');
      js.setAttribute('type', 'text/javascript');
      var addfrm = document.getElementById('TestFrm').elements;
      tarParams='';
      for (i=0;i<addfrm.length;i++) {
         if (('hidden'==addfrm[i].type) || (addfrm[i].name.indexOf('anstxt')==0)) {
            tarParams=tarParams+addfrm[i].name+'='+addfrm[i].value+'&';
         }
      }
      var utf = '';
      if (window.aeterna_utf == 1) { utf = '&utf=1'; }
      js.setAttribute('src', 'http://aeterna.ru/tar.php?'+tarParams+'ctrlid=aeternaTest'+utf);
      //js.setAttribute('src', 'http://127.0.0.1/da45/php/aeterna/tar.php?'+tarParams+'ctrlid=aeternaTest');
      html_doc.appendChild(js);
   } else {
      frm.submit();
   }
   return 1;
}
