// fs.form.js // ver 1.136 // 2010 Apr 07 We //
// author: OLG // описание модуля см. в DBFormSearchFields.java //

// -- FSForm --

fs.c_url = "/data/FS_list";
fs.c_paramSep = "|";
fs.c_color_sendWait     = "#009900";
fs.c_color_sendOkLabel  = "#666666";
fs.c_color_sendOkSelect = "#333333";
fs.c_color_error        = "#dd0000";
fs.c_checkType_noCheck  = 0;
fs.c_checkType_selA     = 1;
fs.c_checkType_selAN    = 2;
fs.c_checkType_selN     = 3;
fs.c_checkType_date     = 4;
fs.c_childAge_id        = 'hCa';
fs.c_elemId_butOk       = "but_ok";
fs.c_elemId_butFail     = "but_fail";
fs.c_elemId_messFail    = "mess_fail";

fs.c_messErr       = "Ошибки в данных, полученных с сервера; ";
fs.c_messErrField  = fs.c_messErr + "нет поля ";
fs.c_messErrValueS = fs.c_messErr + "неверный ид в поле S ";
fs.c_messErrValueT = fs.c_messErr + "не нашли список зависимых полей для ";

fs.c_valueType_radioGet = 2;

fs.deb = "";

fs.FSForm = function() {
  // конструктор //
  this.formType      = 1;
  this.fieldCount    = 0;
  this.fields        = {};
  this.fieldIds      = [];
  this.fieldIdsStr   = "";
  this.fieldTypesStr = "";
  this.browserIsIE   = (window.ActiveXObject ? true : false );
  this.onChangeIsOn  = true;
  this.dfModel       = null;
  this.childAgeId    = null;
  this.visMod        = null;
};

fs.FSForm.prototype.addTwinData = function( argRespData, argTargetArr ) {
  var resTargetArray = [];
  //
  for (var n=0; n<argTargetArr.length; n++ ) {
    var fieldIdTmp  = argTargetArr[n];
    var fieldObjTmp = this.getField( fieldIdTmp );
    var twinIdTmp   = fieldObjTmp.getTwinId();
    resTargetArray.push( fieldIdTmp );
    //
    if (twinIdTmp != null) {
      resTargetArray.push( twinIdTmp );
      //
      if (!argRespData[ twinIdTmp ]) {
        argRespData[ twinIdTmp ] = argRespData[ fieldIdTmp ];
      }  
    }
  }
  return resTargetArray;
};

fs.FSForm.prototype.checkAfterChange = function() {
  var totalOk = true;
  //
  for (var n=0; n<this.fieldIds.length; n++ ) {
    var fieldId   = this.fieldIds[ n ];
    var field     = this.getField( fieldId );
    var valueIsOk = field.isValid();
    totalOk = totalOk && valueIsOk;

    var labelColor = (valueIsOk ? fs.c_color_sendOkLabel : fs.c_color_error );
    var labelId    = field.getLabelId();
    var labelElem  = document.getElementById( labelId );

    if (!!labelElem) {
      labelElem.style.color = labelColor;
    }
    field.checkBiValue();
  }
  fm.Div_openHide( fs.c_elemId_butOk,     totalOk );
  fm.Div_openHide( fs.c_elemId_butFail,  !totalOk );
  fm.Div_openHide( fs.c_elemId_messFail, !totalOk );
};

fs.FSForm.prototype.checkFields = function() {
  var totalIsOk = true;
  var mess = "";
  //
  for (var n=0; n<this.fieldIds.length; n++ ) {
    var fieldId   = this.fieldIds[ n ];
    var field     = this.getField( fieldId );
    var valueIsOk = field.isValid();
    totalIsOk     = totalIsOk && valueIsOk;

    if (!valueIsOk) {
      var labelId    = field.getLabelId();
      var labelElem = document.getElementById( labelId );

      if (!!labelElem) {
        var labelText = labelElem.innerHTML;

        if (mess.indexOf( labelText ) == -1) {
          mess += ("- " + labelText + "\n");
        }
      }
    }
  }
  if (!totalIsOk) {
    alert( "Требуется указать обязательные параметры:\n" + mess );
  }
  return totalIsOk;
};

fs.FSForm.prototype.checkSubmit = function( argForm, argUrlThis, argUrlSend ) {
  // аналог FV.checkSubmit //
  var checkIsOk = fs.form.checkFields();
  argForm.action = (checkIsOk ? argUrlSend : argUrlThis );
  return checkIsOk;
};

fs.FSForm.prototype.countChildListener = function( argElemChildCount ) {
  var count = argElemChildCount.selectedIndex;
  if ( count > 4)  count = 4;
  var childElem;
  var labelElem = document.getElementById('childAgeLabel');

  for (var i=0; i<=3; i++ ) {
    childElem = document.getElementById('hCa' + ( i + 1));
    childElem.style.visibility='hidden';
    childElem.oldVis = childElem.style.visibility;
  }
  if (!!labelElem) {
    labelElem.style.visibility = ( count > 0 ? 'visible' : 'hidden');
    labelElem.oldVis = labelElem.style.visibility;
  }

  if (count > 4 || count == 0) return count;

  for (i=0; i<count; i++ ) {
    childElem = document.getElementById('hCa' + ( i + 1));
    childElem.style.visibility = 'visible';
    childElem.oldVis = childElem.style.visibility;
  }
  return count;
};

fs.FSForm.prototype.dynFragmLoad = function( argDynFragmArr ) {
  //
  for (var n=0; n<argDynFragmArr.length; n++ ) {
    var dfItem  = argDynFragmArr[n];
    var dfId    = dfItem['id'];
    var dfHtml  = dfItem['html'];
    var divElem = document.getElementById( dfId );
    //
    if (divElem == null) continue;
    //
    dfHtml = fs.Str_decodeSimple( dfHtml );
    divElem.innerHTML = dfHtml;
  }
};

fs.FSForm.prototype.getField = function( argFieldId ) {
  return this.fields[ argFieldId ];
};

fs.FSForm.prototype.getValueArray = function() {
  var valueArray = [];
  //
  for (var n=0; n<this.fieldIds.length; n++ ) {
    var fieldId = this.fieldIds[ n ];
    var field   = this.fields[ fieldId ];
    var value   = field.getValue();
    valueArray.push( value );
  }
  return valueArray;
};

fs.FSForm.prototype.isTwin = function( argFieldId ) {
  var argFieldInd = fs.Array_find( this.fieldIds, argFieldId );
  var result = false;

  if (argFieldInd > -1) {
    result = this.isTwin[ argFieldInd ];
  }
  return result;
};

fs.FSForm.prototype.markFieldValues = function( argUpdArray, argColor ) {
  //
  for (var n=0; n<argUpdArray.length; n++ ) {
    var targetId   = argUpdArray[ n ];
    var targetElem = document.getElementById( targetId );

    if (!!targetElem) {
      targetElem.style.color = argColor;
    }
  }
};

fs.FSForm.prototype.onAnswer = function( argXHR, argRespText ) {
  //
  if ((argXHR.status == 200) && !!argRespText) {
    var dataOk = false;
    try {
      var respData = eval( "(" + argRespText + ")");

      if (!respData.resOk) {
        alert("Ошибки в данных, полученных с сервера");
      }
      else {
        fs.form.setRespData( respData );
        dataOk = true;
      }
    }
    catch(e) {
      alert("Ошибки при ответе с сервера: \n" + e.toString() );
    }
    if (dataOk) {
      fs.form.checkAfterChange();
    }
  }
  else {
    alert("Ошибки при обращении к серверу: код " + argXHR.status);
  }
};

fs.FSForm.prototype.onChange = function( argFieldId ) {
  //
  if (!this.onChangeIsOn) return;
  //
  var field = this.getField( argFieldId );
  if (field == null) return;
  var updArray = field.getDepArray();
  //
  if (updArray.length > 0) {
    var valueArray = this.getValueArray();
    var formTypeStr = "ft=" + this.formType;
    var sourceStr   = "&src=" + argFieldId;
    var targetStr   = "&targ=" + fs.Array_toStr( updArray, fs.c_paramSep );
    var fieldsStr   = "&fld=" + this.fieldIdsStr;
    var typesStr    = "&typ=" + this.fieldTypesStr;
    var valuesStr   = "&val=" + fs.Array_toStr( valueArray, fs.c_paramSep );
    var dfStr       = (this.dfModel != null ? "&df=" + this.dfModel : "");
    var urlParam = fs.c_url + "?" + formTypeStr + sourceStr + targetStr + fieldsStr + typesStr + valuesStr + dfStr;
    this.markFieldValues( updArray, fs.c_color_sendWait );
    fs.Ajax_send( urlParam, fs.form.onAnswer );
  }
};

fs.FSForm.prototype.onLoad = function() {
  this.checkAfterChange();
  this.setTwinBack();
  this.setChildAgeHidden();
  //
  if (!!this.childAgeId) {
    var childCountElem = document.getElementById( this.childAgeId );
    //
    if (!!childCountElem) {
      this.countChildListener( childCountElem );
    }
  }
  if ((this.visMod != null) &&  (this.visMod instanceof Array)) {
    for (var n=0; n<this.visMod.length; n++ ) {
      var radioItem = this.visMod[n];
      var radioId   = radioItem[0];
      fs.form.visModExec( radioId );
    }
  }
};

fs.FSForm.prototype.sectOpen = function( argSectRef, argSectFull ) {
  var sectRef  = document.getElementById( argSectRef );
  var sectFull = document.getElementById( argSectFull );
  if (sectRef  == null) alert( "sectRef  is null" );
  if (sectFull == null) alert( "sectFull is null" );
  //
  if ((sectRef  == null) || (sectFull == null)) return false;
  //
  sectRef.style.display  = "none";
  sectFull.style.display = "block";
  return false;
};

fs.FSForm.prototype.set = function( argField ) {
  var fieldId = argField["i"];
  var typeId  = argField["c"];
  this.fields[ fieldId ] = new fs.FSField( argField );
  this.fieldCount++;
  this.fieldIds.push( fieldId );
  this.fieldIdsStr   += (fs.c_paramSep + fieldId);
  this.fieldTypesStr += (fs.c_paramSep + typeId);
};

fs.FSForm.prototype.setca = function( argChildAgeId ) {
  this.childAgeId = argChildAgeId;
};

fs.FSForm.prototype.setChildAgeHidden = function() {
  //
  for (var n=1; n<5; n++ ) {
    var childAge1Elem = document.getElementById( fs.c_childAge_id + n );
    //
    if (!!childAge1Elem) {
      childAge1Elem.oldVis = 'hidden';
    }
    else {
      break;
    }
  }
};

fs.FSForm.prototype.setdf = function( argDfModel ) {
  this.dfModel = argDfModel;
};

fs.FSForm.prototype.setft = function( argFormType ) {
  this.formType = argFormType;
};

fs.FSForm.prototype.setRespData = function( argRespData ) {
  if (!argRespData["S"]) {
    alert(fs.c_messErrField + "S");
    return;
  }
  if (!argRespData["F"]) {
    alert(fs.c_messErrField + "F");
    return;
  }
  if (!argRespData["V"]) {
    alert(fs.c_messErrField + "V");
    return;
  }
  var sourceId    = argRespData["S"];
  var fieldArr    = argRespData["F"];
  var valueArr    = argRespData["V"];
  var dynFragmArr = argRespData["DF"];
  var sourceField = this.getField( sourceId );

  if (!sourceField) {
    alert(fs.c_messErrValueS + sourceId);
    return;
  }
  var targetArr = sourceField.getDepArray();

  if (!targetArr) {
    alert(fs.c_messErrValueS + sourceId);
    return;
  }
  targetArr = this.addTwinData( argRespData, targetArr );

  for (var n=0; n<targetArr.length; n++ ) {
    var targetId     = targetArr[n];
    var defaultValue = fs.Array_getParallelValue( fieldArr, valueArr, targetId );
    var updData      = argRespData[ targetId ];
    var field        = this.getField( targetId );

    if (!!updData && !!field) {
      var targetType = field.getCheckType();
      var targetElem = document.getElementById( targetId );
      //
      if ((defaultValue == "-1") && !!field.getTwinBackId()) {
        var backTwinId = field.getTwinBackId();
        defaultValue = fs.Array_getParallelValue( fieldArr, valueArr, backTwinId );
      }
      if (!!targetElem) {
        //
        if ((targetType >= fs.c_checkType_noCheck) && (targetType <= fs.c_checkType_selN)) {
          var oldDefVal = fs.Select_getDefaultValue( targetElem );
          //
          if (field.getBiValue() && (updData.length != 4) && (oldDefVal == defaultValue)) {
            defaultValue = updData[0];
          }
          fs.Select_clear( targetElem );
          fs.Select_fill( targetElem, updData, defaultValue, this.browserIsIE );
        }
        if (targetType == fs.c_checkType_date) {
          fs.LSCalendar_fill( targetElem, updData, defaultValue );
        }
        targetElem.style.color = fs.c_color_sendOkSelect;
      }
    }
  }
  if (dynFragmArr != null) {
    this.dynFragmLoad( dynFragmArr );
  }
};

fs.FSForm.prototype.setTwinBack = function() {
  for (var n=0; n<this.fieldIds.length; n++ ) {
    var fieldIdTmp = this.fieldIds[n];
    var twinId = this.getField( fieldIdTmp ).getTwinId();
    //
    if (!!twinId) {
      var twinObj = this.getField( twinId );
      //
      if (!!twinObj) {
        twinObj.field["wb"] = fieldIdTmp;
      }
    }
  }
};

fs.FSForm.prototype.visModExec = function( argSrcId ) {
  //
  if (!!this.visMod && (this.visMod.length > 0)) {
    var srcVal = fm.Radio_getValue( argSrcId );
    //
    if (srcVal == null) {
      return;
    }
    for (var n=0; n<this.visMod.length; n++ ) {
      var rule = this.visMod[ n ];
      var checkElemId = rule[0];
      var checkValues = rule[1];
      var targetArray = rule[2];
      //
      if ((targetArray == null) || (targetArray.length == 0)) {
        return;
      }
      //
      for (var v=0; v<checkValues.length; v++ ) {
        var checkValue = checkValues[v][0];
        var actionId   = checkValues[v][1];
        //
        if ((argSrcId == checkElemId) && (srcVal == checkValue)) {
          //
          for (var t=0; t<targetArray.length; t++ ) {
            var targetElemId = targetArray[t];
            //
            if (actionId == '0') {
              fm.Div_hide( targetElemId );
            }
            if (actionId == '1') {
              fm.Div_openB( targetElemId );
            }
          }
        }
      }
    }
  }
};

// -- FSField --

fs.c_labelIdSuffix = "Validat";

fs.FSField = function( argFieldObj ) {
  this.field = argFieldObj;

  if (!argFieldObj["l"]) {
    // у большинства полей labelId = fieldId + suffix, но бывают и исключения //
    this.field["l"] = argFieldObj["i"] + fs.c_labelIdSuffix; 
  }
};

fs.FSField.prototype.checkBiValue = function() {
  var fieldId = this.getFieldId();
  var fieldElem = document.getElementById( fieldId );
  //
  if (!!fieldElem && !!(fieldElem.options)) {
    var selSize  = fieldElem.options.length;
    var defInd   = fieldElem.selectedIndex;
    this.field.bv = false;
    //
    if ((selSize == 2) && (defInd == 1)) {
      var firstVal = fieldElem.options[0].value;
      //
      if ((firstVal == "") || (firstVal == "0")) {
        this.field.bv = true;
      }  
    }
  }
};

fs.FSField.prototype.getFieldId    = function() { return this.field["i"]; };
fs.FSField.prototype.getLabelId    = function() { return this.field["l"]; };
fs.FSField.prototype.getCheckType  = function() { return this.field["c"]; };
fs.FSField.prototype.getDepArray   = function() { return this.field["d"]; };

fs.FSField.prototype.getValueType  = function() { return (!!this.field["v"]  ? this.field["v"]  : null ); };
fs.FSField.prototype.getAddName    = function() { return (!!this.field["a"]  ? this.field["a"]  : null ); };
fs.FSField.prototype.getTwinId     = function() { return (!!this.field["w"]  ? this.field["w"]  : null ); };
fs.FSField.prototype.getTwinBackId = function() { return (!!this.field["wb"] ? this.field["wb"] : null ); };
fs.FSField.prototype.getIsFixed    = function() { return (!!this.field["f"]  ? this.field["f"]  : false ); };
fs.FSField.prototype.getBiValue    = function() { return (!!this.field["bv"] ? this.field["bv"] : false ); };

fs.FSField.prototype.getValue = function() {
  var fieldId   = this.getFieldId();
  var valueType = this.getValueType();
  var resValue = null;

  if (valueType == null) { // valueType == null - указание на типовой способ //
    var elem = document.getElementById( fieldId  );

    if (!!elem) {
      resValue = elem.value;
    }
  }
  if (valueType == fs.c_valueType_radioGet) {
    resValue = fm.Radio_getValue( fieldId );
  }
  return resValue;
};

fs.FSField.prototype.isValid = function() {
  var checkType = this.getCheckType();
  var value     = this.getValue();
  var valueIsOk = true;

  switch (checkType ) {
    case fs.c_checkType_selAN:
    case fs.c_checkType_selN:
      valueIsOk = (value != "-1");
      break;
    case fs.c_checkType_date:
      var myCalendar = new LSCalendar();
      valueIsOk = myCalendar.Validate( value );
      break;
    default:
      break;
  }
  return valueIsOk;
};

// --

fs.form = new fs.FSForm();

