// (C) А.А.Дуванов Роботландский Университет
//------------------------------------------
// Зачетный класс: "Один правильный ответ в списке"
// (работает в Internet Explorer и Netscape Navigator)
// Использование
// -------------
// Зачетный класс представляет собой объект ExamRadio. Необходимо:
// 1. Создать экземпляр объекта
//    var имя_экземпляра = ExamRadio(
//        имя_экземпляра, декодировщик, название,
//        вопрос1, ответ11, ответ12, ..., "#", код_решение1,
//        ....
//        вопросN, ответN1, ответN2, ..., "#", код_решениеN
//                                  );
//    Здесь:
//    имя_экземпляра - имя экземпляра объекта ExamRadio
//    декодировщик   - имя функции, которая пребразует код решения
//                     в номер правильного ответа (нумерация с нуля)
//    название       - заголовок зачетного класса
//    вопросI        - i-ый вопрос зачетного класса
//    ответIJ        - j-ый вариант ответа на i-ый вопрос
//    "#"            - признак конца набора ответов
//    код_решенияI   - код правильного ответа
//
// 2. Написать собственную функцию для преобразования кода правильного
//    ответа в его номер (нумерация с нуля)
//
// 3. Произвести, при необходимости, индивидуальные настройки
//    созданного экземпляра Зачетного класса. доступны для
//    настройки (изменения) следующие свойства:
//
//    border     Толщина рамки таблицы (по умолчанию 0)
//    bgcolor    Фоновый цвет в таблице (по умолчанию "white")
//    background Фоновая картинка в таблице (по умолчанию нет)
//    colortitle Цвет заголовка Зачетного класса (по умолчанию "black")
//    Bonus      Функция для вычисления оценки от двух аргументов:
//               Число_верных_ответов, число вопросов
//               По умолчанию работает функция _Bonus (см. ниже в этом файле)
//
// 4. Показать зачетный класс на экране
//    имя_экземпляра.Show();
//
// Пример использование: файл exam1.htm
//
//------------------------------------------
// Описание одного раздела Зачетного класса
function item(question, num, numright, answers)
{
  this.question=question;     // вопрос
  this.num = num;             // число вариантов ответов
  this.numright=numright;     // номер правильного ответа
  this.answers = new Array(); // массив ответов
  for(var i=0; i<num; i++)
    this.answers[i] = answers[i];
}

// Конструктор
function ExamRadio(name,fun, title)
{
  // Настройки пользователя
  this.border     = 0;          // размер рамки таблицы
  this.bgcolor    = "white";    // фоновый цвет в таблице
  this.background = " ";        // фоновая картинка в таблице
  this.colortitle = "black";    // цвет заголовка Зачетного класса
  this.Bonus      = _Bonus;     // функция для вычисления оценки

  this.name   = name;    // Имя экземпляра объекта
  this.title  = title;   // Заголовок зачетного класса
  this.items  = new Array();  // массив позиций зачетного класса
  this.len;                   // число позиций зачетного класса
  this.NN = (navigator.appName == "Netscape");
  this.Show  = _Show;         // функция для показа Зачетного класса
  this.Check = _Check;        // функция для проверки экзамена
  this.Ini   = _Ini;          // функция для сброса экзамена
  // заполнение  позиций зачетного класса
  var j=0;
  for(var i=3; i<ExamRadio.arguments.length;)
  {

    var question = ExamRadio.arguments[i];
    var answers = new Array();
    var k=0;
    i++;
    while(ExamRadio.arguments[i] != "#")
    {
      answers[k] = ExamRadio.arguments[i];
      k++;
      i++;
    }
    i++;
    var numright = eval(fun+"("+ExamRadio.arguments[i]+")");
    this.items[j] = new item(question, k, numright, answers);
    i++;
    j++;
  }
    this.len=j;
}

// Показать Зачетный класс на экране
function _Show()
{
   document.write("<FORM>"+
     "<TABLE cellspacing=0 cellpadding=4 border="+this.border+
     " bgcolor="+this.bgcolor+
     " background="+this.background+
     "><TR align=left><TD colspan=3><INPUT type=reset value=Сброс"+
     " onclick='"+this.name+".Ini()'>"+
     "</TD></TR><TR><TH colspan=3>"+
     "<FONT color="+this.colortitle+">"+this.title+"</FONT></TH></TR>");
   for(var i=0; i<this.len; i++)
   {
     var ind = this.NN ? "" : "<FONT color="+this.colortitle+
                              "><DIV id=i"+this.name+i+">&nbsp;</DIV></FONT>";
     var str =
       "<TR align=left valign=top>"+
       "<TD rowspan="+eval(this.items[i].num+1)+">"+eval(i+1)+"."+ind+"</TD>"+
       "<TD colspan=2>"+this.items[i].question+"</TD></TR>";
     for(var j=0; j<this.items[i].num; j++)
     {
        str += "<TR align=left valign=top>"+
               "<TD><INPUT type=radio name="+this.name+i+
               eval('j ? ">":" checked>"')+
               "</TD><TD>"+this.items[i].answers[j]+"</TD></TR>";
     }
     document.write(str);
   }

   document.write("<TR align=left><TD colspan=3>"+
     "<INPUT type=button value=Оценка"+
     " onclick='"+this.name+".Check(this.form)'></TD></TR></TABLE></FORM>");
}

// Проверка экзамена
function _Check(forma)
{
  var rezult = "";
  var bonus;
  var right=0;
  for(var i=0; i<this.len; i++)
  {
    if(eval("forma."+this.name+i+"["+this.items[i].numright+"].checked"))
    {
      right++;
      if(!this.NN) eval("document.all[\"i"+this.name+i+"\"].innerText='+'");
    }
    else
   {
     rezult += eval(i+1)+",";
      if(!this.NN) eval("document.all[\"i"+this.name+i+"\"].innerText='-'");
   }
  }
  if(rezult != "") rezult= rezult.substring(0, rezult.length-1);


  bonus = this.Bonus(right, this.len);

  var str =
        "Ваши результаты:\n"+
        "Число вопросов:  "+this.len+"\n"+
        "Верных ответов:  "+right+" ("+Math.floor(right*100/this.len)+"%)\n"+
        "Оценка: "+bonus+"\n";
  if(right!=this.len)
    str += "Неверные ответы даны на следующие вопросы:\n"+rezult;
  alert(str);
}

// Вычисление оценки
function _Bonus(right, num)
{
  if(right==num)            return 5;
  else if (right > 3*num/5) return 4;
  else if (right > num/2)   return 3;
  else                      return 2;
}

// Сброс
function _Ini()
{
  if(!this.NN)
  {
    for(var i=0; i<this.len; i++)
      eval("document.all[\"i"+this.name+i+"\"].innerText=' '");
  }
}
