/**
  * Short description of method initElements
  *
  * @access public
  * @author Somsack Sipasseuth, <*****@*****.**>
  * @return mixed
  */
 public function initElements()
 {
     $versioned = $this->versionedFile->isVersioned();
     $freeFilePath = isset($this->options['freeFilePath']) ? (bool) $this->options['freeFilePath'] : false;
     /*
      * 1. BUILD FORM
      */
     // File Content
     $contentGroup = array();
     function return_bytes($val)
     {
         $val = trim($val);
         $last = strtolower($val[strlen($val) - 1]);
         switch ($last) {
             // Le modifieur 'G' est disponible depuis PHP 5.1.0
             case 'g':
                 $val *= 1024;
             case 'm':
                 $val *= 1024;
             case 'k':
                 $val *= 1024;
         }
         return $val;
     }
     $browseElt = tao_helpers_form_FormFactory::getElement("file_import", "AsyncFile");
     $browseElt->addValidator(tao_helpers_form_FormFactory::getValidator('FileSize', array('max' => return_bytes(ini_get('post_max_size')))));
     //make the content compulsory if it does not exist already
     if (!$versioned) {
         $browseElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
         $browseElt->setDescription(__("Upload the file to version"));
     } else {
         $browseElt->setDescription(__("Upload a new content"));
     }
     $this->form->addElement($browseElt);
     array_push($contentGroup, $browseElt->getName());
     $commitMessageElt = tao_helpers_form_FormFactory::getElement("commit_message", "Textarea");
     $commitMessageElt->setDescription(__("Commit message : "));
     $this->form->addElement($commitMessageElt);
     array_push($contentGroup, $commitMessageElt->getName());
     // if the file is already versioned add a way to download it
     if ($versioned) {
         $downloadUrl = $this->getDownloadUrl($this->versionedFile);
         $downloadFileElt = tao_helpers_form_FormFactory::getElement("file_download", 'Free');
         $downloadFileElt->setValue("<a href='{$downloadUrl}' class='blink' target='_blank'><img src='" . TAOBASE_WWW . "img/document-save.png' alt='Download versioned file' class='icon'  /> " . __('Download content') . "</a>");
         $this->form->addElement($downloadFileElt);
         array_push($contentGroup, $downloadFileElt->getName());
         $deleteFileElt0 = tao_helpers_form_FormFactory::getElement("file_delete0", 'Free');
         $deleteFileElt0->setValue("<a id='delete-versioned-file' href='#' class='blink' target='_blank'><img src='" . TAOBASE_WWW . "img/edit-delete.png' alt='Delete versioned file' class='icon'  /> " . __('Remove content') . "</a>");
         $this->form->addElement($deleteFileElt0);
         array_push($contentGroup, $deleteFileElt0->getName());
         $deleteFileElt = tao_helpers_form_FormFactory::getElement("file_delete", 'Hidden');
         $deleteFileElt->setValue(0);
         $this->form->addElement($deleteFileElt);
         array_push($contentGroup, $deleteFileElt->getName());
     }
     $this->form->createGroup('file', 'Content', $contentGroup);
     //File Meta
     $fileNameElt = tao_helpers_form_FormFactory::getElement(tao_helpers_Uri::encode(PROPERTY_FILE_FILENAME), $versioned ? 'Label' : 'Textbox');
     $fileNameElt->setDescription(__("File name"));
     if (!$versioned) {
         $fileNameElt->addValidator(tao_helpers_form_FormFactory::getValidator('FileName'));
     }
     $this->form->addElement($fileNameElt);
     //file path element to be added or not:
     $filePathElt = tao_helpers_form_FormFactory::getElement(tao_helpers_Uri::encode(PROPERTY_FILE_FILEPATH), $freeFilePath ? 'Textbox' : 'Hidden');
     $filePathElt->setDescription(__("File path"));
     $this->form->addElement($filePathElt);
     $repositoryEltOptions = array();
     foreach (helpers_FileSource::getFileSources() as $fileSystem) {
         $repositoryEltOptions[tao_helpers_Uri::encode($fileSystem->getUri())] = $fileSystem->getLabel();
     }
     $fileRepositoryElt = tao_helpers_form_FormFactory::getElement(tao_helpers_Uri::encode(PROPERTY_FILE_FILESYSTEM), $versioned ? 'Label' : 'Radiobox');
     $fileRepositoryElt->setDescription(__("File repository"));
     if (!$versioned) {
         $fileRepositoryElt->setOptions($repositoryEltOptions);
     }
     $fileRepositoryElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
     $this->form->addElement($fileRepositoryElt);
     $this->form->createGroup('meta', 'Description', array($fileNameElt->getName(), $filePathElt->getName(), $fileRepositoryElt->getName()));
     // File Revision
     if ($versioned) {
         $fileVersionOptions = array();
         $history = $this->versionedFile->gethistory();
         $countHistory = count($history);
         foreach ($history as $i => $revision) {
             $date = new DateTime($revision['date']);
             $fileVersionOptions[$countHistory - $i] = $countHistory - $i . '. ' . $revision['msg'] . ' [' . $revision['author'] . ' / ' . $date->format('Y-m-d H:i:s') . '] ';
         }
         $fileRevisionElt = tao_helpers_form_FormFactory::getElement('file_version', 'Radiobox');
         $fileRevisionElt->setDescription(__("File revision"));
         $fileRevisionElt->setOptions($fileVersionOptions);
         $fileRevisionElt->setValue($countHistory);
         $this->form->addElement($fileRevisionElt);
         $this->form->createGroup('revision', 'Version', array($fileRevisionElt->getName()));
     }
     /*
      * 2. HIDDEN FIELDS
      */
     //add an hidden elt for the property uri (Property associated to the owner instance)
     $propertyUriElt = tao_helpers_form_FormFactory::getElement("propertyUri", "Hidden");
     $propertyUriElt->setValue(tao_helpers_Uri::encode($this->property->getUri()));
     $this->form->addElement($propertyUriElt);
     //add an hidden elt for the instance Uri
     //usefull to render the revert action
     $instanceUriElt = tao_helpers_form_FormFactory::getElement('uri', 'Hidden');
     $instanceUriElt->setValue(tao_helpers_Uri::encode($this->ownerInstance->getUri()));
     $this->form->addElement($instanceUriElt);
     /*
      * 3. FILL THE FORM
      */
     if ($versioned) {
         $fileNameValue = $this->versionedFile->getOnePropertyValue(new core_kernel_classes_Property(PROPERTY_FILE_FILENAME));
         if (!empty($fileNameValue)) {
             $fileNameElt->setValue((string) $fileNameValue);
         }
         $filePathValue = $this->versionedFile->getOnePropertyValue(new core_kernel_classes_Property(PROPERTY_FILE_FILEPATH));
         if (!empty($filePathValue)) {
             $filePathElt->setValue((string) $filePathValue);
         }
         $repositoryValue = $this->versionedFile->getOnePropertyValue(new core_kernel_classes_Property(PROPERTY_FILE_FILESYSTEM));
         if (!empty($repositoryValue)) {
             $fileRepositoryElt->setValue($repositoryValue->getUri());
         }
         $history = $this->versionedFile->gethistory();
         $versionElt = $this->form->getElement('file_version');
         $versionElt->setValue(count($history));
     } else {
         if (!$freeFilePath) {
             $filePathElt->setValue($this->getDefaultFilePath());
         } else {
             $filePathElt->setValue('/');
         }
         $defaultRepo = $this->getDefaultRepository();
         if (!is_null($defaultRepo)) {
             $fileRepositoryElt->setValue($defaultRepo->getUri());
         }
     }
 }