$d)
            {
                $arr_column[$k] = $d[$column];
            }
            array_multisort( $arr_column, $direction, $arr );
        }*/
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::array_column()
         *
         * @author      Roman Telychko
         * @version     0.1.20131030
         *
         * @param     	array        $arr
         * @param     	string       $column_key
         * @param     	string       $index_key
         * @return    	array
         */
        public function array_column( $arr, $column_key, $index_key = null )
        {
            if( empty($arr) )
            {
                return [];
            }
            $data   = [];
            $c      = 0;
            foreach( $arr as $a )
            {
                if( isset($a[$column_key]) )
                {
                    $data[ ( !empty($index_key) && isset($a[$index_key]) ) ? $a[$index_key] : $c ] = $a[$column_key];
                    $c++;
                }
            }
            return $data;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::paginate()
         *
         * @author          Roman Telychko
         * @version         0.1.20130627
         *
         * @param           array           $data
         * @param           bool            $return_output
         * @return          string
         */
        public function paginate( $data = [], $return_output = false )
        {
            $data = array_merge(
                [
                    'page'              => 1,
                    'items_per_page'    => 20,
                    'total_items'       => 0,
                    'url_for'           => [],
                    'links_count'       => 16,
                ],
                $data
            );
            if( empty($data['page']) || empty($data['total_items']) || empty($data['url_for']) )
            {
                return false;
            }
            if( $data['total_items'] <= $data['items_per_page'] )
            {
                return false;
            }
            // pages count
            $data['pages_count'] = intval( ceil( $data['total_items'] / $data['items_per_page'] ) );
            if( $data['page'] > $data['pages_count'] )
            {
                $data['page'] = $data['pages_count'];
            }
            elseif( $data['page'] < 1 )
            {
                $data['page'] = 1;
            }
            // links count
            if( $data['links_count'] <= $data['pages_count'] )
            {
                if( $data['page'] <= floor( $data['links_count'] / 2 ) + 1 )
                {
                    $start_i = 1;
                }
                else
                {
                    $start_i = $data['page'] - floor( $data['links_count'] / 2 );
                }
                $stop_i     = $start_i + $data['links_count'] - 1;
                if( $stop_i > $data['pages_count'] )
                {
                    $start_i    = $data['pages_count'] - $data['links_count'] + 1;
                    $stop_i     = $data['pages_count'];
                }
            }
            else
            {
                $start_i    = 1;
                $stop_i     = $data['pages_count'];
            }
            $url_obj = $this->getDi()->get('url');
            $firstPage = $data['url_for'];
            $firstPage['for'] = $data['index_page'];
            $output =
                '
'.
                ( $data['page']==1 ? '' : ' 
' );
            // build links
            //p($data['page'],1);
            for( $i = $start_i; $i <= $stop_i; $i++ )
            {
                $output .= '- '.$i.'';
            }
            $output .=
                ( $data['page']==$data['pages_count'] ? '' : '
 
' ).
                '
';
            ($data['page'] != '1')            ? $meta_link_prev = '' : $meta_link_prev = '';
            ($data['page'] != $data['pages_count']) ? $meta_link_next = '' : $meta_link_next = '';
            if( $return_output )
            {
                $result = array(
                    'output'          => $output,
                    'meta_link_prev'  => $meta_link_prev,
                    'meta_link_next'  => $meta_link_next,
                );
                return $result;
            }
            else
            {
                echo( $output );
                return true;
            }
        }
        ///////////////////////////////////////////////////////////////////////////
        /**
         * common::adminPaginate()
         *
         * @author          Roman Telychko
         * @version         0.1.20130627
         *
         * @param           array           $data
         * @param           bool            $return_output
         * @return          string
         */
        public function adminPaginate( $data = [], $return_output = false )
        {
            $data = array_merge(
                [
                    'page'              => 1,
                    'items_per_page'    => 20,
                    'total_items'       => 0,
                    'url_for'           => [],
                    'links_count'       => 5,
                ],
                $data
            );
            if( empty($data['page']) || empty($data['total_items']) || empty($data['url_for']) )
            {
                return false;
            }
            if( $data['total_items'] <= $data['items_per_page'] )
            {
                return false;
            }
            // pages count
            $data['pages_count'] = intval( ceil( $data['total_items'] / $data['items_per_page'] ) );
            if( $data['page'] > $data['pages_count'] )
            {
                $data['page'] = $data['pages_count'];
            }
            elseif( $data['page'] < 1 )
            {
                $data['page'] = 1;
            }
            // links count
            if( $data['links_count'] <= $data['pages_count'] )
            {
                if( $data['page'] <= floor( $data['links_count'] / 2 ) + 1 )
                {
                    $start_i = 1;
                }
                else
                {
                    $start_i = $data['page'] - floor( $data['links_count'] / 2 );
                }
                $stop_i     = $start_i + $data['links_count'] - 1;
                if( $stop_i > $data['pages_count'] )
                {
                    $start_i    = $data['pages_count'] - $data['links_count'] + 1;
                    $stop_i     = $data['pages_count'];
                }
            }
            else
            {
                $start_i    = 1;
                $stop_i     = $data['pages_count'];
            }
            $url_obj = $this->getDi()->get('url');
            $output =
                '';
            if( $return_output )
            {
                return $output;
            }
            else
            {
                echo( $output );
                return true;
            }
        }
        ///////////////////////////////////////////////////////////////////////////
        /**
         * common::shortenString()
         *
         * @author          Roman Telychko
         * @version         0.1.20110930
         *
         * @param           string      $str
         * @param           integer     $length
         * @return          string
         */
        public function shortenString( $str, $length = 200 )
        {
            if( strlen($str) > $length )
            {
                $str = wordwrap( $str, $length, '||BR||', false );
                $str = mb_substr( $str, 0, mb_strpos( $str, '||BR||', 0, 'UTF-8' ), 'UTF-8' );
                $str .= '...';
            }
            return $str;
        }
        ///////////////////////////////////////////////////////////////////////////
        /**
         * common::transliterate()
         *
         * @author          Jane Bezmaternykh
         * @version         0.1.20131115
         *
         * @param           string
         * @param           integer      $lang_id
         * @return          string
         */
        public function transliterate( $str, $lang_id = 1 )
        {
            $str = mb_strtolower( trim($str), 'UTF-8');
            $str = preg_replace('/\s{2,}/', ' ', $str);
            if( $lang_id==1 )  /* uk */
            {
                $str = str_replace( 'и', 'y', $str );
                $str = str_replace( 'й', 'yi', $str );
                $str = str_replace( 'і', 'i', $str );
                $str = str_replace( 'ї', 'yi', $str );
                $str = str_replace( 'є', 'ye', $str );
            }
            if( $lang_id==2 )  /* ru */
            {
                $str = str_replace( 'и', 'i', $str );
                $str = str_replace( 'й', 'yi', $str );
                $str = str_replace( 'ы', 'y', $str );
                $str = str_replace( 'э', 'e', $str );
                $str = str_replace( 'ъ', '', $str );
            }
            $str = str_replace( 'а', 'a', $str );
            $str = str_replace( 'б', 'b', $str );
            $str = str_replace( 'в', 'v', $str );
            $str = str_replace( 'г', 'g', $str );
            $str = str_replace( 'д', 'd', $str );
            $str = str_replace( 'е', 'e', $str );
            $str = str_replace( 'ж', 'j', $str );
            $str = str_replace( 'з', 'z', $str );
            $str = str_replace( 'к', 'k', $str );
            $str = str_replace( 'л', 'l', $str );
            $str = str_replace( 'м', 'm', $str );
            $str = str_replace( 'н', 'n', $str );
            $str = str_replace( 'о', 'o', $str );
            $str = str_replace( 'п', 'p', $str );
            $str = str_replace( 'р', 'r', $str );
            $str = str_replace( 'с', 's', $str );
            $str = str_replace( 'т', 't', $str );
            $str = str_replace( 'у', 'u', $str );
            $str = str_replace( 'ф', 'f', $str );
            $str = str_replace( 'х', 'h', $str );
            $str = str_replace( 'ц', 'ts', $str );
            $str = str_replace( 'ч', 'ch', $str );
            $str = str_replace( 'ш', 'sh', $str );
            $str = str_replace( 'щ', 'sch', $str );
            $str = str_replace( 'ю', 'yu', $str );
            $str = str_replace( 'я', 'ya', $str );
            $str = str_replace( 'ь', '', $str );
            $str = preg_replace( '/\s/', '_', $str );
            $str = preg_replace( '/[^a-z0-9\_]/', '', $str );
            $str = preg_replace( '/\_{1,}/', '_', $str );
            return $str;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::generatePasswd()
         *
         * @author          Jane Bezmaternykh
         * @version         0.1.20140428
         *
         * @param           integer      $leight
         * @return          string
         */
        public function generatePasswd( $leight )
        {
            $passwd = '';
            $str = "qwertyuiopasdfghjklzxcvbnm123456789";
            for($i=0; $i<$leight; $i++)
            {
                $passwd .= substr($str, mt_rand(0, strlen($str)-1), 1);
            }
            return $passwd;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::getTypeSubtype()
         *
         * @author		Jane Bezmaternykh
         * @version     0.1.20140407
         *
         * @param       string      $type_alias
         * @param       string      $type_child_alias
         * @param       string      $subtype_alias
         * @param       integer     $lang_id
         * @return     	array
         */
        public function getTypeSubtype( $type_alias = NULL, $type_child_alias = NULL, $subtype_alias = NULL, $lang_id )
        {
            $types      = $this->getDi()->get('models')->getCatalog()->getTypes( $lang_id );
            $subtypes   = $this->getDi()->get('models')->getCatalog()->getSubtypes( $lang_id );
            //p($types,1);
            //p($types,1);
            $catalog = [];
            foreach( $subtypes as $s )
            {
                $subtypes_[$s['type']][$s['id']] = $s;
            }
            foreach( $types as $t )
            {
                $catalog_[$t['type']]                = $t;
                $catalog_[$t['type']]['subtypes']    = !empty( $subtypes_[$t['type']] ) ? $subtypes_[$t['type']] : '';
                if( $t['parent_id'] > 0 )
                {
                    $catalog_[$t['type']]                           = $t;
                    $catalog_[$t['type']]['subtypes']               = $subtypes_[$t['parent_id']];
                    if( empty( $type_child_alias ) )
                    {
                        $catalog_[$t['parent_id']]['type_children'][]   = $t;
                    }
                    else
                    {
                        $catalog_[$t['parent_id']]['type_children_']  = $t; // for breadcrumbs
                    }
                }
            }
            //p($catalog_,1);
            foreach( $catalog_ as $k => $c )
            {
                //p($c['alias'] == $type_alias,1);
                if( !empty( $type_alias ) )
                {
                    if( $c['alias'] == $type_alias )
                    {
                        if( !empty( $subtype_alias ) )
                        {
                            foreach( $c['subtypes'] as $key => $val )
                            {
                                if( $val['alias'] == $subtype_alias )
                                {
                                    //$catalog = $val;
                                    $catalog['subtype_id']      = $key;
                                    $catalog['subtype_alias']   = $subtype_alias;
                                    $catalog['subtype_title']   = $val['title'];
                                    $catalog['cover']           = $val['cover'];
                                }
                            }
                        }
                        else
                        {
                            $catalog = $c;
                        }
                        $catalog['type_id']     = $k;
                        $catalog['type_alias']  = $c['alias'];
                        $catalog['type_title']  = $c['title'];
                    }
                }
                else
                {
                    $catalog = $catalog_;
                }
            }
            // p($catalog,1);
            return $catalog;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::getTypeSubtype1()
         *
         * @author		Jane Bezmaternykh
         * @version     0.1.20140407
         *
         * @param       array       $catalog_elements
         * @param       integer     $lang_id
         * @return     	array
         */
        public function getTypeSubtype1( $catalog_elements, $lang_id )
        {
            $rootId         = 0;
            $catalog        = [];
            $catalog_ids    = [];
            $catalog2return = [];
            if( !empty( $catalog_elements ) )
            {
                $catalog_alias  = array_pop($catalog_elements);
                $catalog_temp   = $this->getDi()->get('models')->getCatalog()->getCatalogWithTreeByAlias( $catalog_alias, $lang_id );
                $catalog_ids    = $this->getDi()->get('etc')->int2arr($catalog_temp);
            }
            $catalog_temp   = $this->getDi()->get('models')->getCatalog()->getCatalog( $lang_id );
            $catalog_return = [];
            foreach( $catalog_temp as $id => $node )
            {
                $catalog[$node['id']] = $node;
            }
            foreach( $catalog as $id => $node )
            {
                if( isset($node['parent_id']) )
                {
                    $catalog[$node['parent_id']]['sub'][$id] = &$catalog[$id];
                }
                else
                {
                    $rootId = $id;
                }
            }
            $catalog_ = [$rootId => $catalog[$rootId]];
            switch( count($catalog_ids) )
            {
                case 0:
                default:
                    $catalog2return = $catalog_['0']['sub'];
                    break;
                case 1:
                    foreach( $catalog_['0']['sub'] as $k => $c )
                    {
                        if( $k == $catalog_ids['0'] )
                        {
                            $catalog2return = $c;
                        }
                    }
                    break;
                case 2:
                    foreach( $catalog_['0']['sub'] as $k => $c )
                    {
                        if( $k == $catalog_ids['0'] )
                        {
                            $catalog2return = $c;
                            foreach( $c['sub'] as $key => $val )
                            {
                                //unset($val['sub']);
                                if( $key == $catalog_ids['1'] )
                                {
                                    $temp = $val;
                                }
                            }
                        }
                    }
                    $catalog2return['sub'] = $temp;
                    break;
                case 3:
                    foreach( $catalog_['0']['sub'] as $k => $c )
                    {
                        if( $k == $catalog_ids['0'] )
                        {
                            $catalog2return = $c;
                            foreach( $c['sub'] as $key => $val )
                            {
                                //unset($val['sub']);
                                if( $key == $catalog_ids['1'] )
                                {
                                    foreach( $val['sub'] as $last_k => $v )
                                    {
                                        if( $last_k  == $catalog_ids['2'] )
                                        {
                                            $val['sub'] = $v;
                                        }
                                        else
                                        {
                                            unset($val['sub'][$last_k]);
                                        }
                                    }
                                    $temp = $val;
                                }
                            }
                            $c['sub'] = $temp;
                        }
                    }
                    $catalog2return['sub'] = $temp;
                    break;
            }
            $catalog_return =
                [
                    'catalog'   => $catalog2return,
                    'path'      => !empty( $catalog_ids ) ? $catalog_ids : []
                ];
            return $catalog_return;
        }
        /////////////////////////////////////////////////////////////////////////////
        public function getTypeSubtype2($lang_id){
            $catalog_temp   = $this->getDi()->get('models')->getCatalog()->getCatalog( $lang_id );
            $catalog = array();
            foreach($catalog_temp as $item){
                $catalog[$item['id']] = $item;
            }
            return $catalog;
        }
        /**
         * common::getGroups()
         *
         * @author		Jane Bezmaternykh
         * @version     0.1.20140407
         *
         * @param       string     $lang_id
         * @param       array      $groups
         * @return     	array
         */
        public function getGroups( $lang_id, $groups )
        {
            $catalog_   = $this->getDi()->get('models')->getCatalog()->getCatalog( $lang_id );
            $compare    = $this->getDi()->get('session')->get('compare', []);
            $groups_    = [];
            foreach( $catalog_ as $c )
            {
                $catalog_new[$c['id']] = $c;
            }
            if( !empty( $groups ) )
            {
                $item_ids   = $this->array_column( $groups, 'id' );
                $items      = $this->getDi()->get('models')->getItems()->getItemsWithMinPrice( $lang_id, join( ',', $item_ids ) );
                if( !empty( $items ) )
                {
                    $items_ = [];
                    foreach( $items as $i )
                    {
                        $items_[$i['id']] = $i;
                    }
                    foreach( $groups as &$g )
                    {
                        $g['price']                 = !empty( $items_[$g['id']]['price2'] ) ? $items_[$g['id']]['price2'] : '';
                        $g['title']                 = !empty( $items_[$g['id']]['title'] ) ? $items_[$g['id']]['title'] : '';
                        $g['description']           = !empty( $items_[$g['id']]['description'] ) ? $this->shortenString($items_[$g['id']]['description'], 200) : '';
                        $g['content_description']   = !empty( $items_[$g['id']]['content_description'] ) ? $items_[$g['id']]['content_description'] : '';
                        $g['cover']                 = !empty( $g['cover'] ) ? $this->getDi()->get('storage')->getPhotoUrl( $g['cover'], 'avatar', '200x' ) : '/images/packet.jpg';
                        $g['alias']                 = $this->getDi()->get('url')->get([ 'for' => 'item', 'subtype' => $catalog_new[$g['catalog']]['alias'], 'group_alias' => $g['alias'], 'item_id' => $g['id'] ]);
                        $g['checked']               = !empty($compare[$g['type_id']][$g['subtype_id']]) && in_array($g['id'], $compare[$g['type_id']][$g['subtype_id']]) ? 1 : 0;
                        if( !empty( $g['options'] ) )
                        {
                            $g['options_']  = $this->getDi()->get('etc')->hstore2arr($g['options']);
                            $g['is_new']    = !empty( $g['options_']['is_new'] ) ? $g['options_']['is_new'] : '0';
                            $g['is_top']    = !empty( $g['options_']['is_top'] ) ? $g['options_']['is_top'] : '0';
                            unset($g['options_']);
                            unset($g['options']);
                        }
                    }
                    $groups_ = $groups;
                }
            }
            return $groups_;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::getGroups1()
         *
         * @author		Jane Bezmaternykh
         * @version     0.1.20140407
         *
         * @param       string     $lang_id
         * @param       array      $groups
         * @return     	array
         */
        public function getGroups1( $lang_id, $groups)
        {
            $groups_    = [];
            $compare    = $this->getDi()->get('session')->get('compare', []);
            if( !empty( $groups ) )
            {
                $item_ids   = $this->array_column( $groups, 'id' );
                $items      = $this->getDi()->get('models')->getItems()->getItemsWithMinPrice( $lang_id, join( ',', $item_ids ) );
                if( !empty( $items ) )
                {
                    $items_ = [];
                    foreach( $items as $i )
                    {
                        $items_[$i['id']] = $i;
                    }
                    foreach( $groups as &$g )
                    {
                        $g['items']                 = $this->getDi()->get('models')->getItems()->getSizesByGroupId($lang_id, $g['group_id']);
                        for($i = 0; $i < count($g['items']); $i++) {
                            $g['items'][$i]['prices'] = $this->getPricesArray($g['items'][$i]);
                        }
                        $g['price']                 = !empty( $items_[$g['id']]['price2'] ) ? $items_[$g['id']]['price2'] : 0;
                        $g['title']                 = !empty( $items_[$g['id']]['title'] ) ? $items_[$g['id']]['title'] : '';
                        $g['description']           = !empty( $items_[$g['id']]['description'] ) ? $this->shortenString($items_[$g['id']]['description'], 200) : '';
                        $g['content_description']   = !empty( $items_[$g['id']]['content_description'] ) ? $items_[$g['id']]['content_description'] : '';
                        $g['cover']                 = !empty( $g['cover'] ) ? $this->getDi()->get('storage')->getPhotoUrl( $g['cover'], 'avatar', '200x' ) : '/images/packet.jpg';
                        $g['alias']                 = $this->getDi()->get('url')->get([ 'for' => 'item', 'type' => $g['type_alias'], 'subtype' => $g['subtype_alias'], 'group_alias' => $g['alias'], 'item_id' => $g['id'] ]);
                        if(isset($g['type_id']) && isset($g['catalog']))
                            $g['checked']               = !empty($compare[$g['type_id']][$g['catalog']]) && in_array($g['id'], $compare[$g['type_id']][$g['catalog']]) ? 1 : 0;
                        if( !empty( $g['options'] ) )
                        {
                            $g['options_']  = $this->getDi()->get('etc')->hstore2arr($g['options']);
                            $g['is_new']    = !empty( $g['options_']['is_new'] ) ? $g['options_']['is_new'] : '0';
                            $g['is_top']    = !empty( $g['options_']['is_top'] ) ? $g['options_']['is_top'] : '0';
                            unset($g['options_']);
                            unset($g['options']);
                        }
                    }
                    $groups_ = $groups;
                }
            }
            return $groups_;
        }
        public function getGroupsBackend( $lang_id, $groups)
        {
            $groups_    = [];
            $compare    = $this->getDi()->get('session')->get('compare', []);
            if( !empty( $groups ) )
            {
                $item_ids   = $this->array_column( $groups, 'id' );
                $items      = $this->getDi()->get('models')->getItems()->getItemsWithMinPrice( $lang_id, join( ',', $item_ids ) );
                if( !empty( $items ) )
                {
                    $items_ = [];
                    foreach( $items as $i )
                    {
                        $items_[$i['id']] = $i;
                    }
                    foreach( $groups as &$g )
                    {
                        $g['items']                 = $this->getDi()->get('models')->getItems()->getSizesByGroupId($lang_id, $g['group_id']);
                        for($i = 0; $i < count($g['items']); $i++) {
                            $g['items'][$i]['prices'] = $this->getPricesArray($g['items'][$i]);
                        }
                        $g['price']                 = !empty( $items_[$g['id']]['price2'] ) ? $items_[$g['id']]['price2'] : 0;
                        $g['title']                 = !empty( $items_[$g['id']]['title'] ) ? $items_[$g['id']]['title'] : '';
                        $g['description']           = !empty( $items_[$g['id']]['description'] ) ? $this->shortenString($items_[$g['id']]['description'], 200) : '';
                        $g['content_description']   = !empty( $items_[$g['id']]['content_description'] ) ? $items_[$g['id']]['content_description'] : '';
                        $g['cover']                 = !empty( $g['cover'] ) ? $this->getDi()->get('storage')->getPhotoUrl( $g['cover'], 'avatar', '200x' ) : '/images/packet.jpg';
                        if(isset($g['type_id']) && isset($g['catalog']))
                            $g['checked']               = !empty($compare[$g['type_id']][$g['catalog']]) && in_array($g['id'], $compare[$g['type_id']][$g['catalog']]) ? 1 : 0;
                        if( !empty( $g['options'] ) )
                        {
                            $g['options_']  = $this->getDi()->get('etc')->hstore2arr($g['options']);
                            $g['is_new']    = !empty( $g['options_']['is_new'] ) ? $g['options_']['is_new'] : '0';
                            $g['is_top']    = !empty( $g['options_']['is_top'] ) ? $g['options_']['is_top'] : '0';
                            unset($g['options_']);
                            unset($g['options']);
                        }
                    }
                    $groups_ = $groups;
                }
            }
            return $groups_;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::seo_important()
         *
         * @author      Jane Bezmaternykh
         * @version     0.1.20140412
         *
         * @param     	array        $filters
         * @param     	array        $filters_applied
         * @param     	string       $url
         * @param     	string       $price
         * @param     	array        $sort
         * @return    	array
         */
        public function seo_important( $filters, $filters_applied, $url, $price, $sort )
        {
            $lang_id = 1;
            $seo_important_filters      = $this->getDi()->get('models')->getFilters()->getSeoImportantFilters( $lang_id );
            $seo_important_filters_ids  = self::array_column( $seo_important_filters, 'id' );
            foreach( $seo_important_filters as $f )
            {
                $seo_alias[$f['id']] =
                    [
                        'key'   => $f['filter_key_alias'],
                        'value' => $f['filter_value_alias']
                    ];
            }
            foreach( $filters as $k => &$f )
            {
                $filters[$k]['alias_'] =
                    in_array( $f['id'], $filters_applied )
                        ?
                        array_diff( $filters_applied, [ $f['id'] ] )
                        :
                        array_merge( $filters_applied, [ $f['id'] ] );
                sort( $f['alias_'] );
                $filters[$k]['alias'] =
                    $url.
                    (!empty( $f['alias_']  ) ? '/'.join( '-', $f['alias_'] ) : '').
                    (!empty( $f['alias_']  ) ? ( !empty($price) ? '--price-'.$price : '' ) : ( !empty($price) ? '/price-'.$price : '' )).
                    (!empty($sort) ? '/sort-'.join('-', $sort) : '');
                if( !empty( $f['alias_'] ) )
                {
                    foreach( $f['alias_'] as $v )
                    {
                        if( in_array( $v, $seo_important_filters_ids ) )
                        {
                            $filters[$k]['seo_alias_array'][] = $seo_alias[$v];
                        }
                    }
                    if( !empty( $f['seo_alias_array'] ) )
                    {
                        foreach( $f['seo_alias_array'] as $s )
                        {
                            $f['seo_alias_array_'][$s['key']][] = $s['value'];
                        }
                        foreach( $f['seo_alias_array_'] as $key => $s )
                        {
                            $f['seo_alias_array__'][$key] = $key.'-'.join( '-', $s );
                        }
                        $filters[$k]['alias'] =
                            $url.
                            (!empty(  $f['alias_'] ) && !empty( $f['seo_alias_array__'] ) ? '/'.join( '-', $f['alias_'] ).'--'.join( '--', $f['seo_alias_array__'] ) : '').
                            ( empty( $f['alias_'] ) && empty( $f['seo_alias_array__'] ) ? ( !empty($price) ? '/price-'.$price : '' ) : ( !empty($price) ? '--price-'.$price : '' ) ).
                            ( !empty($sort) ? '/sort-'.join('-', $sort) : '' );
                        unset($f['seo_alias_array_']);
                        unset($f['seo_alias_array__']);
                    }
                    unset($f['seo_alias_array']);
                    unset($f['alias_']);
                }
            }
            return $filters;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::getUrlForFilter()
         *
         * @author      Jane Bezmaternykh
         * @version     0.1.20140415
         *
         * @param     	array        $params
         * @param     	string       $page
         * @return    	array
         */
        public function getUrlForFilter( $params, $page )
        {
            if( empty($params['filter_ids']) && empty($params['filter_alias']) && empty($params['price']) && !empty($params['sort']) )
            {
                $url = ['for' => 'subtype_sorted_paginated', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'sort' => $params['sort'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && empty($params['filter_alias']) && empty($params['price']) && empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_ids_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && empty($params['filter_alias']) && empty($params['price']) && !empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_ids_sorted_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'sort' => $params['sort'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && !empty($params['filter_alias']) && empty($params['price']) && empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_id_alias_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && !empty($params['filter_alias']) && empty($params['price']) && !empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_id_alias_sorted_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'sort' => $params['sort'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && empty($params['filter_alias']) && !empty($params['price']) && empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_id_price_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && empty($params['filter_alias']) && !empty($params['price']) && !empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_id_price_sorted_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'sort' => $params['sort'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && !empty($params['filter_alias']) && !empty($params['price']) && empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_id_alias_price_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'page' => $page ];
            }
            elseif( !empty($params['filter_ids']) && !empty($params['filter_alias']) && !empty($params['price']) && !empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_id_alias_price_sorted_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'sort' => $params['sort'], 'page' => $page ];
            }
            elseif( empty($params['filter_ids']) && empty($params['filter_alias']) && !empty($params['price']) && empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_price_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'page' => $page ];
            }
            elseif( empty($params['filter_ids']) && empty($params['filter_alias']) && !empty($params['price']) && !empty($params['sort']) )
            {
                $url = [ 'for' => 'get_items_with_filters_price_sorted_paginate', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'sort' => $params['sort'], 'page' => $page ];
            }
            return $url;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::getUrlForSort()
         *
         * @author      Jane Bezmaternykh
         * @version     0.1.20140520
         *
         * @param     	array        $params
         * @param     	string       $sort_default_1
         * @param     	string       $sort_default_2
         * @return    	array
         */
        public function getUrlForSort( $params, $sort_default_1, $sort_default_2 )
        {
            //p($params,1);
            if( empty($params['filter_ids']) && empty($params['filter_alias']) && empty($params['price']) )
            {
                $url[0] = ['for' => 'subtype_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'sort' => '0-'.$sort_default_2];
                $url[1] = ['for' => 'subtype_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'sort' => '1-'.$sort_default_2];
                $url[2] = ['for' => 'subtype_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'sort' => '2-'.$sort_default_2];
                $url[3] = ['for' => 'subtype_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'sort' => $sort_default_1.'-3'];
                $url[4] = ['for' => 'subtype_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'sort' => $sort_default_1.'-4'];
                $url[5] = ['for' => 'subtype_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'sort' => $sort_default_1.'-5'];
            }
            elseif( !empty($params['filter_ids']) && empty($params['filter_alias']) && empty($params['price']) )
            {
                $url[0] = ['for' => 'get_items_with_filters_ids_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'sort' => '0-'.$sort_default_2];
                $url[1] = ['for' => 'get_items_with_filters_ids_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'sort' => '1-'.$sort_default_2];
                $url[2] = ['for' => 'get_items_with_filters_ids_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'sort' => '2-'.$sort_default_2];
                $url[3] = ['for' => 'get_items_with_filters_ids_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'sort' => $sort_default_1.'-3'];
                $url[4] = ['for' => 'get_items_with_filters_ids_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'sort' => $sort_default_1.'-4'];
                $url[5] = ['for' => 'get_items_with_filters_ids_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'sort' => $sort_default_1.'-5'];
            }
            elseif( !empty($params['filter_ids']) && !empty($params['filter_alias']) && empty($params['price']) )
            {
                $url[0] = ['for' => 'get_items_with_filters_id_alias_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'sort' => '0-'.$sort_default_2];
                $url[1] = ['for' => 'get_items_with_filters_id_alias_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'sort' => '1-'.$sort_default_2];
                $url[2] = ['for' => 'get_items_with_filters_id_alias_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'sort' => '2-'.$sort_default_2];
                $url[3] = ['for' => 'get_items_with_filters_id_alias_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'sort' => $sort_default_1.'-3'];
                $url[4] = ['for' => 'get_items_with_filters_id_alias_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'sort' => $sort_default_1.'-4'];
                $url[5] = ['for' => 'get_items_with_filters_id_alias_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'sort' => $sort_default_1.'-5'];
            }
            elseif( !empty($params['filter_ids']) && empty($params['filter_alias']) && !empty($params['price']) )
            {
                $url[0] = ['for' => 'get_items_with_filters_id_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'sort' => '0-'.$sort_default_2];
                $url[1] = ['for' => 'get_items_with_filters_id_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'sort' => '1-'.$sort_default_2];
                $url[2] = ['for' => 'get_items_with_filters_id_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'sort' => '2-'.$sort_default_2];
                $url[3] = ['for' => 'get_items_with_filters_id_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'sort' => $sort_default_1.'-3'];
                $url[4] = ['for' => 'get_items_with_filters_id_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'sort' => $sort_default_1.'-4'];
                $url[5] = ['for' => 'get_items_with_filters_id_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'price' => $params['price'], 'sort' => $sort_default_1.'-5'];
            }
            elseif( !empty($params['filter_ids']) && !empty($params['filter_alias']) && !empty($params['price']) )
            {
                $url[0] = ['for' => 'get_items_with_filters_id_alias_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'sort' => '0-'.$sort_default_2];
                $url[1] = ['for' => 'get_items_with_filters_id_alias_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'sort' => '1-'.$sort_default_2];
                $url[2] = ['for' => 'get_items_with_filters_id_alias_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'sort' => '2-'.$sort_default_2];
                $url[3] = ['for' => 'get_items_with_filters_id_alias_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'sort' => $sort_default_1.'-3'];
                $url[4] = ['for' => 'get_items_with_filters_id_alias_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'sort' => $sort_default_1.'-4'];
                $url[5] = ['for' => 'get_items_with_filters_id_alias_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'filter_ids' => $params['filter_ids'], 'filter_alias' => $params['filter_alias'], 'price' => $params['price'], 'sort' => $sort_default_1.'-5'];
            }
            elseif( empty($params['filter_ids']) && empty($params['filter_alias']) && !empty($params['price']) )
            {
                $url[0] = ['for' => 'get_items_with_filters_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'sort' => '0-'.$sort_default_2];
                $url[1] = ['for' => 'get_items_with_filters_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'sort' => '1-'.$sort_default_2];
                $url[2] = ['for' => 'get_items_with_filters_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'sort' => '2-'.$sort_default_2];
                $url[3] = ['for' => 'get_items_with_filters_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'sort' => $sort_default_1.'-3'];
                $url[4] = ['for' => 'get_items_with_filters_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'sort' => $sort_default_1.'-4'];
                $url[5] = ['for' => 'get_items_with_filters_price_sorted', 'type' => $params['type_alias'], 'subtype' => $params['subtype_alias'], 'price' => $params['price'], 'sort' => $sort_default_1.'-5'];
            }
            return $url;
        }
        /////////////////////////////////////////////////////////////////////////////
        /**
         * common::buildBreadcrumbs()
         *
         * @author      Jane Bezmaternykh
         * @version     0.1.20140718
         *
         * @param     	array        $catalog
         * @return    	string
         */
        public function buildBreadcrumbs( $catalog )
        {
            $breadcrumbs =
                '';
            //p($breadcrumbs,1);
            return $breadcrumbs;
        }
        /**
         * common::explodeAlias()
         *
         * @author      Jane Bezmaternykh
         * @version     0.1.20140718
         *
         * @param     	array        $items
         * @return    	array
         */
        public function explodeAlias( $items )
        {
            if(!empty($items)){
                foreach( $items as &$p )
                {
                    if(!empty($p['catalog_alias'])){
                        $p['explode']       = explode( '/', $p['catalog_alias'] );
                        $p['type_alias']    = $p['explode']['1'];
                        $p['subtype_alias'] = $p['explode']['2'];
                        unset( $p['explode'] );
                    } else {
                        $p['type_alias']    = '';
                        $p['subtype_alias'] = '';
                    }
                }
            }
            return $items;
        }
        public function postCurl($params) {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_VERBOSE, 1);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_URL, 'http://'.config::get( 'global#domains/www-dev' ).'/ajax/get_session' );
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS,'params='.$params);
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/30.0.1599.114 Chrome/30.0.1599.114 Safari/537.36' );
            $data = curl_exec($curl);
            return $data;
        }
        public function getPriceClass($price, $usersPrice) {
            $priceNum = substr($price, -1);
            if($usersPrice > $priceNum) {
                return 'class="inactive_price"';
            }
        }
        public function getPricesArray($item) {
            $prices = [];
            $price_first = 2;
            $price_last = 6;
            for ($i = $price_first; $i < $price_last + 1; $i++) {
                $prices[] = $item['price' . $i];
            }
            return $prices;
        }
        public function getCartItems($in_cart, $lang_id, $special_user = null) {
            $result = [];
            $total_price = 0;
            $item_ids    = $this->array_column( $in_cart, 'item_id' );
            $items       = $this->getDi()->get('models')->getItems()->getItemsByIds( $lang_id, $item_ids );
            $groups_ids  = $this->array_column( $items, 'group_id' );
            $groups_data = $this->getDi()->get('models')->getItems()->getItemsByColorAndGroupsId(join(',',$groups_ids));
            $colors      = array_unique($this->array_column( $groups_data, 'color_id' ));
            $color_info = $this->getDi()->get('models')->getItems()->getColorsInfoByColorsId( $lang_id, join(',',$colors) );
            foreach($color_info as $k =>$v){
                $colors_info[$v['id']] = $v;
            }
            foreach($groups_data as $k =>$v){
                if($groups_data[$k]['color_id'] != 0){
                    $groups_data[$k]['color'] = $colors_info[$groups_data[$k]['color_id']]['color_title'];
                    $groups_data[$k]['absolute_color'] = $colors_info[$groups_data[$k]['color_id']]['absolute_color'];
                } else {
                    $groups_data[$k]['color'] = 0;
                    $groups_data[$k]['absolute_color'] = 0;
                }
            }
            foreach($groups_data as $k =>$v){
                $groups_data[$v['id']] = $v;
            }
            foreach ( $in_cart as $c )
            {
                $count_item[$c['item_id']] = $c['count_items'];
            }
            if(isset($special_user)) {
                for ($i = 0; $i < count($items); $i++) {
                    $items[$i]['prices'] = $this->getPricesArray($items[$i]);
                }
            }
            foreach ( $items as $k => $i )
            {
                $items[$k]['cover']         = !empty( $i['group_cover'] ) ? $this->getDi()->get('storage')->getPhotoUrl( $i['item_cover'], 'avatar', '128x' ) : '/images/packet.jpg';
                $items[$k]['alias']         = $this->getDi()->get('url')->get([ 'for' => 'item', 'subtype' => $i['catalog_alias'], 'group_alias' => $i['group_alias'], 'item_id' => $i['id'] ]);
                if(isset($i['prices'][0])) {
                    $items[$k]['total_price'] = round($count_item[$i['id']] * $i['prices'][$special_user['status']], 2);
                    $items[$k]['price2'] = $i['prices'][$special_user['status']];
                } else {
                    $items[$k]['total_price'] = round($count_item[$i['id']] * $i['price2'], 2);
                }
                $items[$k]['count'] = $count_item[$i['id']];
                $total_price += $items[$k]['total_price'];
                $items[$k]['color'] = $groups_data[$i['id']]['color'];
                $items[$k]['absolute_color'] = $groups_data[$i['id']]['absolute_color'];
                $items_[$i['id']] = $items[$k];
            }
            $total_price = round( $total_price, 2 );
            $result['total_price'] = $total_price;
            $result['items'] = $items;
            $result['items_'] = $items_;
            return $result;
        }
        public function countOrderSum(&$order) {
            $sum = 0;
            foreach($order['items'] as $k => $item) {
                $sum += $item['total_price'];
            }
            $order['total_sum'] = $sum;
        }
        public function applyPromoCode($promo_code, &$items) {
            $flag = false;
            foreach($items as $k => $item) {
                if($this->containsPromoCode($promo_code, $item)) {
                    $flag = true;
                    $items[$k]['price2'] = number_format($item['price2'] - ($item['price2'] * $promo_code['discount'] / 100), 1, '.', '');
                    $items[$k]['total_price'] = number_format($items[$k]['price2'] * $item['count'], 1, '.', '');
                }
            }
            return $flag;
        }
        public function containsPromoCode($promo_code, $item) {
            $group_ids = $this->parseArray($promo_code['group_ids']);
            /*$catalog_ids = $this->parseArray($promo_code['catalog_ids']);*/
            if(!empty($group_ids) && in_array($item['id'], $group_ids))
                return true;
            /*$catalog_tree = $this->getDi()->get('models')->getCatalog()->getCatalogWithTree($item['catalog']);
            $path = $this->parseArray($catalog_tree[0]['path']);
            if(!empty($catalog_ids) && !empty(array_intersect($path, $catalog_ids)))
                return true;*/
            return false;
        }
        public function parseArray($str) {
            return explode(',', preg_replace('[{|}]', '' , $str));
        }
    }
}