/**
  * This function will return paginated result. Result is an array where first element is 
  * array of returned object and second populated pagination object that can be used for 
  * obtaining and rendering pagination data using various helpers.
  * 
  * Items and pagination array vars are indexed with 0 for items and 1 for pagination
  * because you can't use associative indexing with list() construct
  *
  * @access public
  * @param array $arguments Query argumens (@see find()) Limit and offset are ignored!
  * @param integer $items_per_page Number of items per page
  * @param integer $current_page Current page number
  * @return array
  */
 function paginate($arguments = null, $items_per_page = 10, $current_page = 1)
 {
     if (isset($this) && instance_of($this, 'DimensionObjectTypeOptions')) {
         return parent::paginate($arguments, $items_per_page, $current_page);
     } else {
         return DimensionObjectTypeOptions::instance()->paginate($arguments, $items_per_page, $current_page);
     }
     // if
 }
 /**
  * Adds a member to a dimension
  */
 function add()
 {
     if (!can_manage_dimension_members(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $member_data = array_var($_POST, 'member');
     $member = new Member();
     if (!is_array($member_data)) {
         $member_data = array();
         if ($name = array_var($_GET, 'name')) {
             $member_data['name'] = $name;
         }
         if ($parent = array_var($_GET, 'parent')) {
             tpl_assign('parent_sel', $parent);
         }
         tpl_assign('member_data', $member_data);
         $ret = array();
         Hook::fire('check_additional_member_permissions', array('action' => 'add', 'parent_member_id' => $parent, 'pg_id' => logged_user()->getPermissionGroupId()), $ret);
         if (count($ret) > 0 && !array_var($ret, 'ok')) {
             flash_error(array_var($ret, 'message'));
             ajx_current("empty");
             return;
         }
         // Permissions
         $permission_parameters = permission_member_form_parameters();
         $logged_user_pg = array();
         foreach ($permission_parameters['allowed_object_types'] as $ot) {
             $logged_user_pg[] = array('o' => $ot->getId(), 'w' => 1, 'd' => can_manage_dimension_members(logged_user()) ? 1 : 0, 'r' => 1);
         }
         $permission_parameters['member_permissions'][logged_user()->getPermissionGroupId()] = $logged_user_pg;
         $permission_parameters = get_default_member_permission($parent, $permission_parameters);
         tpl_assign('permission_parameters', $permission_parameters);
         //--
         tpl_assign("member", $member);
         $sel_dim = get_id("dim_id");
         $current_dimension = Dimensions::getDimensionById($sel_dim);
         if (!$current_dimension instanceof Dimension) {
             flash_error("dimension dnx");
             ajx_current("empty");
             return;
         }
         tpl_assign("current_dimension", $current_dimension);
         $ot_ids = implode(",", DimensionObjectTypes::getObjectTypeIdsByDimension($current_dimension->getId()));
         $dimension_obj_types = ObjectTypes::findAll(array("conditions" => "`id` IN ({$ot_ids})"));
         $dimension_obj_types_info = array();
         foreach ($dimension_obj_types as $ot) {
             $info = $ot->getArrayInfo(array('id', 'name', 'type'));
             $info['name'] = lang(array_var($info, 'name'));
             $dimension_obj_types_info[] = $info;
         }
         tpl_assign('dimension_obj_types', $dimension_obj_types_info);
         if (isset($_GET['type'])) {
             tpl_assign('obj_type_sel', $_GET['type']);
         } else {
             if (count($dimension_obj_types_info) == 1) {
                 tpl_assign('obj_type_sel', $dimension_obj_types_info[0]['id']);
             }
         }
         tpl_assign('parents', array());
         tpl_assign('can_change_type', true);
         $restricted_dim_defs = DimensionMemberRestrictionDefinitions::findAll(array("conditions" => array("`dimension_id` = ?", $sel_dim)));
         $ot_with_restrictions = array();
         foreach ($restricted_dim_defs as $rdef) {
             if (!isset($ot_with_restrictions[$rdef->getObjectTypeId()])) {
                 $ot_with_restrictions[$rdef->getObjectTypeId()] = true;
             }
         }
         tpl_assign('ot_with_restrictions', $ot_with_restrictions);
         $associations = DimensionMemberAssociations::findAll(array("conditions" => array("`dimension_id` = ?", $sel_dim)));
         $ot_with_associations = array();
         foreach ($associations as $assoc) {
             if (!isset($ot_with_associations[$assoc->getObjectTypeId()])) {
                 $ot_with_associations[$assoc->getObjectTypeId()] = true;
             }
         }
         tpl_assign('ot_with_associations', $ot_with_associations);
         if (array_var($_GET, 'rest_genid') != "") {
             tpl_assign('rest_genid', array_var($_GET, 'rest_genid'));
         }
         if (array_var($_GET, 'prop_genid') != "") {
             tpl_assign('prop_genid', array_var($_GET, 'prop_genid'));
         }
         Hook::fire('before_add_member', array('member' => $member, 'parent' => $parent), $ret);
     } else {
         try {
             $ok = $this->saveMember($member_data, $member);
             if (config_option('add_default_permissions_for_users') && array_var($_GET, 'quick')) {
                 if ($member->getParentMemberId() == 0) {
                     // if added from quick-add add default permissions for executives, managers and administrators
                     $user_types = implode(',', config_option('give_member_permissions_to_new_users'));
                     if (trim($user_types) != "") {
                         $users = Contacts::findAll(array('conditions' => "user_type IN (" . $user_types . ")"));
                         if (!array_var($_REQUEST, 'permissions')) {
                             $_REQUEST['permissions'] = "[]";
                         }
                         $permissions_decoded = json_decode(array_var($_REQUEST, 'permissions'));
                         foreach ($users as $user) {
                             $role_perms = RoleObjectTypePermissions::findAll(array('conditions' => array("role_id=?", $user->getUserType())));
                             foreach ($role_perms as $role_perm) {
                                 $pg_obj = new stdClass();
                                 $pg_obj->pg = $user->getPermissionGroupId();
                                 $pg_obj->o = $role_perm->getObjectTypeId();
                                 $pg_obj->d = $role_perm->getCanDelete();
                                 $pg_obj->w = $role_perm->getCanWrite();
                                 $pg_obj->r = 1;
                                 $permissions_decoded[] = $pg_obj;
                             }
                         }
                         $_REQUEST['permissions'] = json_encode($permissions_decoded);
                     }
                 } else {
                     // inherit permissions from parent member
                     if ($member->getParentMemberId() > 0) {
                         $perm_params = get_default_member_permission($member->getParentMemberId(), array());
                         if (is_array($perm_params) && is_array(array_var($perm_params, 'member_permissions'))) {
                             $mem_perms = array_var($perm_params, 'member_permissions');
                             $permissions_decoded = array();
                             foreach ($mem_perms as $pg_id => $perms) {
                                 foreach ($perms as $perm) {
                                     $pg_obj = new stdClass();
                                     $pg_obj->pg = $pg_id;
                                     $pg_obj->o = array_var($perm, 'o');
                                     $pg_obj->d = array_var($perm, 'd');
                                     $pg_obj->w = array_var($perm, 'w');
                                     $pg_obj->r = array_var($perm, 'r');
                                     $permissions_decoded[] = $pg_obj;
                                 }
                             }
                             $_REQUEST['permissions'] = json_encode($permissions_decoded);
                         }
                     }
                 }
             }
             Env::useHelper('permissions');
             save_member_permissions_background(logged_user(), $member, array_var($_REQUEST, 'permissions'));
             if ($ok) {
                 ApplicationLogs::createLog($member, ApplicationLogs::ACTION_ADD);
                 ajx_extra_data(array("member" => array("id" => $member->getId(), "dimension_id" => $member->getDimensionId())));
                 $ret = null;
                 Hook::fire('after_add_member', $member, $ret);
                 //evt_add("external dimension member click", array('dim_id' => $member->getDimensionId(),'member_id' => $member->getId()));
                 $select_node = intval(DimensionObjectTypeOptions::getOptionValue($member->getDimensionId(), $member->getObjectTypeId(), 'select_after_creation'));
                 evt_add("update dimension tree node", array('dim_id' => $member->getDimensionId(), 'member_id' => $member->getId(), 'select_node' => $select_node));
                 if (array_var($_POST, 'rest_genid')) {
                     evt_add('reload member restrictions', array_var($_POST, 'rest_genid'));
                 }
                 if (array_var($_POST, 'prop_genid')) {
                     evt_add('reload member properties', array_var($_POST, 'prop_genid'));
                 }
                 if (array_var($_GET, 'current') == 'overview-panel' && array_var($_GET, 'quick')) {
                     //ajx_current("reload");
                 }
                 if (array_var($_GET, 'current') == 'more-panel') {
                     ajx_current("back");
                 } else {
                     ajx_current("empty");
                 }
             }
         } catch (Exception $e) {
             DB::rollback();
             flash_error($e->getMessage());
             ajx_current("empty");
         }
     }
 }
 /**
  * Return manager instance
  *
  * @access protected
  * @param void
  * @return DimensionObjectTypeOptions 
  */
 function manager()
 {
     if (!$this->manager instanceof DimensionObjectTypeOptions) {
         $this->manager = DimensionObjectTypeOptions::instance();
     }
     return $this->manager;
 }