Array.prototype.index = function(val) {
  for(var i = 0, l = this.length; i < l; i++) {
    if(this[i] == val) return i;
  }
  return null;
}

Array.prototype.include = function(val) {
  return this.index(val) !== null;
}

function findId(idd)
{
    var obj = document.getElementById(idd);
    if (! obj) obj = document.getElementsByName(idd)[0];
    return obj;
}

function whichElement(e)
{
    var targ;
    if (!e) var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3){ // defeat Safari bug;
       targ = targ.parentNode };
    return targ;
}

function selectOther(name)
{
   bs=document.getElementsByName(name);
   for(i=0;i<bs.length;i++)
      bs[i].checked=!bs[i].checked;
}

function selectAllNoneLight(name,what)
{
   bs=document.getElementsByName(name);
   for(i=0;i<bs.length;i++)
      bs[i].checked=(what==true);
}

function selectAllNone(name,what)
{
   selectAllNoneLight(name,what);
   findId('selectAll'+name).className = (what==true) ? "hidden":"shown";
   findId('selectNone'+name).className = (what==false) ? "hidden":"shown";
}

function selectAll(name)
{
   bs=document.getElementsByName(name);
   for(i=0;i<bs.length;i++)
      bs[i].checked=true;
}

function selectNone(name)
{
   bs=document.getElementsByName(name);
   for(i=0;i<bs.length;i++)
      bs[i].checked=false;
}

function updateSelectController(name, value)
{
   var control = document.getElementById(control_name);
   if (control)
      control.checked = value;
}

function setupControlledSelect(checkbox_name, control_name)
{
   var control = document.getElementById(control_name);
   if (control) {
      // Такие финты ушами нужны, чтобы b_checkbox_control корректно
      // отрабатывал даже будучи прописанным до списка checkbox-ов
      Event.observe(window,'load', function(event) {
         bs=document.getElementsByName(checkbox_name);
         for(i=0;i<bs.length;i++)
            bs[i].observe('click', function(event) {
                  all_checked = true;
                  for(j=0;j<bs.length;j++)
                     if (!bs[j].checked) { all_checked = false; break; }
                  control.checked = all_checked;
            });
      });
   }
}

function controlledSelect(checkbox_name, control_name)
{
   var control = document.getElementById(control_name);
   if (control)
      selectAllNoneLight(checkbox_name, control.checked);
}

function toggleUserTypeControls(type)
{
   if (type == "customer") {
      e=document.getElementsByClassName("producer-only");
      for(i=0;i<e.length;i++)
         e[i].className="producer-only hidden";
      e=document.getElementsByClassName("customer-only");
      for(i=0;i<e.length;i++)
         e[i].className="customer-only shown";
   } else if (type == "producer") {
      e=document.getElementsByClassName("customer-only");
      for(i=0;i<e.length;i++)
         e[i].className="customer-only hidden";
      e=document.getElementsByClassName("producer-only");
      for(i=0;i<e.length;i++)
         e[i].className="producer-only shown";
   }
}

function confirm_delete(check_name, text) {
   checks = document.getElementsByName(check_name);
   if (checks.length > 0) {
      for(i=0;i<checks.length;i++)
         if (checks[i].checked) return confirm(text);
      return false;
   } else
      return false;
}

/* Для helper-а b_confirmed_button_to */
function confirmed_button_action(condition, confirmation, address) {
   if (!condition) {
      if (confirm(confirmation.replace(/###/g, "\n")))
         document.location.href=address;
      else
         return false;
   } else
      document.location.href=address;
}

function confirm_add_need(check_name, onclick) {
   warning = "Ваша закладка Требуется скрыта.\nВаше новое требование не увидят пока Вы не откроете закладку.\nПродолжить?";
   if ($(check_name).checked || confirm(warning))
      return eval(onclick);
   else
      return false;
}

/*
 * Функция прячет невыбранные строки, которых нет в ids
 * и показывает строки, которые в ids есть.
 * idx - номер текущего пункта (от 0).
 * n - число пунктов.
 * Последние два параметра используются для переключения a/span
 * управлялок.
 *
 * Зависит от prototype.js
 */
function checkbox_classifier(name, ids, idx, n) {
   checks = document.getElementsByName(name+'[]');
   for(i=0;i<checks.length;i++)
      if (!checks[i].checked) {
         id = checks[i].id.replace(name+"_", "");
         if (ids.include(id))
            $(name+"-line-"+id).show();
         else
            $(name+"-line-"+id).hide();
      }
   for(i=0;i<n;i++)
      if (i==idx) {
         $$('a.'+name+'-classifier-a-'+i).each(function(e){ e.hide(); });
         $$('span.'+name+'-classifier-span-'+i).each(function(e){ e.show(); });
      } else {
         $$('a.'+name+'-classifier-a-'+i).each(function(e){ e.show(); });
         $$('span.'+name+'-classifier-span-'+i).each(function(e){ e.hide(); });
      }
}

