function smarty_function_select_categories($params, &$smarty)
{
    extract($params);
    if (empty($assign)) {
        $smarty->trigger_error("assign: missing 'assign' parameter");
        return;
    }
    if ($remove_root && !$current_category_id) {
        return false;
    }
    cw_load('category', 'image');
    if ($remove_root) {
        $path = cw_category_get_path($current_category_id);
        $category_id = array_shift($path);
    }
    $categories = cw_category_get_subcategories($category_id, $current_category_id);
    if ($params['images']) {
        foreach ($categories as $k => $v) {
            $categories[$k]['image'] = cw_image_get('categories_images_thumb', $v['category_id']);
        }
    }
    $smarty->assign($assign, $categories);
}
     $query_joins['docs_user_info'] = array("on" => "{$tables['docs_user_info']}.customer_id = {$tables['customers']}.customer_id", 'parent' => 'customers', 'is_inner' => 1);
     if (empty($query_joins['docs'])) {
         $query_joins['docs'] = array("on" => "{$tables['docs']}.doc_info_id = {$tables['docs_user_info']}.doc_info_id", 'parent' => 'docs_user_info', 'is_inner' => 1);
     }
     $query_joins['docs_items'] = array("on" => "{$tables['docs_items']}.doc_id = {$tables['docs']}.doc_id" . " and {$tables['docs_items']}.product_id = '" . $data['orders']['orders_product'] . "'", 'parent' => 'docs', 'is_inner' => 1);
 }
 if (!empty($data['orders']['orders_count_from']) || !empty($data['orders']['orders_count_to']) || !empty($data['orders']['avg_subtotal_from']) || !empty($data['orders']['avg_subtotal_to']) || !empty($data['orders']['total_spent_from']) || !empty($data['orders']['total_spent_to'])) {
     $query_joins['customers_docs_stats'] = array("on" => "{$tables['customers_docs_stats']}.customer_id = {$tables['customers']}.customer_id" . ($data['orders']['orders_count_from'] ? " and {$tables['customers_docs_stats']}.orders_count >= '" . $data['orders']['orders_count_from'] . "'" : "") . ($data['orders']['orders_count_to'] ? " and {$tables['customers_docs_stats']}.orders_count <= '" . $data['orders']['orders_count_to'] . "'" : "") . ($data['orders']['avg_subtotal_from'] ? " and {$tables['customers_docs_stats']}.avg_subtotal >= '" . $data['orders']['avg_subtotal_from'] . "'" : "") . ($data['orders']['avg_subtotal_to'] ? " and {$tables['customers_docs_stats']}.avg_subtotal <= '" . $data['orders']['avg_subtotal_to'] . "'" : "") . ($data['orders']['total_spent_from'] ? " and {$tables['customers_docs_stats']}.total_spent >= '" . $data['orders']['total_spent_from'] . "'" : "") . ($data['orders']['total_spent_to'] ? " and {$tables['customers_docs_stats']}.total_spent <= '" . $data['orders']['total_spent_to'] . "'" : ""), 'parent' => 'customers', 'is_inner' => 1);
 }
 if (!empty($data['orders']['category_ids'])) {
     $categories_conditions = array();
     foreach ($data['orders']['category_ids'] as $search_categ) {
         if (empty($search_categ)) {
             continue;
         }
         $all_subcats = cw_category_get_subcategories($search_categ);
         $subcat_ids[$search_categ] = 1;
         foreach ($all_subcats as $subcat) {
             $subcat_ids[$subcat['category_id']] = 1;
         }
         $categories_conditions[] = "{$tables['doc_history_categories']}.category_id in ('" . implode("','", array_keys($subcat_ids)) . "')";
     }
     if (!empty($categories_conditions)) {
         $query_joins['docs_user_info'] = array("on" => "{$tables['docs_user_info']}.customer_id = {$tables['customers']}.customer_id", 'parent' => 'customers', 'is_inner' => 1);
         if (empty($query_joins['docs'])) {
             $query_joins['docs'] = array("on" => "{$tables['docs']}.doc_info_id = {$tables['docs_user_info']}.doc_info_id", 'parent' => 'docs_user_info', 'is_inner' => 1);
         }
         $query_joins['doc_history_categories'] = array("on" => "{$tables['doc_history_categories']}.doc_id = {$tables['docs']}.doc_id" . " and (" . implode(" or ", $categories_conditions) . ")", 'parent' => 'docs', 'is_inner' => 1);
     }
 }
 if (!empty($data['orders']['attributes'])) {
        $ids[] = $val;
        $curr_subcats = cw_query_column("SELECT c.category_id FROM {$tables['categories']} as c, {$tables['categories_parents']} as cp WHERE c.category_id=cp.parent_id and cp.parent_id='{$val}'");
        if ($curr_subcats) {
            $ids = array_merge($ids, $curr_subcats);
        }
    }
    $subcats = cw_query("SELECT category_id, category FROM {$tables['categories']} WHERE category_id in ('" . implode("', '", $ids) . "')");
    if (is_array($subcats)) {
        foreach ($subcats as $k => $v) {
            # kronev, for the big amount of products - there are no any sense to display it
            $subcats[$k]['products_count'] = cw_query_first_cell("SELECT count(*) FROM {$tables['products_categories']}, {$tables['products']} WHERE {$tables['products_categories']}.category_id='{$v['category_id']}' AND {$tables['products_categories']}.product_id={$tables['products']}.product_id AND {$tables['products_categories']}.main=1");
            //        $subcats[$k]['products_count'] = (is_array($subcats[$k]['products']) ? count($subcats[$k]['products']) : 0);
        }
    }
    $smarty->assign('subcats', $subcats);
    $smarty->assign('main', 'category/delete_confirmation');
} elseif ($mode == 'search') {
    $search_data['categories']['page'] = $page;
    list($categories, $navigation) = cw_func_call('cw_category_search', array('data' => $search_data['categories']));
    $navigation['script'] = 'index.php?target=' . $target . '&mode=search';
    $smarty->assign('navigation', $navigation);
    $smarty->assign('categories', $categories);
    $smarty->assign('search_prefilled', $search_data['categories']);
    $smarty->assign('js_tab', 'search');
    $smarty->assign('main', 'categories');
}
$location[] = array(cw_get_langvar_by_name('lbl_categories'), '');
$smarty->assign('subcategories', cw_category_get_subcategories($cat ? $cat : 0));
$smarty->assign('current_category', cw_func_call('cw_category_get', array('cat' => $cat)));
$smarty->assign('category_location', cw_category_get_location($cat, 'categories', 1));
$smarty->assign('cat', $cat);
<?php

cw_load('category');
$smarty->assign('subcategories', cw_category_get_subcategories($cat, $current_category));
$smarty->assign('current_category', $current_category);
$smarty->assign('name', $name);
$smarty->assign('id', $id);
$smarty->assign('index', $index);
$smarty->assign('el_name', $el_name);
$smarty->assign('multiple', $multiple);
$smarty->assign('parent_category_id', $cat);
$smarty->assign('return_type', $return_type);
cw_display('main/ajax/categories.tpl', $smarty);
exit(0);