function apply_association_filters($dimension, $dimension_members, $selected_members)
 {
     $members_to_retrieve = array();
     $all_associated_members_ids = array();
     foreach ($selected_members as $member) {
         // ignore selected members that are from the same dimension that is going to be filtered
         if (!$member instanceof Member || $member->getDimensionId() == $dimension->getId()) {
             continue;
         }
         // get dimension associations for selected member object type and the dimension to be filtered
         $association_ids = DimensionMemberAssociations::getAllAssociationIds($member->getDimensionId(), $dimension->getId(), $member->getObjectTypeId());
         if (count($association_ids) > 0) {
             $associated_members_ids = array();
             foreach ($association_ids as $id) {
                 $property_members_members = null;
                 $property_members_props = null;
                 $association = DimensionMemberAssociations::findById($id);
                 //	$children = $member->getAllChildrenInHierarchy();
                 if ($association->getDimensionId() == $dimension->getId()) {
                     if (is_null($property_members_members)) {
                         $property_members_members = MemberPropertyMembers::getAllPropertyMembers($id);
                     }
                     $tmp_assoc_member_ids = array_var($property_members_members, $member->getId(), array());
                     /*		foreach ($children as $child){
                     							$tmp_assoc_member_ids = array_merge($tmp_assoc_member_ids, array_var($property_members_members, $child->getId(), array()));
                     						}
                     				*/
                     $associated_members_ids = array_unique(array_merge($associated_members_ids, $tmp_assoc_member_ids));
                 } else {
                     if (is_null($property_members_props)) {
                         $property_members_props = MemberPropertyMembers::getAllPropertyMembers($id, true);
                     }
                     $tmp_assoc_member_ids = array_var($property_members_props, $member->getId(), array());
                     /*		foreach ($children as $child){
                     							$tmp_assoc_member_ids = array_merge($tmp_assoc_member_ids, array_var($property_members_props, $child->getId(), array()));
                     						}
                     				*/
                     $associated_members_ids = array_unique(array_merge($associated_members_ids, $tmp_assoc_member_ids));
                 }
             }
             $all_associated_members_ids[] = array_unique($associated_members_ids);
         }
     }
     if (isset($association_ids) && count($association_ids) > 0 && count($all_associated_members_ids) > 0) {
         $intersection = array_var($all_associated_members_ids, 0);
         if (count($all_associated_members_ids) > 1) {
             $k = 1;
             while ($k < count($all_associated_members_ids)) {
                 $intersection = array_intersect($intersection, $all_associated_members_ids[$k++]);
             }
         }
         $all_associated_members_ids = $intersection;
         if (count($all_associated_members_ids) > 0) {
             $dimension_member_ids = array();
             foreach ($dimension_members as $dm) {
                 $dimension_member_ids[] = $dm->getId();
             }
             $members_to_retrieve_ids = array();
             $associated_members = Members::findAll(array('conditions' => 'id IN (' . implode(',', $all_associated_members_ids) . ')'));
             foreach ($associated_members as $associated_member) {
                 $context_hierarchy_members = $associated_member->getAllParentMembersInHierarchy(true);
                 foreach ($context_hierarchy_members as $context_member) {
                     if (!in_array($context_member->getId(), $members_to_retrieve_ids) && in_array($context_member->getId(), $dimension_member_ids)) {
                         $members_to_retrieve[$context_member->getName() . "_" . $context_member->getId()] = $context_member;
                         $members_to_retrieve_ids[] = $context_member->getId();
                     }
                 }
             }
             // alphabetical order
             $members_to_retrieve = array_ksort($members_to_retrieve);
         }
     } else {
         $members_to_retrieve = $dimension_members;
     }
     return $members_to_retrieve;
 }
 /**
  * 
  * 
  */
 function list_dimension_members($member_id, $context_dimension_id, $object_type_id, $allowed_member_type_ids)
 {
     if ($member_id != 0) {
         $contact_pg_ids = ContactPermissionGroups::getPermissionGroupIdsByContactCSV(logged_user()->getId(), false);
         $member = members::findById($member_id);
         $dimension = Dimensions::getDimensionById($context_dimension_id);
         if ($object_type_id != null) {
             $dimension_object_type_contents = $dimension->getObjectTypeContent($object_type_id);
             foreach ($dimension_object_type_contents as $dotc) {
                 $dot_id = $dotc->getDimensionObjectTypeId();
                 if (is_null($allowed_member_type_ids) || in_array($dot_id, $allowed_member_type_ids)) {
                     $allowed_object_type_ids[] = $dot_id;
                 }
             }
         }
         if ($dimension instanceof Dimension && $member instanceof Member) {
             if (!$dimension->getDefinesPermissions() || $dimension->hasAllowAllForContact($contact_pg_ids)) {
                 $dimension_members = $dimension->getAllMembers(false, "parent_member_id, name", true);
             } else {
                 if ($dimension->hasCheckForContact($contact_pg_ids)) {
                     $member_list = $dimension->getAllMembers(false, "parent_member_id, name", true);
                     $allowed_members = array();
                     foreach ($member_list as $dim_member) {
                         if (ContactMemberPermissions::instance()->contactCanReadMemberAll($contact_pg_ids, $dim_member->getId(), logged_user())) {
                             $allowed_members[] = $dim_member;
                         }
                     }
                     $dimension_members = $allowed_members;
                 }
             }
             $members_to_retrieve = array();
             $association_ids = DimensionMemberAssociations::getAllAssociationIds($member->getDimensionId(), $context_dimension_id);
             if (count($association_ids) > 0) {
                 $associated_members_ids_csv = '';
                 foreach ($association_ids as $id) {
                     $association = DimensionMemberAssociations::findById($id);
                     $children = $member->getAllChildrenInHierarchy();
                     if ($association->getDimensionId() == $context_dimension_id) {
                         $new_csv = MemberPropertyMembers::getAllMemberIds($id, $member_id);
                         $associated_members_ids_csv .= $new_csv != '' ? $new_csv . "," : '';
                         foreach ($children as $child) {
                             $new_csv = MemberPropertyMembers::getAllMemberIds($id, $child->getId());
                             $associated_members_ids_csv .= $new_csv != '' ? $new_csv . "," : '';
                         }
                     } else {
                         $new_csv = MemberPropertyMembers::getAllPropertyMemberIds($id, $member_id) . ",";
                         $associated_members_ids_csv .= $new_csv != '' ? $new_csv . "," : '';
                         foreach ($children as $child) {
                             $new_csv = MemberPropertyMembers::getAllPropertyMemberIds($id, $child->getId());
                             $associated_members_ids_csv .= $new_csv != '' ? $new_csv . "," : '';
                         }
                     }
                 }
                 $associated_members_ids = explode(',', $associated_members_ids_csv);
                 $associated_members_ids = array_unique($associated_members_ids);
             }
             if (isset($associated_members_ids) && count($associated_members_ids) > 0) {
                 foreach ($associated_members_ids as $id) {
                     $associated_member = Members::findById($id);
                     if (in_array($associated_member, $dimension_members)) {
                         $context_hierarchy_members = $associated_member->getAllParentMembersInHierarchy(true);
                         foreach ($context_hierarchy_members as $context_member) {
                             if (!in_array($context_member, $members_to_retrieve) && in_array($context_member, $dimension_members)) {
                                 $members_to_retrieve[$context_member->getName()] = $context_member;
                             }
                         }
                     }
                 }
                 // alphabetical order
                 $members_to_retrieve = array_ksort($members_to_retrieve);
             } else {
                 $members_to_retrieve[] = $dimension_members;
             }
             $membersset = array();
             foreach ($members_to_retrieve as $m) {
                 $membersset[$m->getId()] = true;
             }
             $members = array();
             // Todo adapt this code to call "buildMemberList" - (performance and code improvement)
             foreach ($members_to_retrieve as $m) {
                 if ($m->getArchivedById() > 0) {
                     continue;
                 }
                 if ($object_type_id != null) {
                     $selectable = in_array($m->getObjectTypeId(), $allowed_object_type_ids) ? true : false;
                 }
                 $tempParent = $m->getParentMemberId();
                 $x = $m;
                 while ($x instanceof Member && !isset($membersset[$tempParent])) {
                     $tempParent = $x->getParentMemberId();
                     $x = $x->getParentMember();
                 }
                 if (!$x instanceof Member) {
                     $tempParent = 0;
                 }
                 if ($dot = DimensionObjectTypes::instance()->findOne(array("conditions" => "\n\t\t\t\t\t\tdimension_id = " . $dimension->getId() . " AND\n\t\t\t\t\t\tobject_type_id = " . $m->getObjectTypeId()))) {
                     $memberOptions = $dot->getOptions(true);
                 } else {
                     $memberOptions = '';
                 }
                 /* @var $m Member */
                 $member = array("id" => $m->getId(), "name" => clean($m->getName()), "parent" => $tempParent, "realParent" => $m->getParentMemberId(), "object_id" => $m->getObjectId(), "options" => $memberOptions, "depth" => $m->getDepth(), "iconCls" => $m->getIconClass(), "selectable" => isset($selectable) ? $selectable : false, "dimension_id" => $m->getDimensionId(), "object_type_id" => $m->getObjectTypeId(), "allow_childs" => $m->allowChilds());
                 if ($oid = $m->getObjectId()) {
                     if ($obj = Objects::instance()->findObject($m->getObjectId())) {
                         $editUrl = $obj->getEditUrl();
                     }
                 }
                 // Member Actions
                 if (can_manage_dimension_members(logged_user())) {
                     if ($oid = $m->getObjectId()) {
                         if ($obj = Objects::instance()->findObject($m->getObjectId())) {
                             $editUrl = $obj->getEditUrl();
                         }
                     } else {
                         $editUrl = get_url('member', 'edit', array('id' => $m->getId()));
                     }
                     $member['actions'] = array(array('url' => $editUrl, 'text' => '', 'iconCls' => 'ico-edit'));
                 }
                 $members[] = $member;
             }
             return $members;
         }
         return null;
     } else {
         $members = $this->initial_list_dimension_members($context_dimension_id, $object_type_id, $allowed_member_type_ids);
         return $members;
     }
 }