/**
  * Delete the the ListOfValueElement.
  * Then keep metadata_value consistent: if there is no entry for a given
  * (item, $this->metadataId), create a default entry (NONE value).
  */
 function delete(&$love)
 {
     $dao =& $this->getDao();
     $deleted = $dao->delete($love->getId());
     if ($deleted) {
         $mdvFactory = new Docman_MetadataValueFactory(null);
         $deleted = $mdvFactory->deleteLove($this->metadataId, $love->getId());
     }
     return $deleted;
 }
 function create(&$md)
 {
     $md->setGroupId($this->groupId);
     $dao =& $this->getDao();
     $mdId = $dao->create($this->groupId, $md->getName(), $md->getType(), $md->getDescription(), $md->getIsRequired(), $md->getIsEmptyAllowed(), $md->getIsMultipleValuesAllowed(), $md->getSpecial(), $md->getUseIt());
     if ($mdId !== false) {
         if ($md->getType() == PLUGIN_DOCMAN_METADATA_TYPE_LIST) {
             // Insert 'none' value in the list (first value).
             $loveFactory = new Docman_MetadataListOfValuesElementFactory($mdId);
             $inserted = $loveFactory->createNoneValue();
             if ($inserted === false) {
                 $mdId = false;
             }
         }
         if ($mdId !== false) {
             // Update existing items, and give them the default
             // value of the metadata.
             // We only need to do that with list of value element for
             // beeing able to easily manipulate 'None' value (esp. for
             // reports).
             $mdvFactory = new Docman_MetadataValueFactory($this->groupId);
             $mdvFactory->updateOrphansLoveItem($mdId);
         }
     }
     return $mdId;
 }
 function setMetadataValuesFromUserInput(&$item, $itemArray, $metadataArray)
 {
     $mdvFactory = new Docman_MetadataValueFactory($this->groupId);
     $mdFactory = new Docman_MetadataFactory($this->groupId);
     $mdIter =& $item->getMetadataIterator();
     $mdIter->rewind();
     while ($mdIter->valid()) {
         $md =& $mdIter->current();
         $value = $this->getValueInArrays($md->getLabel(), $itemArray, $metadataArray);
         if ($value !== null) {
             $mdv = $mdvFactory->newMetadataValue($item->getId(), $md->getId(), $md->getType(), $value);
             $val = $mdv->getValue();
             $mdvFactory->validateInput($md, $val);
             $md->setValue($val);
             // Take care to update hardcoded values too.
             if ($mdFactory->isHardCodedMetadata($md->getLabel())) {
                 $item->updateHardCodedMetadata($md);
             }
         }
         $mdIter->next();
     }
 }
 function update()
 {
     $request =& $this->_controler->request;
     if ($request->exist('item')) {
         $user =& $this->_controler->getUser();
         $data = $request->get('item');
         $item_factory =& $this->_getItemFactory($request->get('group_id'));
         $item =& $item_factory->getItemFromDb($data['id']);
         // Update Owner
         $ownerChanged = false;
         if (isset($data['owner'])) {
             $_owner_id = $this->_checkOwnerChange($data['owner'], $user);
             if ($_owner_id != $item->getOwnerId()) {
                 $ownerChanged = true;
                 $um = $this->_getUserManagerInstance();
                 $_oldowner = $um->getUserById($item->getOwnerId())->getName();
                 $_newowner = $um->getUserById($_owner_id)->getName();
                 $data['user_id'] = $_owner_id;
             }
             unset($data['owner']);
         }
         // Change creation date
         if (isset($data['create_date']) && $data['create_date'] != '') {
             $old_create_date = $item->getCreateDate();
             if ($old_create_date == $data['create_date']) {
                 $create_date_changed = false;
             } else {
                 $create_date_changed = true;
             }
         } else {
             $create_date_changed = false;
         }
         // Change update date
         if (isset($data['update_date']) && $data['update_date'] != '') {
             $old_update_date = $item->getUpdateDate();
             if ($old_update_date == $data['update_date']) {
                 $update_date_changed = false;
             } else {
                 $update_date_changed = true;
             }
         } else {
             $update_date_changed = false;
         }
         // Special handling of obsolescence date
         if (isset($data['obsolescence_date']) && $data['obsolescence_date'] != 0) {
             if (preg_match('/^([0-9]+)-([0-9]+)-([0-9]+)$/', $data['obsolescence_date'], $d)) {
                 $data['obsolescence_date'] = gmmktime(0, 0, 0, $d[2], $d[3], $d[1]);
             } else {
                 if (!preg_match('/^[0-9]*$/', $data['obsolescence_date'])) {
                     $data['obsolescence_date'] = 0;
                 }
             }
         }
         // Check is status change
         $statusChanged = false;
         if (array_key_exists('status', $data)) {
             $old_st = $item->getStatus();
             if ($old_st != $data['status']) {
                 $statusChanged = true;
             }
         }
         // For empty document, check if type changed
         $createFile = false;
         $itemType = $item_factory->getItemTypeForItem($item);
         if ($itemType == PLUGIN_DOCMAN_ITEM_TYPE_EMPTY && isset($data['item_type']) && $itemType != $data['item_type'] && ($data['item_type'] != PLUGIN_DOCMAN_ITEM_TYPE_EMBEDDEDFILE || $this->_controler->getProperty('embedded_are_allowed'))) {
             if ($data['item_type'] == PLUGIN_DOCMAN_ITEM_TYPE_EMBEDDEDFILE || $data['item_type'] == PLUGIN_DOCMAN_ITEM_TYPE_FILE) {
                 $createFile = true;
             }
         } else {
             $data['item_type'] = $itemType;
         }
         $updated = $item_factory->update($data);
         if ($updated) {
             $this->event_manager->processEvent('plugin_docman_event_update', array('group_id' => $request->get('group_id'), 'item' => $item, 'new' => $data, 'user' => $user));
         }
         // Log the 'edit' event if link_url or wiki_page are set
         if (isset($data['link_url']) || isset($data['wiki_page'])) {
             $this->event_manager->processEvent('plugin_docman_event_edit', array('group_id' => $request->get('group_id'), 'item' => &$item, 'user' => &$user));
         }
         if ($ownerChanged) {
             $this->_raiseMetadataChangeEvent($user, $item, $request->get('group_id'), $_oldowner, $_newowner, 'owner');
         }
         if ($statusChanged) {
             $this->_raiseMetadataChangeEvent($user, $item, $request->get('group_id'), $old_st, $data['status'], 'status');
         }
         if ($create_date_changed) {
             $this->_raiseMetadataChangeEvent($user, $item, $request->get('group_id'), $old_create_date, $data['create_date'], 'create_date');
         }
         if ($update_date_changed) {
             $this->_raiseMetadataChangeEvent($user, $item, $request->get('group_id'), $old_update_date, $data['update_date'], 'update_date');
         }
         if ($createFile) {
             // Re-create from DB (because of type changed)
             $item = $item_factory->getItemFromDb($data['id']);
             $this->_storeFile($item);
         }
         // Update real metatata
         if ($request->exist('metadata')) {
             $groupId = (int) $request->get('group_id');
             $metadata_array = $request->get('metadata');
             $mdvFactory = new Docman_MetadataValueFactory($groupId);
             $mdvFactory->updateFromRow($data['id'], $metadata_array);
             if ($mdvFactory->isError()) {
                 $this->_controler->feedback->log('error', $mdvFactory->getErrorMessage());
             } else {
                 // Recursive update of properties
                 if ($request->exist('recurse')) {
                     $recurseArray = $request->get('recurse');
                     // Check if all are actually inheritable
                     $metadataFactory = new Docman_MetadataFactory($groupId);
                     $inheritableMdLabelArray = $metadataFactory->getInheritableMdLabelArray();
                     if (count(array_diff($recurseArray, $inheritableMdLabelArray)) == 0) {
                         $dPm =& Docman_PermissionsManager::instance($groupId);
                         if ($dPm->currentUserCanWriteSubItems($data['id'])) {
                             $subItemsWritableVisitor =& $dPm->getSubItemsWritableVisitor();
                             if ($this->_controler->_actionParams['recurseOnDocs']) {
                                 $itemIdArray = $subItemsWritableVisitor->getItemIdList();
                             } else {
                                 $itemIdArray = $subItemsWritableVisitor->getFolderIdList();
                             }
                             // Remove the first element (parent item) to keep
                             // only the children.
                             array_shift($itemIdArray);
                             if (count($itemIdArray) > 0) {
                                 $recurseArray = $request->get('recurse');
                                 $mdvFactory->massUpdateFromRow($data['id'], $recurseArray, $itemIdArray);
                                 // extract cross references
                                 $reference_manager =& ReferenceManager::instance();
                                 foreach ($metadata_array as $curr_metadata_value) {
                                     foreach ($itemIdArray as $curr_item_id) {
                                         $reference_manager->extractCrossRef($curr_metadata_value, $curr_item_id, ReferenceManager::REFERENCE_NATURE_DOCUMENT, $groupId);
                                     }
                                 }
                             } else {
                                 $this->_controler->feedback->log('warning', $GLOBALS['Language']->getText('plugin_docman', 'warning_no_item_recurse'));
                             }
                         }
                     }
                 }
             }
         }
         $this->_controler->feedback->log('info', $GLOBALS['Language']->getText('plugin_docman', 'info_item_updated'));
     }
     $this->event_manager->processEvent('send_notifications', array());
 }