/**
* put your comment there...
*
* @param mixed $defs
* @param mixed $defs_nonsel
* @param mixed $dtyID
*/
function getAllowedTerms($defs, $defs_nonsel, $dtyID)
{
    global $dtyIDDefs;
    $allowed_terms = null;
    if ($dtyID == null || !@$dtyIDDefs[$dtyID]) {
        //detail type ID is not defined or terms are already found
        if ($dtyID == DT_RELATION_TYPE) {
            //get all root terms (vocabs)
            $allowed_terms = getTermListAll('relation');
            $dtyIDDefs[$dtyID] = $allowed_terms;
        } else {
            $terms = getTermsFromFormat($defs);
            if (($cntTrm = count($terms)) > 0) {
                if ($cntTrm == 1) {
                    //vocabulary
                    $terms = getTermOffspringList($terms[0]);
                } else {
                    $nonTerms = getTermsFromFormat($defs_nonsel);
                    if (count($nonTerms) > 0) {
                        $terms = array_diff($terms, $nonTerms);
                    }
                }
                if (count($terms) < 1) {
                    $allowed_terms = "all";
                } else {
                    $allowed_terms = $terms;
                }
                if ($dtyID != null) {
                    //keep for future use
                    $dtyIDDefs[$dtyID] = $allowed_terms;
                }
            }
        }
    } else {
        $allowed_terms = $dtyIDDefs[$dtyID];
    }
    return $allowed_terms;
}
/**
* Verify rectype pointer value or term id
*
* @param mixed $id  - rectype id (for resource) or term id (for enum reltype)
* @param mixed $dtyID - field type id
* @param mixed $rtyID - rectype id
*/
function isValidID($id, $dtyID, $rtyID = null)
{
    if (!is_numeric($id) || !is_numeric($dtyID)) {
        return false;
    }
    if (!@$dtyIDDefs) {
        $dtyIDDefs = array();
    }
    if (!@$dtyIDDefs[$dtyID]) {
        $res = mysql_query("select dty_ID, dty_Type, dty_JsonTermIDTree,dty_TermIDTreeNonSelectableIDs,dty_PtrTargetRectypeIDs" . " from defDetailTypes" . " where dty_ID={$dtyID} and dty_Type in ('enum','relationtype','resource')");
        while ($res && ($row = mysql_fetch_row($res))) {
            //use first element as index
            if (defined('DT_RELATION_TYPE') && $dtyID == DT_RELATION_TYPE) {
                //$row[1] === 'relationtype' ){
                $dtyIDDefs[$dtyID] = getTermListAll('relation');
            } else {
                if ($row[1] === 'enum') {
                    //create term Id list and term list.
                    $terms = getTermsFromFormat($row[2]);
                    if (($cntTrm = count($terms)) > 0) {
                        if ($cntTrm == 1) {
                            //vocabulary
                            $terms = getTermOffspringList($terms[0]);
                        } else {
                            $nonTerms = getTermsFromFormat($row[3]);
                            if (count($nonTerms) > 0) {
                                $terms = array_diff($terms, $nonTerms);
                            }
                        }
                        if (count($terms) < 1) {
                            $dtyIDDefs[$row[0]] = "all";
                        } else {
                            $dtyIDDefs[$row[0]] = $terms;
                        }
                    }
                } else {
                    if ($row[1] === 'resource') {
                        // create list of valid rectypes
                        $dtyIDDefs[$row[0]] = "all";
                        if ($row[4] != "") {
                            $temp = explode(",", $row[4]);
                            //get allowed record types
                            if (count($temp) > 0) {
                                $dtyIDDefs[$row[0]] = $temp;
                            }
                        }
                    }
                }
            }
        }
    }
    if (false && $rtyID && !$rtFieldDefs) {
        //this code not used anymore
        $rtFieldDefs = array('max' => array());
        $res = mysql_query("select rst_DetailTypeID, dty_Type, rst_MaxValues," . " if(rst_FilteredJsonTermIDTree is not null and CHAR_LENGTH(rst_FilteredJsonTermIDTree)>0,rst_FilteredJsonTermIDTree,dty_JsonTermIDTree) as rst_FilteredJsonTermIDTree," . " if(rst_TermIDTreeNonSelectableIDs is not null and CHAR_LENGTH(rst_TermIDTreeNonSelectableIDs)>0,rst_TermIDTreeNonSelectableIDs,dty_TermIDTreeNonSelectableIDs) as rst_TermIDTreeNonSelectableIDs," . " if(rst_PtrFilteredIDs is not null and CHAR_LENGTH(rst_PtrFilteredIDs)>0,rst_PtrFilteredIDs,dty_PtrTargetRectypeIDs) as rst_PtrFilteredIDs" . " from defRecStructure" . " left join defDetailTypes on rst_DetailTypeID = dty_ID" . " where rst_RecTypeID=" . $rtyID);
        while ($res && ($row = mysql_fetch_row($res))) {
            //use first element as index
            if (is_numeric($row[2])) {
                $rtFieldDefs['max'][$row[0]] = $row[2];
            }
            /*
            These fields are never defined in UI. Thus, they should aleays be null. It was for overwrite of base field constraints by further contraints within the recstructure,
            which is one step too many and has been removed from design by Ian in approx 2011
            
            if ( $row[1] === 'enum' || $row[1] === 'relationtype') {
            //create term Id list and term list.
            $terms = getTermsFromFormat($row[3]);
            if (($cntTrm = count($terms)) > 0) {
            if ($cntTrm == 1) {
            $terms = getTermOffspringList($terms[0]);
            }else{
            $nonTerms = getTermsFromFormat($row[4]);
            if (count($nonTerms) > 0) {
            $terms = array_diff($terms,$nonTerms);
            }
            }
            if (!empty($terms)) {
            $rtFieldDefs[$row[0]] = $terms;
            }
            }
            } else if ($row[1] === 'resource') {
            // create list of valid rectypes
            if (count($row[5])>0 && $row[5] != "") {
            $temp = explode(",",$row[5]);
            if (!empty($temp)) {
            $rtFieldDefs[$row[0]] = $temp;
            }
            }else{
            $rtFieldDefs[$row[0]] = "all";
            }
            }
            */
        }
    }
    // not used
    // if ($rtFieldDefs && $rtyID && array_key_exists($dtyID, $rtFieldDefs)) {
    //    $res = $rtFieldDefs[$dtyID] === "all" || in_array($id, $rtFieldDefs[$dtyID]);
    //}
    if ($dtyIDDefs && @$dtyIDDefs[$dtyID]) {
        return $dtyIDDefs[$dtyID] === "all" || in_array($id, $dtyIDDefs[$dtyID]);
    }
    return false;
}