/**
  * Creates the image and returns the image HTML tag as string.
  * Please note: The properties are currently not used.
  *
  * @param array $properties key value pairs for template variables
  *
  * @return string HTML
  *
  * @author Sascha Koehler <*****@*****.**>, 
  *         Patrick Schneider <*****@*****.**>
  *         Ramon Kupper <*****@*****.**>
  * @since 05.02.2015
  */
 public function Field($properties = array())
 {
     if ($this->cachedField === null) {
         $picture = $this->getPic($this->getNrOfChars());
         $this->cachedField = '
             <img src="' . CustomHtmlFormTools::getBaseURLSegment() . 'customhtmlformimage/get/cap_' . $picture . '/jpg" width="' . $this->width . '" height="' . $this->height . '" alt="Captcha" />
         ';
     }
     return $this->cachedField;
 }
 /**
  * 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;
 }
 /**
  * Returns the base URL segment that's used for inclusion of css and
  * javascript files via Requirements.
  *
  * @return string
  *
  * @author Sascha Koehler <*****@*****.**>
  * @since 16.02.2012
  */
 public static function getBaseURLSegment()
 {
     if (is_null(self::$baseURLSegment)) {
         $baseUrl = Director::baseURL();
         if ($baseUrl === '/') {
             $baseUrl = '';
         }
         if (!empty($baseUrl) && substr($baseUrl, -1) != '/') {
             $baseUrl .= '/';
         }
         self::$baseURLSegment = $baseUrl;
     }
     return self::$baseURLSegment;
 }