diff --git a/checklists/checklist.php b/checklists/checklist.php index 625166afbe..6b7b4a83b1 100644 --- a/checklists/checklist.php +++ b/checklists/checklist.php @@ -153,12 +153,12 @@ #sddm div{position: absolute;visibility:hidden;margin:0;padding:0;background:#EAEBD8;border:1px solid #5970B2} #sddm div a {position: relative;display:block;margin:0;padding:5px 10px;width:auto;white-space:nowrap;text-align:left;text-decoration:none;background:#EAEBD8;color:#2875DE;font-weight:bold;} #sddm div a:hover{background:#49A3FF;color:#FFF} + body{ background-color:#ffffff; } #innertext{ background-color:#ffffff; } - #taxaDiv{ line-height: 1em; } .printoff{ display:none; } a{ color: currentColor; cursor: none; pointer-events: none; text-decoration: none; } '; + echo '
'; $voucherArr = array(); if($showVouchers) $voucherArr = $clManager->getVoucherArr(); $prevGroup = ''; @@ -697,27 +697,29 @@ $group = $sppArr['taxongroup']; if($group != $prevGroup){ $famUrl = '../taxa/index.php?taxauthid=1&taxon='.strip_tags($group).'&clid='.$clid; + //Edit family name display style here ?> -
+
"; - echo '
'; + echo '
'; + //Edit species name display style here + echo '
'; if(!preg_match('/\ssp\d/',$sppArr["sciname"])) echo ''; - echo "".$sppArr["sciname"]." "; + echo ''.$sppArr['sciname'].' '; if(array_key_exists("author",$sppArr)) echo $sppArr["author"]; if(!preg_match('/\ssp\d/',$sppArr["sciname"])) echo ""; if(array_key_exists('vern',$sppArr)){ - echo " - ".$sppArr["vern"].""; + echo ' - '.$sppArr['vern'].''; } $clidArr = array(); if(isset($sppArr['clid'])) $clidArr = explode(',',$sppArr['clid']); if($clArray["dynamicsql"]){ ?> - + @@ -747,7 +749,7 @@ } echo "
\n"; if($showSynonyms && isset($sppArr['syn'])){ - echo '
['.$sppArr['syn'].']
'; + echo '
['.$sppArr['syn'].']
'; } if($showVouchers){ $voucStr = ''; @@ -770,7 +772,8 @@ $noteStr = $sppArr['notes']; } if($noteStr || $voucStr){ - echo "
".$noteStr.($noteStr && $voucStr?'; ':'').$voucStr."
"; + //Edit notes and voucher display style here + echo '
'.$noteStr.($noteStr && $voucStr?'; ':'').$voucStr.'
'; } } echo "
\n"; @@ -780,7 +783,8 @@ $taxaLimit = ($showImages?$clManager->getImageLimit():$clManager->getTaxaLimit()); if($clManager->getTaxaCount() > (($pageNumber)*$taxaLimit)){ echo ''; + echo ' '.$LANG['DISPLAYNEXT'].' '.$taxaLimit.' '.$LANG['TAXA'].'...'; + echo '
'; } if(!$taxaArray) echo "

".$LANG['NOTAXA']."

"; ?> diff --git a/classes/ImageLibraryManager.php b/classes/ImageLibraryManager.php index 0a071f8c7b..77f51ebf1f 100644 --- a/classes/ImageLibraryManager.php +++ b/classes/ImageLibraryManager.php @@ -498,12 +498,20 @@ public function getTaxaSuggest($queryString, $type = 'sciname'){ public function getPhotographerUidArr(){ $retArr = array(); - $sql = 'SELECT DISTINCT u.uid, CONCAT_WS(", ",u.lastname, u.firstname) AS fullname FROM images i INNER JOIN users u ON i.photographeruid = u.uid '; - $rs = $this->conn->query($sql); - while ($r = $rs->fetch_object()) { - $retArr[$r->uid] = $r->fullname; + $sql1 = 'SELECT DISTINCT photographeruid FROM images WHERE photographeruid IS NOT NULL'; + $rs1 = $this->conn->query($sql1); + while ($r1 = $rs1->fetch_object()) { + $retArr[$r1->photographeruid] = ''; + } + $rs1->free(); + if($retArr){ + $sql2 = 'SELECT uid, CONCAT_WS(", ", lastname, firstname) AS fullname FROM users WHERE uid IN('.implode(',',array_keys($retArr)).')'; + $rs2 = $this->conn->query($sql2); + while ($r2 = $rs2->fetch_object()) { + $retArr[$r2->uid] = $r2->fullname; + } + $rs2->free(); } - $rs->free(); asort($retArr,SORT_NATURAL | SORT_FLAG_CASE); return $retArr; } diff --git a/classes/ImageProcessor.php b/classes/ImageProcessor.php index 3eecc85ba1..c650e54828 100644 --- a/classes/ImageProcessor.php +++ b/classes/ImageProcessor.php @@ -115,7 +115,7 @@ public function processIPlantImages($pmTerm, $postArr){ return false; } //Get start date - if(!$lastRunDate || !preg_match('/^\d{4}-\d{2}-\d{2}$/',$lastRunDate)) $lastRunDate = '2015-04-01'; + if(!$lastRunDate || !preg_match('/^\d{4}-\d{2}-\d{2}$/',$lastRunDate)) $lastRunDate = '2019-05-01'; while(strtotime($lastRunDate) < strtotime('now')){ $url = $iPlantDataUrl.'image?value=*'.$iPlantSourcePath.'*&tag_query=upload_datetime:'.$lastRunDate.'*'; $contents = @file_get_contents($url); @@ -374,7 +374,12 @@ public function loadFileData($postArr){ while($r1 = $rs1->fetch_object()){ $uFileName = substr(strrchr($r1->url, "/"), 1); $oFileName = substr(strrchr($r1->originalurl, "/"), 1); - if($oFileName == $origFileName || $uFileName == $urlFileName || $oFileName == $urlFileName || $uFileName == $origFileName){ + $replaceImg = false; + if($oFileName && $oFileName == $origFileName) $replaceImg = true; + elseif($uFileName && $uFileName == $urlFileName) $replaceImg = true; + elseif($oFileName && $oFileName == $urlFileName) $replaceImg = true; + elseif($uFileName && $uFileName == $origFileName) $replaceImg = true; + if($replaceImg){ $sql2 = 'UPDATE images '. 'SET url = "'.$url.'", originalurl = "'.$originalUrl.'", thumbnailurl = '.($thumbnailUrl?'"'.$thumbnailUrl.'"':'NULL').', '. 'sourceurl = '.($sourceUrl?'"'.$sourceUrl.'"':'NULL').' '. diff --git a/classes/ImageShared.php b/classes/ImageShared.php index 0833313148..d7f98db9ce 100644 --- a/classes/ImageShared.php +++ b/classes/ImageShared.php @@ -1237,11 +1237,11 @@ public static function getImgDim($imgUrl){ // Retrieve JPEG width and height without downloading/reading entire image. private static function getImgDim1($imgUrl) { $opts = array( - 'http'=>array( - 'user_agent' => $GLOBALS['DEFAULT_TITLE'], - 'method'=>"GET", - 'header'=> implode("\r\n", array('Content-type: text/plain;')) - ) + 'http'=>array( + 'user_agent' => $GLOBALS['DEFAULT_TITLE'], + 'method'=>"GET", + 'header'=> implode("\r\n", array('Content-type: text/plain;')) + ) ); $context = stream_context_create($opts); if($handle = fopen($imgUrl, "rb", false, $context)){ @@ -1263,9 +1263,14 @@ private static function getImgDim1($imgUrl) { $sof_marker = array("\xC0", "\xC1", "\xC2", "\xC3", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCD", "\xCE", "\xCF"); if(in_array($new_block[$i+1], $sof_marker)) { // SOF marker detected. Width and height information is contained in bytes 4-7 after this byte. - $size_data = $new_block[$i+2] . $new_block[$i+3] . $new_block[$i+4] . $new_block[$i+5] . $new_block[$i+6] . $new_block[$i+7] . $new_block[$i+8]; + //$size_data = $new_block[$i+2] . $new_block[$i+3] . $new_block[$i+4] . $new_block[$i+5] . $new_block[$i+6] . $new_block[$i+7] . $new_block[$i+8]; + $size_data = null; + for($x = 2; $x < 9; $x++){ + if(isset($new_block[$i+$x])) $size_data .= $new_block[$i+$x]; + } $unpacked = unpack("H*", $size_data); $unpacked = $unpacked[1]; + if(!is_array($unpacked) || count($unpacked) < 13) return false; $height = hexdec($unpacked[6] . $unpacked[7] . $unpacked[8] . $unpacked[9]); $width = hexdec($unpacked[10] . $unpacked[11] . $unpacked[12] . $unpacked[13]); return array($width, $height); diff --git a/classes/OccurrenceAttributes.php b/classes/OccurrenceAttributes.php index c207eec54f..017bbee236 100644 --- a/classes/OccurrenceAttributes.php +++ b/classes/OccurrenceAttributes.php @@ -27,7 +27,7 @@ public function addAttributes($postArr,$uid){ $status = true; $stateArr = array(); foreach($postArr as $postKey => $postValue){ - if(substr($postKey,0,8) == 'stateid-'){ + if(substr($postKey,0,8) == 'traitid-'){ if(is_array($postValue)){ $stateArr = array_merge($stateArr,$postValue); } @@ -36,23 +36,35 @@ public function addAttributes($postArr,$uid){ } } } - $sourceStr = 'viewingSpecimenImage'; - if(isset($postArr['source']) && $postArr['source']) $sourceStr = $postArr['source']; - foreach($stateArr as $stateId){ - if(is_numeric($stateId)){ - $sql = 'INSERT INTO tmattributes(stateid,occid,source,notes,createduid) '. - 'VALUES('.$stateId.','.$this->occid.','.($sourceStr?'"'.$this->cleanInStr($sourceStr).'"':'NULL').','. - ($postArr['notes']?'"'.$this->cleanInStr($postArr['notes']).'"':'NULL').','.$uid.') '; - //echo $sql.'
'; - if(!$this->conn->query($sql)){ - $this->errorMessage .= 'ERROR saving occurrence attribute: '.$this->conn->error.'; '; + if($stateArr){ + //Get trait types + $traitArr = array(); + $sql = 'SELECT s.stateid, t.traittype FROM tmtraits t INNER JOIN tmstates s ON t.traitid = s.traitid WHERE s.stateid IN('.implode(',',$stateArr).')'; + $rs = $this->conn->query($sql); + while($r = $rs->fetch_object()){ + $traitArr[$r->stateid] = $r->traittype; + } + $rs->free(); + + //Insert attributes + $sourceStr = 'viewingSpecimenImage'; + if(isset($postArr['source']) && $postArr['source']) $sourceStr = $postArr['source']; + foreach($stateArr as $stateId){ + if(is_numeric($stateId)){ + $sql = 'INSERT INTO tmattributes(stateid,xvalue,occid,source,notes,createduid) '. + 'VALUES('.$stateId.',,'.$this->occid.','.($sourceStr?'"'.$this->cleanInStr($sourceStr).'"':'NULL').','. + ($postArr['notes']?'"'.$this->cleanInStr($postArr['notes']).'"':'NULL').','.$uid.') '; + //echo $sql.'
'; + if(!$this->conn->query($sql)){ + $this->errorMessage .= 'ERROR saving occurrence attribute: '.$this->conn->error.'; '; + $status = false; + } + } + else{ + $this->errorMessage .= 'ERROR saving occurrence attribute: bad input values ('.$stateId.'); '; $status = false; } } - else{ - $this->errorMessage .= 'ERROR saving occurrence attribute: bad input values ('.$stateId.'); '; - $status = false; - } } return $status; } @@ -62,7 +74,7 @@ public function editAttributes($postArr){ $stateArr = array(); foreach($postArr as $postKey => $postValue){ - if(substr($postKey,0,8) == 'stateid-'){ + if(substr($postKey,0,8) == 'traitid-'){ if(is_array($postValue)){ $stateArr = array_merge($stateArr,$postValue); } @@ -89,7 +101,7 @@ public function editAttributes($postArr){ $status = true; } else{ - $this->errorMessage = 'ERROR addin occurrence attribute: '.$this->conn->error; + $this->errorMessage = 'ERROR adding occurrence attribute: '.$this->conn->error; $status = false; } } @@ -253,8 +265,8 @@ public function getTraitArr($traitID = null, $setAttributes = true){ } private function setTraitArr($traitID){ - $sql = 'SELECT traitid, traitname, traittype, units, description, refurl, notes, dynamicproperties FROM tmtraits '; - if($traitID) $sql .= 'WHERE (traitid = '.$traitID.')'; + $sql = 'SELECT traitid, traitname, traittype, units, description, refurl, notes, dynamicproperties FROM tmtraits WHERE traittype IN("UM","OM","NU") '; + if($traitID) $sql .= 'AND (traitid = '.$traitID.')'; //echo $sql.'
'; $rs = $this->conn->query($sql); while($r = $rs->fetch_object()){ @@ -305,14 +317,14 @@ private function setTraitStates(){ private function setCodedAttribute(){ $retArr = array(); - $sql = 'SELECT s.traitid, a.stateid, a.source, a.notes, a.statuscode, a.modifieduid, a.datelastmodified, a.createduid, a.initialtimestamp '. + $sql = 'SELECT s.traitid, a.stateid, a.xvalue, a.source, a.notes, a.statuscode, a.modifieduid, a.datelastmodified, a.createduid, a.initialtimestamp '. 'FROM tmattributes a INNER JOIN tmstates s ON a.stateid = s.stateid '. 'WHERE (a.occid = '.$this->occid.') '; if($this->traitArr) $sql .= 'AND (s.traitid IN('.implode(',',array_keys($this->traitArr)).'))'; //echo $sql; exit; $rs = $this->conn->query($sql); while($r = $rs->fetch_object()){ - $this->traitArr[$r->traitid]['states'][$r->stateid]['coded'] = ''; + $this->traitArr[$r->traitid]['states'][$r->stateid]['coded'] = $r->xvalue; $this->traitArr[$r->traitid]['states'][$r->stateid]['source'] = $r->source; $this->traitArr[$r->traitid]['states'][$r->stateid]['notes'] = $r->notes; $this->traitArr[$r->traitid]['states'][$r->stateid]['statuscode'] = $r->statuscode; @@ -342,19 +354,20 @@ private function getTraitUnitString($traitID,$display,$classStr=''){ foreach($attrStateArr as $sid => $sArr){ $isCoded = false; if(array_key_exists('coded',$sArr)){ - $isCoded = true; + if($sArr['coded'] === '') $isCoded = true; + else $isCoded = $sArr['coded']; $this->stateCodedArr[$sid] = $sid; } $depTraitId = false; if(isset($sArr['dependTraitID']) && $sArr['dependTraitID']) $depTraitId = $sArr['dependTraitID']; if($controlType == 'checkbox' || $controlType == 'radio'){ - $innerStr .= '
'.$sArr['name']; + $innerStr .= '
'.$sArr['name']; } elseif($controlType == 'select'){ $innerStr .= ''; } elseif($controlType == 'numeric'){ - $innerStr .= '
'.$sArr['name'].': '; + $innerStr .= '
'.$sArr['name'].': '; } if($depTraitId){ $innerStr .= $this->getTraitUnitString($depTraitId,$isCoded,trim($classStr.' child-'.$sid)); diff --git a/classes/OccurrenceCollectionProfile.php b/classes/OccurrenceCollectionProfile.php index bced4ec329..f7eb880f67 100644 --- a/classes/OccurrenceCollectionProfile.php +++ b/classes/OccurrenceCollectionProfile.php @@ -135,14 +135,14 @@ public function getMetadataHtml($collArr, $LANG){ $outStr .= '
'; $outStr .= ''.$LANG['MANAGEMENT'].': '; if($collArr['managementtype'] == 'Live Data'){ - $outStr .= 'Live Data managed directly within data portal'; + $outStr .= (isset($LANG['LIVE_DATA'])?$LANG['LIVE_DATA']:'Live Data managed directly within data portal'); } else{ if($collArr['managementtype'] == 'Aggregate'){ - $outStr .= 'Data harvested from a data aggregator'; + $outStr .= (isset($LANG['DATA_AGGREGATE'])?$LANG['DATA_AGGREGATE']:'Data harvested from a data aggregator'); } else{ - $outStr .= 'Data snapshot of local collection database '; + $outStr .= (isset($LANG['DATA_SNAPSHOT'])?$LANG['DATA_SNAPSHOT']:'Data snapshot of local collection database '); } $outStr .= '
'.$LANG['LAST_UPDATE'].': '.$collArr['uploaddate'].'
'; } @@ -161,13 +161,10 @@ public function getMetadataHtml($collArr, $LANG){ } $outStr .= '
'; if($collArr['managementtype'] == 'Live Data'){ - $outStr .= ''.(isset($LANG['LIVE_DOWNLOAD'])?$LANG['LIVE_DOWNLOAD']:'Live Data Download').': '; if($GLOBALS['SYMB_UID']){ + $outStr .= ''.(isset($LANG['LIVE_DOWNLOAD'])?$LANG['LIVE_DOWNLOAD']:'Live Data Download').': '; $outStr .= ''.(isset($LANG['FULL_DATA'])?$LANG['FULL_DATA']:'DwC-Archive File').''; } - else{ - $outStr .= ''.(isset($LANG['LOGIN_TO_ACCESS'])?$LANG['LOGIN_TO_ACCESS']:'Login for access').''; - } } elseif($collArr['managementtype'] == 'Snapshot'){ $pathArr = $this->getDwcaPath($collArr['collid']); @@ -201,7 +198,7 @@ public function getMetadataHtml($collArr, $LANG){ if($rightsUrl) $outStr .= ''; } elseif(file_exists('../../misc/usagepolicy.php')){ - $outStr .= 'Usage policy'; + $outStr .= ''.(isset($LANG['USAGE_POLICY'])?$LANG['USAGE_POLICY']:'Usage policy').''; } $outStr .= '
'; if($collArr['rightsholder']){ diff --git a/classes/OccurrenceDuplicate.php b/classes/OccurrenceDuplicate.php index 55dba96923..dfd5be810f 100644 --- a/classes/OccurrenceDuplicate.php +++ b/classes/OccurrenceDuplicate.php @@ -30,7 +30,7 @@ public function getClusterArr($occid){ $retArr[$r1->duplicateid]['description'] = $r1->description; $retArr[$r1->duplicateid]['notes'] = $r1->notes; } - $rs1->close(); + $rs1->free(); } else{ $this->errorStr = 'ERROR getting list of duplicate records [1]: '.$this->conn->error; @@ -39,7 +39,7 @@ public function getClusterArr($occid){ if($retArr){ $sql = 'SELECT d.duplicateid, d.occid, c.institutioncode, c.collectioncode, c.collectionname, o.catalognumber, '. - 'o.occurrenceid, o.sciname, o.identifiedby, o.dateidentified, '. + 'o.occurrenceid, o.sciname, o.scientificnameauthorship, o.identifiedby, o.dateidentified, '. 'o.recordedby, o.recordnumber, o.eventdate, d.notes, i.url, i.thumbnailurl '. 'FROM omoccurduplicatelink d INNER JOIN omoccurrences o ON d.occid = o.occid '. 'INNER JOIN omcollections c ON o.collid = c.collid '. @@ -48,7 +48,7 @@ public function getClusterArr($occid){ if($rs = $this->conn->query($sql)){ while($r = $rs->fetch_object()){ $retArr[$r->duplicateid]['o'][$r->occid] = array('instcode' => $r->institutioncode, 'collcode' => $r->collectioncode, - 'collname' => $r->collectionname, 'catnum' => $r->catalognumber, 'occurrenceid' => $r->occurrenceid, 'sciname' => $r->sciname, + 'collname' => $r->collectionname, 'catnum' => $r->catalognumber, 'occurrenceid' => $r->occurrenceid, 'sciname' => $r->sciname, 'author' => $r->scientificnameauthorship, 'identifiedby' => $r->identifiedby, 'dateidentified' => $r->dateidentified, 'recordedby' => $r->recordedby, 'recordnumber' => $r->recordnumber, 'eventdate' => $r->eventdate, 'notes' => $r->notes, 'tnurl' => $r->thumbnailurl, 'url' => $r->url); diff --git a/classes/OccurrenceEditorManager.php b/classes/OccurrenceEditorManager.php index 27629cbe3d..ec28fe2cea 100644 --- a/classes/OccurrenceEditorManager.php +++ b/classes/OccurrenceEditorManager.php @@ -17,6 +17,7 @@ class OccurrenceEditorManager { protected $occurrenceMap = array(); private $occFieldArr = array(); + private $paleoFieldArr = array(); private $sqlWhere; private $otherCatNumIsNum = false; private $qryArr = array(); @@ -25,6 +26,8 @@ class OccurrenceEditorManager { protected $errorArr = array(); protected $isShareConn = false; + private $paleoActivated = false; + public function __construct($conn = null){ if($conn){ $this->conn = $conn; @@ -47,6 +50,8 @@ public function __construct($conn = null){ 'minimumdepthinmeters', 'maximumdepthinmeters', 'verbatimdepth', 'disposition', 'language', 'duplicatequantity', 'genericcolumn1', 'genericcolumn2', 'labelproject','observeruid','basisofrecord','institutioncode','collectioncode','ownerinstitutioncode','datelastmodified', 'processingstatus', 'recordenteredby', 'dateentered'); + $this->paleoFieldArr = array('eon','era','period','epoch','earlyinterval','lateinterval','absoluteage','storageage','stage','localstage','biota', + 'biostratigraphy','lithogroup','formation','taxonenvironment','member','bed','lithology','stratremarks','element','slideproperties'); } public function __destruct(){ @@ -86,20 +91,20 @@ private function setCollMap(){ } public function getDynamicPropertiesArr(){ + global $EDITOR_PROPERTIES; $propArr = array(); + if(isset($EDITOR_PROPERTIES)) $propArr = $EDITOR_PROPERTIES; $dynPropArr = array(); if(array_key_exists('dynamicproperties', $this->collMap)){ $dynPropArr = json_decode($this->collMap['dynamicproperties'],true); - if(isset($dynPropArr['editorProp'])) $propArr = $dynPropArr['editorProp']; + if(isset($dynPropArr['editorProps'])) $propArr = array_merge($propArr,$dynPropArr['editorProps']); } - //$dynPropArr = array("editorProp"=>array("paleoMod"=>1,"catalogDupeCheck"=>1)); - if(isset($dynPropArr['editorProp'])) $propArr = $dynPropArr['editorProp']; + if(isset($propArr['modules-panel']['paleo']['status']) && $propArr['modules-panel']['paleo']['status']) $this->paleoActivated = true; return $propArr; } //Query functions public function setQueryVariables($overrideQry = false){ - global $CLIENT_ROOT; if($overrideQry){ $this->qryArr = $overrideQry; unset($_SESSION['editorquery']); @@ -558,7 +563,6 @@ private function setSqlOrderBy(&$sql){ } public function getQueryRecordCount($reset = 0){ - global $CLIENT_ROOT; if(!$reset && array_key_exists('rc',$this->qryArr)) return $this->qryArr['rc']; $recCnt = false; if($this->sqlWhere){ @@ -689,6 +693,7 @@ protected function setOccurArr($start = 0, $limit = 0){ $this->occurrenceMap = $this->cleanOutArr($retArr); if($this->occid){ $this->setLoanData(); + $this->setPaleoData(); if(isset($GLOBALS['ACTIVATE_EXSICCATI']) && $GLOBALS['ACTIVATE_EXSICCATI']) $this->setExsiccati(); } } @@ -771,8 +776,6 @@ public function editOccurrence($occArr, $editorStatus){ if($editArr || $quickHostEntered){ if($editArr){ //Deal with scientific name changes if the AJAX code fails - $paleoFieldArr = array('eon','era','period','epoch','earlyinterval','lateinterval','absoluteage','storageage','stage','localstage','biozone', - 'biostratigraphy','lithogroup','formation','taxonenvironment','member','lithology','stratremarks','lithdescription','element','slideproperties'); if(in_array('sciname',$editArr) && $occArr['sciname'] && !$occArr['tidinterpreted']){ $sql2 = 'SELECT t.tid, t.author, ts.family '. 'FROM taxa t INNER JOIN taxstatus ts ON t.tid = ts.tid '. @@ -801,7 +804,7 @@ public function editOccurrence($occArr, $editorStatus){ (in_array('recordenteredby',$editArr)?'':',recordenteredby'). ' FROM omoccurrences o '; } - if(array_intersect($editArr, $paleoFieldArr)){ + if($this->paleoActivated && array_intersect($editArr, $this->paleoFieldArr)){ $sql .= 'LEFT JOIN omoccurpaleo p ON o.occid = p.occid '; } $sql .= 'WHERE o.occid = '.$occArr['occid']; @@ -912,7 +915,7 @@ public function editOccurrence($occArr, $editorStatus){ } } //Deal with paleo fields - if(array_key_exists('eon',$occArr)){ + if($this->paleoActivated && array_key_exists('eon',$occArr)){ //Check to see if paleo record already exists $paleoRecordExist = false; $paleoSql = 'SELECT paleoid FROM omoccurpaleo WHERE occid = '.$occArr['occid']; @@ -921,40 +924,49 @@ public function editOccurrence($occArr, $editorStatus){ if($paleoRS->num_rows) $paleoRecordExist = true; $paleoRS->free(); } - $paleoFieldArr = array('eon','era','period','epoch','earlyinterval','lateinterval','absoluteage','storageage','stage','localstage','biozone', - 'biostratigraphy','lithogroup','formation','taxonenvironment','member','lithology','stratremarks','lithdescription','element','slideproperties'); if($paleoRecordExist){ //Edit existing record $paleoHasValue = false; $paleoFrag = ''; - foreach($paleoFieldArr as $paleoField){ + foreach($this->paleoFieldArr as $paleoField){ if(array_key_exists($paleoField,$occArr)){ $paleoFrag .= ','.$paleoField.' = '.($occArr[$paleoField]?'"'.$this->cleanInStr($occArr[$paleoField]).'"':'NULL'); if($occArr[$paleoField]) $paleoHasValue = true; } } + $paleoSql = ''; if($paleoHasValue){ - if($paleoFrag) $this->conn->query('UPDATE omoccurpaleo SET '.substr($paleoFrag, 1).' WHERE occid = '.$occArr['occid']); + if($paleoFrag) $paleoSql = 'UPDATE omoccurpaleo SET '.substr($paleoFrag, 1).' WHERE occid = '.$occArr['occid']; + $this->conn->query('UPDATE omoccurpaleo SET '.substr($paleoFrag, 1).' WHERE occid = '.$occArr['occid']); } else{ - $this->conn->query('DELETE FROM omoccurpaleo WHERE occid = '.$occArr['occid']); + $paleoSql = 'DELETE FROM omoccurpaleo WHERE occid = '.$occArr['occid']; + } + if($paleoSql){ + if(!$this->conn->query($paleoSql)){ + $status = 'ERROR editing paleo data: '.$this->conn->error; + } } } else{ //Add new record $paleoFrag1 = ''; $paleoFrag2 = ''; - foreach($paleoFieldArr as $paleoField){ + foreach($this->paleoFieldArr as $paleoField){ if(array_key_exists($paleoField,$occArr) && $occArr[$paleoField]){ $paleoFrag1 .= ','.$paleoField; $paleoFrag2 .= ',"'.$this->cleanInStr($occArr[$paleoField]).'" '; } } if($paleoFrag1){ - $this->conn->query('INSERT INTO omoccurpaleo(occid'.$paleoFrag1.') VALUES('.$occArr['occid'].$paleoFrag2.')'); + $paleoSql = 'INSERT INTO omoccurpaleo(occid'.$paleoFrag1.') VALUES('.$occArr['occid'].$paleoFrag2.')'; + if(!$this->conn->query($paleoSql)){ + $status = 'ERROR adding new record for paleo data edit: '.$this->conn->error; + } } } } + //Deal with exsiccati if(in_array('ometid',$editArr) || in_array('exsnumber',$editArr)){ $ometid = $this->cleanInStr($occArr['ometid']); @@ -1064,7 +1076,6 @@ public function addOccurrence($occArr){ } } $sql .= ')'; - //echo "
".$sql."
"; if($this->conn->query($sql)){ $this->occid = $this->conn->insert_id; //Update collection stats @@ -1076,20 +1087,19 @@ public function addOccurrence($occArr){ $status .= '(WARNING: Symbiota GUID mapping failed) '; } //Deal with paleo - if(in_array('eon',$occArr)){ - $paleoFieldArr = array('eon','era','period','epoch','earlyinterval','lateinterval','absoluteage','storageage','stage','localstage','biozone', - 'biostratigraphy','lithogroup','formation','taxonenvironment','member','lithology','stratremarks','lithdescription','element','slideproperties'); + if($this->paleoActivated && array_key_exists('eon',$occArr)){ //Add new record $paleoFrag1 = ''; $paleoFrag2 = ''; - foreach($paleoFieldArr as $paleoField){ + foreach($this->paleoFieldArr as $paleoField){ if(array_key_exists($paleoField,$occArr)){ - $paleoFrag1 = ','.$paleoField; + $paleoFrag1 .= ','.$paleoField; $paleoFrag2 .= ','.($occArr[$paleoField]?'"'.$this->cleanInStr($occArr[$paleoField]).'"':'NULL'); } } if($paleoFrag1){ - $this->conn->query('INSERT INTO omoccurpaleo(occid'.$paleoFrag1.') VALUES('.$this->occid.$paleoFrag2.')'); + $paleoSql = 'INSERT INTO omoccurpaleo(occid'.$paleoFrag1.') VALUES('.$this->occid.$paleoFrag2.')'; + $this->conn->query($paleoSql); } } //Deal with Exsiccati @@ -1226,17 +1236,19 @@ public function deleteOccurrence($delOccid){ } //Archive paleo - $sql = 'SELECT * FROM omoccurpaleo WHERE occid = '.$delOccid; - $rs = $this->conn->query($sql); - if($rs){ - $paleoArr = array(); - if($r = $rs->fetch_assoc()){ - foreach($r as $k => $v){ - if($v) $paleoArr[$k] = $this->encodeStrTargeted($v,$CHARSET,'utf8'); + if($this->paleoActivated){ + $sql = 'SELECT * FROM omoccurpaleo WHERE occid = '.$delOccid; + $rs = $this->conn->query($sql); + if($rs){ + $paleoArr = array(); + if($r = $rs->fetch_assoc()){ + foreach($r as $k => $v){ + if($v) $paleoArr[$k] = $this->encodeStrTargeted($v,$CHARSET,'utf8'); + } } + $rs->free(); + $archiveArr['paleo'] = $paleoArr; } - $rs->free(); - $archiveArr['paleo'] = $paleoArr; } //Archive Exsiccati info @@ -1340,10 +1352,12 @@ public function mergeRecords($targetOccid,$sourceOccid){ } //Remap paleo - $sql = 'UPDATE omoccurpaleo SET occid = '.$targetOccid.' WHERE occid = '.$sourceOccid; - if(!$this->conn->query($sql)){ - //$this->errorArr[] .= '; ERROR remapping paleos: '.$this->conn->error; - //$status = false; + if($this->paleoActivated){ + $sql = 'UPDATE omoccurpaleo SET occid = '.$targetOccid.' WHERE occid = '.$sourceOccid; + if(!$this->conn->query($sql)){ + //$this->errorArr[] .= '; ERROR remapping paleos: '.$this->conn->error; + //$status = false; + } } //Delete source occurrence edits @@ -1463,6 +1477,20 @@ private function setLoanData(){ $rs->free(); } + private function setPaleoData(){ + if($this->paleoActivated){ + $sql = 'SELECT '.implode(',',$this->paleoFieldArr).' FROM omoccurpaleo WHERE occid = '.$this->occid; + //echo $sql; + $rs = $this->conn->query($sql); + if($r = $rs->fetch_assoc()){ + foreach($this->paleoFieldArr as $term){ + $this->occurrenceMap[$this->occid][$term] = $r[$term]; + } + } + $rs->free(); + } + } + private function setExsiccati(){ $sql = 'SELECT l.notes, l.ranking, l.omenid, n.exsnumber, t.ometid, t.title, t.abbreviation, t.editor '. 'FROM omexsiccatiocclink l INNER JOIN omexsiccatinumbers n ON l.omenid = n.omenid '. @@ -1550,9 +1578,7 @@ public function batchUpdateField($fieldName,$oldValue,$newValue,$buMatch){ $statusStr = 'ERROR adding update to omoccuredits: '.$this->conn->error; } //Apply edits to core tables - $paleoFieldArr = array('eon','era','period','epoch','earlyinterval','lateinterval','absoluteage','storageage','stage','localstage','biozone', - 'biostratigraphy','lithogroup','formation','taxonenvironment','member','lithology','stratremarks','lithdescription','element','slideproperties'); - if(array_key_exists($fn, $paleoFieldArr)){ + if($this->paleoActivated && array_key_exists($fn, $this->paleoFieldArr)){ $sql = 'UPDATE omoccurpaleo SET '.$fn.' = '.$nvSqlFrag.' '.$sqlWhere; } else{ @@ -1607,8 +1633,8 @@ public function carryOverValues($fArr){ 'georeferencesources','georeferenceverificationstatus','georeferenceremarks', 'minimumelevationinmeters','maximumelevationinmeters','verbatimelevation','minimumdepthinmeters','maximumdepthinmeters','verbatimdepth', 'habitat','substrate','lifestage', 'sex', 'individualcount', 'samplingprotocol', 'preparations', - 'associatedtaxa','basisofrecord','language','labelproject','eon','era','period','epoch','earlyinterval','lateinterval','absoluteage','storageage','stage','localstage','biozone', - 'biostratigraphy','lithogroup','formation','taxonenvironment','member','lithology','stratremarks','lithdescription','element'); + 'associatedtaxa','basisofrecord','language','labelproject','eon','era','period','epoch','earlyinterval','lateinterval','absoluteage','storageage','stage','localstage','biota', + 'biostratigraphy','lithogroup','formation','taxonenvironment','member','bed','lithology','stratremarks','element'); $retArr = $this->cleanOutArr(array_intersect_key($fArr,array_flip($locArr))); return $retArr; } @@ -2086,9 +2112,8 @@ public function getCollectionList(){ $collArr = array('0'); if(isset($GLOBALS['USER_RIGHTS']['CollAdmin'])) $collArr = $GLOBALS['USER_RIGHTS']['CollAdmin']; $sql = 'SELECT collid, collectionname FROM omcollections WHERE (collid IN('.implode(',',$collArr).')) '; - $collEditorArr = $GLOBALS['USER_RIGHTS']['CollEditor']; - if($collEditorArr){ - $sql .= 'OR (collid IN('.implode(',',$collEditorArr).') AND colltype = "General Observations")'; + if(isset($GLOBALS['USER_RIGHTS']['CollEditor'])){ + $sql .= 'OR (collid IN('.implode(',',$GLOBALS['USER_RIGHTS']['CollEditor']).') AND colltype = "General Observations")'; } $rs = $this->conn->query($sql); while($r = $rs->fetch_object()){ @@ -2101,13 +2126,15 @@ public function getCollectionList(){ public function getPaleoGtsTerms(){ $retArr = array(); - $sql = 'SELECT gtsterm, rankid FROM omoccurpaleogts '; - $rs = $this->conn->query($sql); - while($r = $rs->fetch_object()){ - $retArr[$r->gtsterm] = $r->rankid; + if($this->paleoActivated){ + $sql = 'SELECT gtsterm, rankid FROM omoccurpaleogts '; + $rs = $this->conn->query($sql); + while($r = $rs->fetch_object()){ + $retArr[$r->gtsterm] = $r->rankid; + } + $rs->free(); + ksort($retArr); } - $rs->free(); - ksort($retArr); return $retArr; } diff --git a/classes/OccurrenceEditorServices.php b/classes/OccurrenceEditorServices.php index a94aef00e0..41b870f934 100644 --- a/classes/OccurrenceEditorServices.php +++ b/classes/OccurrenceEditorServices.php @@ -28,6 +28,27 @@ public function getSpeciesSuggest($term){ return $retArr; } + public function getPaleoGtsParents($term){ + $retArr = Array(); + $sql = 'SELECT gtsid, gtsterm, rankid, rankname, parentgtsid FROM omoccurpaleogts WHERE gtsterm = "'.$this->cleanInStr($term).'"'; + $parentId = ''; + do{ + $rs = $this->conn->query($sql); + if ($r = $rs->fetch_object()){ + if($parentId == $r->parentgtsid){ + $parentId = 0; + } + else{ + $retArr[] = array("rankid" => $r->rankid, "value" => $r->gtsterm); + $parentId = $r->parentgtsid; + } + } + $rs->free(); + $sql = 'SELECT gtsid, gtsterm, rankid, rankname, parentgtsid FROM omoccurpaleogts WHERE gtsid = '.$parentId; + }while($parentId); + return $retArr; + } + //Misc functions protected function cleanInStr($str){ $newStr = trim($str); diff --git a/classes/OccurrenceIndividualManager.php b/classes/OccurrenceIndividualManager.php index 0702c4c249..da1b414efc 100644 --- a/classes/OccurrenceIndividualManager.php +++ b/classes/OccurrenceIndividualManager.php @@ -219,8 +219,8 @@ private function loadImages(){ } private function loadPaleo(){ - $sql = 'SELECT paleoid, eon, era, period, epoch, earlyinterval, lateinterval, absoluteage, storageage, stage, localstage, biozone, '. - 'biostratigraphy, lithogroup, formation, taxonenvironment, member, lithology, stratremarks, lithdescription, element, slideproperties '. + $sql = 'SELECT paleoid, eon, era, period, epoch, earlyinterval, lateinterval, absoluteage, storageage, stage, localstage, biota, '. + 'biostratigraphy, lithogroup, formation, taxonenvironment, member, bed, lithology, stratremarks, element, slideproperties '. 'FROM omoccurpaleo WHERE occid = '.$this->occid; $rs = $this->conn->query($sql); if($rs){ diff --git a/classes/OccurrenceSearchSupport.php b/classes/OccurrenceSearchSupport.php index 5a8ce3410f..c1a1ded716 100644 --- a/classes/OccurrenceSearchSupport.php +++ b/classes/OccurrenceSearchSupport.php @@ -118,7 +118,7 @@ public function outputFullCollArr($collGrpArr, $targetCatID = '', $displayIcons - + - + - + '; ?> @@ -222,7 +222,7 @@ public function outputFullCollArr($collGrpArr, $targetCatID = '', $displayIcons - "> + "> - + '; ?> diff --git a/classes/SpecProcessorOcr.php b/classes/SpecProcessorOcr.php index 975f3e774b..633160aeab 100644 --- a/classes/SpecProcessorOcr.php +++ b/classes/SpecProcessorOcr.php @@ -3,10 +3,10 @@ * Used by automatic nightly process and by the occurrence editor (/collections/editor/occurrenceeditor.php) */ include_once($SERVER_ROOT.'/config/dbconnection.php'); +include_once($SERVER_ROOT.'/classes/Manager.php'); -class SpecProcessorOcr{ +class SpecProcessorOcr extends Manager{ - private $conn; private $tempPath; private $imgUrlLocal; private $deleteAllOcrFiles = 0; @@ -20,19 +20,13 @@ class SpecProcessorOcr{ private $specKeyPattern; private $ocrSource; - //If silent is set, script will produce no non-fatal output. - private $verbose = 0; //0 = silent, 1 = logFile, 2 = echo, 3 = both - private $logFH; - private $errorStr; - function __construct() { + parent::__construct(null,'write'); $this->setTempPath(); - $this->conn = MySQLiConnectionFactory::getCon("write"); } function __destruct(){ - if($this->logFH) fclose($this->logFH); - if(!($this->conn === false)) $this->conn->close(); + parent::__destruct(); //unlink($this->imgUrlLocal); } @@ -78,33 +72,33 @@ private function ocrImageByUrl($imgUrl,$getBest = 0,$sciName=''){ } else{ $err = 'ERROR: Unable to load image, URL: '.$imgUrl; - $this->logMsg($err,1); + $this->logOrEcho($err,1); $rawStr = 'ERROR'; } } else{ $err = 'ERROR: Empty URL'; - $this->logMsg($err,1); + $this->logOrEcho($err,1); $rawStr = 'ERROR'; } return $rawStr; } private function ocrImage($url = ""){ - global $tesseractPath; + global $TESSERACT_PATH; $retStr = ''; if(!$url) $url = $this->imgUrlLocal; if($url){ //OCR image, result text is output to $outputFile $output = array(); $outputFile = substr($url,0,strlen($url)-4); - if(isset($tesseractPath) && $tesseractPath){ - if(substr($tesseractPath,0,2) == 'C:'){ + if(isset($TESSERACT_PATH) && $TESSERACT_PATH){ + if(substr($TESSERACT_PATH,0,2) == 'C:'){ //Full path to tesseract with quotes needed for Windows - exec('"'.$tesseractPath.'" '.$url.' '.$outputFile,$output); + exec('"'.$TESSERACT_PATH.'" '.$url.' '.$outputFile,$output); } else{ - exec($tesseractPath.' '.$url.' '.$outputFile,$output); + exec($TESSERACT_PATH.' '.$url.' '.$outputFile,$output); } } else{ @@ -124,7 +118,7 @@ private function ocrImage($url = ""){ unlink($outputFile.'.txt'); } else{ - $this->logMsg("ERROR: Unable to locate output file",1); + $this->logOrEcho("ERROR: Unable to locate output file",1); } } return $retStr;//$this->cleanRawStr($retStr); @@ -144,8 +138,8 @@ private function databaseRawStr($imgId,$rawStr,$notes,$source){ return true; } else{ - $this->logMsg("ERROR: Unable to load fragment into database: ".$this->conn->error,1); - $this->logMsg("SQL: ".$sql,2); + $this->logOrEcho("ERROR: Unable to load fragment into database: ".$this->conn->error,1); + $this->logOrEcho("SQL: ".$sql,2); return false; } } @@ -198,7 +192,7 @@ public function batchOcrUnprocessed($inCollStr,$procStatus = 'unprocessed',$limi //Batch OCR foreach($collArr as $collid => $instCode){ - $this->logMsg('Starting batch processing for '.$instCode); + $this->logOrEcho('Starting batch processing for '.$instCode); $sql = 'SELECT i.imgid, IFNULL(i.originalurl, i.url) AS url, o.sciName, i.occid '. 'FROM omoccurrences o INNER JOIN images i ON o.occid = i.occid '. 'LEFT JOIN specprocessorrawlabels r ON i.imgid = r.imgid '. @@ -210,7 +204,7 @@ public function batchOcrUnprocessed($inCollStr,$procStatus = 'unprocessed',$limi while($r = $rs->fetch_object()){ $rawStr = $this->ocrImageByUrl($r->url,$getBest,$r->sciName); if($rawStr != 'ERROR'){ - $this->logMsg('#'.$recCnt.': image '.$r->imgid.' processed ('.date("Y-m-d H:i:s").')'); + $this->logOrEcho('#'.$recCnt.': image '.$r->imgid.' processed ('.date("Y-m-d H:i:s").')'); $notes = ''; $source = 'Tesseract: '.date('Y-m-d'); $this->databaseRawStr($r->imgid,$rawStr,$notes,$source); @@ -233,8 +227,8 @@ public function harvestOcrText($postArr){ $this->ocrSource = $postArr['ocrsource']; $this->specKeyPattern = $postArr['speckeypattern']; if(!$this->specKeyPattern){ - $this->errorStr = 'ERROR loading OCR files: Specimen catalog number pattern missing'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR files: Specimen catalog number pattern missing'; + $this->logOrEcho($this->errorMessage); return false; } $sourcePath = ''; @@ -246,38 +240,38 @@ public function harvestOcrText($postArr){ $sourcePath = $this->uploadOcrFile(); } if(!$sourcePath){ - $this->errorStr = 'ERROR loading OCR files: OCR source path is missing'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR files: OCR source path is missing'; + $this->logOrEcho($this->errorMessage); return false; } if(substr($sourcePath,0,4) == 'http'){ //http protocol, thus test for a valid page $headerArr = get_headers($sourcePath); if(!$headerArr){ - $this->errorStr = 'ERROR loading OCR files: sourcePath returned bad headers ('.$sourcePath.')'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR files: sourcePath returned bad headers ('.$sourcePath.')'; + $this->logOrEcho($this->errorMessage); return false; } preg_match('/http.+\s{1}(\d{3})\s{1}/i',$headerArr[0],$codeArr); if($codeArr[1] == '403'){ - $this->errorStr = 'ERROR loading OCR files: sourcePath returned Forbidden ('.$sourcePath.')'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR files: sourcePath returned Forbidden ('.$sourcePath.')'; + $this->logOrEcho($this->errorMessage); return false; } if($codeArr[1] == '404'){ - $this->errorStr = 'ERROR loading OCR files: sourcePath returned a page Not Found error ('.$sourcePath.')'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR files: sourcePath returned a page Not Found error ('.$sourcePath.')'; + $this->logOrEcho($this->errorMessage); return false; } if($codeArr[1] != '200'){ - $this->errorStr = 'ERROR loading OCR files: sourcePath returned error code '.$codeArr[1].' ('.$sourcePath.')'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR files: sourcePath returned error code '.$codeArr[1].' ('.$sourcePath.')'; + $this->logOrEcho($this->errorMessage); return false; } } elseif(!file_exists($sourcePath)){ - $this->errorStr = 'ERROR loading OCR files: sourcePath does not exist ('.$sourcePath.')'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR files: sourcePath does not exist ('.$sourcePath.')'; + $this->logOrEcho($this->errorMessage); return false; } //Initiate processing @@ -288,7 +282,7 @@ public function harvestOcrText($postArr){ else{ $this->processOcrFolder($sourcePath); } - $this->logMsg('Done loading OCR files '); + $this->logOrEcho('Done loading OCR files '); return $status; @@ -297,13 +291,13 @@ public function harvestOcrText($postArr){ private function uploadOcrFile(){ $retPath = ''; if(!array_key_exists('ocrfile',$_FILES)){ - $this->errorStr = 'ERROR loading OCR file: OCR file missing'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR file: OCR file missing'; + $this->logOrEcho($this->errorMessage); return ; } if(!$this->tempPath){ - $this->errorStr = 'ERROR loading OCR file: temp target path empty'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR file: temp target path empty'; + $this->logOrEcho($this->errorMessage); return ; } $zipPath = $this->tempPath.'ocrupload.zip'; @@ -321,14 +315,14 @@ private function uploadOcrFile(){ unlink($zipPath); } else{ - $this->errorStr = 'ERROR unpacking OCR file: '.$res; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR unpacking OCR file: '.$res; + $this->logOrEcho($this->errorMessage); return ; } } else{ - $this->errorStr = 'ERROR loading OCR file: input file lacks zip extension'; - $this->logMsg($this->errorStr); + $this->errorMessage = 'ERROR loading OCR file: input file lacks zip extension'; + $this->logOrEcho($this->errorMessage); return ; } return $retPath; @@ -344,16 +338,16 @@ private function processOcrHtml($sourcePath){ if(!in_array($fileName,$skipAnchors)){ $fileExt = strtolower(substr($fileName,strrpos($fileName,'.')+1)); if($fileExt){ - $this->logMsg("Processing OCR File: ".$fileName); + $this->logOrEcho("Processing OCR File: ".$fileName); if($fileExt == "txt"){ $this->processOcrFile($fileName,$sourcePath); } else{ - $this->logMsg("ERROR: File skipped, not a supported OCR file with .txt extension: ".$sourcePath.$fileName); + $this->logOrEcho("ERROR: File skipped, not a supported OCR file with .txt extension: ".$sourcePath.$fileName); } } elseif(stripos($fileName,'Parent Dir') === false){ - $this->logMsg('New dir path: '.$sourcePath.$fileName); + $this->logOrEcho('New dir path: '.$sourcePath.$fileName); $this->processOcrHtml($sourcePath.$fileName.'/'); } } @@ -367,13 +361,13 @@ private function processOcrFolder($sourcePath){ while($fileName = readdir($dirFH)){ if($fileName != "." && $fileName != ".." && $fileName != ".svn"){ if(is_file($sourcePath.$fileName)){ - $this->logMsg("Processing OCR File: ".$fileName); + $this->logOrEcho("Processing OCR File: ".$fileName); $fileExt = strtolower(substr($fileName,strrpos($fileName,'.'))); if($fileExt == ".txt"){ $this->processOcrFile($fileName,$sourcePath); } else{ - $this->logMsg("ERROR: File skipped, not a supported OCR text file (.txt): ".$fileName); + $this->logOrEcho("ERROR: File skipped, not a supported OCR text file (.txt): ".$fileName); } } elseif(is_dir($sourcePath.$fileName)){ @@ -384,14 +378,14 @@ private function processOcrFolder($sourcePath){ if($dirFH) closedir($dirFH); } else{ - $this->logMsg("ERROR: unable to access source directory: ".$sourcePath,1); + $this->logOrEcho("ERROR: unable to access source directory: ".$sourcePath,1); } if($this->deleteAllOcrFiles) unlink($sourcePath); } private function processOcrFile($fileName,$sourcePath){ $ocrCnt = 0; - //$this->logMsg('Starting OCR text processing... ',1); + //$this->logOrEcho('Starting OCR text processing... ',1); if($rawTextFH = fopen($sourcePath.$fileName, 'r')){ $rawStr = fread($rawTextFH, filesize($sourcePath.$fileName)); fclose($rawTextFH); @@ -451,15 +445,15 @@ private function processOcrFile($fileName,$sourcePath){ } } else{ - $this->logMsg('ERROR: unable locate specimen image (catalog #: '.$catNumber.')',1); + $this->logOrEcho('ERROR: unable locate specimen image (catalog #: '.$catNumber.')',1); } } else{ - $this->logMsg('ERROR: unable to extract catalog number ('.$fileName.' using '.$this->specKeyPattern.')',1); + $this->logOrEcho('ERROR: unable to extract catalog number ('.$fileName.' using '.$this->specKeyPattern.')',1); } } else{ - $this->logMsg('ERROR: unable to read rawOcr file: '.$fileName,1); + $this->logOrEcho('ERROR: unable to read rawOcr file: '.$fileName,1); } } @@ -600,7 +594,7 @@ private function getBestOCR($sciName = ''){ $score_treated = $this->scoreOCR($rawStr_treated, $sciName); unlink($urlTemp); if($score_treated > $score_base) { - $this->logMsg('Best Score applied',1); + $this->logOrEcho('Best Score applied',1); return $rawStr_treated; } else { return $rawStr_base; @@ -770,20 +764,6 @@ public function setCropH($h){ $this->cropH = $h; } - public function getErrorStr(){ - return $this->errorStr; - } - - public function setVerbose($s){ - $this->verbose = $s; - if($this->verbose == 1 || $this->verbose == 3){ - if($this->tempPath){ - $logPath = $this->tempPath.'log_'.date('Ymd').'.log'; - $this->logFH = fopen($logPath, 'a'); - } - } - } - private function setTempPath(){ $tempPath = 0; if(array_key_exists('tempDirRoot',$GLOBALS)){ @@ -810,19 +790,6 @@ private function setTempPath(){ }*/ //Misc functions - private function logMsg($msg,$indent = 0) { - if($this->verbose == 1 || $this->verbose == 3){ - if($this->logFH){ - $msg .= "\n"; - if($indent) $msg = "\t".$msg; - fwrite($this->logFH, $msg); - } - } - elseif($this->verbose > 1 ){ - echo '
  • '.$msg.'
  • '; - } - } - private function cleanRawStr($inStr){ $retStr = $this->encodeString($inStr); @@ -858,56 +825,5 @@ private function cleanRawStr($inStr){ ); return $retStr; } - - private function encodeString($inStr){ - global $CHARSET; - $retStr = $inStr; - //Get rid of Windows curly (smart) quotes - $search = array(chr(145),chr(146),chr(147),chr(148),chr(149),chr(150),chr(151)); - $replace = array("'","'",'"','"','*','-','-'); - $inStr = str_replace($search, $replace, $inStr); - //Get rid of UTF-8 curly smart quotes and dashes - $badwordchars=array("\xe2\x80\x98", // left single quote - "\xe2\x80\x99", // right single quote - "\xe2\x80\x9c", // left double quote - "\xe2\x80\x9d", // right double quote - "\xe2\x80\x94", // em dash - "\xe2\x80\xa6" // elipses - ); - $fixedwordchars=array("'", "'", '"', '"', '-', '...'); - $inStr = str_replace($badwordchars, $fixedwordchars, $inStr); - - if($inStr){ - if(strtolower($CHARSET) == "utf-8" || strtolower($CHARSET) == "utf8"){ - if(mb_detect_encoding($inStr,'UTF-8,ISO-8859-1',true) == "ISO-8859-1"){ - $retStr = utf8_encode($inStr); - //$retStr = iconv("ISO-8859-1//TRANSLIT","UTF-8",$inStr); - } - } - elseif(strtolower($CHARSET) == "iso-8859-1"){ - if(mb_detect_encoding($inStr,'UTF-8,ISO-8859-1') == "UTF-8"){ - $retStr = utf8_decode($inStr); - //$retStr = iconv("UTF-8","ISO-8859-1//TRANSLIT",$inStr); - } - } - //$line = iconv('macintosh', 'UTF-8', $line); - //mb_detect_encoding($buffer, 'windows-1251, macroman, UTF-8'); - } - return $retStr; - } - - private function cleanOutStr($str){ - $newStr = str_replace('"',""",$str); - $newStr = str_replace("'","'",$newStr); - //$newStr = $this->conn->real_escape_string($newStr); - return $newStr; - } - - private function cleanInStr($str){ - $newStr = trim($str); - $newStr = preg_replace('/\s\s+/', ' ',$newStr); - $newStr = $this->conn->real_escape_string($newStr); - return $newStr; - } } ?> \ No newline at end of file diff --git a/classes/SpecUploadBase.php b/classes/SpecUploadBase.php index de360a7217..72c78f5478 100644 --- a/classes/SpecUploadBase.php +++ b/classes/SpecUploadBase.php @@ -145,6 +145,25 @@ public function loadFieldMap($autoBuildFieldMap = false){ //Add additional fields that are used for mapping to other fields just before record is imported into uploadspectemp $this->symbFields[] = 'coordinateuncertaintyradius'; $this->symbFields[] = 'coordinateuncertaintyunits'; + //Add DwC GeologicalContext (paleo) terms + $this->symbFields[] = 'geologicalcontextid'; + $this->symbFields[] = 'earliestEonOrLowestEonothem'; + $this->symbFields[] = 'latestEonOrHighestEonothem'; + $this->symbFields[] = 'earliestEraOrLowestErathem'; + $this->symbFields[] = 'latestEraOrHighestErathem'; + $this->symbFields[] = 'earliestPeriodOrLowestSystem'; + $this->symbFields[] = 'latestPeriodOrHighestSystem'; + $this->symbFields[] = 'earliestEpochOrLowestSeries'; + $this->symbFields[] = 'latestEpochOrHighestSeries'; + $this->symbFields[] = 'earliestAgeOrLowestStage'; + $this->symbFields[] = 'latestAgeOrHighestStage'; + $this->symbFields[] = 'lowestBiostratigraphicZone'; + $this->symbFields[] = 'highestBiostratigraphicZone'; + $this->symbFields[] = 'lithostratigraphicTermsProperty'; + $this->symbFields[] = 'group'; + $this->symbFields[] = 'formation'; + $this->symbFields[] = 'member'; + $this->symbFields[] = 'bed'; switch ($this->uploadType) { case $this->FILEUPLOAD: @@ -728,7 +747,7 @@ private function recordCleaningStage2(){ if($this->collMetadataArr["managementtype"] == 'Snapshot' || $this->uploadType == $this->SKELETAL){ //Match records that were processed via the portal, walked back to collection's central database, and come back to portal $this->outputMsg('
  • Populating source identifiers (dbpk) to relink specimens processed within portal...
  • '); - $sql = 'UPDATE uploadspectemp u INNER JOIN omoccurrences o ON (u.catalogNumber = o.catalogNumber) AND (u.collid = o.collid) '. + $sql = 'UPDATE IGNORE uploadspectemp u INNER JOIN omoccurrences o ON (u.catalogNumber = o.catalogNumber) AND (u.collid = o.collid) '. 'SET u.occid = o.occid, o.dbpk = u.dbpk '. 'WHERE (u.collid IN('.$this->collId.')) AND (u.occid IS NULL) AND (u.catalogNumber IS NOT NULL) AND (o.catalogNumber IS NOT NULL) AND (o.dbpk IS NULL) '; $this->conn->query($sql); @@ -970,7 +989,7 @@ private function prepareImages(){ $sql = 'DELETE FROM uploadimagetemp '. 'WHERE (originalurl LIKE "%.dng" OR originalurl LIKE "%.tif") AND (collid = '.$this->collId.')'; if($this->conn->query($sql)){ - $this->outputMsg('
  • step 1 of 3...
  • '); + $this->outputMsg('
  • step 1 of 5...
  • '); } else{ $this->outputMsg('
  • WARNING removing non-jpgs from uploadimagetemp: '.$this->conn->error.'
  • '); @@ -981,7 +1000,7 @@ private function prepareImages(){ 'SET ui.occid = u.occid '. 'WHERE (ui.occid IS NULL) AND (u.occid IS NOT NULL) AND (ui.collid = '.$this->collId.')'; if($this->conn->query($sql)){ - $this->outputMsg('
  • step 2 of 3...
  • '); + $this->outputMsg('
  • step 2 of 5...
  • '); } else{ $this->outputMsg('
  • WARNING updating occids within uploadimagetemp: '.$this->conn->error.'
  • '); @@ -989,12 +1008,22 @@ private function prepareImages(){ //Remove previously loaded images where urls match exactly $sql = 'DELETE u.* FROM uploadimagetemp u INNER JOIN images i ON u.occid = i.occid '. - 'WHERE (u.collid = '.$this->collId.') AND (u.originalurl = i.originalurl)'; + 'WHERE (u.collid = '.$this->collId.') AND (u.originalurl = i.originalurl) AND (u.url = i.url)'; if($this->conn->query($sql)){ - $this->outputMsg('
  • step 3 of 3...
  • '); + $this->outputMsg('
  • step 3 of 5...
  • '); } else{ - $this->outputMsg('
  • ERROR deleting uploadimagetemp records with matching originalurls: '.$this->conn->error.'
  • '); + $this->outputMsg('
  • ERROR deleting uploadimagetemp records with matching urls: '.$this->conn->error.'
  • '); + } + if($this->collMetadataArr["managementtype"] == 'Snapshot'){ + //Flush non-matching image derivatives (e.g. thumbnails) + $sql = 'DELETE i.* FROM uploadimagetemp u INNER JOIN images i ON u.occid = i.occid WHERE (u.collid = '.$this->collId.') AND (u.originalurl = i.originalurl)'; + if($this->conn->query($sql)){ + $this->outputMsg('
  • step 4 of 5...
  • '); + } + else{ + $this->outputMsg('
  • ERROR deleting image records with matching originalurls: '.$this->conn->error.'
  • '); + } } $sql = 'DELETE u.* FROM uploadimagetemp u INNER JOIN images i ON u.occid = i.occid '. 'WHERE (u.collid = '.$this->collId.') AND (u.url = i.url) AND (i.url != "") AND (i.url != "empty")'; @@ -1277,13 +1306,12 @@ protected function loadIdentificationRecord($recMap){ } } - $sqlFragments = $this->getSqlFragments($recMap,$this->identFieldMap); - if($sqlFragments){ - if($recMap['identifiedby'] || $recMap['dateidentified']){ - if(!isset($recMap['identifiedby']) || !$recMap['identifiedby']) $recMap['identifiedby'] = 'not specified'; - if(!isset($recMap['dateidentified']) || $recMap['dateidentified']) $recMap['dateidentified'] = 'not specified'; - $sql = 'INSERT INTO uploaddetermtemp(collid'.$sqlFragments['fieldstr'].') '. - 'VALUES('.$this->collId.$sqlFragments['valuestr'].')'; + if($recMap['identifiedby'] || $recMap['dateidentified']){ + if(!isset($recMap['identifiedby']) || !$recMap['identifiedby']) $recMap['identifiedby'] = 'not specified'; + if(!isset($recMap['dateidentified']) || $recMap['dateidentified']) $recMap['dateidentified'] = 'not specified'; + $sqlFragments = $this->getSqlFragments($recMap,$this->identFieldMap); + if($sqlFragments){ + $sql = 'INSERT INTO uploaddetermtemp(collid'.$sqlFragments['fieldstr'].') VALUES('.$this->collId.$sqlFragments['valuestr'].')'; //echo "
    SQL: ".$sql."
    "; exit; if($this->conn->query($sql)){ diff --git a/classes/TaxonomyHarvester.php b/classes/TaxonomyHarvester.php index 34b4922595..7bfdb48edc 100644 --- a/classes/TaxonomyHarvester.php +++ b/classes/TaxonomyHarvester.php @@ -293,7 +293,7 @@ private function getColNode($nodeArr){ if(isset($nodeArr['infraspecies'])) $taxonArr['unitname3'] = $nodeArr['infraspecies']; if(isset($nodeArr['infraspecies_marker'])){ $taxonArr['unitind3'] = $nodeArr['infraspecies_marker']; - $taxonArr['sciname'] = trim($taxonArr['unitname1'].' '.$taxonArr['unitname2'].' '.$taxonArr['unitind3'].' '.$taxonArr['unitname3']); + $taxonArr['sciname'] = trim($taxonArr['unitname1'].' '.$taxonArr['unitname2'].($taxonArr['unitind3']?' '.$taxonArr['unitind3']:'').' '.$taxonArr['unitname3']); } if(isset($nodeArr['author'])) $taxonArr['author'] = $nodeArr['author']; if(isset($nodeArr['source_database'])) $taxonArr['source'] = $nodeArr['source_database']; diff --git a/collections/admin/specupload.php b/collections/admin/specupload.php index 4084458150..22ba4a802a 100644 --- a/collections/admin/specupload.php +++ b/collections/admin/specupload.php @@ -18,7 +18,7 @@ $importIdent = array_key_exists("importident",$_REQUEST)?true:false; $importImage = array_key_exists("importimage",$_REQUEST)?true:false; $matchCatNum = array_key_exists("matchcatnum",$_REQUEST)?true:false; -$matchOtherCatNum = array_key_exists("matchothercatnum",$_REQUEST)?true:false; +$matchOtherCatNum = array_key_exists('matchothercatnum',$_REQUEST)&&$_REQUEST['matchothercatnum']?true:false; $verifyImages = array_key_exists("verifyimages",$_REQUEST)&&$_REQUEST['verifyimages']?true:false; $processingStatus = array_key_exists("processingstatus",$_REQUEST)?$_REQUEST['processingstatus']:''; $finalTransfer = array_key_exists("finaltransfer",$_REQUEST)?$_REQUEST["finaltransfer"]:0; @@ -539,7 +539,7 @@ function pkChanged(selObj){ Match on Catalog Number
    - + /> Match on Other Catalog Numbers
      @@ -620,9 +620,10 @@ function pkChanged(selObj){
    - - - + + + +
    @@ -786,7 +787,7 @@ function pkChanged(selObj){ Match on Catalog Number
    - + /> Match on Other Catalog Numbers
      @@ -942,7 +943,7 @@ function pkChanged(selObj){ Match on Catalog Number
    - + /> Match on Other Catalog Numbers
    Misc @@ -1283,32 +1295,23 @@ function requestImage(){
    0,'HumanObservation'=>0,'LivingSpecimen'=>0,'MachineObservation'=>0,'PreservedSpecimen'=>0); if(isset($occArr['basisofrecord']) && $occArr['basisofrecord']){ - if(in_array($occArr['basisofrecord'],$borArr)){ - $targetBOR = $occArr['basisofrecord']; - } - else{ - $extraBOR = $occArr['basisofrecord']; - } + if(in_array($occArr['basisofrecord'],$borArr)) $borArr[$occArr['basisofrecord']] = 1; + else $borArr[$occArr['basisofrecord']] = 2; } if(!isset($occArr['basisofrecord']) || !$occArr['basisofrecord']){ - if($collMap['colltype']=='General Observations' || $collMap['colltype']=='Observations'){ - $targetBOR = 'HumanObservation'; - } - elseif($collMap['colltype']=='Preserved Specimens'){ - $targetBOR = 'PreservedSpecimen'; - } + if($collType == 'obs') $borArr['HumanObservation'] = 1; + elseif($collType == 'paleo') $borArr['FossilSpecimen'] = 1; + elseif($collType == 'spec') $borArr['PreservedSpecimen'] = 1; } ?>
    diff --git a/collections/editor/rpc/getPaleoGtsParents.php b/collections/editor/rpc/getPaleoGtsParents.php new file mode 100644 index 0000000000..821380aa36 --- /dev/null +++ b/collections/editor/rpc/getPaleoGtsParents.php @@ -0,0 +1,12 @@ +getPaleoGtsParents($term); + +echo json_encode($retArr); +?> \ No newline at end of file diff --git a/collections/harvestparams.php b/collections/harvestparams.php index d3f509d918..161e2ac363 100644 --- a/collections/harvestparams.php +++ b/collections/harvestparams.php @@ -32,6 +32,9 @@ +
    -

    -

    @@ -67,10 +68,10 @@
    -

    +
    -
    +
    -

    +
    -

    +
    : @@ -104,7 +105,7 @@

    -

    +
    @@ -184,7 +185,7 @@

    -

    +
    : @@ -199,12 +200,13 @@ -
    +
    -

    +
    : diff --git a/collections/individual/index.php b/collections/individual/index.php index 010b5e7c13..e51bac43ee 100644 --- a/collections/individual/index.php +++ b/collections/individual/index.php @@ -336,33 +336,30 @@ function initializeMap(){

    '; - $instCode = $collMetadata['institutioncode']; - if(isset($collMetadata['collectioncode'])){ - $instCode .= (strlen($collMetadata['institutioncode'])<7?' : ':'
    ').$collMetadata['collectioncode']; - } - elseif(!isset($occArr['secondaryinstcode']) && isset($occArr['secondarycollcode'])){ - $instCode .= (strlen($collMetadata['institutioncode'])<7?' : ':'
    ').$occArr['secondarycollcode']; - } - if($occArr['secondaryinstcode']){ - $instCode .= '
    '; - $instCode .= $occArr['secondaryinstcode']; - if(isset($occArr['secondarycollcode'])){ - $instCode .= (strlen($occArr['secondaryinstcode'])<7?' : ':'
    '); - $instCode .= $occArr['secondarycollcode']; - } - $instCode .= '
    '; - } if($iconUrl){ + $iconUrl = ''; echo '
    '; echo $iconUrl; echo '
    '; } + $instCode = $collMetadata['institutioncode']; + if(isset($collMetadata['collectioncode']) && $collMetadata['collectioncode']){ + $instCode .= ':'.$collMetadata['collectioncode']; + } + if($occArr['secondaryinstcode']){ + $instCode .= ' || '.$occArr['secondaryinstcode']; + if(isset($occArr['secondarycollcode']) && $occArr['secondarycollcode']){ + $instCode .= ':'.$occArr['secondarycollcode']; + } + } ?> -
    - - - +
    +
    + +
    +
    + +
    @@ -765,30 +762,35 @@ function initializeMap(){
    Paleontology terms: absolute age: '.$occArr['absoluteage']; - if($occArr['storageage']) $paleoStr .= '; storage age: '.$occArr['storageage']; - if($occArr['stage']) $paleoStr .= '; stage: '.$occArr['stage']; - if($occArr['localstage']) $paleoStr .= '; local stage: '.$occArr['localstage']; - if($occArr['biozone']) $paleoStr .= '; biozone: '.$occArr['biozone']; - if($occArr['biostratigraphy']) $paleoStr .= '; biostratigraphy: '.$occArr['biostratigraphy']; - if($occArr['lithogroup']) $paleoStr .= '; group: '.$occArr['lithogroup']; - if($occArr['formation']) $paleoStr .= '; formation: '.$occArr['formation']; - if($occArr['taxonenvironment']) $paleoStr .= '; Taxon Environment: '.$occArr['taxonenvironment']; - if($occArr['member']) $paleoStr .= '; member: '.$occArr['member']; - if($occArr['lithology']) $paleoStr .= '; lithology: '.$occArr['lithology']; - if($occArr['stratremarks']) $paleoStr .= '; remarks: '.$occArr['stratremarks']; - if($occArr['lithdescription']) $paleoStr .= '; lith description: '.$occArr['lithdescription']; - if($occArr['element']) $paleoStr .= '; element: '.$occArr['element']; - if($occArr['slideproperties']) $paleoStr .= '; slide properties: '.$occArr['slideproperties']; - echo trim($paleoStr,'; '); + $paleoStr1 = ''; + if($occArr['eon']) $paleoStr1 .= '; '.$occArr['eon']; + if($occArr['era']) $paleoStr1 .= '; '.$occArr['era']; + if($occArr['period']) $paleoStr1 .= '; '.$occArr['period']; + if($occArr['epoch']) $paleoStr1 .= '; '.$occArr['epoch']; + if($occArr['stage']) $paleoStr1 .= '; '.$occArr['stage']; + if($occArr['earlyinterval']) $paleoStr1 .= '; '.$occArr['earlyinterval']; + if($occArr['lateinterval']) $paleoStr1 .= ' to '.$occArr['lateinterval']; + if($paleoStr1) echo trim($paleoStr1,'; '); ?> +
    + absolute age: '.$occArr['absoluteage'].'
    '; + if($occArr['storageage']) echo '
    storage age: '.$occArr['storageage'].'
    '; + if($occArr['localstage']) echo '
    local stage: '.$occArr['localstage'].'
    '; + if($occArr['biota']) echo '
    biota: '.$occArr['biota'].'
    '; + if($occArr['biostratigraphy']) echo '
    biostratigraphy: '.$occArr['biostratigraphy'].'
    '; + if($occArr['lithogroup']) echo '
    group: '.$occArr['lithogroup'].'
    '; + if($occArr['formation']) echo '
    formation: '.$occArr['formation'].'
    '; + if($occArr['taxonenvironment']) echo '
    taxon environment: '.$occArr['taxonenvironment'].'
    '; + if($occArr['member']) echo '
    member: '.$occArr['member'].'
    '; + if($occArr['bed']) echo '
    bed: '.$occArr['bed'].'
    '; + if($occArr['lithology']) echo '
    lithology: '.$occArr['lithology'].'
    '; + if($occArr['stratremarks']) echo '
    remarks: '.$occArr['stratremarks'].'
    '; + if($occArr['element']) echo '
    element: '.$occArr['element'].'
    '; + if($occArr['slideproperties']) echo '
    slide properties: '.$occArr['slideproperties'].'
    '; + ?> +
    Catalog Number: '.$occArr['catalognumber'].'
    '; if($occArr['occurrenceid']) echo '
    GUID: '.$occArr['occurrenceid'].'
    '; echo '
    Latest Identification: '; - if($securityCode < 2) echo ''.$occArr['sciname'].' '.$occArr['author']; + if($securityCode < 2) echo ''.$occArr['sciname'].' '.$occArr['scientificnameauthorship']; else echo 'species identification protected'; echo '
    '; if($occArr['identifiedby']) echo '
    Identified by: '.$occArr['identifiedby'].''.$occArr['dateidentified'].'
    '; @@ -984,19 +986,21 @@ function initializeMap(){ if($dupArr['notes']) echo '
    '.$dupArr['notes'].'
    '; echo ''; echo '
    '; - if($dupArr['url']){ - $url = $dupArr['url']; - $tnUrl = $dupArr['tnurl']; - if(!$tnUrl) $tnUrl = $url; - if($IMAGE_DOMAIN){ - if(substr($url,0,1) == '/') $url = $IMAGE_DOMAIN.$url; - if(substr($tnUrl,0,1) == '/') $tnUrl = $IMAGE_DOMAIN.$tnUrl; + if(!$securityCode){ + if($dupArr['url']){ + $url = $dupArr['url']; + $tnUrl = $dupArr['tnurl']; + if(!$tnUrl) $tnUrl = $url; + if($IMAGE_DOMAIN){ + if(substr($url,0,1) == '/') $url = $IMAGE_DOMAIN.$url; + if(substr($tnUrl,0,1) == '/') $tnUrl = $IMAGE_DOMAIN.$tnUrl; + } + echo '
    '; + echo ''; + echo ''; + echo ''; + echo '
    '; } - echo '
    '; - echo ''; - echo ''; - echo ''; - echo '
    '; } echo '

    '; echo '
    '; diff --git a/collections/misc/collprofiles.php b/collections/misc/collprofiles.php index db46d9d37e..ef84e799f1 100644 --- a/collections/misc/collprofiles.php +++ b/collections/misc/collprofiles.php @@ -366,7 +366,7 @@ function toggleById(target){ $dataUrl = 'http://www.gbif.org/dataset/'.$datasetKey; ?>
    -
    GBIF Dataset page:
    +
    :
    -
    iDigBio Dataset page:
    +
    :
    getAddress()){ ?>
    -
    Address:
    +
    :
    ".$addrArr["institutionname"]; - if($editCode > 1) echo ' '; + if($editCode > 1) echo ' '; echo '
    '; if($addrArr["institutionname2"]) echo "
    ".$addrArr["institutionname2"]."
    "; if($addrArr["address1"]) echo "
    ".$addrArr["address1"]."
    "; @@ -430,22 +430,22 @@ function toggleById(target){
    • -
    • 1?round($georefPerc):round($georefPerc,2))."%)":'');?> georeferenced
    • +
    • 1?round($georefPerc):round($georefPerc,2))."%)":'').' '.(isset($LANG['GEOREFERENCED'])?$LANG['GEOREFERENCED']:'georeferenced');?>
    • '.number_format($extrastatsArr['imgcnt']).($imgPerc?" (".($imgPerc>1?round($imgPerc):round($imgPerc,2))."%)":'').' with images'; - if($extrastatsArr['gencnt']) echo '
    • '.number_format($extrastatsArr['gencnt']).' GenBank references
    • '; - if($extrastatsArr['boldcnt']) echo '
    • '.number_format($extrastatsArr['boldcnt']).' BOLD references
    • '; - if($extrastatsArr['refcnt']) echo '
    • '.number_format($extrastatsArr['refcnt']).' publication references
    • '; - if($extrastatsArr['SpecimensCountID']) echo '
    • '.number_format($extrastatsArr['SpecimensCountID']).($spidPerc?" (".($spidPerc>1?round($spidPerc):round($spidPerc,2))."%)":'').' identified to species
    • '; + if($extrastatsArr['imgcnt']) echo '
    • '.number_format($extrastatsArr['imgcnt']).($imgPerc?" (".($imgPerc>1?round($imgPerc):round($imgPerc,2))."%)":'').' '.(isset($LANG['WITH_IMAGES'])?$LANG['WITH_IMAGES']:'with images').'
    • '; + if($extrastatsArr['gencnt']) echo '
    • '.number_format($extrastatsArr['gencnt']).' '.(isset($LANG['GENBANK_REF'])?$LANG['GENBANK_REF']:'GenBank references').'
    • '; + if($extrastatsArr['boldcnt']) echo '
    • '.number_format($extrastatsArr['boldcnt']).' '.(isset($LANG['BOLD_REF'])?$LANG['BOLD_REF']:'BOLD references').'
    • '; + if($extrastatsArr['refcnt']) echo '
    • '.number_format($extrastatsArr['refcnt']).' '.(isset($LANG['PUB_REFS'])?$LANG['PUB_REFS']:'publication references').'
    • '; + if($extrastatsArr['SpecimensCountID']) echo '
    • '.number_format($extrastatsArr['SpecimensCountID']).($spidPerc?" (".($spidPerc>1?round($spidPerc):round($spidPerc,2))."%)":'').' '.(isset($LANG['IDED_TO_SPECIES'])?$LANG['IDED_TO_SPECIES']:'identified to species').'
    • '; } ?>
    • '.number_format($extrastatsArr['TotalTaxaCount']).' total taxa (including subsp. and var.)'; - //if($extrastatsArr&&$extrastatsArr['TypeCount']) echo '
    • '.number_format($extrastatsArr['TypeCount']).' type specimens
    • '; + if($extrastatsArr&&$extrastatsArr['TotalTaxaCount']) echo '
    • '.number_format($extrastatsArr['TotalTaxaCount']).' '.(isset($LANG['TOTAL_TAXA'])?$LANG['TOTAL_TAXA']:'total taxa (including subsp. and var.)').'
    • '; + //if($extrastatsArr&&$extrastatsArr['TypeCount']) echo '
    • '.number_format($extrastatsArr['TypeCount']).' '.(isset($LANG['TYPE_SPECIMENS'])?$LANG['TYPE_SPECIMENS']:'type specimens').'
    • '; ?>
    @@ -464,7 +464,7 @@ function toggleById(target){ } else{ ?> -

    Natural History Collections and Observation Projects

    +

    -1){ - alert("ERROR: Target field names must be unique (duplicate field: "+obj.value+")"); - return false; + if(obj.value){ + if(tfArr.indexOf(obj.value) > -1){ + alert("ERROR: Target field names must be unique (duplicate field: "+obj.value+")"); + return false; + } + tfArr[tfArr.length] = obj.value; } - tfArr[tfArr.length] = obj.value; } if(obj.name.indexOf("sf[") == 0){ - if(sfArr.indexOf(obj.value) > -1){ - alert("ERROR: Source field names must be unique (duplicate field: "+obj.value+")"); - return false; + if(obj.value){ + if(sfArr.indexOf(obj.value) > -1){ + alert("ERROR: Source field names must be unique (duplicate field: "+obj.value+")"); + return false; + } + sfArr[sfArr.length] = obj.value; } - sfArr[sfArr.length] = obj.value; } } if(tfArr.indexOf("catalognumber") < 0 && tfArr.indexOf("othercatalognumbers") < 0){ @@ -227,12 +231,9 @@ function validateFileUploadForm(f){
    - These tools are designed to aid collection managers in batch processing specimen images. - Contact portal manager for helping in setting up a new workflow. - Once a profile is established, the collection manager can use this form to manually trigger image processing. - For more information, see the Symbiota documentation for - recommended practices for - integrating images. + These tools are designed to aid collection managers in batch processing specimen images. Contact portal manager for help in setting up a new workflow. + Once a profile is established, the collection manager can use this form to manually trigger image processing. For more information, see the Symbiota documentation for + recommended practices for integrating images.
    - Image Mapping Type: + Processing Type:
    @@ -528,7 +529,7 @@ function validateFileUploadForm(f){