// Массив, в котором ключом является кодовое имя атрибута,
// а значением список кодовых имен атрибутов, от которых зависит возможность редактирования текущего
var fieldseditdependence = new Array();

var ajaxSelectBoxAttrs = new Object();
function addAjaxSelectBoxAttr(attrName, objId, attrDepList, className) {       
  if (attrName && attrDepList && className != null) {
    var dep = attrDepList.slice(1, attrDepList.length - 1);
    if (dep && dep != '') {
      var attrDepAr = dep.split(', ');
      ajaxSelectBoxAttrs[attrName] = new ajaxSelectBoxAttrData(objId, attrDepAr, className);
    }
  }
}
function ajaxSelectBoxAttrData(objId, attrDepAr, className) {
  this.objId = objId;
  this.attrDepAr = attrDepAr;
  this.className = className;
}
function loadAjaxSelectBoxHandlers() {
  for (var attrName in ajaxSelectBoxAttrs) {
    var objId = ajaxSelectBoxAttrs[attrName].objId;
    var attrDepAr = ajaxSelectBoxAttrs[attrName].attrDepAr;
    var className = ajaxSelectBoxAttrs[attrName].className; 
    for (var n = 0; n < attrDepAr.length; n++) {
      loadAjaxSelectBox(attrName, attrDepAr, attrDepAr[n], objId, className);
    }
  }
}

function loadAjaxSelectBox(attrName, attrDepAr, attrDepAttr, objId, className) {
  var element = document.getElementById('id_' + attrDepAttr);
  if (element) {
    var e_onchange = element.onchange;
    if (e_onchange) {
      if (typeof e_onchange == 'function') {
        element.onchange = new Function("var e_onchange=" + e_onchange + "; e_onchange();" + "ajaxSelectBoxReq('" + attrName + "','" + objId + "','" + attrDepAr + "','" + className + "');");
      } else {
        addHandler(element, 'change', new Function("ajaxSelectBoxReq('" + attrName + "','" + objId + "','" + attrDepAr + "','" + className + "');"));
      }
    } else {
      element.onchange = new Function("ajaxSelectBoxReq('" + attrName + "','" + objId + "','" + attrDepAr + "','" + className + "');");
    }
    element = document.getElementById('search_' + attrDepAttr);
    if (element) {
      addHandler(element, 'click', new Function("ajaxSelectBoxReq('" + attrName + "','" + objId + "','" + attrDepAr + "','" + className + "');"));
      addHandler(element, 'keypress', new Function("event", "if (event.keyCode==13) {" + "ajaxSelectBoxReq('" + attrName + "','" + objId + "','" + attrDepAr + "','" + className + "');" + "}"));
    }
  }
}

// Добавляем новый атрибут для контроля
function addFieldEditDependence(fieldName, dependenceList) {
  var value = dependenceList.slice(1, dependenceList.length - 1);
  if (value && value != '') {
    fieldseditdependence[fieldseditdependence.length] = new editDependence(fieldName, value);
  }
}
// Добавляем скрытое поле - дублер
function addHiddenInput(attrName) {
  var form = self.parent.document.forms['formMain'];
  var inputTag = self.parent.document.getElementById("hid_" + attrName);
  if (form && !inputTag) {
    inputTag = self.parent.document.createElement("INPUT");
    inputTag.setAttribute("type", "hidden");
    inputTag.setAttribute("name", "data(" + attrName +")");
    inputTag.setAttribute("id", "hid_" + attrName);
    inputTag.setAttribute("value", "");
    form.appendChild(inputTag);
  }
}

// Удаляем скрытое поле - дублер
function removeHiddenInput(attrName) {
  var inputTag = self.parent.document.getElementById("hid_" + attrName);
  if (inputTag) {
    var parent = inputTag.parentNode;
    if(parent) parent.removeChild(inputTag);
  }
}

// Объект, содержащий данные об атрибуте и списке атрибутов, которые надо предварительно заполнить
function editDependence(fieldName, dependenceList) {
  this.fld = fieldName;
  // поля для возможности редактирования
  this.edit = dependenceList.split(', ');
}

// Слушатель полей
function listenEditDependence() {
  if (fieldseditdependence) {
    for (var i = 0; i < fieldseditdependence.length; i++) {

      // Для каждого "прослушимаемого" поля
      var canEdit = true;
      var fldList = fieldseditdependence[i].edit;
      for (var j = 0; j < fldList.length; j++) {
        // Проверяем заполненность ведущих атрибутов
        var editFldObj = document.getElementById('id_' + fldList[j]);
        var titleEditFldObj = document.getElementById('title_' + fldList[j]);
        if (titleEditFldObj==null && editFldObj==null) {return;}
        if (titleEditFldObj) {
          if ((!titleEditFldObj.checked || titleEditFldObj.value == '' || titleEditFldObj.value == 'объект не выбран')
                  && (!editFldObj || editFldObj.value == '' || editFldObj.value == 'false')) {
            canEdit = false;
            break;
          }
        } else if (editFldObj.value == '' || editFldObj.value == 'false') {
          canEdit = false;
          break;
        }
      }

      var fld = fieldseditdependence[i].fld;
      var fldId = document.getElementById('id_' + fieldseditdependence[i].fld);
      if (!fldId) {
        fldId = document.getElementById('cal_' + fieldseditdependence[i].fld);
      }
      var fldTitle = document.getElementById('title_' + fieldseditdependence[i].fld);
      var fldBtn = document.getElementById('buttons_' + fieldseditdependence[i].fld);
      if (canEdit) {
        // Если все "ведущие" поля заполены - разрешаем редактировать поле
        if (fldId) {
          fldId.removeAttribute('disabled');
          removeHiddenInput(fieldseditdependence[i].fld);
          fldId.readOnly = "";
          if (fldId.type != "checkbox") {
            fldId.className = "";
          }
        }
        if (fldTitle) {
          fldTitle.removeAttribute('disabled');
          fldTitle.readOnly = "";
          if (fldTitle.type != "checkbox") {
            fldTitle.className = "";
          }
        }
        if (fldBtn) fldBtn.style.display = '';
      } else {
        // Если не все "ведущие" поля заполнены - запрещаем редактрование
        if (fldId) {
          fldId.setAttribute('disabled', 'disabled');
          addHiddenInput(fieldseditdependence[i].fld);
          fldId.readOnly = "true";
          if (fldId.type != "checkbox") {
            fldId.className = "disabled";
          }             
          fldId.value = '';
        }
        if (fldTitle) {
          fldTitle.setAttribute('disabled', 'disabled');
          fldTitle.readOnly = "true";
          if (fldTitle.type != "checkbox") {
            fldTitle.className = "disabled";
          }
          fldTitle.value = '';
          fldTitle.checked = false;
        }
        if (fldBtn) {
          fldBtn.style.display = 'none';
        }
      }
    }
  }
}

function startListenEditDependence() {
  loadAjaxSelectBoxHandlers();
  listenEditDependence();
  setInterval('listenEditDependence()', 250);
}

// Запускаем слушателя для блокирования
if (document.addEventListener) {
  document.addEventListener("DOMContentLoaded", startListenEditDependence, false);
} else {
   window.attachEvent("onload", startListenEditDependence);
}


function ajaxSelectBoxReq(attrName, objId, depAttrsStr, className) {
  var depAttrsAr = depAttrsStr.split(",");
  if (checkDep(depAttrsAr)) {
    try {
      var jsonrpc = typeof(jsonrpc) == "undefined" ? new JSONRpcClient(window.getBaseUrl() + "util/ajaxRpc.sx") : jsonrpc;
      var params = getDepLinkAttrs(attrName, objId, depAttrsAr, className);
      var ajaxParams = {
        "javaClass": "java.util.HashMap",
        "map": params
      };
      jsonrpc.selectboxrequest.getSelectBoxAttr(function (result) {
        newSelectBox(result, attrName)
      }, ajaxParams);
    } catch(e) {
    }
  }
}
function newSelectBox(result, attrName) {
  var select = document.getElementById("id_" + attrName);
  if (select) {
    select.options.length = 0;
    FLUtils.addOption(select, "", "-----");
    if (result != null) {
      var params = result["map"];
      for (var key in params) {
        FLUtils.addOption(select, key, params[key]);
      }
    }
  }
}
var FLUtils = {
  addOption: function(select, value, text) {
    if (document.createElement) {
      var option = document.createElement("option");
      option.value = value;
      option.text = text;
    }
    if (select.options.add) {
      select.options.add(option);
    }
  }
}

function getDepLinkAttrs(attrName, objId, depAttrsAr, className) {
  var params = new Object();
  for (var i = 0; i < depAttrsAr.length; i++) {
    var depAttr = document.getElementById("id_" + depAttrsAr[i]);
    if (depAttr) {
      params[depAttrsAr[i]] = depAttr.value;
    }
  }
  params["attr"] = attrName;
  params["obj_id"] = objId;
  params["class"] = className;
  return params;
}
function addHandler(object, event, handler) {
  if (object.addEventListener) {
    object.addEventListener(event, handler, false);
  } else if (object.attachEvent) {
    object.attachEvent('on' + event, handler);
  }
}
function checkDep(attrDepAr) {
  var editCapa = true;
  for (var n = 0; n < attrDepAr.length; n++) {
    var field = document.getElementById('id_' + attrDepAr[n]);
    var title = document.getElementById('title_' + attrDepAr[n]);
    if (title) {
      if ((!title.checked || title.value == '' || title.value == 'объект не выбран') && (!field || field.value == '' || field.value == 'false')) {
        editCapa = false;
        break;
      }
    } else if (!field || field.value == '' || field.value == 'false') {
      editCapa = false;
      break;
    }
  }
  return editCapa;
}

