/**
   @brief Очистка элементов формы с временем.
   
   Параметры a1-a6 - поля ввода даты
*/
function CleanStamp(a1, a2, a3, a4, a5, a6) {
    document.getElementById(a1).value = '';
    document.getElementById(a2).value = '';
    document.getElementById(a3).value = '';
    document.getElementById(a4).value = '';
    document.getElementById(a5).value = '';
    document.getElementById(a6).value = '';
}

/**
   @brief Установка текущего времени элементов формы с временем.
   
   Параметры a1-a6 - поля ввода даты
*/
function SetStamp(a1, a2, a3, a4, a5, a6) {
    date = new Date();
    document.getElementById(a1).value = date.getFullYear();
    
    /* т.к. месяц здесь 0-11  */
    document.getElementById(a2).value = date.getMonth()+1; 
    
    document.getElementById(a3).value = date.getDate();
    document.getElementById(a4).value = date.getHours();
    document.getElementById(a5).value = date.getMinutes();
    document.getElementById(a6).value = date.getSeconds();
}

/**
   @brief Открытие соответствующего IFRAME'а для редактирования FK  

   @param inputName
   @param tName
   @param keyName
   @param valName
   @param nullFlag
*/
function EditIFrame(inputName, tName, keyName, valName, nullFlag) {

  document.getElementById(inputName+'IFrame').src = 
    'fkedit.php?input_name='+inputName
    +'&table='+tName
    +'&key='+keyName
    +'&value='+valName
    +'&nullable='
    +nullFlag;

  document.getElementById(inputName+'IFrame').style.display = 'block';
}

/* Открытие соответствующего SLAVE IFRAME'а для редактирования FK  */
function SlaveEditIFrame(inputName, tName, keyName, valName, inputMaster, tMaster, keyMaster, valMaster, nullFlag) {
  var MasterInput = document.getElementById(inputMaster);
  var MasterId = MasterInput.options[MasterInput.selectedIndex].value;

  document.getElementById(inputName+'IFrame').src = 
    'sfkedit.php?input_name='+inputName
    +'&table='+tName
    +'&key='+keyName
    +'&value='+valName
    +'&master_name='+inputMaster
    +'&table_master='+tMaster
    +'&key_master='+keyMaster
    +'&val_master='+valMaster
    +'&nullable='+nullFlag
    +'&master_id='+MasterId;

  document.getElementById(inputName+'IFrame').style.display = 'block';
}

/* Открытие соответствующего MASTER IFRAME'а для редактирования FK  */
function MasterEditIFrame(
			  inputName, tName, keyName, 
			  valName, inputSlave, tSlave, 
			  keySlave, valSlave, nullFlag) {
  document.getElementById(inputName+'IFrame').src = 
    'mfkedit.php?input_name='+inputName
    +'&table='+tName+
    '&key='+keyName+
    '&value='+valName
    +'&slave_name='+inputSlave
    +'&table_slave='+tSlave
    +'&key_slave='+keySlave
    +'&val_slave='+valSlave
    +'&nullable='+nullFlag;

  document.getElementById(inputName+'IFrame').style.display = 'block';
}

function Cancel(inputId) {
  var iframe=parent.document.getElementById(inputId + 'IFrame');
  iframe.style.display = 'none';
}

/* Удаление строки в окне редактирования FK  */
/**********************************************************************************************
* tableId - id редактируемой таблицы;
* rowId - id удаляемой строки:
*     - если имеет префикс row, то это существующая, информация о ней заносится в deleted;
*     - если префикс new, то это созданная только в этом FKIframe.
* key - значение ключа для deps. 
***********************************************************************************************/
function DeleteRow( tableId, rowId, key  ) {
  if (confirm('Данная оперция уничтожит '+deps[key]+' записей.'+'\n'+'Вы уверены?')) {
    var tBody = document.getElementById(tableId).tBodies[0];
    for (var i=0; i < tBody.rows.length; i++) {
      if (tBody.rows[i].id==(rowId)) {
	rowIndex=i;
	break;
      };
    };
    if (rowId.substr(0, 3) != 'new') {
      deleted.push(rowId);
    };
    tBody.deleteRow(rowIndex);
  };
}

/******************************************************
* Добавление пустой строки в окно редактирования FK.
* tableId - id таблицы, в которую добавляется строка.
* newsCount - глоб. переменная, содержащая количество уже
*             добавлявшихся строк, служит для гарантии 
*             уникальности имен и id.
******************************************************/
function AppendRow(tableId) {
  newsCount++;
  var tBody = document.getElementById(tableId).tBodies[0];

  // Создаем строку
  var newRow = tBody.insertRow(-1);
  newRow.id='new'+newsCount;

  // Вставляем ячейку с text input.
  var cell = newRow.insertCell(0);
  var TInput = document.createElement('INPUT');
      TInput = document.createElement('INPUT');
      TInput.type='text';
      TInput.name='newInput'+newsCount;
      TInput.value='';
  cell.appendChild(TInput);

  // Всавляем ячейку с элементами управления
  cell = newRow.insertCell(1);
  TImg = document.createElement('IMG');
      TImg.src='/images/edit/delete.gif';
  TA = document.createElement('A');
      TA.href='javascript:DeleteRow(\''+tableId+'\', \''+newRow.id+'\', -1);';
      TA.appendChild(TImg);
  cell.appendChild(TA);

  TImg = document.createElement('IMG');
      TImg.src='/images/edit/new.gif';
  TA = document.createElement('A');
      TA.href='javascript:AppendRow(\''+tableId+'\');';
      TA.appendChild(TImg);
  cell.appendChild(TA);

}

function FindRowPos(tableId, rowId) {

  var tBody = document.getElementById(tableId).tBodies[0];
  for (var i=0; i < tBody.rows.length; i++) {
    if (tBody.rows[i].id==rowId) {
      return i;
    };
  };
  return null; // Это на случай, если ничего не нашлось.
}

/******************************************************
* Добавление пустой строки в окно редактирования FK.
* tableId - id таблицы, в которую добавляется строка.
* rowId - id строки, после которой надо вставлять,
* если равно (-1) - то в начало.
* Если равно (-2) - то в конец.
* newsCount - глоб. переменная, содержащая количество уже
*             добавлявшихся строк, служит для гарантии 
*             уникальности имен и id.
******************************************************/
function InsertRow(tableId, rowId) {
  newsCount++;
  var tBody = document.getElementById(tableId).tBodies[0];

  // Создаем строку
  var rowPos = null;
  if (rowId == -1) {
    rowPos = 0;
  } else {
  };
  switch(rowId) {
  case -1:
    rowPos = 0;
    break;
  case -2:
    rowPos = -1;
    break;
  default:
    rowPos = FindRowPos(tableId, rowId)+1;
  };

  var newRow = tBody.insertRow(rowPos);
  newRow.id='new'+newsCount;

  // Вставляем ячейку с text input.
  var cell = newRow.insertCell(0);
  var TInput = document.createElement('INPUT');
      TInput = document.createElement('INPUT');
      TInput.type='text';
      TInput.name='newInput'+newsCount;
      TInput.value='';
  cell.appendChild(TInput);

  // Всавляем ячейку с элементами управления
  cell = newRow.insertCell(1);
  TImg = document.createElement('IMG');
      TImg.src='/images/edit/delete.gif';
  TA = document.createElement('A');
      TA.href='javascript:DeleteRow(\''+tableId+'\', \''+newRow.id+'\', -1);';
      TA.appendChild(TImg);
  cell.appendChild(TA);

  TImg = document.createElement('IMG');
      TImg.src='/images/edit/new.gif';
  TA = document.createElement('A');
      TA.href='javascript:InsertRow(\''+tableId+'\', \''+newRow.id+'\');';
      TA.appendChild(TImg);
  cell.appendChild(TA);

}

/**************************************
* почему-то непосредсвенно 
* из event-handler'а это не работет %-/
**************************************/
function MarkChanged(key) {
  changed.push(key);
}

/*****************************************
* записывает javascript-массивы измененных
* и удаленных значений в один input.
*****************************************/
function SerializeArrays(form) {

  while (deleted.length >0) {
    form.deleted.value += ':'+deleted.pop();
  };
  while (changed.length >0) {
    form.changed.value += ':'+changed.pop();
  };

}

/*********************************************
*
* Следующие 3 функции используются в Arraize()
*
*********************************************/
function is_numeric(innum) {
  if (innum >= '0' && innum <= '9') {
    return true;
  } else {
    return false;
  };
};
function is_int(innum) {
  for (var i=0; i<innum.length; i++) {
    if (!is_numeric(innum.charAt(i)))
      return false;
  };
  return true;
};
function ExtractLastNumbers(str) {
  var num='';
  var i=str.length-1;
  while (is_numeric(str.charAt(i))) {
    num =str.charAt(i)+num;
    i--;
  };
  return num;
};

/***************************************
* переводит в вид массива имена элементов
* формы form, имеющих префикс prefix.
***************************************/
function Arraize(form, prefix) {
  for (var i=0;i<form.elements.length;i++) {
    if (form.elements[i].name.substr(0, prefix.length) == prefix) {
      var nums = ExtractLastNumbers(form.elements[i].name);
      if (nums!='') {
	var eltLength = form.elements[i].name.length;
	form.elements[i].name=form.elements[i].name.substr(0, eltLength-nums.length) + '[' + nums + ']';
      };
    };
  };
}

/**************************************
* пост-обработка значений формы для
* удобного восприятия их в PHP-скрипте.
**************************************/
function FKSubmitted(form) {
  SerializeArrays(form);
  Arraize(form, 'newInput');
  Arraize(form, 'valInput');
}

/********************************************
* Переносит изменения в справочнике в 
* выпадающие списки в родительсом фрейме
* inputId - id корректируемого SELECT'а;
* nullFlag - знак возможности NULL-значений
*     в этом значении родительской страницы.
*     Тип - integer, 0 - NOT NULL, 1 - иначе.
* Данные хранятся в массиве data[int](.val|.key)
*********************************************/
function PropagateFK(inputId, nullFlag) {

  var input = parent.document.getElementById(inputId);

  // Очищаем SELECT.
  while (input.options.length > 0) {
    input.options[0] = null;
  };

  // Добавим пустую строчку, если нужны NULL'ы.
  if (nullFlag==1) {
    input.options[0] = new Option('', '-1');
  };

  // Непосредственно сам перенос данных.
  for ( var i=nullFlag; i < data.length+nullFlag; i++) {
    input.options[i] = new Option(data[i-nullFlag].val, data[i-nullFlag].key);
  };

  // Прячем фрейм.
  var iframe=parent.document.getElementById(inputId + 'IFrame');
  iframe.style.display = 'none';

}

function PropagateFKSingle(inputId, nullFlag, newVal) {
  PropagateFK(inputId, nullFlag);
  var input = parent.document.getElementById(inputId);
  for (var i=0; i < input.options.length; i++) {
    if (input.options[i].text==newVal) {
      input.options[i].selected = true;
    };
  };
}

function PropagateMasterFK(inputId, slaveId, slaveData, nullFlag) {

  var input=parent.document.getElementById(inputId);

  // Очищаем SELECT.
  while (input.options.length > 0) {
    input.options[0] = null;
  };

  // Добавим пустую строчку, если нужны NULL'ы.
  if (nullFlag==1) {
    input.options[0] = new Option('', '-1');
  };

  // Непосредственно сам перенос данных.
  for ( var i=nullFlag; i < data.length; i++) {
    input.options[i] = new Option(data[i-nullFlag].val, data[i-nullFlag].key);
  };

  // Прячем фрейм.
  var iframe=parent.document.getElementById(inputId + 'IFrame');
  iframe.style.display = 'none';

  parent.AdjustSlave(input, slaveId, slaveData);

}

/*
PropagateSlaveFK(\''.$input_name.'\', '.$master_id
    .', parent.'.$input_name.'data, '.$nullable.');"
 */
function PropagateSlaveFK(inputId, masterKey, slaveData, nullFlag) {

  var input=parent.document.getElementById(inputId);

  // Очищаем нужный фрагмент slaveData
  delete slaveData[masterKey];
  slaveData[masterKey] = new Array();
  for (var j=0; j < data.length; j++) {
    slaveData[masterKey][j] = new Array();
    slaveData[masterKey][j].key = data[j].key;
    slaveData[masterKey][j].val = data[j].val;
  };

  // Очищаем SELECT.
  while (input.options.length > 0) {
    input.options[0] = null;
  };

  // Добавим пустую строчку, если нужны NULL'ы.
  if (nullFlag==1) {
    input.options[0] = new Option('', '-1');
  };

  // Непосредственно сам перенос данных.
  for ( var i=nullFlag; i < data.length; i++) {
    input.options[i] = new Option(data[i-nullFlag].val, data[i-nullFlag].key);
  };

  // Прячем фрейм.
  var iframe=parent.document.getElementById(inputId + 'IFrame');
  iframe.style.display = 'none';

}

function PropagateMasterFKSingle(inputId, slaveId, slaveData, nullFlag, newVal) 
{

  PropagateMasterFK(inputId, slaveId, slaveData, nullFlag);
  var input = parent.document.getElementById(inputId);
  for (var i=0; i < input.options.length; i++) {
    if (input.options[i].text==newVal) {
      input.options[i].selected = true;
    };
  };
}

function PropagateSlaveFKSingle(inputId, masterKey, slaveData, nullFlag, newVal) 
{
  PropagateSlaveFK(inputId, masterKey, slaveData, nullFlag);
  var input = parent.document.getElementById(inputId);
  for (var i=0; i < input.options.length; i++) {
    if (input.options[i].text==newVal) {
      input.options[i].selected = true;
    };
  };
}

function AdjustSlave(select, slaveId, slaveData) {

  var masterKey = select.options[select.selectedIndex].value;
  var slaveInput = document.getElementById(slaveId);

  while (slaveInput.options.length > 0) {
    slaveInput.options[0] = null;
  };

  if (slaveData[masterKey] == null) {
    slaveData[masterKey] = new Array();
  };
  for ( var i=0; i< slaveData[masterKey].length; i++) {
    slaveInput.options[i] = new Option (slaveData[masterKey][i].val, slaveData[masterKey][i].key);
  };

}

function checkYear(input, nullFlag) {
  if (input.value.length > 0) {
    if ((input.value.length != 4) || isNaN(parseInt(input.value))) {
      alert('Input '+input.name+' is not a valid year.');
      input.focus();
      input.select();
    };
  } else {
    if (nullFlag == 0) {
      alert('Input '+input.name+' must be not NULL.');
      input.focus();
      input.select();
    };
  };
}


//------------- см. Single ---------------------
function passArg (name, val) {
  this.name = name;
  this.val = val;
}

/**
   @brief Передает аргументы в iframe
   
   @param id косвенный ID для IFRAME.
   @param inputId ID c new_val
   @param url URL, по которому вызывать содержимое IFRAME.
   @param args Дополнительные аргументы см. passArg().
*/
function PassSingleFK( id, inputId, url, args) {

  var iframe = document.getElementById(id + 'IFrame');

  var src = url;
  for (var i=0; i < args.length; i++) {
    src = src+args[i].name+'='+args[i].val+'&' ;
  };
  src = src + 'new=' + document.getElementById(inputId).value;
  iframe.src = src;
  iframe.style.display = 'block';
  
}

function PassSingleSlaveFK(id, inputId, url, args) {

  var inputMaster = null;

  for (var i=0; i<args.length; i++) {
    if (args[i].name == 'master_name') {
      inputMaster = args[i].val;
    };
  };

  var MasterInput = document.getElementById(inputMaster);
  var MasterId = MasterInput.options[MasterInput.selectedIndex].value;

  var argst = args;
  argst[argst.length] = new passArg( 'master_id', MasterId);
  
  PassSingleFK(id, inputId, url, argst);
}

function FindInFK(id, inputId) {
  var select = document.getElementById(id);
  var text = document.getElementById(inputId).value;

  if (text!='') {
    var found = false;
    for (var i=0; i < select.options.length; i++) {
      if (select.options[i].text==text) {
	found = true;
	select.options[i].selected = true;
      };
    };
    
    if (!found) {
      alert('Значение не найдено.');
    } else {
      document.getElementById(inputId).value = '';
    };
  };
}

