function get_date($startdate, $enddate)
{
    global $warnings;
    $node = '';
    $start_gYear = '';
    $end_gYear = '';
    //validate dates
    if ($startdate != 0 && is_int($startdate) && $startdate < 3000) {
        $start_gYear = number_pad($startdate, 4);
    }
    if ($enddate != 0 && is_int($enddate) && $enddate < 3000) {
        $end_gYear = number_pad($enddate, 4);
    }
    if ($startdate == 0 && $enddate != 0) {
        $node = '<date' . (strlen($end_gYear) > 0 ? ' standardDate="' . $end_gYear . '"' : '') . '>' . get_date_textual($enddate) . '</date>';
    } elseif ($startdate != 0 && $enddate == 0) {
        $node = '<date' . (strlen($start_gYear) > 0 ? ' standardDate="' . $start_gYear . '"' : '') . '>' . get_date_textual($startdate) . '</date>';
    } elseif ($startdate == $enddate) {
        $node = '<date' . (strlen($end_gYear) > 0 ? ' standardDate="' . $end_gYear . '"' : '') . '>' . get_date_textual($enddate) . '</date>';
    } elseif ($startdate != 0 && $enddate != 0) {
        $node = '<dateRange><fromDate' . (strlen($start_gYear) > 0 ? ' standardDate="' . $start_gYear . '"' : '') . '>' . get_date_textual($startdate) . '</fromDate><toDate' . (strlen($start_gYear) > 0 ? ' standardDate="' . $end_gYear . '"' : '') . '>' . get_date_textual($enddate) . '</toDate></dateRange>';
    }
    return $node;
}
function generate_nuds($row, $recordId)
{
    //array of cleaned labels for title elements
    $title_elements = array();
    //develop date
    $startdate_int = trim($row['fromDate']) * 1;
    $enddate_int = trim($row['toDate']) * 1;
    if (trim($row['fromDate']) != '' || trim($row['toDate']) != '') {
        $fromDate_textual = get_date_textual($startdate_int);
        $toDate_textual = get_date_textual($enddate_int);
        $date_textual = $fromDate_textual . (strlen($fromDate_textual) > 0 && strlen($toDate_textual) > 0 ? '-' : '') . $toDate_textual;
        $date = get_date($startdate_int, $enddate_int, $date_textual, $fromDate_textual, $toDate_textual);
    }
    //set objectType
    $objtype = 'Coin';
    $objtype_uri = 'http://nomisma.org/id/coin';
    //control
    $xml = '<?xml version="1.0" encoding="UTF-8"?><nuds xmlns="http://nomisma.org/nuds" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mets="http://www.loc.gov/METS/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" recordType="physical">';
    $xml .= "<control><recordId>{$recordId}</recordId>";
    $xml .= '<publicationStatus>approved</publicationStatus>';
    $xml .= '<maintenanceAgency><agencyName>American Numismatic Society</agencyName></maintenanceAgency>';
    $xml .= '<maintenanceStatus>derived</maintenanceStatus>';
    $xml .= '<maintenanceHistory><maintenanceEvent>';
    $xml .= '<eventType>derived</eventType><eventDateTime standardDateTime="' . date(DATE_W3C) . '">' . date(DATE_W3C) . '</eventDateTime><agentType>machine</agentType><agent>PHP</agent><eventDescription>Derived from CSV</eventDescription>';
    $xml .= '</maintenanceEvent></maintenanceHistory>';
    $xml .= '<rightsStmt><copyrightHolder>American Numismatic Society</copyrightHolder></rightsStmt>';
    $xml .= "</control>";
    $xml .= '<descMeta>';
    /***** TITLE *****/
    $title = $recordId;
    /*$title .= $title_elements['objectType'];
    	if (array_key_exists('location', $title_elements)){
    		$title .= ', ' . $title_elements['location'];
    	}
    	if (strlen($date_textual) > 0){
    		$title .= ', ';
    		$title .= $date_textual;
    	}
    	$title .= '. ' . $recordId;*/
    $xml .= '<title xml:lang="en">' . $title . '</title>';
    /************ typeDesc ***************/
    $xml .= '<typeDesc>';
    //fill in other typeDesc metadata
    $xml .= '<objectType xlink:type="simple" xlink:href="' . $objtype_uri . '">' . $objtype . '</objectType>';
    //date
    if (strlen($date) > 0) {
        $xml .= $date;
    }
    //denomination
    if (strlen(trim($row['denomination'])) > 0) {
        $xml .= '<denomination xlink:type="simple"' . (strlen($row['denomination_uri']) > 0 ? ' xlink:href="' . trim($row['denomination_uri']) . '"' : '') . '>' . trim($row['denomination']) . '</denomination>';
    }
    //material
    if (trim($row['material']) == 'Electrum') {
        $xml .= '<material xlink:type="simple" xlink:href="http://nomisma.org/id/el">Electrum</material>';
    } elseif (trim($row['material']) == 'Gold') {
        $xml .= '<material xlink:type="simple" xlink:href="http://nomisma.org/id/av">Gold</material>';
    }
    /***** GEOGRAPHICAL LOCATIONS *****/
    if (strlen(trim($row['mint'])) > 0 || strlen(trim($row['region'])) > 0) {
        $xml .= '<geographic>';
        if (strlen(trim($row['mint'])) > 0) {
            $xml .= '<geogname xlink:type="simple" xlink:role="mint"' . (strlen($row['mint_uri']) > 0 ? ' xlink:href="' . trim($row['mint_uri']) . '"' : '') . '>' . trim($row['mint']) . '</geogname>';
        }
        if (strlen(trim($row['region'])) > 0) {
            $xml .= '<geogname xlink:type="simple" xlink:role="region"' . (strlen($row['region_uri']) > 0 ? ' xlink:href="' . trim($row['region_uri']) . '"' : '') . '>' . trim($row['region']) . '</geogname>';
        }
        $xml .= '</geographic>';
    }
    if (strlen(trim($row['obverseType'])) > 0) {
        $xml .= '<obverse>';
        $xml .= '<type><description xml:lang="en">' . trim($row['obverseType']) . '</description></type>';
        $xml .= '</obverse>';
    }
    if (strlen(trim($row['reverseType'])) > 0) {
        $xml .= '<reverse>';
        $xml .= '<type><description xml:lang="en">' . trim($row['reverseType']) . '</description></type>';
        $xml .= '</reverse>';
    }
    //weightStandard
    if (strlen(trim($row['weight_standard'])) > 0) {
        $xml .= '<weightStandard>' . trim($row['weight_standard']) . '</weightStandard>';
    }
    $xml .= '</typeDesc>';
    /***** PHYSICAL DESCRIPTION *****/
    if (strlen(trim($row['dob'])) > 0 || trim($row['weight']) > 0 || trim($row['diameter']) > 0) {
        $xml .= '<physDesc>';
        //dob
        if (strlen(trim($row['dob'])) > 0) {
            $xml .= '<dateOnObject><date>' . $row['dob'] . '</date></dateOnObject>';
        }
        //create measurementsSet, if applicable
        if (trim($row['weight']) > 0 || trim($row['diameter']) > 0) {
            $xml .= '<measurementsSet>';
            //weight
            $weight = trim($row['weight']);
            if (is_numeric($weight) && $weight > 0) {
                $xml .= '<weight units="g">' . $weight . '</weight>';
            }
            //diameter
            $diameter = trim(str_replace('mm', '', $row['diameter']));
            if (is_numeric($diameter) && $diameter > 0) {
                $xml .= '<diameter units="mm">' . $diameter . '</diameter>';
            }
            $xml .= '</measurementsSet>';
        }
        $xml .= '</physDesc>';
    }
    /***** FINDSPOT DESCRIPTION *****/
    if (strlen(trim($row['findspot'])) > 0 || strlen(trim($row['hoard'])) > 0) {
        if (strlen(trim($row['hoard'])) > 0) {
            $id = strtolower(str_replace(' ', '', trim($row['hoard'])));
            $hoardUri = "http://nomisma.org/id/{$id}";
            $xml .= '<findspotDesc xlink:type="simple" xlink:href="' . $hoardUri . '"/>';
        } elseif (strlen(trim($row['findspot'])) > 0) {
            $xml .= '<findspotDesc>';
            $xml .= '<findspot><geogname xlink:type="simple" xlink:role="findspot">' . trim($row['findspot']) . '</geogname></findspot>';
            $xml .= '</findspotDesc>';
        }
    }
    /***** ADMINSTRATIVE DESCRIPTION *****/
    $xml .= '<adminDesc>';
    if (strlen(trim($row['identifier'])) > 0) {
        $xml .= '<identifier>' . $row['identifier'] . '</identifier>';
    }
    if (strlen(trim($row['repository'])) > 0) {
        $xml .= '<repository>' . $row['repository'] . '</repository>';
    }
    if (strlen(trim($row['auc1'])) > 0 || strlen(trim($row['auc2'])) > 0 || strlen(trim($row['auc3'])) > 0 || strlen(trim($row['auc4'])) > 0 || strlen(trim($row['auc5'])) > 0 || strlen(trim($row['provenance'])) > 0) {
        $xml .= '<provenance><chronList>';
        //previous collection
        if (strlen(trim($row['provenance'])) > 0) {
            $xml .= '<chronItem><previousColl>' . trim($row['provenance']) . '</previousColl></chronItem>';
        }
        //auction catalogs
        $xml .= auction_to_nuds($row, 'auc1');
        $xml .= auction_to_nuds($row, 'auc2');
        $xml .= auction_to_nuds($row, 'auc3');
        $xml .= auction_to_nuds($row, 'auc4');
        $xml .= auction_to_nuds($row, 'auc5');
        $xml .= '</chronList></provenance>';
    }
    $xml .= '</adminDesc>';
    /***** BIBLIOGRAPHIC DESCRIPTION *****/
    if (strlen(trim($row['ref1'])) > 0 || strlen(trim($row['ref2'])) > 0 || strlen(trim($row['ref3'])) > 0 || strlen(trim($row['ref4'])) > 0 || strlen(trim($row['ref5'])) > 0) {
        $xml .= '<refDesc>';
        $xml .= reference_to_nuds($row, 'ref1');
        $xml .= reference_to_nuds($row, 'ref2');
        $xml .= reference_to_nuds($row, 'ref3');
        $xml .= reference_to_nuds($row, 'ref4');
        $xml .= reference_to_nuds($row, 'ref5');
        $xml .= '</refDesc>';
    }
    $xml .= '</descMeta>';
    /***** IMAGES *****/
    $xml .= '<digRep><mets:fileSec>';
    $xml .= '<mets:fileGrp USE="obverse">';
    $xml .= '<mets:file USE="reference" MIMETYPE="image/jpeg"><mets:FLocat LOCTYPE="URL" xlink:href="media/reference/' . trim($row['obv_image']) . '.jpg"/></mets:file>';
    $xml .= '<mets:file USE="thumbnail" MIMETYPE="image/jpeg"><mets:FLocat LOCTYPE="URL" xlink:href="media/thumbnail/' . trim($row['obv_image']) . '.jpg"/></mets:file>';
    $xml .= '</mets:fileGrp>';
    $xml .= '<mets:fileGrp USE="reverse">';
    $xml .= '<mets:file USE="reference" MIMETYPE="image/jpeg"><mets:FLocat LOCTYPE="URL" xlink:href="media/reference/' . trim($row['rev_image']) . '.jpg"/></mets:file>';
    $xml .= '<mets:file USE="thumbnail" MIMETYPE="image/jpeg"><mets:FLocat LOCTYPE="URL" xlink:href="media/thumbnail/' . trim($row['rev_image']) . '.jpg"/></mets:file>';
    $xml .= '</mets:fileGrp>';
    $xml .= '</mets:fileSec></digRep>';
    //close nuds
    $xml .= '</nuds>';
    return $xml;
}