// Универсальный зачётный класс

// Глобальные константы
// -----------------------------
var cellpaddingRU = 4;   // Промежуток между содержимым и гранью клетки
var room;                // Зачетный класс
var ret;                 // Результат проверки

// ---------------------
// Выбор на радиокнопках
// ---------------------
// teach         true для варианта учителя
// num           номер задания (число)
// description   описание задания (строка)
// vers          варианты ответа (массив строк)
// answ          ответы число (номер варианта, начиная с нуля)
// ----------------------------------------------
function ZRadioRU(teach, num, description, vers, answ)
{
  var str = '<P><TABLE border=0 cellspacing=0 cellpadding='+cellpaddingRU+'>';


  // первая строка
  str += '<TR valign=top align=left>';
  // номер задания
  str += '<TD valign=top>'+eval(num+1)+'.</TD>';
  // постановка задачи
  str += '<TD>';
  str += description;
  str += '</TD>';
  str += '</TR>';

  // вторая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';

  // Задать смещение для вывода вариантов
  var move = Math.floor(vers.length*Math.random());
  // Номер правильного ответа
  var answmove = answ-move;
  if (answmove < 0) answmove += vers.length-0;

  // радиокнопки
  str += '<TD><TABLE  border=0 cellspacing=0 cellpadding=4>';
  for (var i=0; i<vers.length; i++)
  {
    str += '<TR valign=top align=left><TD><INPUT type=radio name=itemr'+num;
    if ((teach && i == answmove) || (!teach && i==0))  str += ' checked';
    var ind = i+ move;
    if (ind > vers.length-1) ind -= vers.length;
    str += ' ></TD><TD>'+vers[ind]+'</TD></TR>';

  }
  str += '</TABLE></TD>';


  // третья строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';
  str += '<TD>';
  str += '<INPUT type=button value=Проверить';
  str += '       onclick="';
  str += '                room.Answer = this.form.itemr'+num+'['+answmove+'].checked ? room.Yes : room.No;';
  str += '                room.Check('+eval(num+1)+');"> ';
  str += '<INPUT class=check type=text size=14 name=result'+eval(num+1)+' readonly>';
  str += '</TD>';
  str += '</TR>';
  str += '</TABLE>';

  // if (num==8) alert(str);
  return str;

}

// ----------------
// Выбор на флажках
// ----------------
// teach         true для варианта учителя
// num           номер задания (число)
// description   описание задания (строка)
// vers          варианты ответа (массив строк)
// answ          ответы (массив из true, false)
// ----------------------------------------------
function ZFlagRU(teach, num, description, vers, answ)
{
  var i, ind;
  var str = '<P><TABLE border=0 cellspacing=0 cellpadding='+cellpaddingRU+'>';


  // первая строка
  str += '<TR valign=top align=left>';
  // номер задания
  str += '<TD valign=top>'+eval(num+1)+'.</TD>';
  // постановка задачи
  str += '<TD>';
  str += description;
  str += '</TD>';
  str += '</TR>';

  // вторая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';

  // Задать смещение для вывода вариантов
  var move = Math.floor(vers.length*Math.random());

  // флажки
  str += '<TD><TABLE  border=0 cellspacing=0 cellpadding=4>';
  for (i=0; i<vers.length; i++)
  {
    str += '<TR valign=top align=left><TD><INPUT type=checkbox name=itemf'+num;
    ind = i+ move;
    if (ind > vers.length-1) ind -= vers.length;
    if (teach && answ[ind])  str += ' checked';
    str += ' ></TD><TD>'+vers[ind]+'</TD></TR>';

  }
  str += '</TABLE></TD>';


  // третья строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';
  str += '<TD>';
  str += '<INPUT type=button value=Проверить';
  str += ' onclick=" ret = false; if (' ;

  for (i=0; i<vers.length; i++)
  {
    var ind = i+ move;
    if (ind > vers.length-1) ind -= vers.length;
    if (!answ[ind]) str += '!';
    str += 'this.form.itemf'+num+'['+i+'].checked';
    if(i < vers.length-1) str += ' && ';
  }
  str += ') ret = true;'
  str += ' room.Answer = ret ? room.Yes : room.No;';
  str += ' room.Check('+eval(num+1)+');"> ';
  str += '<INPUT class=check type=text size=14 name=result'+eval(num+1)+' readonly>';
  str += '</TD>';
  str += '</TR>';
  str += '</TABLE>';

  // if (num==3) alert(str);
  return str;

}

// Построение алгоритма из выпадающих меню
// ---------------------------------------
// teach         true для варианта учителя
// num           номер задания (число)
// description   описание задания (строка)
// vers          набор позиций меню (массив строк)
// answ          ответы (массив из номеров правильных позиций меню)
// ----------------------------------------------
function ZAlgoritmMenuRU(teach, num, description, vers, answ)
{
  var i;
  var str = '<P><TABLE border=0 cellspacing=0 cellpadding='+cellpaddingRU+'>';


  // первая строка
  str += '<TR valign=top align=left>';
  // номер задания
  str += '<TD valign=top>'+eval(num+1)+'.</TD>';
  // постановка задачи
  str += '<TD>';
  str += description;
  str += '</TD>';
  str += '</TR>';

  // вторая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';


  // Построение пунктов алгоритма
  str += '<TD><TABLE  border=0 cellspacing=0 cellpadding=4>';
  for (i=0; i<answ.length; i++)
  {
    str += '<TR valign=top align=left>';
    // Номер пункта алгоритма
    str += '<TD>'+eval(i+1)+'.</TD><TD>';
    // Построение меню для i-го пункта алгоритма
    str += '<SELECT name=itemm'+num+i+'>';
    // Построение позиций меню
    for (var j=0; j<vers.length; j++)
    {
       str += '<OPTION';
       if ((teach && j == answ[i]) || (!teach && j==0)) str += ' selected';
       str += '>'+vers[j]+'</OPTION>'
    }
    str += '</SELECT><TD></TR>';
  }
  str += '</TABLE></TD>';


  // третья строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';
  str += '<TD>';
  str += '<INPUT type=button value=Проверить';

  // Проверка решения
  str += ' onclick=" ret = ';
  for (var i=0; i<answ.length; i++)
  {
     str += 'this.form.itemm'+num+i+'.selectedIndex == '+answ[i];
     if (i<answ.length-1) str += ' && ';
  }
  str += ';'
  str += ' room.Answer = ret ? room.Yes : room.No;';
  str += ' room.Check('+eval(num+1)+');"> ';
  str += '<INPUT class=check type=text size=14 name=result'+eval(num+1)+' readonly>';
  str += '</TD>';
  str += '</TR>';
  str += '</TABLE>';

  // if (num==7) alert(str);
  return str;
}

// Выбор ответа к картинке из выпадающих меню
// ------------------------------------------
// teach         true для варианта учителя
// num           номер задания (число)
// description   описание задания (строка)
// vers          набор позиций меню (массив строк)
// answ          ответ (номер правильной позиции меню)
// pic           ссылка на картинку
// ----------------------------------------------
function ZPicMenuRU(teach, num, description, vers, answ, pic)
{
  var i;
  var str = '<P><TABLE border=0 cellspacing=0 cellpadding='+cellpaddingRU+'>';


  // первая строка
  str += '<TR valign=top align=left>';
  // номер задания
  str += '<TD valign=top>'+eval(num+1)+'.</TD>';
  // постановка задачи
  str += '<TD>';
  str += description;
  str += '</TD>';
  str += '</TR>';

  // вторая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';


  // Построение пунктов алгоритма
  str += '<TD>';
  // Построение меню
  str += '<SELECT name=picmenu'+num+'>';
  // Построение позиций меню
  for (var j=0; j<vers.length; j++)
  {
    str += '<OPTION';
    if ((teach && j == answ) || (!teach && j==0)) str += ' selected';
    str += '>'+vers[j]+'</OPTION>'
  }
  str += '</SELECT>';
  str += '</TD>';
  str += '</TR>';


  // третья строка (картинка)
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';
  str += '<TD>';
  str += '<IMG src='+pic+' border=0 hspace=0 vspace=0 alt="">';
  str += '</TD>';
  str += '</TR>';


  // четвертая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';
  str += '<TD>';
  str += '<INPUT type=button value=Проверить';

  // Проверка решения
  str += ' onclick=" ret = ';
  str += 'this.form.picmenu'+num+'.selectedIndex == '+answ;
  str += ';'
  str += ' room.Answer = ret ? room.Yes : room.No;';
  str += ' room.Check('+eval(num+1)+');"> ';
  str += '<INPUT class=check type=text size=14 name=result'+eval(num+1)+' readonly>';
  str += '</TD>';
  str += '</TR>';
  str += '</TABLE>';

  // if (num==9) alert(str);
  return str;
}


/*
// Выбор ответа из выпадающих меню
// teach         true для варианта учителя
// num           номер задания (число)
// description   описание задания (строка)
// vers          набор позиций меню (массив строк)
// answ          ответ (номер правильной позиции меню)
// ----------------------------------------------
function ZMenuRU1(teach, num, description, vers, answ)
{
  var i;
  var str = '<P><TABLE border=0 cellspacing=0 cellpadding='+cellpaddingRU+'>';


  // первая строка
  str += '<TR valign=top align=left>';
  // номер задания
  str += '<TD valign=top>'+eval(num+1)+'.</TD>';
  // постановка задачи
  str += '<TD>';
  str += description;
  str += '</TD>';
  str += '</TR>';

  // вторая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';


  // Построение пунктов алгоритма
  str += '<TD>';
  // Построение меню
  str += '<SELECT name=picmenu'+num+'>';
  // Построение позиций меню
  for (var j=0; j<vers.length; j++)
  {
    str += '<OPTION';
    if ((teach && j == answ) || (!teach && j==0)) str += ' selected';
    str += '>'+vers[j]+'</OPTION>'
  }
  str += '</SELECT>';
  str += '</TD>';
  str += '</TR>';


  // третья строка (картинка)
  //str += '<TR valign=top align=left>';
  //str += '<TD>&nbsp;</TD>';
  //str += '<TD>';
  //str += '<IMG src='+pic+' border=0 hspace=0 vspace=0 alt="">';
  //str += '</TD>';
  //str += '</TR>';


  // четвертая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';
  str += '<TD>';
  str += '<INPUT type=button value=Проверить';

  // Проверка решения
  str += ' onclick=" ret = ';
  str += 'this.form.picmenu'+num+'.selectedIndex == '+answ;
  str += ';'
  str += ' room.Answer = ret ? room.Yes : room.No;';
  str += ' room.Check('+eval(num+1)+');"> ';
  str += '<INPUT class=check type=text size=14 name=result'+eval(num+1)+' readonly>';
  str += '</TD>';
  str += '</TR>';
  str += '</TABLE>';

  // if (num==9) alert(str);
  return str;
}
*/

// Выбор ответа из выпадающих меню
// --------------------------------
// Первая позиция: ? (не может быть правильной)   
// teach         true для варианта учителя
// num           номер задания (число)
// description   описание задания (строка)
// vers          набор позиций меню (массив строк)
// answ          ответ (номер правильной позиции меню)
// ----------------------------------------------
function ZMenuRU(teach, num, description, vers, answ)
{
  var i;
  var ind;
  var str = '<P><TABLE border=0 cellspacing=0 cellpadding='+cellpaddingRU+'>';


  // первая строка
  str += '<TR valign=top align=left>';
  // номер задания
  str += '<TD valign=top>'+eval(num+1)+'.</TD>';
  // постановка задачи
  str += '<TD>';
  str += description;
  str += '</TD>';
  str += '</TR>';

  // вторая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';

  // Задать смещение для вывода вариантов
  var move = Math.floor((vers.length-1)*Math.random());

  // Номер правильного ответа
  var answmove = answ-move;
  if (answmove < 1) answmove += vers.length-1;

  // Построение пунктов алгоритма
  str += '<TD>';
  // Построение меню
  str += '<SELECT name=picmenu'+num+'>';
  // Построение позиций меню
  for (var j=0; j<vers.length; j++)
  {
    str += '<OPTION';

    ind = (j==0) ? 0: j+ move;
    if (ind > vers.length-1) ind = ind - vers.length + 1;

    if ((teach && j == answmove) || (!teach && j==0)) str += ' selected';
    str += '>'+vers[ind]+'</OPTION>'
  }
  str += '</SELECT>';
  str += '</TD>';
  str += '</TR>';

  // четвертая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD>';
  str += '<TD>';
  str += '<INPUT type=button value=Проверить';

  // Проверка решения
  str += ' onclick=" ret = ';
  str += 'this.form.picmenu'+num+'.selectedIndex == '+answmove;
  str += ';'
  str += ' room.Answer = ret ? room.Yes : room.No;';
  str += ' room.Check('+eval(num+1)+');"> ';
  str += '<INPUT class=check type=text size=14 name=result'+eval(num+1)+' readonly>';
  str += '</TD>';
  str += '</TR>';
  str += '</TABLE>';

  return str;
}

// Запись ответа в строку ввода
//-----------------------------
// teach         true для варианта учителя
// num           номер задания (число)
// description   описание задания (строка)
// answ          ответ 
// before        текст до поля ввода
// after         текст после поля ввода
// down          если true, то переводить в нижний регистр
// winput        ширина строки ввода
//-----------------------------
function ZTextRU(teach, num, description, answ, before, after, down, winput)
{
  var j,k;
  var str = '<P><TABLE border=0 cellspacing=0 cellpadding='+cellpaddingRU+'>';

  // первая строка
  str += '<TR valign=top align=left>';
  // номер задания
  str += '<TD valign=top>'+eval(num+1)+'.</TD>';

  // постановка задачи
  str += '<TD>';
  str += description;
  str += '</TD>';
  str += '</TR>';

  // вторая строка
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD><TD>';

  // поле для ответа
  str += before;
  if(teach)
    str += '<INPUT type=text size='+winput+' value="'+answ+
            '" name=zt'+num+' ';
  else
    str += '<INPUT type=text size='+winput+' name=zt'+num+' ';

  str += '       onkeypress="if(event.keyCode==13)';
  str += '                   {';
  str += '                     room.Answer = checkZTextRU(this.value,\''+answ+'\','+down+') ? room.Yes : room.No;';
  str += '                     room.Check('+eval(num+1)+');';
  str += '                   }">';
  str += after;
  str += '</TD></TR>';

  // третья строка 
  str += '<TR valign=top align=left>';
  str += '<TD>&nbsp;</TD><TD>';

  str += '<INPUT type=button value=Проверить';
  str += '       onclick="';
  str += '                room.Answer = checkZTextRU(this.form[\'zt'+num+'\'].value,\''+answ+'\','+down+') ? room.Yes : room.No;';
  str += '                 room.Check('+eval(num+1)+');"> ';

  str += '<INPUT class=check type=text size=14 name=result'+eval(num+1)+' readonly>';
  str += '</TD>';
  str += '</TR>';
  str += '</TABLE>';

//  if (num==1) alert(str);
  return str;
}

// Проверка ответа

function checkZTextRU(value, answ, down)
{
  var str = down ? value.toLowerCase() : value; 
  return DelBlanks(str) == answ;
}

function DelBlanks(st)
{
  var str = "";
  for(var i=0; i<st.length; i++) if (st.charAt(i) != " ") str +=st.charAt(i);
  return str;
}
