$location .= cw_clean_url_get_additional_query($url['query'], $params_query);
                cw_header_location($location, true, false, 301);
            }
        } elseif ($REQUEST_METHOD == 'GET' && !defined('IS_AJAX') && !empty($_GET['att'])) {
            parse_str($url['query'], $arr);
            $clean_url = cw_call('cw_clean_url_generate_filter_url', array(array('ns' => $url['path']), array('att' => $arr['att'])));
            if (!empty($clean_url)) {
                unset($arr['att']);
                $has_additional_query = FALSE;
                if (is_array($arr)) {
                    foreach ($arr as $_v) {
                        if (!empty($_v)) {
                            $has_additional_query = TRUE;
                            break;
                        }
                    }
                }
                $location = $clean_url . ($has_additional_query ? '?' . http_build_query($arr) : '');
                cw_header_location($location, true, false, 301);
            } else {
                cw_header_location($url['path'], true, false);
            }
        } elseif ($REQUEST_METHOD == 'GET' && !defined('IS_AJAX') && !empty($url['query'])) {
            $redirect_url = cw_clean_url_get_redirect_url_in_owner_urls($url['query'], $lang);
            if (!empty($redirect_url)) {
                $location = $current_location . '/' . $redirect_url;
                cw_header_location($location, true, false, 301);
            }
        }
    }
}
/**
 * 
 * @param array $params - additional function params 
 *  [ns] - navigation script
 *  [clean_urls] - array of clean urls can be supplied by pre-hooks to build final url
 * @param array $query - query params
 * @param bool $full - add or not navigation script to returned url
 * 
 * @return string url
 */
function cw_clean_url_generate_filter_url($params, $query, $full = true)
{
    global $tables, $current_language, $config, $current_location, $current_host_location;
    global $cw_attributes;
    $main_attribute_id = cw_clean_url_get_uniting_attribute_id();
    $attribute_values_attribute_id = cw_clean_url_get_attribute_values_attribute_id();
    $language = !empty($current_language) ? $current_language : $config['default_customer_language'];
    if (empty($query) || !is_array($query)) {
        return '';
    }
    $addition_params = array();
    $clean_urls = array();
    if (!empty($params['clean_urls'])) {
        $clean_urls = $params['clean_urls'];
    }
    foreach ($query as $varname => $element) {
        if (is_array($element)) {
            foreach ($element as $attribute_id => $attribute_value) {
                if ($attribute_id == 'price') {
                    // If price is shown as ranges, then process it as usual attribute
                    $a = cw_call('cw_attributes_filter', array(array('field' => 'price'), true));
                    if (in_array($a['pf_display_type'], array('P', 'E', 'W', 'G'))) {
                        $attribute_id = $a['attribute_id'];
                    }
                }
                if (is_numeric($attribute_id)) {
                    $att = $cw_attributes['all'][$attribute_id];
                    $attribute_type = $att['active'] == 1 && $att['pf_is_use'] == 1 ? $att['type'] : false;
                    if (in_array($attribute_type, array("selectbox", "multiple_selectbox")) || in_array($attribute_type, array("decimal", "integer")) && in_array($att['pf_display_type'], array('P', 'E', 'W', 'G'))) {
                        if (is_numeric($attribute_value[0])) {
                            $clean_url = cw_call('cw_attribute_get_value', array($attribute_values_attribute_id, $attribute_value[0], $language));
                            if (!empty($clean_url)) {
                                $clean_urls[] = $clean_url;
                            }
                        } else {
                            $clean_url = cw_call('cw_attribute_get_value', array($attribute_values_attribute_id, $attribute_id, $language));
                            if (!empty($clean_url)) {
                                $clean_urls[] = $clean_url . '-' . $attribute_value[0];
                            }
                        }
                    } elseif (in_array($attribute_type, array("text", "date", "yes_no", "decimal", "integer"))) {
                        $clean_url = cw_call('cw_attribute_get_value', array($main_attribute_id, $attribute_id, $language));
                        if (!empty($clean_url)) {
                            if (isset($attribute_value['min']) && isset($attribute_value['max'])) {
                                $clean_urls[] = $clean_url . '-' . $attribute_value['min'] . '-' . $attribute_value['max'];
                            } else {
                                $clean_urls[] = $clean_url . '-' . $attribute_value[0];
                            }
                        }
                    } elseif (in_array($attribute_type, array("manufacturer-selector"))) {
                        $clean_url = cw_call('cw_attribute_get_value', array($main_attribute_id, $attribute_id, $language));
                        $att = cw_call('cw_attributes_filter', array(array('field' => 'clean_url', 'item_type' => 'M', 'addon' => 'clean_urls'), true));
                        $clean_url_value = cw_call('cw_attribute_get_value', array($att['attribute_id'], $attribute_value[0], $language));
                        if (!empty($clean_url) && !empty($clean_url_value)) {
                            $clean_urls[] = $clean_url . '-' . $clean_url_value;
                        }
                    }
                } elseif ($attribute_id == 'price') {
                    // price
                    $att = cw_call('cw_attributes_filter', array(array('field' => 'price', 'pf_is_use' => '1'), true));
                    $attribute_id = $att['attribute_id'];
                    $clean_url = cw_call('cw_attribute_get_value', array($main_attribute_id, $attribute_id, $language));
                    if (!empty($clean_url) && isset($attribute_value['min']) && isset($attribute_value['max'])) {
                        $clean_urls[] = $clean_url . '-' . $attribute_value['min'] . '-' . $attribute_value['max'];
                    }
                } elseif ($attribute_id == 'substring') {
                    //substring
                    $clean_urls[] = 'substring-' . $attribute_value;
                }
            }
        } else {
            $addition_params[$varname] = $element;
        }
    }
    if (!empty($clean_urls)) {
        if ($full) {
            $url_info = parse_url($params['ns']);
            $redirect_url = cw_clean_url_get_redirect_url_in_owner_urls($url_info['query'], $language);
            if (!empty($redirect_url)) {
                return trim($current_location . '/' . $redirect_url, '/') . '/' . implode('/', $clean_urls) . '?' . http_build_query($addition_params);
            } else {
                return '/' . trim($url_info['path'], '/') . '/' . implode('/', $clean_urls) . '?' . http_build_query($addition_params);
            }
        } else {
            return implode('/', $clean_urls) . '?' . http_build_query($addition_params);
        }
    }
    return '';
}