function extendedParsing($arrayState)
 {
     // set filter for base fields
     require_once $GLOBALS['where_framework'] . '/modules/field/class.field.php';
     $field = new Field(0);
     $arr_fields = Field::getArrFieldValue_Filter($_POST, $this->add_nat_fields, $this->id, '_');
     foreach ($arr_fields as $fname => $fvalue) {
         if (isset($fvalue['value'])) {
             $this->arr_fields_filter[$fname] = $fvalue;
         }
     }
     if (isset($_POST['pw_more_usersel'])) {
         $this->_expand_user = key($_POST['pw_more_usersel']);
     }
     // set filter for custom fields
     $arr_all_fields = $this->field_list->getAllFields();
     $arr_fields = Field::getArrFieldValue_Filter($_POST, $arr_all_fields, $this->id, '_');
     foreach ($arr_fields as $fname => $fvalue) {
         if (isset($fvalue['value'])) {
             $this->arr_fields_filter[$fname] = $fvalue;
         }
     }
     if (isset($arrayState[$this->id])) {
         // this test first - not correct in foreach
         if (isset($arrayState[$this->id]['directory_lessmore'])) {
             $this->more_filter = $arrayState[$this->id]['directory_lessmore'];
         }
         if (isset($arrayState[$this->id]['order_state'])) {
             $this->arr_fields_order = unserialize(urldecode($arrayState[$this->id]['order_state']));
         }
         $isFieldsSet = FALSE;
         foreach ($arrayState[$this->id] as $key => $val) {
             switch ($key) {
                 case $this->_getOpEditItemId():
                     $this->itemSelected = key($arrayState[$this->id][$this->_getOpEditItemId()]);
                     $this->op = 'editperson';
                     break;
                 case $this->_getOpDeleteItemId():
                     $this->itemSelected = key($arrayState[$this->id][$this->_getOpDeleteItemId()]);
                     $this->op = 'deleteperson';
                     break;
                 case $this->_getOpSuspendItemId():
                     $this->itemSelected = key($arrayState[$this->id][$this->_getOpSuspendItemId()]);
                     $this->op = 'suspendperson';
                     break;
                 case $this->_getOpRecoverItemId():
                     $this->itemSelected = key($arrayState[$this->id][$this->_getOpRecoverItemId()]);
                     $this->op = 'recoverperson';
                     break;
                 case $this->_getOpRemoveItemId():
                     $this->itemSelected = key($arrayState[$this->id][$this->_getOpRemoveItemId()]);
                     $this->op = 'removeperson';
                     break;
                 case 'cfield_state':
                     if (!$isFieldsSet) {
                         $this->cFields = unserialize(urldecode($val));
                     }
                     break;
                 case DIRECTORY_CFIELD:
                     $isFieldsSet = TRUE;
                     foreach ($val as $nField => $idField) {
                         $this->cFields[$nField] = $idField;
                     }
                     break;
                 case DIRECTORY_ORDER:
                     $arr_order = array();
                     foreach ($val as $fieldName => $dummyvar) {
                         if (isset($this->arr_fields_order[$fieldName])) {
                             if ($this->arr_fields_order[$fieldName]) {
                                 // is DESC
                                 // do nothing, therefore remove order
                             } else {
                                 // is ASC, go to DESC
                                 $arr_order[$fieldName] = TRUE;
                             }
                         } else {
                             // is unordered
                             $arr_order[$fieldName] = FALSE;
                         }
                     }
                     $this->arr_fields_order = $arr_order;
                     break;
                 case 'directory_more':
                     $this->more_filter = 'more';
                     break;
                 case 'directory_less':
                     $this->more_filter = 'less';
                     break;
                 case 'flat_mode':
                     $this->flat_mode = $val == 'flat_mode';
                     break;
                 case 'add_filter':
                     $id_field = $arrayState[$this->id]['add_field_filter'];
                     if (is_numeric($id_field)) {
                         $this->arr_fields_filter['ff' . count($this->arr_fields_filter) . '_' . $id_field] = $arr_all_fields[$id_field];
                     } else {
                         $this->arr_fields_filter['ff' . count($this->arr_fields_filter) . '_' . $id_field] = $this->add_nat_fields[$id_field];
                     }
                     break;
                 case 'del_filter':
                     if (is_array($val)) {
                         unset($this->arr_fields_filter[key($val)]);
                     } else {
                         $this->arr_fields_filter = array();
                     }
                     break;
             }
         }
     } else {
         // default initializations
         $this->cFields = unserialize(urldecode(Docebo::user()->preference->getPreference('ui.directory.custom_columns')));
         $this->arr_fields_order = unserialize(urldecode(Docebo::user()->preference->getPreference('ui.directory.order_columns')));
         $this->arr_fields_filter = unserialize(urldecode(Docebo::user()->preference->getPreference('ui.directory.filters.current')));
     }
     // remove anonymous ================================================
     if ($this->hide_anonymous === true) {
         $this->data->addCustomFilter('', " idst <> '" . $this->anonymous_idst . "' ");
     }
     if ($this->hide_suspend === true) {
         $this->data->addCustomFilter('', " valid <> '0' ");
     }
     // filter by editions ==============================================
     if ($this->lms_editions_filter === true) {
         if (isset($GLOBALS['course_descriptor']) && $GLOBALS['course_descriptor']->hasEdition()) {
             $fvalue = isset($_POST[$this->id]['edition_filter']) ? strip_tags(html_entity_decode($_POST[$this->id]['edition_filter'])) : '';
             if ($fvalue != false) {
                 $acl_man =& Docebo::user()->getAclManager();
                 $members = $acl_man->getGroupAllUser($fvalue);
                 if ($members && !empty($members)) {
                     $this->data->addCustomFilter('', "idst IN (" . implode(',', $members) . ") ");
                 }
             } else {
                 $ed_list = array();
                 if ($this->editions == false) {
                     $this->editions = $GLOBALS['course_descriptor']->getEditionsSimpleList(getLogUserId(), true);
                 }
                 $this->data->intersectGroupFilter(array_keys($this->editions));
             }
         }
     }
     // show filter ============================================================
     if ($this->show_simple_filter === true) {
         $fvalue = isset($_POST[$this->id]['simple_fulltext_search']) ? strip_tags(html_entity_decode($_POST[$this->id]['simple_fulltext_search'])) : '';
         if (trim($fvalue !== '')) {
             $this->data->addCustomFilter('', " ( userid LIKE '%" . $fvalue . "%' OR firstname LIKE '%" . $fvalue . "%' OR lastname LIKE '%" . $fvalue . "%' ) ");
         }
     } else {
         if (is_array($this->arr_fields_filter)) {
             foreach ($this->arr_fields_filter as $fname => $fvalue) {
                 if (isset($fvalue['value'])) {
                     if (isset($fvalue['fieldname'])) {
                         if ($fvalue['field_type'] == 'upload') {
                             $this->data->addFieldFilter($fvalue['fieldname'], '', '<>');
                         } else {
                             if ($fvalue['value'] == '') {
                                 $search_op = " = ";
                                 $search_val = "";
                             } else {
                                 $search_op = " LIKE ";
                                 $search_val = "%" . $fvalue['value'] . "%";
                             }
                             $this->data->addFieldFilter($fvalue['fieldname'], $search_val, $search_op);
                         }
                     } else {
                         if ($fvalue[FIELD_INFO_TYPE] == 'upload') {
                             $this->data->addCustomFilter(" LEFT JOIN " . $field->_getUserEntryTable() . " AS " . $fname . " ON ( {$fname}.id_common = '" . (int) $fvalue[FIELD_INFO_ID] . "'" . " AND {$fname}.id_user = idst ) ", " ({$fname}.user_entry IS " . ($fvalue['value'] == 'true' ? 'NOT' : '') . " NULL ) ");
                         } else {
                             if ($fvalue['value'] == '') {
                                 $where = " ({$fname}.user_entry = '' OR {$fname}.user_entry IS NULL )";
                             } else {
                                 $where = " ({$fname}.user_entry LIKE '%" . $fvalue['value'] . "%' ) ";
                             }
                             $this->data->addCustomFilter(" LEFT JOIN " . $field->_getUserEntryTable() . " AS " . $fname . " ON ( {$fname}.id_common = '" . (int) $fvalue[FIELD_INFO_ID] . "'" . " AND {$fname}.id_user = idst ) ", $where);
                         }
                     }
                 }
             }
         }
     }
     // end else simple filter
 }