public function getToDate()
 {
     $time = null;
     if ($this->GTUdate['time']) {
         $time = $this->GTUdate['time'];
     }
     return $this->GTUdate['to'] ? FuzzyDateTime::getValidDate($this->GTUdate['to']) : $time;
 }
 private function endElement($parser, $name)
 {
     $this->cdata = trim($this->cdata);
     $this->inside_data = false;
     if (in_array($this->getPreviousTag(), array('Bacterial', 'Zoological', 'Botanical', 'Viral'))) {
         $this->object->handleKeyword($this->tag, $this->cdata, $this->staging);
     } elseif ($this->getPreviousTag() == "efg:LithostratigraphicAttribution" && $name != "efg:InformalLithostratigraphicName") {
         $this->object->handleParent($name, strtolower($this->cdata), $this->staging);
     } else {
         switch ($name) {
             case "AccessionCatalogue":
                 $this->object->addAccession($this->cdata);
                 break;
             case "AccessionDate":
                 if (date('Y-m-d H:i:s', strtotime($this->cdata)) == $this->cdata) {
                     $this->object->InitAccessionVar($this->cdata);
                 }
                 break;
             case "AccessionNumber":
                 $this->object->accession_num = $this->cdata;
                 $this->object->HandleAccession($this->staging, $this->object_to_save);
                 break;
             case "Accuracy":
                 $this->getPreviousTag() == 'Altitude' ? $this->staging['gtu_elevation_accuracy'] = $this->cdata : ($this->property->property->property_accuracy = $this->cdata);
                 break;
             case "AcquisitionDate":
                 $dt = FuzzyDateTime::getValidDate($this->cdata);
                 if (!is_null($dt)) {
                     $this->staging['acquisition_date'] = $dt->getDateTime();
                     $this->staging['acquisition_date_mask'] = $dt->getMask();
                 }
                 break;
             case "AcquisitionType":
                 $this->staging['acquisition_category'] = in_array($this->cdata, SpecimensTable::$acquisition_category) ? array_search($this->cdata, SpecimensTable::$acquisition_category) : 'undefined';
                 break;
             case "AppliesTo":
                 $this->property->setAppliesTo($this->cdata);
                 break;
             case "AreaClass":
                 $this->object->tag_group_name = $this->cdata;
                 break;
             case "AreaName":
                 $this->object->tag_value = $this->cdata;
                 break;
             case "AssociatedUnitID":
                 if (in_array($this->cdata, array_keys($this->unit_id_ref))) {
                     $this->object->setStagingRelatedRef($this->unit_id_ref[$this->cdata]);
                 } else {
                     $this->object->setSourceId($this->cdata);
                     $this->object->setUnitType('external');
                 }
                 break;
             case "AssociatedUnitSourceInstitutionCode":
                 $this->object->setInstitutionName($this->cdata);
                 break;
             case "AssociatedUnitSourceName":
                 $this->object->setSourceName($this->cdata);
                 break;
             case "AssociationType":
                 $this->object->setRelationshipType($this->cdata);
                 break;
             case "efg:ChronostratigraphicAttribution":
                 $this->cdata = $this->object->setChronoParent();
                 if ($this->cdata) {
                     $this->property = new ParsingProperties("Local stage", "chronostratigraphy");
                     $this->property->property->setLowerValue($this->cdata['name']);
                     $this->addProperty(true);
                 }
                 break;
             case "efg:ChronoStratigraphicDivision":
                 $this->object->getChronoLevel(strtolower($this->cdata));
                 break;
             case "efg:ChronostratigraphicAttributions":
                 $this->object->saveChrono($this->staging);
                 break;
             case "efg:ChronostratigraphicName":
                 $this->object->name = $this->cdata;
                 break;
             case "Code":
                 $this->staging['gtu_code'] = (string) $this->cdata;
                 break;
             case "CoordinateErrorDistanceInMeters":
                 $this->staging['gtu_lat_long_accuracy'] = $this->cdata;
                 break;
             case "Context":
                 $this->object->multimedia_data['sub_type'] = $this->cdata;
                 break;
             case "CreatedDate":
                 $this->object->multimedia_data['creation_date'] = $this->cdata;
                 break;
             case "Country":
                 $this->staging_tags[] = $this->object->addTagGroups();
                 break;
             case "Database":
                 $this->object->desc .= "Database ref :" . $this->cdata . ";";
                 break;
             case "DateText":
                 $this->object->getDateText($this->cdata);
                 break;
             case "DateTime":
                 if ($this->getPreviousTag() == "Gathering") {
                     if ($this->object->getFromDate()) {
                         $this->staging["gtu_from_date"] = $this->object->getFromDate()->getDateTime();
                     }
                     if ($this->object->getToDate()) {
                         $this->staging["gtu_to_date"] = $this->object->getToDate()->getDateTime();
                     }
                     if ($this->object->getFromDate()) {
                         $this->staging["gtu_from_date_mask"] = $this->object->getFromDate()->getMask();
                     }
                     if ($this->object->getToDate()) {
                         $this->staging["gtu_to_date_mask"] = $this->object->getToDate()->getMask();
                     }
                 }
                 break;
             case "TimeOfDayBegin":
                 if ($this->getPreviousTag() == "DateTime") {
                     $this->object->GTUdate['from'] .= " " . $this->cdata;
                 }
                 break;
             case "TimeOfDayEnd":
                 if ($this->getPreviousTag() == "DateTime") {
                     $this->object->GTUdate['to'] .= " " . $this->cdata;
                 }
                 break;
             case "dna:Concentration":
                 $this->property = new ParsingProperties("Concentration", "DNA");
                 $this->property->property->setLowerValue($this->cdata);
                 $this->property->property->setPropertyUnit("ng/µl");
                 $this->addProperty(true);
                 break;
             case "dna:DNASample":
                 $this->object->addMaintenance($this->staging);
                 break;
             case "dna:ExtractionDate":
                 $dt = FuzzyDateTime::getValidDate($this->cdata);
                 if (!is_null($dt)) {
                     $this->object->maintenance->setModificationDateTime($dt->getDateTime());
                     $this->object->maintenance->setModificationDateMask($dt->getMask());
                 }
                 break;
             case "dna:ExtractionMethod":
                 $this->object->maintenance->setDescription($this->cdata);
                 break;
             case "dna:ExtractionStaff":
                 $this->handlePeople($this->object->people_type, $this->cdata);
                 break;
             case "dna:GenBankNumber":
                 $this->handleGenbankNumber($this->cdata);
                 break;
             case "dna:RatioOfAbsorbance260_280":
                 $this->property = new ParsingProperties("Ratio of absorbance 260/280", "DNA");
                 $this->property->property->setLowerValue($this->cdata);
                 $this->addProperty(true);
                 break;
             case "dna:Tissue":
                 $this->property = new ParsingProperties("Tissue", "DNA");
                 $this->property->property->setLowerValue($this->cdata);
                 $this->addProperty(true);
                 break;
             case "dna:Preservation":
                 $this->addComment(false, "conservation_mean");
                 break;
             case "Duration":
                 $this->property->setDateTo($this->cdata);
                 break;
             case "FileURI":
                 $this->handleFileURI($this->cdata);
                 break;
             case "Format":
                 $this->object->multimedia_data['type'] = $this->cdata;
                 break;
             case "FullName":
                 $this->people_name = $this->cdata;
                 break;
             case "efg:ScientificNameString":
                 $this->object->fullname = $this->cdata;
                 break;
             case "FullScientificNameString":
                 $this->object->fullname = $this->cdata;
                 break;
             case "InformalNameString":
                 $this->object->fullname = $this->cdata;
                 $this->object->setInformal(true);
                 $this->staging["taxon_name"] = $this->object->getLastParentName();
                 $this->staging["taxon_level_name"] = $this->object->getLastParentLevel();
                 break;
             case "MarkText":
                 $this->staging->setObjectName($this->cdata);
                 break;
             case "efg:InformalLithostratigraphicName":
                 $this->addComment(true, "lithostratigraphy");
                 break;
             case "Gathering":
                 if ($this->object->staging_info !== null) {
                     $this->object_to_save[] = $this->object->staging_info;
                 }
                 break;
             case "HigherTaxa":
                 $this->object->getCatalogueParent($this->staging);
                 break;
             case "HigherTaxon":
                 $this->object->handleParent();
                 break;
             case "HigherTaxonName":
                 $this->object->higher_name = $this->cdata;
                 break;
             case "HigherTaxonRank":
                 $this->object->higher_level = strtolower($this->cdata);
                 break;
             case "TaxonIdentified":
                 $this->object->checkNoSelfInParents($this->staging);
                 break;
             case "efg:LithostratigraphicAttribution":
                 $this->staging["litho_parents"] = $this->object->getParent();
                 break;
             case "Identification":
                 $this->object->save($this->staging);
                 break;
             case "IdentificationHistory":
                 $this->addComment(true, 'taxonomy');
                 break;
             case "ID-in-Database":
                 $this->object->desc .= "id in database :" . $this->cdata . " ;";
                 break;
             case "ISODateTimeBegin":
                 if ($this->getPreviousTag() == "DateTime") {
                     $this->object->GTUdate['from'] = $this->cdata;
                 } elseif ($this->getPreviousTag() == "Date") {
                     $this->object->identification->setNotionDate(FuzzyDateTime::getValidDate($this->cdata));
                 }
                 break;
             case "ISODateTimeEnd":
                 if ($this->getPreviousTag() == "DateTime") {
                     $this->object->GTUdate['to'] = $this->cdata;
                 }
                 break;
             case "IsQuantitative":
                 $this->property->property->setIsQuantitative($this->cdata);
                 break;
             case "KindOfUnit":
                 $this->staging['part'] = $this->cdata;
                 break;
             case "RecordBasis":
                 if ($this->cdata == "PreservedSpecimen") {
                     $this->staging->setCategory('specimen');
                 } else {
                     $this->staging->setCategory('observation');
                 }
                 break;
             case "LatitudeDecimal":
                 $this->staging['gtu_latitude'] = $this->cdata;
                 break;
             case "Length":
                 $this->object->desc .= "Length : " . $this->cdata . " ;";
                 break;
             case "efg:LithostratigraphicAttributions":
                 $this->object->setAttribution($this->staging);
                 break;
             case "LocalityText":
                 (string) $this->addComment(false, "exact_site");
                 break;
             case "LongitudeDecimal":
                 $this->staging['gtu_longitude'] = $this->cdata;
                 break;
             case "LowerValue":
                 $this->property->property->setLowerValue($this->cdata);
                 break;
             case "MeasurementDateTime":
                 $this->property->getDateFrom($this->cdata, $this->getPreviousTag(), $this->staging);
                 break;
             case "Method":
                 if ($this->getPreviousTag() == "Identification") {
                     $this->addComment(false, "identifications");
                 } else {
                     $this->object_to_save[] = $this->object->addMethod($this->cdata, $this->staging->getId());
                 }
                 break;
             case "efg:Petrology":
                 break;
             case "MeasurementsOrFacts":
                 if ($this->object && property_exists($this->object, 'staging_info') && $this->getPreviousTag() != "Unit" && $this->object->staging_info) {
                     $this->object_to_save[] = $this->object->staging_info;
                 }
                 break;
             case "MeasurementOrFactAtomised":
                 if ($this->getPreviousTag() == "Altitude") {
                     //Set Altitude in meters in GTU
                     $altitude = str_replace('.', ',', $this->property->property->getLowerValue());
                     $comma_count = mb_substr_count($altitude, ',');
                     if ($comma_count > 1) {
                         $altitude = preg_replace('/\\,/', '', $altitude, $comma_count - 1);
                     }
                     $altitude = str_replace(',', '.', $altitude);
                     $this->staging['gtu_elevation'] = $altitude;
                 } else {
                     $this->addProperty();
                 }
                 break;
             case "MeasurementOrFactText":
                 $this->addComment();
                 break;
             case "MineralColour":
                 $this->staging->setMineralColour($this->cdata);
                 break;
             case "efg:MineralRockClassification":
                 if ($this->getPreviousTag() == "efg:MineralRockGroup") {
                     $this->object->higher_level = strtolower($this->cdata);
                 } elseif ($this->getPreviousTag() == "efg:MineralRockNameAtomised") {
                     $this->object->classification = strtolower($this->cdata);
                 }
                 break;
             case "efg:MineralRockGroup":
                 $this->object->handleRockParent();
                 break;
             case "efg:MineralRockGroupName":
                 $this->object->higher_name = $this->cdata;
                 break;
             case "efg:MineralRockIdentified":
                 $this->object->getCatalogueParent($this->staging);
                 if ($this->object->notion !== 'mineralogy') {
                     $this->object->checkNoSelfInParents($this->staging);
                 }
                 break;
             case "Name":
                 if ($this->getPreviousTag() == "Country") {
                     $this->object->tag_value = $this->cdata;
                 }
                 break;
             case "efg:NameComments":
                 $this->object->setNotion(strtolower($this->cdata));
                 break;
             case "NameAddendum":
                 if (stripos($this->cdata, 'Variety') !== false) {
                     $this->object->level_name = 'variety';
                     $this->object->catalogue_parent['variety'] = $this->object->getCatalogueName();
                 }
                 break;
             case "NamedArea":
                 $this->staging_tags[] = $this->object->addTagGroups();
                 break;
             case "Notes":
                 if ($this->getPreviousTag() == "Identification") {
                     $this->addComment(true, "identifications");
                 } else {
                     $this->addComment();
                 }
                 break;
             case "Parameter":
                 $this->property->property->setPropertyType($this->cdata);
                 if ($this->cdata == 'DNA size') {
                     $this->property->property->setAppliesTo('DNA');
                 }
                 break;
             case "PersonName":
                 $this->handlePeople($this->object->people_type, $this->people_name);
                 break;
             case "Person":
                 $this->handlePeople($this->object->people_type, $this->people_name);
                 break;
             case "efg:MineralDescriptionText":
                 $this->addComment(true, 'mineralogy');
                 break;
             case "PetrologyDescriptiveText":
                 //SAME AS BELOW
             //SAME AS BELOW
             case "efg:PetrologyDescriptiveText":
                 $this->addComment(true, 'description');
                 break;
             case "PhaseOrStage":
                 $this->staging->setIndividualStage($this->cdata);
                 break;
             case "Preparation":
                 $this->addPreparation();
                 break;
             case "PreparationType":
                 $this->preparation_type = $this->cdata;
                 break;
             case "PreparationMaterials":
                 $this->preparation_mat = $this->cdata;
                 break;
             case "ProjectTitle":
                 $this->staging['expedition_name'] = $this->cdata;
                 break;
             case "RecordURI":
                 $this->addExternalLink($this->cdata);
                 break;
             case "ScientificName":
                 $this->staging["taxon_name"] = $this->object->getCatalogueName();
                 $this->staging["taxon_level_name"] = strtolower($this->object->level_name);
                 break;
             case "Sequence":
                 $this->object->addMaintenance($this->staging, true);
                 break;
             case "Sex":
                 if (strtolower($this->cdata) == 'm') {
                     $this->staging->setIndividualSex('male');
                 } elseif (strtolower($this->cdata) == 'f') {
                     $this->staging->setIndividualSex('female');
                 } elseif (strtolower($this->cdata) == 'u') {
                     $this->staging->setIndividualSex('unknown');
                 } elseif (strtolower($this->cdata) == 'n') {
                     $this->staging->setIndividualSex('not applicable');
                 } elseif (strtolower($this->cdata) == 'x') {
                     $this->staging->setIndividualSex('mixed');
                 }
                 break;
             case "storage:Barcode":
                 $this->addCode("barcode");
                 break;
                 // c'est un code avec "2dbarcode" dans le main
             // c'est un code avec "2dbarcode" dans le main
             case "storage:Institution":
                 $this->staging->setInstitutionName($this->cdata);
                 break;
             case "storage:Building":
                 $this->staging->setBuilding($this->cdata);
                 break;
             case "storage:Floor":
                 $this->staging->setFloor($this->cdata);
                 break;
             case "storage:Room":
                 $this->staging->setRoom($this->cdata);
                 break;
             case "storage:Column":
                 $this->staging->setCol($this->cdata);
                 break;
             case "storage:Row":
                 $this->staging->setRow($this->cdata);
                 break;
             case "storage:Shelf":
                 $this->staging->setShelf($this->cdata);
                 break;
             case "storage:Rack":
                 $this->staging->setShelf($this->cdata);
                 break;
             case "storage:Box":
                 $this->staging->setContainerType('box');
                 $this->staging->setContainer($this->cdata);
                 break;
             case "storage:Tube":
                 $this->staging->setSubContainerType('tube');
                 $this->staging->setSubContainer($this->cdata);
                 break;
             case "storage:ContainerName":
                 $this->staging->setContainer($this->cdata);
                 break;
             case "storage:ContainerType":
                 $this->staging->setContainerType($this->cdata);
                 break;
             case "storage:ContainerStorage":
                 $this->staging->setContainerStorage($this->cdata);
                 break;
             case "storage:SubcontainerName":
                 $this->staging->setSubContainer($this->cdata);
                 break;
             case "storage:SubcontainerType":
                 $this->staging->setSubContainerType($this->cdata);
                 break;
             case "storage:SubcontainerStorage":
                 $this->staging->setSubContainerStorage($this->cdata);
                 break;
             case "storage:Position":
                 $this->staging->setSubContainerType('position');
                 $this->staging->setSubContainer($this->cdata);
                 break;
             case "Text":
                 if ($this->getPreviousTag() == "Biotope") {
                     $this->object->tag_group_name = 'ecology';
                     $this->object->tag_value = $this->cdata;
                     $this->staging_tags[] = $this->object->addTagGroups();
                 }
                 break;
             case "TitleCitation":
                 if (substr($this->cdata, 0, 7) == 'http://') {
                     $this->addExternalLink($this->cdata);
                 }
                 if ($this->getPreviousTag() == "UnitReference") {
                     $this->addComment(true, 'publication');
                 } else {
                     $this->addComment(true, "identifications");
                 }
                 break;
             case "TypeStatus":
                 $this->staging->setIndividualType($this->cdata);
                 break;
             case "Unit":
                 $this->saveUnit();
                 break;
             case "UnitAssociation":
                 $this->staging->addRelated($this->object);
                 $this->object = null;
                 break;
             case "UnitID":
                 $this->addCode();
                 $this->name = $this->cdata;
                 break;
             case "SourceID":
                 if ($this->cdata != 'Not defined') {
                     $this->addCode('secondary');
                 }
                 break;
             case "UnitOfMeasurement":
                 $this->property->property->setPropertyUnit($this->cdata);
                 break;
             case "Accuracy":
                 $this->property->property->setPropertyAccuracy($this->cdata);
                 break;
             case "UpperValue":
                 $this->property->property->setUpperValue($this->cdata);
                 break;
             case "efg:InformalNameString":
                 $this->addComment(true, "identifications");
                 break;
             case "VerificationLevel":
                 $this->object->determination_status = $this->cdata;
                 break;
             case "storage:Type":
                 $this->code_type = $this->cdata;
                 break;
             case "storage:Value":
                 $this->addCode($this->code_type);
                 break;
             case "Major":
                 $this->version = $this->cdata;
                 break;
             case "Minor":
                 $this->version .= !empty($this->cdata) ? '.' . $this->cdata : '';
                 break;
             case "Version":
                 $this->version_defined = true;
                 $authorized = sfConfig::get('tpl_authorizedversion');
                 Doctrine::getTable('Imports')->find($this->import_id)->setTemplateVersion(trim($this->version))->save();
                 if (!isset($authorized['specimens']) || empty($authorized['specimens']) || isset($authorized['specimens']) && !empty($authorized['specimens']) && !in_array(trim($this->version), $authorized['specimens'])) {
                     $this->errors_reported .= $this->version_error_msg;
                 }
                 break;
         }
     }
     $this->tag = "";
     $this->path = substr($this->path, 0, strrpos($this->path, "/{$name}"));
 }
 public function getDateText($date)
 {
     $this->identification->setNotionDate(FuzzyDateTime::getValidDate($date));
 }