private void setDefaultValue(FieldDefinition field, FormItem fi) {
   if (field.getDefaultValue() != null && field.getDefaultValue().trim().length() > 0) {
     String defValue = field.getDefaultValue().trim();
     if (defValue.toLowerCase().equals("$regionId".toLowerCase())) {
       defValue = null;
     }
     if (defValue != null && defValue.toLowerCase().equals("$subregionId".toLowerCase())) {
       defValue = null;
     }
     fi.setValue(defValue);
   }
 }
  public void setCalculatorProceed() {
    Set<String> fieldKeys = formitemMap.keySet();

    for (String key : fieldKeys) {
      final FieldDefinitionItem item = formitemMap.get(key);
      FieldDefinition fieldDef = item.getFieldDef();
      if (!fieldDef.isCalculatorProceed()) continue;
      if (fieldDef.getCalculatorClass() != null) {
        final ICalculatorClass classCalculator =
            listValue.getCalculetorClass(fieldDef.getCalculatorClass());
        if (classCalculator != null) {
          classCalculator.calculate(formitemMap, item);
        }
      }
    }
  }
  public int getDelayInterval() {
    Set<String> fieldKeys = formitemMap.keySet();

    for (String key : fieldKeys) {
      final FieldDefinitionItem item = formitemMap.get(key);
      FieldDefinition fieldDef = item.getFieldDef();
      final FormItem formItem = item.getFormItem();

      if (fieldDef.getFieldType() == FieldDefinition.FT_DATE
          && formItem instanceof CurrentTimeItem) {
        int valid = validateDate(formItem, fieldDef);
        if (valid != 0 && !fieldDef.isDonotcheckForDate()) return valid;
      }
    }
    return 0;
  }
  private void comboValueChanged(String[] depFieldNames, Object selectedvalue, String parent_type) {
    HashMap<String, String> listSqls = new HashMap<String, String>();

    for (int i = 0; i < depFieldNames.length; i++) {
      String key = depFieldNames[i];
      FieldDefinitionItem item = formitemMap.get(key);
      if (item == null) continue;
      FieldDefinition fieldDef = item.getFieldDef();
      if (fieldDef == null) continue;
      FormItem formItem = item.getFormItem();
      if (formItem == null) continue;
      // result.put(key, );
      formItem.setValue((String) null);
      setSelectItems(formItem, new ArrayList<ClSelectionItem>());
      if ((fieldDef.getFieldType() == FieldDefinition.FT_COMBO
              || fieldDef.getFieldType() == FieldDefinition.FT_SELECTION
              || fieldDef.getFieldType() == FieldDefinition.FT_CHK_GRID)
          && fieldDef.getFieldSelectMethode() > 0) {

        String depFields = fieldDef.getDependencyFields();
        depFields = depFields == null ? "" : depFields;
        final String[] mydepFieldNames = depFields.split(";");
        final String myparent_type = fieldDef.getFieldSelectMethode() + "";
        if (mydepFieldNames.length > 0 && mydepFieldNames[0].length() > 0) {
          comboValueChanged(mydepFieldNames, null, myparent_type);
        }
        if (selectedvalue == null) continue;
        String value =
            fieldDef.getFieldSelectMethode() + "_" + parent_type + "_" + selectedvalue.toString();
        listSqls.put(key, value);
      }
    }
    getRemouteValues(null, -1, listSqls, false);
  }
  public HashMap<String, Object> getData() {
    HashMap<String, Object> values = new HashMap<String, Object>();
    Set<String> keys = formitemMap.keySet();
    for (String key : keys) {
      FieldDefinitionItem item = formitemMap.get(key);
      FieldDefinition fieldDef = item.getFieldDef();
      Object value = item.getFormItem().getValue();
      if (fieldDef.getFieldType() == FieldDefinition.FT_COMBO
          || fieldDef.getFieldType() == FieldDefinition.FT_SELECTION
          || fieldDef.getFieldType() == FieldDefinition.FT_CHK_GRID
          || fieldDef.getFieldType() == FieldDefinition.FT_MAP_ITEM
          || fieldDef.getFieldType() == FieldDefinition.FT_IMAGE_ITEM
          || fieldDef.getFieldType() == FieldDefinition.FT_CUSTOM) {
        if (value != null) {
          if (!fieldDef.isDisplayValueIgnored())
            value = new String[] {value.toString(), item.getFormItem().getDisplayValue()};
        }
      }

      if (fieldDef.getFieldType() == FieldDefinition.FT_DATE) {
        if (value != null) {
          Date dt = (Date) value;
          value = new String[] {dt.getTime() + "", dt.toString()};
        }
      }
      if (fieldDef.getFieldType() == FieldDefinition.FT_BOOLEAN) {
        if (value != null) {
          Boolean dt = false;
          try {
            if (value instanceof Boolean) dt = (Boolean) value;
            else dt = (Boolean) (Integer.parseInt(value.toString()) == 1);
          } catch (Exception e) {
            // TODO: handle exception
          }
          value = new String[] {(dt.booleanValue() ? 1 : 0) + "", dt.toString()};
        }
      }
      values.put(key, value);
    }
    return values;
  }
  public FormDefinitionPanel(
      FormDefinition definition,
      FieldDefinitionListValue listValue,
      DocType docType,
      DocPanelSettingDataComplete dataComplete) {
    super();
    this.listValue = listValue;
    this.dataComplete = dataComplete;
    this.docType = docType;
    this.setWidth100();
    this.setHeight100();
    ArrayList<FormGroup> formGroups = definition.getFormGroups();
    formitemMap = new HashMap<String, FieldDefinitionItem>();
    ArrayList<MyDynamicForm> dynFields = new ArrayList<MyDynamicForm>();
    for (FormGroup formGroup : formGroups) {
      ArrayList<FieldDefinition> fields = formGroup.getFieldDefinitions();
      MyDynamicForm dynamicForm = new MyDynamicForm();
      dynamicForm.setNewLine(formGroup.getNewLine() == 1);
      ArrayList<FormItem> items = new ArrayList<FormItem>();
      for (FieldDefinition fieldDefinition : fields) {
        FieldDefinitionItem fi = createField(fieldDefinition);
        if (fi != null) {
          items.add(fi.getFormItem());
          if (fieldDefinition.isFieldReadOnly()) fi.getFormItem().setCanEdit(false);
          formitemMap.put(fieldDefinition.getFieldName(), fi);
        }
      }

      //
      dynamicForm.setAlign(Alignment.LEFT);
      switch (formGroup.getLabelOrientation()) {
        case FormGroup.FTORIENTATION_LEFT:
          dynamicForm.setTitleOrientation(TitleOrientation.LEFT);
          break;
        case FormGroup.FTORIENTATION_TOP:
          dynamicForm.setTitleOrientation(TitleOrientation.TOP);
          break;
        case FormGroup.FTORIENTATION_RIGHT:
          dynamicForm.setTitleOrientation(TitleOrientation.RIGHT);
          break;
        default:
          break;
      }

      int numofColumns = 0;
      if (definition.isHorizontal()) {
        numofColumns = formGroup.getNumofColumns() > 0 ? formGroup.getNumofColumns() : 1;
      } else {

        numofColumns = formGroup.getNumofColumns() > 0 ? formGroup.getNumofColumns() : items.size();
      }
      numofColumns =
          numofColumns * (formGroup.getLabelOrientation() == FormGroup.FTORIENTATION_TOP ? 1 : 2);
      dynamicForm.setNumCols(numofColumns);

      if (formGroup.getGroupHeight() != null && !formGroup.getGroupHeight().isEmpty()) {
        dynamicForm.setHeight(formGroup.getGroupHeight());
      }

      if (formGroup.getGroupWidth() != null && !formGroup.getGroupWidth().isEmpty()) {
        dynamicForm.setWidth(formGroup.getGroupWidth());
      }
      dynamicForm.setFields(items.toArray(new FormItem[] {}));
      dynFields.add(dynamicForm);
      if (formGroup.getGroupTitle() != null && formGroup.getGroupTitle().length() > 0) {
        dynamicForm.setIsGroup(true);
        dynamicForm.setGroupTitle(
            DocFlow.getCaption(formGroup.getFieldCaptionId(), formGroup.getGroupTitle()));
      }
      // this.addMember(dynamicForm);
      listValue.setFieldDefinitionListValue(formitemMap, this);
    }
    Layout container = this;
    if (definition.isHorizontal()) {
      container = createNewPanel();
    }

    for (MyDynamicForm dynamicForm : dynFields) {
      if (dynamicForm.isNewLine()) {
        container = createNewPanel();
      }
      container.addMember(dynamicForm);
    }

    Set<String> fieldKeys = formitemMap.keySet();

    for (String key : fieldKeys) {
      final FieldDefinitionItem item = formitemMap.get(key);
      FieldDefinition fieldDef = item.getFieldDef();
      if (fieldDef.getCalculatorClass() != null) {
        final ICalculatorClass classCalculator =
            listValue.getCalculetorClass(fieldDef.getCalculatorClass());
        if (classCalculator != null) {
          item.getFormItem()
              .addChangedHandler(
                  new ChangedHandler() {
                    @Override
                    public void onChanged(ChangedEvent event) {
                      classCalculator.calculate(formitemMap, item);
                    }
                  });
        }
      }
      if (fieldDef.isClearComboValue()) {
        PickerIcon eraserValuePicker =
            new PickerIcon(
                new Picker("eraser.png"),
                new FormItemClickHandler() {
                  public void onFormItemClick(FormItemIconClickEvent event) {
                    item.getFormItem().setValue((Object) null);
                    fireChangedEvent(item.getFormItem());
                  }
                });
        item.getFormItem().setIcons(eraserValuePicker);
      }

      if ((fieldDef.getFieldType() == FieldDefinition.FT_COMBO
          || fieldDef.getFieldType() == FieldDefinition.FT_SELECTION)) {
        if (fieldDef.getFieldSelectMethode() > 0) {
          String depFields = fieldDef.getDependencyFields();
          depFields = depFields == null ? "" : depFields;
          final String[] depFieldNames = depFields.split(";");
          final String parent_type = fieldDef.getFieldSelectMethode() + "";
          if (depFieldNames.length > 0 && depFieldNames[0].length() > 0) {
            item.getFormItem()
                .addChangedHandler(
                    new ChangedHandler() {
                      @Override
                      public void onChanged(ChangedEvent event) {
                        if (settingMyself) return;
                        try {
                          settingMyself = true;
                          comboValueChanged(depFieldNames, event.getValue(), parent_type);
                        } finally {
                          settingMyself = false;
                        }
                      }
                    });
          }
        }
      }
    }
  }
 public int validateDate(FormItem formItem, FieldDefinition fieldDef) {
   if (docType == null) return 0;
   if (!fieldDef.getFieldName().equals(docType.getDatefield())) return 0;
   return validateDate(formItem);
 }
  public void setData(
      HashMap<String, String> values, long customer_id, HashMap<String, String> displayValues) {
    if (displayValues == null) displayValues = new HashMap<String, String>();
    newData = true;
    Set<String> fieldKeys = formitemMap.keySet();
    for (String key : fieldKeys) {
      FieldDefinitionItem item = formitemMap.get(key);
      FieldDefinition fieldDef = item.getFieldDef();
      if (fieldDef.getFieldType() == FieldDefinition.FT_IMAGE_ITEM
          && displayValues.containsKey(key))
        ((ImageItem) item.getFormItem()).setDisplayValue(displayValues.get(key));

      if ((fieldDef.getFieldType() == FieldDefinition.FT_COMBO
          || fieldDef.getFieldType() == FieldDefinition.FT_SELECTION
          || fieldDef.getFieldType() == FieldDefinition.FT_CHK_GRID)) {
        String val = fieldDef.getDefaultValue();
        if (val != null && val.trim().length() > 0) {
          val = val.trim();
          if (DocFlow.hasPermition("CAN_VIEW_ALL_REGIONS")
              && (val.toLowerCase().equals("$regionId".toLowerCase())
                  || val.toLowerCase().equals("$subregionId".toLowerCase()))) {
            if (values.get(key) != null) continue;
          }
          if (val.toLowerCase().equals("$regionId".toLowerCase())
              && DocFlow.user_obj.getUser().getRegionid() >= 0) {
            values.put(key, "" + DocFlow.user_obj.getUser().getRegionid());
            if (!item.getFieldDef().isFieldReadOnly())
              item.getFormItem().setDisabled(!DocFlow.hasPermition("CAN_VIEW_ALL_REGIONS"));
          }
          if (val.toLowerCase().equals("$subregionId".toLowerCase())
              && DocFlow.user_obj.getUser().getSubregionid() >= 0) {
            values.put(key, "" + DocFlow.user_obj.getUser().getSubregionid());
            if (!item.getFieldDef().isFieldReadOnly())
              item.getFormItem().setDisabled(!DocFlow.hasPermition("CAN_VIEW_ALL_REGIONS"));
          }
        }
      }
      setDefaultValue(fieldDef, item.getFormItem());
    }

    HashMap<String, String> listSqls = new HashMap<String, String>();
    for (String key : fieldKeys) {
      FieldDefinitionItem item = formitemMap.get(key);
      FieldDefinition fieldDef = item.getFieldDef();

      if (fieldDef.getFieldType() == FieldDefinition.FT_COMBO
          || fieldDef.getFieldType() == FieldDefinition.FT_SELECTION
          || fieldDef.getFieldType() == FieldDefinition.FT_CHK_GRID) {
        String value = "";
        if (fieldDef.getFieldSelectMethode() > 0) {
          value = fieldDef.getFieldSelectMethode() + "";
          String parentField = fieldDef.getParentField();
          parentField = parentField == null ? "" : parentField;
          if (parentField.length() != 0) {
            FieldDefinitionItem pItem = formitemMap.get(parentField);
            String parent_id = values.get(parentField);
            if (parent_id == null || parent_id.trim().length() == 0) {
              parent_id = "-1";
            }
            parent_id = parent_id.trim();

            if (pItem != null && pItem.getFieldDef() != null)
              value += "_" + pItem.getFieldDef().getFieldSelectMethode() + "_" + parent_id;
          }

        } else value = fieldDef.getFieldSelectionSQL();
        if (value == null || value.length() < 1) continue;
        listSqls.put(key, value);
      }
    }

    getRemouteValues(values, customer_id, listSqls, true);
  }
 private FieldDefinitionItem createField(FieldDefinition field) {
   FormItem fi = null;
   switch (field.getFieldType()) {
     case FieldDefinition.FT_STRING:
       fi = new TextItem();
       break;
     case FieldDefinition.FT_INTEGER:
       fi = new IntegerItem();
       break;
     case FieldDefinition.FT_DOUBLE:
       fi = new FloatItem();
       break;
     case FieldDefinition.FT_BOOLEAN:
       fi = new CheckboxItem();
       break;
     case FieldDefinition.FT_TEXTAREA:
       fi = new TextAreaItem();
       // fi.setWidth("10000px");
       break;
     case FieldDefinition.FT_STATICTEXT:
       fi = new StaticTextItem();
       break;
     case FieldDefinition.FT_COMBO:
       fi = new ComboBoxItem();
       if (field.isNoUnknownValueComboValue())
         ((ComboBoxItem) fi).setAddUnknownValues(!field.isNoUnknownValueComboValue());
       break;
     case FieldDefinition.FT_SELECTION:
       fi = new SelectItem();
       if (field.isNoUnknownValueComboValue())
         ((SelectItem) fi).setAddUnknownValues(!field.isNoUnknownValueComboValue());
       break;
     case FieldDefinition.FT_DATE:
       fi = new CurrentTimeItem();
       break;
     case FieldDefinition.FT_CHK_GRID:
       fi = new ChkGridItem();
       break;
     case FieldDefinition.FT_MAP_ITEM:
       fi = new MapButton(this, field);
       break;
     case FieldDefinition.FT_IMAGE_ITEM:
       fi = new ImageItem(this, field);
       break;
     case FieldDefinition.FT_CUSTOM:
       fi = new CanvasItem();
       break;
     default:
       break;
   }
   if (fi == null) {
     return null;
   }
   fi.setTitle(DocFlow.getCaption(field.getFieldCaptionId(), field.getFieldCaption()));
   if (field.getFieldWidth() != null && !field.getFieldWidth().isEmpty()) {
     fi.setWidth(field.getFieldWidth());
   }
   if (field.getFieldHeight() != null && !field.getFieldHeight().isEmpty()) {
     fi.setHeight(field.getFieldHeight());
   }
   if (field.isFieldReadOnly()) {
     if (field.getFieldType() == FieldDefinition.FT_COMBO
         || field.getFieldType() == FieldDefinition.FT_SELECTION
         || field.getFieldType() == FieldDefinition.FT_DATE) fi.setCanEdit(false);
     else fi.setCanEdit(false);
   }
   setDefaultValue(field, fi);
   if (field.isHidden()) fi.setVisible(false);
   if (field.isDisabled()) {
     fi.setDisabled(true);
   }
   return new FieldDefinitionItem(field, fi);
 }