function _update_member_object($member, $pack, $data, $insert = true)
 {
     $arr_resp = array('status' => true);
     $duration_exprs = mgm_get_class('subscription_packs')->get_duration_exprs();
     $arr_status = array(MGM_STATUS_NULL, MGM_STATUS_ACTIVE, MGM_STATUS_EXPIRED, MGM_STATUS_PENDING, MGM_STATUS_TRIAL_EXPIRED, MGM_STATUS_CANCELLED, MGM_STATUS_ERROR, MGM_STATUS_AWAITING_CANCEL);
     // if trial on
     if ($pack['trial_on']) {
         $member->trial_on = !empty($data['trial_on']) ? $data['trial_on'] : (isset($member->trial_on) && $member->trial_on ? $member->trial_on : $pack['trial_on']);
         $member->trial_cost = !empty($data['trial_cost']) ? $data['trial_cost'] : (isset($member->trial_cost) && $member->trial_cost ? $member->trial_cost : $pack['trial_cost']);
         $member->trial_duration = !empty($data['trial_duration']) ? $data['trial_duration'] : (isset($member->trial_duration) && $member->trial_duration ? $member->trial_duration : $pack['trial_duration']);
         $member->trial_duration_type = !empty($data['trial_duration_type']) ? $data['trial_duration_type'] : (isset($member->trial_duration_type) && $member->trial_duration_type ? $member->trial_duration_type : $pack['trial_duration_type']);
         $member->trial_num_cycles = !empty($data['trial_num_cycles']) ? $data['trial_num_cycles'] : (isset($member->trial_num_cycles) ? $member->trial_num_cycles : $pack['trial_num_cycles']);
     }
     // duration
     if (!empty($data['duration'])) {
         if (is_numeric($data['duration'])) {
             $member->duration = $data['duration'];
         } else {
             $arr_resp['status'] = false;
             $arr_resp['error'][] = __('Invalid Duration', 'mgm');
         }
     } elseif ($insert) {
         $member->duration = $pack['duration'];
     }
     //duration type:
     if (!empty($data['duration_type'])) {
         if (in_array($data['duration_type'], array('d', 'w', 'm', 'y', 'l', 'dr'))) {
             $member->duration_type = $data['duration_type'];
         } else {
             $arr_resp['status'] = false;
             $arr_resp['error'][] = __('Invalid Duration Type', 'mgm');
         }
     } elseif ($insert) {
         $member->duration_type = $pack['duration_type'];
     }
     //duration type:
     if (!empty($data['amount'])) {
         if (is_numeric($data['amount'])) {
             $member->amount = number_format($data['amount'], 2, '.', '');
         } else {
             $arr_resp['status'] = false;
             $arr_resp['error'][] = __('Invalid Amount', 'mgm');
         }
     } elseif ($insert) {
         $member->amount = $pack['cost'];
     }
     //amount:
     if (!empty($data['hide_old_content'])) {
         $member->hide_old_content = $data['hide_old_content'];
     } elseif ($insert) {
         $member->hide_old_content = $pack['hide_old_content'];
     }
     //$member->currency        = (!empty($data['currency'])) ? $data['currency'] : $system_obj->setting['currency'];
     $member->membership_type = $data['membership_type'];
     //status
     if (!empty($data['status'])) {
         if (in_array($data['status'], $arr_status)) {
             $member->status = $data['status'];
         } else {
             $arr_resp['status'] = false;
             $arr_resp['error'][] = __('Invalid Status', 'mgm');
         }
     } elseif ($insert) {
         //to prevent updating active/expired user status
         //if(isset($member->status) && !in_array($member->status, array(MGM_STATUS_ACTIVE, MGM_STATUS_EXPIRED)))
         $member->status = MGM_STATUS_ACTIVE;
     }
     if (!empty($data['status_str'])) {
         $member->status_str = $data['status_str'];
     } elseif ($insert) {
         $member->status_str = __('Last payment was successful', 'mgm');
     }
     //join date:
     if (!empty($data['join_date'])) {
         if (mgm_is_valid_date($data['join_date']) && ($mysql_date = mgm_format_inputdate_to_mysql($data['join_date']))) {
             $member->join_date = strtotime($mysql_date);
         } else {
             $arr_resp['status'] = false;
             $arr_resp['error'][] = __('Invalid Joining Date', 'mgm');
         }
     } elseif ($insert) {
         // do not overwrite if already set
         if (empty($member->join_date)) {
             $member->join_date = strtotime('now');
         }
     }
     //last pay date:
     if (!empty($data['last_pay_date'])) {
         if (mgm_is_valid_date($data['last_pay_date']) && ($mysql_date = mgm_format_inputdate_to_mysql($data['last_pay_date']))) {
             $member->last_pay_date = $mysql_date;
         } else {
             $arr_resp['status'] = false;
             $arr_resp['error'][] = __('Invalid Last Pay Date', 'mgm');
         }
     } elseif ($insert) {
         // do not overwrite if already set
         if (empty($member->last_pay_date)) {
             $member->last_pay_date = date('Y-m-d');
         }
     }
     //expiry date:
     if (!empty($data['expire_date'])) {
         if (mgm_is_valid_date($data['expire_date']) && ($mysql_date = mgm_format_inputdate_to_mysql($data['expire_date']))) {
             $member->expire_date = $mysql_date;
         } else {
             $arr_resp['status'] = false;
             $arr_resp['error'][] = __('Invalid Last Expiry Date', 'mgm');
         }
     } elseif ($insert) {
         $time = strtotime('now');
         //if not lifetime:
         // if($pack['duration_type'] != 'l') {
         if (in_array($pack['duration_type'], array_keys($duration_exprs))) {
             // take only date exprs
             $time = strtotime("+{$pack['duration']} {$duration_exprs[$pack['duration_type']]}", $time);
             // formatted
             $member->expire_date = date('Y-m-d', $time);
         } else {
             $member->expire_date = '';
         }
     }
     //if lifetime:
     if ($pack['duration_type'] == 'l' && $member->status == MGM_STATUS_ACTIVE) {
         $member->expire_date = '';
         if (isset($member->status_reset_on)) {
             unset($member->status_reset_on);
         }
         if (isset($member->status_reset_as)) {
             unset($member->status_reset_as);
         }
     }
     //active number of cycles:
     if (isset($data['active_num_cycles']) && !empty($data['active_num_cycles'])) {
         $member->active_num_cycles = $data['active_num_cycles'];
     }
     //autoresponder subscription:
     if (isset($data['autoresponder']) && !empty($data['autoresponder'])) {
         $member->autoresponder = $data['autoresponder'];
         $member->subscribed = 'Y';
     }
     //payment_info
     //module:
     if (isset($data['payment_info_module']) && !empty($data['payment_info_module'])) {
         if (!isset($member->payment_info)) {
             $member->payment_info = new stdClass();
         }
         $member->payment_info->module = $data['payment_info_module'];
     }
     //subscr_id
     if (isset($data['payment_info_subscr_id']) && !empty($data['payment_info_subscr_id'])) {
         if (!isset($member->payment_info)) {
             $member->payment_info = new stdClass();
         }
         $member->payment_info->subscr_id = $data['payment_info_subscr_id'];
     }
     //txn_type
     if (isset($data['payment_info_txn_type']) && !empty($data['payment_info_txn_type'])) {
         if (!isset($member->payment_info)) {
             $member->payment_info = new stdClass();
         }
         $member->payment_info->txn_type = $data['payment_info_txn_type'];
     }
     //txn_id
     if (isset($data['payment_info_txn_id']) && !empty($data['payment_info_txn_id'])) {
         if (!isset($member->payment_info)) {
             $member->payment_info = new stdClass();
         }
         $member->payment_info->txn_id = $data['payment_info_txn_id'];
     }
     if ($arr_resp['status']) {
         $arr_resp['mgm_member'] = $member;
     }
     //object fields:
     //		$member->code = 'mgm_member';
     //		$member->name = 'Member Lib';
     //		$member->description = 'Member Lib';
     //check this:
     $duration_exprs = null;
     unset($duration_exprs);
     $arr_status = null;
     unset($arr_status);
     if (function_exists('gc_collect_cycles')) {
         gc_collect_cycles();
     }
     return $arr_resp;
 }
    /** 
     * get pack description
     *	
     * @param array $pack
     * @return string $desc
     */
    function get_pack_desc($pack)
    {
        // system
        $system_obj = mgm_get_class('system');
        // format
        $date_fmt = mgm_get_date_format('date_format_short');
        // tpl data
        $tpl_data = array();
        // tpl vars
        $tpl_vars = array('membership_type', 'cost', 'currency', 'duration', 'duration_period', 'num_cycles', 'trial_cost', 'trial_duration', 'trial_duration_period', 'description', 'currency_sign', 'pack_start_date', 'pack_end_date');
        // get template
        if (!($pack_desc_template = $system_obj->get_template('pack_desc_template', array(), true))) {
            $pack_desc_template = sprintf('[membership_type] - [cost] [currency] %s [duration] [duration_period] [num_cycles].<br/> 
										   [if_trial_on] %s [trial_cost] [currency] %s [trial_duration] [trial_duration_period] [/if_trial_on]', __('per', 'mgm'), __('This pack includes a special, limited trial-offer:', 'mgm'), __('for', 'mgm'));
        }
        // lifetime template:
        if ($pack['duration_type'] == 'l') {
            // template	-issue #988
            if (!($pack_desc_template = $system_obj->get_template('pack_desc_lifetime_template', array(), true))) {
                $pack_desc_template = sprintf('[membership_type] - [cost] [currency] %s', __('for Lifetime', 'mgm'));
            }
        } elseif ($pack['duration_type'] == 'dr') {
            $date_range = '';
            // check
            if (mgm_is_valid_date($pack['duration_range_start_dt'], '-') && mgm_is_valid_date($pack['duration_range_end_dt'], '-')) {
                $tpl_data['pack_start_date'] = date($date_fmt, strtotime($pack['duration_range_start_dt']));
                $tpl_data['pack_end_date'] = date($date_fmt, strtotime($pack['duration_range_end_dt']));
            }
            if (!($pack_desc_template = $system_obj->get_template('pack_desc_date_range_template', array(), true))) {
                $pack_desc_template = sprintf('[membership_type] - [cost] [currency] starts from [pack_start_date]  to [pack_end_date]');
            }
        }
        // currency - issue #1602
        if (!isset($pack['currency']) || empty($pack['currency'])) {
            $tpl_data['currency'] = $system_obj->get_setting('currency');
        } else {
            $tpl_data['currency'] = $pack['currency'];
        }
        // issue #1177
        $tpl_data['currency_sign'] = mgm_get_currency_symbols($tpl_data['currency']);
        // type
        $tpl_data['membership_type'] = mgm_stripslashes_deep(mgm_get_class('membership_types')->get_type_name($pack['membership_type']));
        $tpl_data['duration_period'] = strtolower($this->get_pack_duration($pack));
        // transalation issue #950
        $tpl_data['text_for'] = __('for', 'mgm');
        $tpl_data['num_cycles'] = $pack['num_cycles'] == 0 ? __(' - Ongoing', 'mgm') : sprintf(' - %s %d %s', $tpl_data['text_for'], (int) $pack['num_cycles'], $pack['num_cycles'] == 1 ? __('time', 'mgm') : __('times', 'mgm'));
        $tpl_data['trial_duration_period'] = strtolower($this->get_pack_duration($pack, true));
        // merge rest, overwrite tpl_data
        if (is_array($pack)) {
            $tpl_data = array_merge($pack, $tpl_data);
        }
        // remove next lines as preg_replace will fail
        $pack_desc_template = str_replace(array("\r\n", "\n", "\r"), '', $pack_desc_template);
        // copy template
        $pack_desc = $pack_desc_template;
        // replace 0 cost
        if (isset($tpl_data['cost']) && $tpl_data['cost'] == 0.0) {
            $pack_desc = str_replace('[cost] [currency]', __('free', 'mgm'), $pack_desc);
        }
        // replace 0 trial_cost
        if (isset($tpl_data['trial_cost']) && $tpl_data['trial_cost'] == 0.0) {
            $pack_desc = str_replace('[trial_cost] [currency]', __('free', 'mgm'), $pack_desc);
        }
        // replace
        foreach ($tpl_vars as $var) {
            if (isset($tpl_data[$var])) {
                $pack_desc = str_replace('[' . $var . ']', $tpl_data[$var], $pack_desc);
            }
        }
        // num cycles
        if ($pack['num_cycles']) {
            $pack_desc = preg_replace("'\\[/?\\s?if_num_cycles\\s?\\]'i", '', $pack_desc);
        } else {
            $pack_desc = preg_replace("'\\[if_num_cycles\\s?\\](.*)\\[/if_num_cycles\\s?\\]'i", '', $pack_desc);
        }
        // trial on
        if (isset($pack['trial_on']) && (int) $pack['trial_on'] == 1) {
            $pack_desc = preg_replace("'\\[/?\\s?if_trial_on\\s?\\]'i", '', $pack_desc);
        } else {
            $pack_desc = preg_replace("'\\[if_trial_on\\s?\\](.*)\\[/if_trial_on\\s?\\]'i", '', $pack_desc);
        }
        // send
        return $pack_desc;
    }