// Исполнитель Код Листика
// ---------------------------

var picBonusRU = new Array(
'<IMG src=./pic/prav00.gif width=56 height=60 onmouseover="this.src=\'./pic/prav01.gif\'" onmouseout="this.src=\'./pic/prav00.gif\'" border=0 alt="Незнайка">',
'<IMG src=./pic/prav10.gif width=56 height=60 onmouseover="this.src=\'./pic/prav11.gif\'" onmouseout="this.src=\'./pic/prav10.gif\'" border=0 alt="Торопыжка">',
'<IMG src=./pic/prav20.gif width=56 height=60 onmouseover="this.src=\'./pic/prav21.gif\'" onmouseout="this.src=\'./pic/prav20.gif\'" border=0 alt="Студент">',
'<IMG src=./pic/prav30.gif width=56 height=60 onmouseover="this.src=\'./pic/prav31.gif\'" onmouseout="this.src=\'./pic/prav30.gif\'" border=0 alt="Профессор">'
                          );

var messTaskRU = new Array("Передан код: ", "Закодируйте число: ", "Получено: ");


// Конструктор Код Листика
// ----------------------------
function listikRU(name,type,numtasks)
{
  this.tasks     = new Array(); // массив заданий (число, код)
  this.type      = type;        // тип задания
  this.numtasks  = numtasks;    // число заданий
  this.name      = name;        // имя экземпляра
  this.nameform  = name+"f";    // имя формы
  this.edname    = "rs";        // имя поля ввода
  this.lenname   = name+"l";    // имя поля "число заданий"
  this.taskname  = name+"t";    // имя поля "текст задания"
  this.bonusname = name+"b";    // имя поля "отметки о решении"
  this.zname     = name+"z";    // имя картинки "звание"
  this.ready     = false;       // готовность к решению
  this.num       = 0;           // текущий номер задания
  this.bonusmark = "";          // отметки о правильности решения задач
  this.bonusplus = 0;           // число правильно решенных задач

  this.heighted  = "28pt";      // высота для текста заданий

  this.number;                  // Число Листика (рабочая переменная)
  this.kod;                     // Код числа Листика (рабочая переменная)

  // Функции
  this.showListikRU  = _showListikRU;  // Показать исполнителя
  this.clearListikRU = _clearListikRU; // Сброс исполнителя
  this.undoListikRU = _undoListikRU;   // Откатка последнего задания
  this.enterListikRU = _enterListikRU; // Ввод пользователя
  this.bonusRU = _bonusRU;           // Вывод картинки-бонуса

  this.listikPutKodRU = _listikPutKodRU; // генерация числа м кода
  this.putTaskRU      = _putTaskRU;      // Вывод на экран задания
  this.checkRU        = _checkRU;        // проверка правильности ввода
  this.DecDigitToBin  = _DecDigitToBin;  // Десятичная цифра в двоичный код
  this.DecToBinRU     = _DecToBinRU;     // 10 --> 2
}

// Вывод на экран задания n
// --------------------------------------------------
function _putTaskRU(n)
{
  var str = parseInt(n+1) + ". " + messTaskRU[this.type];

  if (this.type == 0)      str +=  this.tasks[n][1].substring(0,4)+" "+this.tasks[n][1].substring(4);
  else if (this.type == 1) str +=  this.tasks[n][0];
  else
  {
    // Утроение каждого сигнала
    for(var i=0; i<this.tasks[n][1].length; i++)
    {
      // Искажение одного сигнала из трех
      var j = 3;
      if (10*Math.random() < 7) j = Math.floor(3*Math.random());
      //if (j==3) j--;
      for(var k=0; k<3; k++)
       if(k==j) str += this.tasks[n][1].charAt(i) == 0 ? 1:0;
       else     str += this.tasks[n][1].charAt(i);
      str += " ";
      if(!((i+1)%4)) str += " ";
    }
  }

  // Очистка строки ввода
  eval("document."+this.nameform+"."+this.edname+".value=''");
  // Вывод нового задания
  eval("document.all['"+this.taskname+"'].innerHTML=str");
  // Фокус ввода поместить в строку
  eval("document."+this.nameform+"."+this.edname+".focus()");
}

// Проверим правильность ввода
function _checkRU(str)
{
  if (this.type == 0)
  {
    if (isNaN(str)) return false;
    else            return !(str-this.tasks[this.num][0]);
  }
  else if (this.type == 1)
  {
    var s = "";
    // Удалим лишние пробелы, если есть
    for(i=0; i<str.length; i++)
      if (str.charAt(i) != " ") s += str.charAt(i);
    return s == this.tasks[this.num][1];
  }
  else
  {
    if (isNaN(str)) return false;
    else            return !(str-this.tasks[this.num][0]);
  }

}

// Генерация n-значного числа и кода Листика для него
// --------------------------------------------------
function _listikPutKodRU(n)
{
  var i;
  this.number = "";
  this.kod = "";
  // генерация числа
  for(i=0; i<n; i++)
    this.number += Math.floor(10*Math.random());
    if (this.number == 10) this.number--;
  // код  для сгенерированного числа
  for(i=0; i<n; i++)
    this.kod += this.DecDigitToBin(this.number.charAt(i));
}


// Перевод десятичной цифры в код Листика
// --------------------------------------
function _DecDigitToBin(digit)
{
  var str = this.DecToBinRU(digit);
  while(str.length < 4) str = "0"+str;
  return str;
}

// Перевод 10-тичного в 2-ное
// --------------------------
function _DecToBinRU(num)
{
  var ret="";
  while(num>1)
  {
     ret = num%2+ret;
     num = Math.floor(num/2);
  }
  ret = num+ret;
  return ret;
}


// Сброс исполнителя
// -----------------
function _clearListikRU()
{

  // Генерируем задания
  for (var i=0; i<this.numtasks; i++)
  {
    var n = this.type < 2 ? 2:1;
    this.listikPutKodRU(n);
    this.tasks[i]    = new Array();
    this.tasks[i][0] = this.number; // Число Листика
    this.tasks[i][1] = this.kod;    // Код числа Листика
  }

  eval("document.all['"+this.zname+"'].innerHTML=picBonusRU[3]");
  this.putTaskRU(0); // вывод на экран первого задания

  eval("document.all['"+this.lenname+"'].innerText=this.tasks.length");
  eval("document.all['"+this.bonusname+"'].innerHTML='&nbsp;'");
  this.ready = true;
  this.num   = 0;
  this.bonusmark = "";
  this.bonusplus = 0;

}

// Откатка последнего задания
// --------------------------
function _undoListikRU()
{
  if (this.ready && this.num)
  {
    this.num--;
    if (this.bonusmark.charAt(this.bonusmark.length-2) == "+")
    {
      this.bonusplus--;
      this.bonusmark = this.bonusmark.substring(0,this.bonusmark.length-2);
    }
    else
      this.bonusmark = this.bonusmark.substring(0,this.bonusmark.length-7);


    // Вывод строки с отметками о правильности решения
     eval("document.all['"+this.bonusname+"'].innerHTML=this.bonusmark");

    // Вывод числа оставшихся задач
    eval("document.all['"+this.lenname+"'].innerText=this.tasks.length-this.num");

    // Вывод нового задания
    this.putTaskRU(this.num);

    // Вывод текущего звания-картинки
    this.bonusRU();
  }
}

// Ввод пользователя
// -----------------
function _enterListikRU()
{
  if (this.ready)
  {
    if(this.num < this.tasks.length)
    {
      var str = eval("document."+this.nameform+"."+this.edname+".value");
      if (str == "") alert("Ничего не записано!");
      else
      {
        var znak = "&#150;";

        // Проверим правильность ввода
        if (this.checkRU(str)) {znak = "+"; this.bonusplus++;}

        if (str == this.tasks[this.num][2]) {znak = "+"; this.bonusplus++;}
        this.bonusmark += znak+ " ";

        // Вывод строки с отметками о правильности решения
        eval("document.all['"+this.bonusname+"'].innerHTML=this.bonusmark");

        this.num++

        // Вывод числа оставшихся задач
        eval("document.all['"+this.lenname+"'].innerText=this.tasks.length-this.num");

        // Вывод нового задания
        if(this.num < this.tasks.length) this.putTaskRU(this.num);
        else
          eval("document.all['"+this.taskname+"'].innerHTML='<B style=\" color:red\">Все задания выполнены!</B>'");

        // Вывод текущего звания-картинки
        this.bonusRU();

      }
    }
    else alert("Все задания выполнены!");
  }

}

//--------------------------------------------------------
// Вывести оценку
// --------------
// Алгоритм определениЯ оценки:
//
// 5 - ошибок нет                         0
// 4 - ошибок меньше 2/5 от числа задач   1
// 3 - ошибок меньше 1/2 от числа задач   2
// 2 - в остальных случаЯх                3

function  _bonusRU()
{
  var bonus; // индекс картинки
  var error = this.num-this.bonusplus;

  if (!error)                    bonus = 3;
  else if (error < 2*this.num/5) bonus = 2;
  else if (error < this.num/2)   bonus = 1;
  else                           bonus = 0;

  eval("document.all['"+this.zname+"'].innerHTML=picBonusRU[bonus]");
}

// Показать исполнителя
// --------------------
function _showListikRU()
{
  var str = "<FORM name="+this.nameform+">";
  str += '<DIV style="background-color:#EEE5DB;width:480;border-style:solid;border-width:2px;border-left-color:silver;border-top-color:silver;border-right-color:gray;border-bottom-color:gray;padding:10px;">';
  str += '<TABLE border=0 cellspacing=0 cellpadding=5 width=100%>';

  str += '<TR valign=top>';
  str +=  '<TD><IMG src=./pic/listik.gif width=310 height=41 border=0 alt=""></TD>';
  str +=  '<TD><IMG src=./pic/clear.gif width=113 height=41 border=0 alt="Сброс" onmouseup="'+this.name+'.clearListikRU()" onmousedown="this.src=\'./pic/clear2.gif\'" onmouseover="this.src=\'./pic/clear1.gif\'" '+
          'onmouseout ="this.src=\'./pic/clear.gif\'"></TD>';
  str += '</TR>';

  str += '<TR valign=top>';
  str +=   '<TD><INPUT style="font-size:10pt" type=text size=37 name='+this.edname+' value="" onkeypress="if(event.keyCode==13) '+this.name+'.enterListikRU()"></TD>';
  str +=   '<TD><NOBR><IMG src=./pic/key5.gif width=30 height=30 border=0 alt=Ввод onmouseover="this.src=\'./pic/key5_.gif\'" onmouseout="this.src=\'./pic/key5.gif\'" onclick="'+this.name+'.enterListikRU()">'+
           ' <IMG src=./pic/key6.gif width=30 height=30 border=0 alt=Откатка onmouseover="this.src=\'./pic/key6_.gif\'" onmouseout="this.src=\'./pic/key6.gif\'" onclick="'+this.name+'.undoListikRU()">'+
           '<INPUT type=text size=1 style="visibility:hidden">'+
           '<SPAN id='+this.lenname+' style="font-size:14pt;color:#BE9802;font-weight:bold;">&nbsp;</SPAN></NOBR></TD>';
  str += '</TR>';

  str += '<TR valign=top>';
  str +=   '<TD colspan=2><SPAN id='+this.taskname+' style="height:'+this.heighted+';font-size:12pt;color:black;">Нажмите кнопку <B style="color:#009900">Сброс</B></SPAN></TD>';
  str += '</TR>';
  str += '<TR valign=top>';
  str +=   '<TD><BR><IMG src=./pic/line.gif width=310 height=2 border=0 alt=""><BR><SPAN id='+this.bonusname+' style=" font-size:14pt;color:#BE9802;font-weight:800;">&nbsp;</SPAN></TD>';
  str +=   '<TD id='+this.zname+' align=right><IMG src=./pic/prav30.gif width=56 height=60  border=0 alt=""></TD>';
  str += '</TR>';

  str += '</TABLE></DIV></FORM>';

  //alert(str);
  document.write(str);
}
