function traverse_tree_down($class, $category_id, $level, $forbidcatids, $onlycatids, $virtuemart_vendor_id, $toplevel)
 {
     $db = JFactory::getDBO();
     $banned_cats = explode(',', $forbidcatids);
     $prefered_cats = explode(',', $onlycatids);
     $level++;
     $toplevel = 0;
     $q = "SELECT * FROM `#__virtuemart_categories_" . VMLANG . "` AS vmcl, `#__virtuemart_category_categories` AS vmcc,  `#__virtuemart_categories` AS vmc\r\r\n\t\t\t\t\tWHERE vmcc.`category_parent_id` = '" . $category_id . "' \r\r\n\t\t\t\t\tAND vmcl.`virtuemart_category_id` = `category_child_id` \r\r\n\t\t\t\t\tAND vmc.`virtuemart_category_id` = vmcl.`virtuemart_category_id` \r\r\n\t\t\t\t\tAND vmc.`published`='1' \r\r\n\t\t\t\t\tAND (vmc.`virtuemart_vendor_id`='1' OR vmc.`virtuemart_vendor_id` ='" . $virtuemart_vendor_id . "' OR vmc.`shared`='1' ) ";
     foreach ($banned_cats as $banned_cat) {
         $q .= "AND vmc.`virtuemart_category_id` !='" . $banned_cat . "' ";
     }
     if ($onlycatids != '') {
         $q .= " AND vmc.`virtuemart_category_id` IN (" . implode(',', $prefered_cats) . ") ";
     }
     $q .= "\tORDER BY vmc.`ordering` ASC ";
     $db->setQuery($q);
     $cats = $db->loadObjectList();
     if (count($cats) > 0) {
         $c_js = '';
         echo '<div class="form-group">';
         echo ' <select id="selectid' . $category_id . '" class="form-control catrank chosen' . $level . '" required="required" aria-required="true" ';
         if ($level == 1) {
             $c_js = '';
             echo ' name="formcat" ';
         } elseif ($level > 1) {
             echo ' style="display:none" ';
         }
         echo 'onchange="this.style.backgroundColor = \'\'" >';
         //if(count($cats)>1)
         echo '<option value="0">' . JText::_('COM_VMVENDOR_VMVENADD_FORM_CHOOSECAT') . '</option>';
         foreach ($cats as $cat) {
             echo '<option value="' . $cat->virtuemart_category_id . '" ';
             echo '> ';
             for ($iii = 1; $iii < $level; $iii++) {
                 echo ' . ';
             }
             if ($level > 1) {
                 echo ' |_ ';
             }
             echo JText::_($cat->category_name) . '</option>';
         }
         echo '</select>';
         echo '</div>';
     }
     static $toplevel = 0;
     if ($level > $toplevel) {
         $toplevel = $level;
     }
     foreach ($cats as $cat) {
         traverse_tree_down($class, $cat->category_child_id, $level, $forbidcatids, $onlycatids, $virtuemart_vendor_id, $toplevel);
     }
     return $toplevel;
 }
function traverse_tree_down($class, $category_id, $level, $forbidcatids, $onlycatids, $virtuemart_category_id, $virtuemart_vendor_id, $multicat)
{
    $db = JFactory::getDBO();
    $banned_cats = explode(',', $forbidcatids);
    $prefered_cats = explode(',', $onlycatids);
    $level++;
    $q = "SELECT * FROM `#__virtuemart_categories_" . VMLANG . "` AS vmcl, `#__virtuemart_category_categories` AS vmcc, `#__virtuemart_categories` AS vmc\r\r\n\t\tWHERE vmcc.`category_parent_id` = '" . $category_id . "' \r\r\n\t\tAND vmcl.`virtuemart_category_id` = `category_child_id` \r\r\n\t\tAND vmc.`virtuemart_category_id` = vmcl.`virtuemart_category_id` \r\r\n\t\tAND vmc.`published`='1' \r\r\n\t\tAND (vmc.`virtuemart_vendor_id`='1' OR vmc.`virtuemart_vendor_id` ='" . $virtuemart_vendor_id . "' OR vmc.`shared`='1' ) ";
    foreach ($banned_cats as $banned_cat) {
        $q .= "AND vmc.`virtuemart_category_id` !='" . $banned_cat . "' ";
    }
    if ($onlycatids != '') {
        $q .= " AND vmc.`virtuemart_category_id` IN (" . implode(',', $prefered_cats) . ") ";
    }
    $q .= "\tORDER BY vmc.`ordering` ASC ";
    $db->setQuery($q);
    $cats = $db->loadObjectList();
    foreach ($cats as $cat) {
        echo '<option value="' . $cat->virtuemart_category_id . '" ';
        if (!$multicat && $cat->virtuemart_category_id == $virtuemart_category_id) {
            echo ' selected="selected" ';
        } elseif ($multicat && in_array($cat->virtuemart_category_id, $virtuemart_category_id)) {
            echo ' selected="selected" ';
        }
        echo '>';
        $parent = 0;
        for ($i = 1; $i < $level; $i++) {
            echo ' . ';
        }
        if ($level > 1) {
            echo ' |_ ';
        }
        echo JText::_($cat->category_name) . '</option>';
        traverse_tree_down($class, $cat->category_child_id, $level, $forbidcatids, $onlycatids, $virtuemart_category_id, $virtuemart_vendor_id, $multicat);
    }
}