/**
  * creates a form field from the definition; sets standard values if they
  * are not defined
  *
  * @param string $fieldName       the field's name
  * @param array  $fieldDefinition the field definitions
  *
  * @return Field
  *
  * @throws Exception
  * @author Sascha Koehler <*****@*****.**>,
  *         Sebastian Diel <*****@*****.**>
  * @since 04.03.2014
  */
 public function getFormField($fieldName, $fieldDefinition)
 {
     if (!isset($fieldDefinition['type'])) {
         throw new Exception('CustomHtmlForm: Field type must be specified.');
     }
     // SelectionGroup fields use '//' as separator for key/label definition
     if (strpos($fieldName, '//') !== false) {
         list($fieldName, $fieldLabel) = explode('//', $fieldName, 2);
     }
     foreach ($this->fieldGroups as $groupFields) {
         if (isset($groupFields[$fieldName])) {
             $fieldReference =& $groupFields[$fieldName];
             break;
         }
     }
     $this->addRequiredFieldParams($fieldDefinition, $fieldReference);
     // create field
     if (CustomHtmlFormTools::isListboxField($fieldDefinition['type'])) {
         $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value'], $fieldDefinition['selectedValue'], $fieldDefinition['size'], $fieldDefinition['multiple'], $fieldDefinition['form']);
     } else {
         if (CustomHtmlFormTools::isDropdownField($fieldDefinition['type'])) {
             if ($fieldDefinition['type'] == 'TreeDropdownField') {
                 Requirements::css(FRAMEWORK_DIR . '/css/TreeDropdownField.css');
                 Requirements::css('customhtmlform/css/TreeDropdownField.css');
                 $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['sourceObject'], $fieldDefinition['selectedValue'], $fieldDefinition['labelField'], $fieldDefinition['showSearch']);
                 if (array_key_exists('treeBaseID', $fieldDefinition)) {
                     $field->setTreeBaseID($fieldDefinition['treeBaseID']);
                 }
                 if (array_key_exists('value', $fieldDefinition)) {
                     $field->setValue($fieldDefinition['value']);
                 }
             } else {
                 $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value'], $fieldDefinition['selectedValue'], $fieldDefinition['form']);
             }
         } else {
             if (CustomHtmlFormTools::isOptionsetField($fieldDefinition['type'])) {
                 $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value'], $fieldDefinition['selectedValue'], $fieldDefinition['form']);
             } else {
                 if (CustomHtmlFormTools::isSelectiongroupField($fieldDefinition['type'])) {
                     $groupFields = array();
                     foreach ($fieldDefinition['items'] as $itemFieldName => $item) {
                         $itemObj = $this->getFormField($itemFieldName, $item);
                         $groupFields[$itemFieldName] = $itemObj;
                     }
                     if (empty($groupFields)) {
                         return false;
                     }
                     $field = new $fieldDefinition['type']($fieldName, $groupFields);
                     $field->value = $fieldDefinition['value'];
                 } else {
                     if (CustomHtmlFormTools::isTextField($fieldDefinition['type'])) {
                         $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value']);
                         $field->setMaxLength($fieldDefinition['maxLength']);
                         $field->setForm($fieldDefinition['form']);
                         if (isset($fieldDefinition['placeholder']) && method_exists($field, 'setPlaceholder')) {
                             $field->setPlaceholder($fieldDefinition['placeholder']);
                         }
                         if (isset($fieldDefinition['configuration']) && is_array($fieldDefinition['configuration']) && method_exists($field, 'setConfig')) {
                             foreach ($fieldDefinition['configuration'] as $key => $value) {
                                 $field->setConfig($key, $value);
                             }
                         }
                     } else {
                         if ($fieldDefinition['type'] == 'PtCaptchaImageField') {
                             $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value'], $fieldDefinition['maxLength'], $fieldDefinition['form']);
                         } else {
                             if ($fieldDefinition['type'] == 'PasswordField') {
                                 $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value']);
                                 $field->setMaxLength($fieldDefinition['maxLength']);
                             } else {
                                 if ($fieldDefinition['type'] == 'DateField') {
                                     $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value'], $fieldDefinition['form']);
                                     $field->setMaxLength(16);
                                     if (isset($fieldDefinition['configuration']) && is_array($fieldDefinition['configuration'])) {
                                         foreach ($fieldDefinition['configuration'] as $key => $value) {
                                             $field->setConfig($key, $value);
                                         }
                                     }
                                 } else {
                                     if (CustomHtmlFormTools::isTextareaField($fieldDefinition['type'])) {
                                         if (!isset($fieldDefinition['rows'])) {
                                             $fieldDefinition['rows'] = 10;
                                             $fieldReference['rows'] = $fieldDefinition['rows'];
                                         }
                                         if (!isset($fieldDefinition['cols'])) {
                                             $fieldDefinition['cols'] = 10;
                                             $fieldReference['cols'] = $fieldDefinition['cols'];
                                         }
                                         $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value']);
                                         $field->setColumns($fieldDefinition['cols']);
                                         $field->setRows($fieldDefinition['rows']);
                                         $field->setForm($fieldDefinition['form']);
                                         if (isset($fieldDefinition['placeholder']) && method_exists($field, 'setPlaceholder')) {
                                             $field->setPlaceholder($fieldDefinition['placeholder']);
                                         }
                                     } else {
                                         if ($fieldDefinition['type'] == 'MultipleImageUploadField' || $fieldDefinition['type'] == 'MultipleFileUploadField') {
                                             if (isset($fieldDefinition['configuration']) && is_array($fieldDefinition['configuration'])) {
                                                 $configuration = $fieldDefinition['configuration'];
                                             } else {
                                                 $configuration = array();
                                             }
                                             $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $configuration, $fieldDefinition['form']);
                                             if (isset($fieldDefinition['filetypes']) && is_array($fieldDefinition['filetypes'])) {
                                                 $field->setFileTypes($fieldDefinition['filetypes']);
                                             }
                                             $field->setVar('script', urlencode($this->controller->Link() . 'uploadifyUpload'));
                                             $field->setVar('refreshlink', $this->controller->Link() . 'uploadifyRefresh');
                                             $field->setVar('refreshlink', $this->controller->Link() . 'uploadifyRefresh');
                                             if (isset($fieldDefinition['configuration']) && is_array($fieldDefinition['configuration']) && isset($fieldDefinition['configuration']['uploadFolder'])) {
                                                 $field->setUploadFolder($fieldDefinition['configuration']['uploadFolder']);
                                             } else {
                                                 $field->setUploadFolder('Uploads');
                                             }
                                             if (isset($fieldDefinition['value']) && is_array($fieldDefinition['value'])) {
                                                 $field->setValue($fieldDefinition['value']);
                                             }
                                         } else {
                                             if ($fieldDefinition['type'] == 'UploadField' || $fieldDefinition['type'] == 'CommunityImageUploadField' || $fieldDefinition['type'] == 'CommunityImageUploadField_Readonly') {
                                                 $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value']);
                                                 if (array_key_exists('configuration', $fieldDefinition) && is_array($fieldDefinition['configuration'])) {
                                                     foreach ($fieldDefinition['configuration'] as $key => $value) {
                                                         $field->setConfig($key, $value);
                                                     }
                                                 }
                                                 if (array_key_exists('allowedExtensions', $fieldDefinition) && is_array($fieldDefinition['allowedExtensions'])) {
                                                     $field->getValidator()->setAllowedExtensions($fieldDefinition['allowedExtensions']);
                                                 }
                                                 if (array_key_exists('folderName', $fieldDefinition)) {
                                                     $field->setFolderName($fieldDefinition['folderName']);
                                                 }
                                                 if (array_key_exists('record', $fieldDefinition)) {
                                                     $field->setRecord($fieldDefinition['record']);
                                                 }
                                                 if (array_key_exists('alternativeLink', $fieldDefinition)) {
                                                     $field->setAlternativeLink($fieldDefinition['alternativeLink']);
                                                 }
                                                 if (array_key_exists('showTitleField', $fieldDefinition)) {
                                                     $field->setShowTitleField($fieldDefinition['showTitleField']);
                                                 }
                                                 if (array_key_exists('showDescriptionField', $fieldDefinition)) {
                                                     $field->setShowDescriptionField($fieldDefinition['showDescriptionField']);
                                                 }
                                             } else {
                                                 if ($fieldDefinition['type'] == 'TreeMultiselectField') {
                                                     Requirements::css(FRAMEWORK_DIR . '/css/TreeDropdownField.css');
                                                     Requirements::css('customhtmlform/css/TreeDropdownField.css');
                                                     if (array_key_exists('keyField', $fieldDefinition)) {
                                                         $fieldDefinition['selectedValue'] = $fieldDefinition['keyField'];
                                                     }
                                                     $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['sourceObject'], $fieldDefinition['selectedValue'], $fieldDefinition['labelField'], $fieldDefinition['showSearch']);
                                                     if (array_key_exists('treeBaseID', $fieldDefinition)) {
                                                         $field->setTreeBaseID($fieldDefinition['treeBaseID']);
                                                     }
                                                     if (array_key_exists('value', $fieldDefinition)) {
                                                         $field->setValue($fieldDefinition['value']);
                                                     }
                                                 } else {
                                                     $formFieldHandler = self::getRegisteredFormFieldHandlerForType($fieldDefinition['type']);
                                                     if ($formFieldHandler) {
                                                         $field = $formFieldHandler->getFormField($fieldName, $fieldDefinition);
                                                     } else {
                                                         $field = new $fieldDefinition['type']($fieldName, $fieldDefinition['title'], $fieldDefinition['value']);
                                                         $field->setForm($fieldDefinition['form']);
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     if (method_exists($field, 'addExtraClass') && array_key_exists('extraClasses', $fieldDefinition) && is_array($fieldDefinition['extraClasses'])) {
         foreach ($fieldDefinition['extraClasses'] as $extraClass) {
             $field->addExtraClass($extraClass);
         }
     }
     // add error message for a field if defined
     if (isset($this->errorMessages[$fieldName])) {
         $field->errorMessage = new ArrayData(array('message' => $this->errorMessages[$fieldName]['message']));
     }
     // set identifier for mandatory fields
     if (isset($fieldDefinition['checkRequirements']) && isset($fieldDefinition['checkRequirements']['isFilledIn']) && $fieldDefinition['checkRequirements']['isFilledIn']) {
         $field->isRequiredField = true;
     } else {
         $field->isRequiredField = false;
     }
     if ($this->useCustomTabIndex()) {
         if (!in_array($this->name, self::$customTabIndexForms)) {
             self::$customTabIndexForms[] = $this->name;
         }
         $baseIndex = count(self::$customTabIndexForms) * 100;
         $tabIndex = $baseIndex + (int) $fieldDefinition['tabIndex'];
         if ($tabIndex > $this->highestTabIndex) {
             $this->highestTabIndex = $tabIndex;
         }
         if ($tabIndex == $baseIndex) {
             $tabIndex = ++$this->highestTabIndex;
         }
         $field->setTabIndex($tabIndex);
     }
     if (array_key_exists('isReadonly', $fieldDefinition) && $fieldDefinition['isReadonly'] == true && method_exists($field, 'setReadonly')) {
         $field->setReadonly(true);
     }
     if (array_key_exists('isDisabled', $fieldDefinition) && $fieldDefinition['isDisabled'] == true && method_exists($field, 'setDisabled')) {
         $field->setDisabled(true);
     }
     if (array_key_exists('data', $fieldDefinition) && $field instanceof FormField) {
         foreach ($fieldDefinition['data'] as $key => $value) {
             $field->setAttribute('data-' . $key, $value);
         }
     }
     return $field;
 }