Exemple #1
0
        if (class_exists('module_group', false) && isset($import_options['group']) && $import_options['group']) {
            // hack to support multiple groups (for members)
            if (!is_array($import_options['group'])) {
                $import_options['group'] = array($import_options['group']);
            }
            foreach ($import_options['group'] as $group_option) {
                ?>
                <tr>
                    <th>
                        <?php 
                _e('Add imported records to group:');
                ?>
                    </th>
                    <td>
                        <?php 
                $groups = module_group::get_groups($group_option);
                if (!count($groups)) {
                    _e('Sorry, no groups exist. Please create a %s group first.', $group_option);
                }
                foreach ($groups as $group) {
                    $group_id = $group['group_id'];
                    ?>
                            <input type="checkbox" class="add_to_group" name="add_to_group[<?php 
                    echo $group['group_id'];
                    ?>
]" id="groupchk<?php 
                    echo $group_id;
                    ?>
" value="yes">
                            <label for="groupchk<?php 
                    echo $group_id;
    $link = module_import_export::import_link(array('callback' => 'module_member::handle_import', 'name' => 'Members', 'return_url' => $_SERVER['REQUEST_URI'], 'group' => array('member', 'newsletter_subscription'), 'fields' => array('Member ID' => 'member_id', 'First Name' => 'first_name', 'Last Name' => 'last_name', 'Business Name' => 'business', 'Email' => 'email', 'Phone' => 'phone', 'Mobile' => 'mobile'), 'extra' => array('owner_table' => 'member', 'owner_id' => 'member_id')));
    $header['button'][] = array('url' => $link, 'title' => 'Import members', 'type' => 'add');
}
print_heading($header);
?>


<form action="" method="post">

<?php 
$search_bar = array('elements' => array('name' => array('title' => _l('Names, Phone or Email:'), 'field' => array('type' => 'text', 'name' => 'search[generic]', 'value' => isset($search['generic']) ? $search['generic'] : ''))));
if (class_exists('module_group', false) && module_member::can_i('view', 'Member Groups')) {
    $search_bar['elements']['group'] = array('title' => _l('Group:'), 'field' => array('type' => 'select', 'name' => 'search[group_id]', 'value' => isset($search['group_id']) ? $search['group_id'] : '', 'options' => module_group::get_groups('member'), 'options_array_id' => 'name'));
}
if (class_exists('module_newsletter', false)) {
    $search_bar['elements']['group'] = array('title' => _l('Newsletter:'), 'field' => array('type' => 'select', 'name' => 'search[group_id2]', 'value' => isset($search['group_id2']) ? $search['group_id2'] : '', 'options' => module_group::get_groups('newsletter_subscription'), 'options_array_id' => 'name'));
}
echo module_form::search_bar($search_bar);
$table_manager = module_theme::new_table_manager();
$columns = array();
$columns['member_name'] = array('title' => 'Member Name', 'callback' => function ($member) {
    echo module_member::link_open($member['member_id'], true);
}, 'cell_class' => 'row_action');
$columns['member_business'] = array('title' => 'Business', 'callback' => function ($member) {
    echo htmlspecialchars($member['business']);
});
$columns['member_phone'] = array('title' => 'Phone', 'callback' => function ($member) {
    echo htmlspecialchars($member['phone']);
});
$columns['member_mobile'] = array('title' => 'Mobile', 'callback' => function ($member) {
    echo htmlspecialchars($member['mobile']);
if (file_exists('includes/plugin_user/pages/contact_admin_list.php') && module_user::can_i('view', 'All ' . $page_type_single . ' Contacts', 'Customer', 'customer')) {
    $header_buttons[] = array('url' => module_user::link_open_contact(false), 'title' => 'View All Contacts');
}
print_heading(array('main' => true, 'type' => 'h2', 'title' => $page_type, 'button' => $header_buttons));
?>


<form action="" method="post">

    <?php 
$search_bar = array('elements' => array('name' => array('title' => _l('Names, Phone or Email:'), 'field' => array('type' => 'text', 'name' => 'search[generic]', 'value' => isset($search['generic']) ? $search['generic'] : '', 'size' => 15)), 'address' => array('title' => _l('Address:'), 'field' => array('type' => 'text', 'name' => 'search[address]', 'value' => isset($search['address']) ? $search['address'] : '', 'size' => 15))));
if (class_exists('module_extra', false)) {
    $search_bar['extra_fields'] = 'customer';
}
if (class_exists('module_group', false) && module_customer::can_i('view', $page_type_single . ' Groups')) {
    $search_bar['elements']['group_id'] = array('title' => false, 'field' => array('type' => 'select', 'name' => 'search[group_id]', 'value' => isset($search['group_id']) ? $search['group_id'] : '', 'options' => module_group::get_groups('customer'), 'options_array_id' => 'name', 'blank' => _l(' Industry - ')));
}
if (class_exists('module_company', false) && module_company::can_i('view', 'Company') && module_company::is_enabled()) {
    $companys = module_company::get_companys();
    $companys_rel = array();
    foreach ($companys as $company) {
        $companys_rel[$company['company_id']] = $company['name'];
    }
    $search_bar['elements']['company'] = array('title' => false, 'field' => array('type' => 'select', 'name' => 'search[company_id]', 'value' => isset($search['company_id']) ? $search['company_id'] : '', 'options' => $companys_rel, 'blank' => _l(' - Company - ')));
}
echo module_form::search_bar($search_bar);
/** START TABLE LAYOUT **/
$table_manager = module_theme::new_table_manager();
$columns = array();
if (class_exists('module_company', false) && module_company::can_i('view', 'Company') && module_company::is_enabled()) {
    $columns['company_name'] = array('title' => 'Company', 'callback' => function ($customer) {
Exemple #4
0
    public function external_hook($hook)
    {
        switch ($hook) {
            case 'subscribe_form':
                // handle subscriptions to the member database and also the newsletter system.
                // todo - tie in with "subscription" module to allow users to select which subscription they want as well.
            // handle subscriptions to the member database and also the newsletter system.
            // todo - tie in with "subscription" module to allow users to select which subscription they want as well.
            case 'subscribe':
                $member = isset($_REQUEST['member']) && is_array($_REQUEST['member']) ? $_REQUEST['member'] : false;
                $provided_member_id = isset($_REQUEST['i']) ? (int) $_REQUEST['i'] : false;
                $hash = isset($_REQUEST['hash']) ? trim($_REQUEST['hash']) : false;
                $member_id = false;
                if ($member) {
                    if (isset($member['email']) && $member['email']) {
                        // proceed with signup
                        $email = filter_var(strtolower(trim($member['email'])), FILTER_VALIDATE_EMAIL);
                        if (strlen($email) > 3) {
                            $adding_new_member = true;
                            // are we adding a new member to the system or updating an old one
                            if ($provided_member_id && $hash) {
                                $real_hash = $this->link_public_details($provided_member_id, true);
                                if ($real_hash == $hash) {
                                    $existing_member = get_single('member', 'email', $email);
                                    if ($existing_member && $existing_member['member_id'] != $provided_member_id) {
                                        // this user is trying to update their email address to a user who exists in the system already
                                        $template = module_template::get_template_by_key('member_subscription_error');
                                        $template->page_title = htmlspecialchars(_l('Subscription'));
                                        $template->assign_values(array('message' => _l('The email address %s is already linked to another member.', htmlspecialchars($email))));
                                        echo $template->render('pretty_html');
                                        exit;
                                    }
                                    $adding_new_member = false;
                                    // updating details in the system.
                                    update_insert("member_id", $provided_member_id, "member", $member);
                                    $member_id = $provided_member_id;
                                    // update extra fields...
                                }
                            }
                            if (!$member_id) {
                                // add member to system.
                                $existing_member = get_single('member', 'email', $email);
                                if ($existing_member && $existing_member['member_id'] > 0) {
                                    // todo: give them link to change details.
                                    $template = module_template::get_template_by_key('member_subscription_error');
                                    $template->page_title = htmlspecialchars(_l('Subscription'));
                                    $template->assign_values(array('message' => _l('The email address %s is already a member. Please click the link in our newsletter to modify your details.', htmlspecialchars($email))));
                                    echo $template->render('pretty_html');
                                    exit;
                                }
                                // todo - sanatise input here, this will allow anyone to insert member details:
                                $member_id = update_insert("member_id", 'new', "member", $member);
                            }
                            if ($member_id) {
                                // save extra fields against member.
                                $extra_fields = module_extra::get_defaults('member');
                                $extra_values = array();
                                foreach ($extra_fields as $extra_field) {
                                    // check if this field was submitted.
                                    if (isset($member[$extra_field['key']])) {
                                        $extra_values[$extra_field['key']] = array('val' => $member[$extra_field['key']], 'key' => $extra_field['key']);
                                    }
                                }
                                if (count($extra_values)) {
                                    $_REQUEST['extra_member_field'] = $extra_values;
                                    module_extra::save_extras('member', 'member_id', $member_id, false);
                                }
                                if (class_exists('module_newsletter', false)) {
                                    $newsletter_member_id = module_newsletter::member_from_email(array('email' => $email, 'member_id' => $member_id, 'data_callback' => 'module_member::get_newsletter_recipient', 'data_args' => $member_id), true, true);
                                    module_newsletter::subscribe_member($email, $newsletter_member_id);
                                    // now add thsi member to the grups they have selected.
                                    if (isset($member['group']) && is_array($member['group'])) {
                                        $group_items = module_group::get_groups('newsletter_subscription');
                                        $public_group_ids = array();
                                        foreach ($group_items as $group_item) {
                                            $public_group_ids[$group_item['group_id']] = true;
                                            // remove user group all these groups.
                                            module_group::delete_member($member_id, 'newsletter_subscription');
                                        }
                                        //print_r($member['group']);print_r($public_group_ids);exit;
                                        foreach ($member['group'] as $group_id => $tf) {
                                            if ($tf && isset($public_group_ids[$group_id])) {
                                                // add member to group - but only public group ids!
                                                module_group::add_to_group($group_id, $member_id);
                                            }
                                        }
                                    }
                                }
                                // is the newsletter module giving us a subscription redirection?
                                if ($adding_new_member) {
                                    if (module_config::c('newsletter_subscribe_redirect', '')) {
                                        redirect_browser(module_config::c('newsletter_subscribe_redirect', ''));
                                    }
                                    $template = module_template::get_template_by_key('member_subscription_success');
                                    $template->page_title = htmlspecialchars(_l('Subscription'));
                                    $template->assign_values(array('email' => $email));
                                    echo $template->render('pretty_html');
                                    exit;
                                } else {
                                    if (module_config::c('newsletter_update_details_redirect', '')) {
                                        redirect_browser(module_config::c('newsletter_update_details_redirect', ''));
                                    }
                                    $template = module_template::get_template_by_key('member_update_details_success');
                                    $template->page_title = htmlspecialchars(_l('Subscription'));
                                    $template->assign_values(array('email' => $email));
                                    echo $template->render('pretty_html');
                                    exit;
                                }
                            } else {
                                echo 'database failure.. please try again.';
                            }
                        } else {
                            $template = module_template::get_template_by_key('member_subscription_error');
                            $template->page_title = htmlspecialchars(_l('Subscription'));
                            $template->assign_values(array('message' => _l('Sorry please go back and complete all required fields (especially email address)')));
                            echo $template->render('pretty_html');
                            exit;
                        }
                    } else {
                        $template = module_template::get_template_by_key('member_subscription_error');
                        $template->page_title = htmlspecialchars(_l('Subscription'));
                        $template->assign_values(array('message' => _l('Sorry please go back and complete all required fields')));
                        echo $template->render('pretty_html');
                        exit;
                    }
                } else {
                    $template = module_template::get_template_by_key('member_subscription_form');
                    $template->page_title = htmlspecialchars(_l('Subscription'));
                    // we also treat this as a subscription modification form.
                    $newsletter_subscriptions = array();
                    $member = array('email' => '', 'first_name' => '', 'last_name' => '', 'business' => '', 'phone' => '', 'mobile' => '');
                    // extra fields:
                    $extra_fields = module_extra::get_defaults('member');
                    foreach ($extra_fields as $extra_field) {
                        $member[$extra_field['key']] = '';
                    }
                    if ($provided_member_id && $hash) {
                        $real_hash = $this->link_public_details($provided_member_id, true);
                        if ($real_hash == $hash) {
                            // we can load these details into the forum successfully.
                            $member = array_merge($member, $this->get_member($provided_member_id));
                            // get their fields:
                            $extra_fields = module_extra::get_extras(array('owner_table' => 'member', 'owner_id' => $provided_member_id));
                            foreach ($extra_fields as $extra_field) {
                                $member[$extra_field['extra_key']] = $extra_field['extra'];
                            }
                            // find out what newsletter subscriptions this member has.
                            if (class_exists('module_newsletter', false)) {
                                $newsletter_member_id = module_newsletter::member_from_email($member, true, true);
                                $newsletter_subscriptions = module_group::get_member_groups('newsletter_subscription', $provided_member_id);
                            }
                        }
                    }
                    $template->assign_values($member);
                    if (class_exists('module_newsletter', false)) {
                        $group_items = module_group::get_groups('newsletter_subscription');
                        ob_start();
                        foreach ($group_items as $group_item) {
                            ?>

                            <div class="group_select">
                                <input type="checkbox" name="member[group][<?php 
                            echo $group_item['group_id'];
                            ?>
]" value="1"<?php 
                            foreach ($newsletter_subscriptions as $newsletter_subscription) {
                                if ($newsletter_subscription['group_id'] == $group_item['group_id']) {
                                    echo ' checked';
                                }
                            }
                            ?>
 > <?php 
                            echo htmlspecialchars($group_item['name']);
                            ?>

                            </div>
                            <?php 
                        }
                        $template->assign_values(array('newsletter_options' => ob_get_clean()));
                    } else {
                        $template->assign_values(array('newsletter_options' => ''));
                    }
                    echo $template->render('pretty_html');
                    exit;
                }
                break;
        }
    }
    echo htmlspecialchars($default['key']);
    ?>
</label>
        <input type="text" id="website_extra_<?php 
    echo $x;
    ?>
" name="website[extra][<?php 
    echo htmlspecialchars($default['key']);
    ?>
]" />
    </li>
    <?php 
    $x++;
}
$x = 1;
foreach (module_group::get_groups('website') as $group_data) {
    ?>
    <li>
        <label for="website_group_<?php 
    echo $x;
    ?>
"><?php 
    echo htmlspecialchars($group_data['name']);
    ?>
</label>
        <input type="text" id="website_group_<?php 
    echo $x;
    ?>
" name="website[group_ids][<?php 
    echo htmlspecialchars($group_data['group_id']);
    ?>
print_heading($header);
?>



<form action="" method="post">

    <?php 
module_form::print_form_auth();
?>


<?php 
$search_bar = array('elements' => array('name' => array('title' => _l('Invoice Number:'), 'field' => array('type' => 'text', 'name' => 'search[generic]', 'value' => isset($search['generic']) ? $search['generic'] : '')), 'date' => array('title' => _l('Create Date:'), 'fields' => array(array('type' => 'date', 'name' => 'search[date_from]', 'value' => isset($search['date_from']) ? $search['date_from'] : ''), _l('to'), array('type' => 'date', 'name' => 'search[date_to]', 'value' => isset($search['date_to']) ? $search['date_to'] : ''))), 'status' => array('title' => _l('Status:'), 'field' => array('type' => 'select', 'name' => 'search[status]', 'value' => isset($search['status']) ? $search['status'] : '', 'options' => module_invoice::get_statuses()))));
if (!isset($_REQUEST['customer_id']) && class_exists('module_group', false) && module_customer::can_i('view', 'Customer Groups')) {
    $search_bar['elements']['group'] = array('title' => _l('Customer Group:'), 'field' => array('type' => 'select', 'name' => 'search[customer_group_id]', 'value' => isset($search['customer_group_id']) ? $search['customer_group_id'] : '', 'options' => module_group::get_groups('customer'), 'options_array_id' => 'name'));
}
echo module_form::search_bar($search_bar);
/** START TABLE LAYOUT **/
$colspan = 9;
$colspan2 = 0;
$table_manager = module_theme::new_table_manager();
$columns = array();
$columns['invoice_number'] = array('title' => 'Invoice Number', 'callback' => function ($invoice) {
    echo module_invoice::link_open($invoice['invoice_id'], true, $invoice);
}, 'cell_class' => 'row_action');
$columns['invoice_status'] = array('title' => 'Status', 'callback' => function ($invoice) {
    echo htmlspecialchars($invoice['status']);
});
$columns['invoice_create_date'] = array('title' => 'Create Date', 'callback' => function ($invoice) {
    if (!$invoice['date_create'] || $invoice['date_create'] == '0000-00-00') {
                <?php 
print_heading(array('type' => 'h3', 'title' => 'Select Recipients'));
?>
                <table class="tableclass tableclass_form tableclass_full">
                    <tbody>
                    <tr>
                        <td colspan="3">
                            <?php 
_e('Please select the groups you would like to send this email to:');
?>
                        </td>
                    </tr>
                        <?php 
// grab a list of groups from the "group" plugin
// group plugin allows us to group people by different categories throu out the application
$groups = module_group::get_groups();
foreach ($groups as $group) {
    ?>
                            <tr>
                                <td>
                                    <input type="checkbox" name="group[<?php 
    echo $group['group_id'];
    ?>
]" id="group_<?php 
    echo $group['group_id'];
    ?>
" value="yes">
                                </td>
                                <td>
                                    <label for="group_<?php 
    echo $group['group_id'];
?>
">
		</td>
        <?php 
if (class_exists('module_group', false) && module_customer::can_i('view', 'Customer Groups')) {
    ?>

        <td width="60">
            <?php 
    _e('Group:');
    ?>

        </td>
        <td>
            <?php 
    echo print_select_box(module_group::get_groups('customer'), 'search[group_id]', isset($search['group_id']) ? $search['group_id'] : false, '', true, 'name');
    ?>

        </td>
        <?php 
}
?>

		<td align="right" rowspan="2">
			<?php 
echo create_link("Reset", "reset", module_customer::link_open(false));
?>

			<?php 
echo create_link("Search", "submit");
?>
                    <h3><?php 
            echo _l('Perform Bulk Actions on Tickets (BETA!)');
            ?>
</h3>

                    <table width="100%" border="0" cellspacing="0" cellpadding="2" class="tableclass tableclass_form">
                        <tbody>
                        <tr>
                            <th class="width2">
                                <?php 
            echo _l('Select Ticket Group');
            ?>
                            </th>
                            <td>
                                <?php 
            echo print_select_box(module_group::get_groups('ticket'), 'group_id', false, '', true, 'name');
            ?>
                            </td>
                        </tr>
                        <tr>
                            <th>
                                <?php 
            echo _l('Change Ticket Status');
            ?>
                            </th>
                            <td>
                                <?php 
            echo print_select_box(module_ticket::get_statuses(), 'status_id', '');
            ?>
                            </td>
                        </tr>
Exemple #10
0
 public function process()
 {
     $errors = array();
     if (isset($_REQUEST['butt_del']) && $_REQUEST['butt_del'] && $_REQUEST['newsletter_id']) {
         $data = self::get_newsletter($_REQUEST['newsletter_id']);
         if (module_form::confirm_delete('newsletter_id', "Really delete newsletter: " . $data['subject'], self::link_open($_REQUEST['newsletter_id']))) {
             $this->delete_newsletter($_REQUEST['newsletter_id']);
             set_message("Newsletter deleted successfully");
             redirect_browser(self::link_list(false));
         }
     } else {
         if ("save_newsletter" == $_REQUEST['_process']) {
             $newsletter_id = isset($_REQUEST['newsletter_id']) ? (int) $_REQUEST['newsletter_id'] : false;
             $newsletter_id = $this->save_newsletter($newsletter_id, $_POST);
             if (isset($_REQUEST['butt_send'])) {
                 redirect_browser($this->link_send($newsletter_id));
             }
             if (isset($_REQUEST['butt_duplicate'])) {
                 $newsletter_id = $this->duplicate_newsetter($newsletter_id);
                 set_message('Newsletter duplicated successfully');
                 redirect_browser($this->link_open($newsletter_id));
             }
             if (isset($_REQUEST['butt_preview_email'])) {
                 if ($this->send_preview($newsletter_id, $_REQUEST['quick_email'])) {
                     //set_message("Newsletter preview sent successfully.");
                     redirect_browser($this->link_open($newsletter_id));
                 }
                 /*else{
                       echo "<br><br>Failed to send preview. <br><br>";
                       echo '<a href="'.$this->link_open($newsletter_id).'">try again</a> ';
                       exit;
                   }*/
             }
             if (isset($_REQUEST['butt_preview'])) {
                 redirect_browser($this->link_preview($newsletter_id));
             }
             set_message("Newsletter saved successfully");
             redirect_browser($this->link_open($newsletter_id));
         } else {
             if ("send_send" == $_REQUEST['_process']) {
                 $newsletter_id = (int) $_REQUEST['newsletter_id'];
                 $send_id = (int) $_REQUEST['send_id'];
                 if ($newsletter_id && $send_id) {
                     $sql = "UPDATE `" . _DB_PREFIX . "newsletter_send` SET `status` = " . _NEWSLETTER_STATUS_PENDING . " WHERE send_id = {$send_id} AND newsletter_id = {$newsletter_id}";
                     query($sql);
                     self::update_member_data_for_send($send_id);
                     self::remove_unsubscribed_members_from_send($send_id);
                     //ready to send
                     redirect_browser($this->link_queue_watch($newsletter_id, $send_id));
                 }
             } else {
                 if ("modify_send" == $_REQUEST['_process']) {
                     $send_id = (int) $_REQUEST['send_id'];
                     $newsletter_id = (int) $_REQUEST['newsletter_id'];
                     $send = get_single('newsletter_send', array('send_id', 'newsletter_id'), array($send_id, $newsletter_id));
                     if (isset($_POST['status']) && $_POST['status'] == 'delete') {
                         if (module_form::confirm_delete('newsletter_id', "Really delete this send?", self::link_queue_watch($newsletter_id, $send_id))) {
                             if ($send && $send['send_id'] == $send_id) {
                                 set_message("Newsletter send deleted successfully");
                                 update_insert('send_id', $send_id, 'newsletter_send', array('status' => _NEWSLETTER_STATUS_DELETED));
                             }
                             redirect_browser(self::link_list(false));
                         }
                         unset($_POST['status']);
                     }
                     if (!$send['start_time']) {
                         $_POST['start_time'] = time();
                     }
                     // hack cos sometimes it doesn't save start time? i think i fixed this bug though.
                     if ($send && $send['send_id'] == $send_id) {
                         update_insert('send_id', $send_id, 'newsletter_send', $_POST);
                         redirect_browser($this->link_queue_watch($newsletter_id, $send_id));
                     }
                 } else {
                     if ("enque_send" == $_REQUEST['_process']) {
                         $newsletter_id = (int) $_REQUEST['newsletter_id'];
                         $send_id = (int) $_REQUEST['send_id'];
                         $newsletter_data = self::get_newsletter($newsletter_id);
                         if ($newsletter_data['newsletter_id'] != $newsletter_id) {
                             die('failed to enqueue send');
                         }
                         // are we adding members to an existing send? or overwriting them to an existing draft / or creating a new blank send.
                         if ($send_id > 0) {
                             $adding_members = true;
                         } else {
                             $adding_members = false;
                         }
                         $members = array();
                         //todo: pass this off as a hook.
                         // so we could have another module (eg: module_drupal or module_wordpress) that
                         // checks which members were selected on the previous screen, and return a standard member array
                         if (class_exists('module_group', false)) {
                             // find the groups we are sending to.
                             $send_groups = array();
                             $groups = module_group::get_groups();
                             foreach ($groups as $group) {
                                 if (isset($_REQUEST['group']) && isset($_REQUEST['group'][$group['group_id']]) && $_REQUEST['group'][$group['group_id']] == 'yes') {
                                     // we are sending to this group
                                     // get a list of members in this group and add them to a send table ready to go.
                                     $send_groups[$group['group_id']] = true;
                                 }
                             }
                             // find the members for these groups
                             $callback = 'module_group::newsletter_callback';
                             $error_count = 0;
                             foreach ($send_groups as $group_id => $tf) {
                                 $group_members = module_group::get_members($group_id);
                                 //echo '<pre>';print_r($group_members);exit;
                                 // give all these members a callback so the newsletter system can get more data from them.
                                 $group_members_with_data = array();
                                 foreach ($group_members as $id => $group_member) {
                                     $args = array('group_id' => $group_id, 'owner_id' => $group_member['owner_id'], 'owner_table' => $group_member['owner_table']);
                                     // run this data callback to get the data from this group member.
                                     $all_callback_data = self::member_data_callback($callback, $args, false);
                                     // false, just want the email address for now.
                                     if (!$all_callback_data) {
                                         $error_count++;
                                     }
                                     if (is_array($all_callback_data)) {
                                         // check if $callback_data is a multi-array - sometimes this will return more than 1 record (eg: customer = returns all contacts under that customer)
                                         if (!isset($all_callback_data['_multi'])) {
                                             // this is a single record. make it multi
                                             $all_callback_data = array($all_callback_data);
                                         } else {
                                             unset($all_callback_data['_multi']);
                                         }
                                         foreach ($all_callback_data as $callback_data) {
                                             if (!$callback_data) {
                                                 continue;
                                             }
                                             if (!isset($callback_data['data_callback']) || !$callback_data['data_callback']) {
                                                 $callback_data['data_callback'] = $callback;
                                             }
                                             if (!isset($callback_data['data_args']) || !$callback_data['data_args']) {
                                                 $callback_data['data_args'] = json_encode($args);
                                             }
                                             $group_members_with_data[] = $callback_data;
                                         }
                                     }
                                     /*$group_members[$id] = self::member_data_callback($callback,$args);
                                       if(!$group_members[$id]){
                                           // todo: report this problematic group member, possibly remove group member from list.
                                           $error_count++;
                                           unset($group_members[$id]);
                                       }else{
                                           // a callback on customers will return all contacts for that customer (if advanced option is set)
                                           if(!isset($group_members[$id]['data_callback']) || !$group_members[$id]['data_callback']){
                                               $group_members[$id]['data_callback'] = $callback;
                                           }
                                           if(!isset($group_members[$id]['data_args']) || !$group_members[$id]['data_args']){
                                               $group_members[$id]['data_args'] = json_encode($args);
                                           }
                                       }*/
                                 }
                                 unset($group_members);
                                 //$members = array_merge($members,$group_members);
                                 $members = array_merge($members, $group_members_with_data);
                             }
                             if ($error_count > 0) {
                                 set_error('Failed to get the information on ' . $error_count . ' group members.');
                             }
                         }
                         /*if(class_exists('module_company',false) && module_company::can_i('view','Company') && module_company::is_enabled()){
                                         // copy of the group logic above, but we're adding companies to the list.
                                         // find the groups we are sending to.
                                         $send_companys = array();
                                         $companys = module_company::get_companys();
                                         foreach($companys as $company){
                                             if(isset($_REQUEST['company']) && isset($_REQUEST['company'][$company['company_id']]) && $_REQUEST['company'][$company['company_id']] == 'yes'){
                                                 // we are sending to this company
                                                 // get a list of members in this company and add them to a send table ready to go.
                                                 $send_companys[$company['company_id']] = true;
                                             }
                                         }
                                         // find the members for these companys
                                         $callback = 'module_company::newsletter_callback';
                                         $error_count = 0;
                                         foreach($send_companys as $company_id => $tf){
                                             $company_members = module_company::get_members($company_id);
                                             //echo '<pre>';print_r($company_members);exit;
                                             // give all these members a callback so the newsletter system can get more data from them.
                                             $company_members_with_data = array();
                                             foreach($company_members as $id => $company_member){
                                                 $args = array(
                                                      'company_id'=>$company_id,
                                                      'owner_id'=>$company_member['owner_id'],
                                                      'owner_table'=>$company_member['owner_table'],
                                                  );
                                                 // run this data callback to get the data from this company member.
                                                 $all_callback_data = self::member_data_callback($callback,$args);
                                                 if(!$all_callback_data){
                                                     $error_count++;
                                                 }
                                                 if(is_array($all_callback_data)){
                                                     // check if $callback_data is a multi-array - sometimes this will return more than 1 record (eg: customer = returns all contacts under that customer)
                                                     if(!isset($all_callback_data['_multi'])){
                                                         // this is a single record. make it multi
                                                         $all_callback_data = array($all_callback_data);
                                                     }else{
                                                         unset($all_callback_data['_multi']);
                                                     }
                                                     foreach($all_callback_data as $callback_data){
                                                         if(!$callback_data)continue;
                                                         if(!isset($callback_data['data_callback']) || !$callback_data['data_callback']){
                                                             $callback_data['data_callback'] = $callback;
                                                         }
                                                         if(!isset($callback_data['data_args']) || !$callback_data['data_args']){
                                                             $callback_data['data_args'] = json_encode($args);
                                                         }
                                                         $company_members_with_data[] = $callback_data;
                                                     }
                                                 }
                         
                         
                                             }
                                             unset($company_members);
                                             //$members = array_merge($members,$company_members);
                                             $members = array_merge($members,$company_members_with_data);
                                         }
                                         if($error_count>0){
                                             set_error('Failed to get the information on '.$error_count.' company members.');
                                         }
                                     }*/
                         //echo '<pre>';print_r($members);exit;
                         // todo - load CSV formats in too. IDEA! make a new CSV module, it will work in with GROUP hook above! YESS!
                         if (!$adding_members && !count($members)) {
                             set_error('Please select at least 1 person to send this newsletter to');
                             redirect_browser(self::link_send($newsletter_id));
                         }
                         if (!$adding_members && !$send_id) {
                             // see if we can re-use a previously unsent send (ie: draft send)
                             $drafts = get_multiple('newsletter_send', array('newsletter_id' => $newsletter_id, 'status' => _NEWSLETTER_STATUS_NEW));
                             if (count($drafts)) {
                                 $draft = array_shift($drafts);
                                 if ($draft['send_id']) {
                                     $send_id = (int) $draft['send_id'];
                                     $sql = "DELETE FROM `" . _DB_PREFIX . "newsletter_send_member` WHERE send_id = " . (int) $send_id;
                                     query($sql);
                                 }
                             }
                         }
                         if (isset($_REQUEST['start_time'])) {
                             $start_time = strtotime(input_date($_REQUEST['start_time'], true));
                             if (!$start_time) {
                                 $start_time = time();
                             }
                         } else {
                             $start_time = time();
                         }
                         $allow_duplicates = isset($_REQUEST['allow_duplicates']) ? $_REQUEST['allow_duplicates'] : 0;
                         // remove cache from send newsletter data history
                         if (isset($newsletter_data['sends']) && is_array($newsletter_data['sends'])) {
                             foreach ($newsletter_data['sends'] as $previous_newsletter_data_send_id => $previous_newsletter_data_send) {
                                 if (isset($previous_newsletter_data_send['cache'])) {
                                     unset($newsletter_data['sends'][$previous_newsletter_data_send_id]['cache']);
                                 }
                             }
                         }
                         $send_id = self::save_send($send_id, array('newsletter_id' => $newsletter_id, 'status' => _NEWSLETTER_STATUS_NEW, 'start_time' => $start_time, 'allow_duplicates' => $allow_duplicates, 'cache' => serialize($newsletter_data), 'subject' => $newsletter_data['subject']));
                         $done_member = false;
                         if ($send_id) {
                             // add the members from this send into the listing.
                             // this will be a snapshop of the members details at the time this send is created.
                             // todo: figure out if this will come back and bite me in the bum :)
                             $failed_due_to_unsubscribe = false;
                             $error_count = 0;
                             foreach ($members as $member) {
                                 //print_r($member);
                                 // check uniquness of this member's email in the send listing.
                                 // find this member by email.
                                 $newsletter_member_id = self::member_from_email($member);
                                 if ($newsletter_member_id > 0) {
                                     // found a member! add it to the send queue for this send.
                                     if (!$allow_duplicates) {
                                         // check if this member has received this email before.
                                         $sql = "SELECT * FROM `" . _DB_PREFIX . "newsletter_send_member` sm";
                                         $sql .= " LEFT JOIN `" . _DB_PREFIX . "newsletter_send` s USING (send_id) ";
                                         $sql .= " WHERE sm.newsletter_member_id = " . (int) $newsletter_member_id;
                                         $sql .= " AND sm.send_id IN (SELECT send_id FROM `" . _DB_PREFIX . "newsletter_send` WHERE newsletter_id = {$newsletter_id})";
                                         $sql .= " AND sm.send_id != " . (int) $send_id;
                                         $sql .= " AND s.status != 4 ";
                                         // so we ignore deleted sends.
                                         $check = query($sql);
                                         if (mysql_num_rows($check)) {
                                             // user has received this before.
                                             //echo 'received before';
                                             mysql_free_result($check);
                                             continue;
                                         }
                                         mysql_free_result($check);
                                     }
                                     // check if this member is unsubscribed or marked as not receiving emails?
                                     if (self::is_member_unsubscribed($newsletter_member_id, $member)) {
                                         // unsubscribe checks blacklist so no need to inclde it here:  || self::email_blacklisted($member['email'])
                                         //echo 'unsubscribed';
                                         $failed_due_to_unsubscribe = true;
                                         continue;
                                     }
                                     $sql = "REPLACE INTO `" . _DB_PREFIX . "newsletter_send_member` SET ";
                                     $sql .= " send_id = " . (int) $send_id . " ";
                                     $sql .= ", newsletter_member_id = " . (int) $newsletter_member_id . " ";
                                     $sql .= ", `sent_time` = 0";
                                     $sql .= ", `status` = 0";
                                     $sql .= ", `open_time` = 0";
                                     $sql .= ", `bounce_time` = 0";
                                     query($sql);
                                     //echo 'done';
                                     $done_member = true;
                                 } else {
                                     $error_count++;
                                     if (_DEBUG_MODE) {
                                         echo 'failed to create member from email';
                                         print_r($member);
                                         echo '<hr>';
                                     }
                                 }
                             }
                             if ($error_count) {
                                 set_error('Failed to add ' . $error_count . ' members to the queue. Possibly because they have no valid email address.');
                                 if (_DEBUG_MODE) {
                                     //exit;
                                 }
                             }
                             // exit;
                             if (!$done_member && !$adding_members) {
                                 if ($failed_due_to_unsubscribe) {
                                     set_error('All selected members have been unsubscribed or bounced, please select other members.');
                                     // this member is added, redirect and show the errors ..
                                 } else {
                                     set_error('Please select at least 1 person to send this newsletter to.');
                                     redirect_browser(self::link_send($newsletter_id));
                                 }
                             }
                             redirect_browser($this->link_queue($newsletter_id, $send_id));
                         }
                     } else {
                         if ("save_newsletter_template" == $_REQUEST['_process']) {
                             if (isset($_REQUEST['butt_del'])) {
                                 $data = self::get_newsletter_template($_REQUEST['newsletter_template_id']);
                                 if (module_form::confirm_delete('newsletter_template_id', "Really delete newsletter template: " . $data['newsletter_template_name'], self::link_open_template($_REQUEST['newsletter_template_id']))) {
                                     $this->delete_newsletter_template($_REQUEST['newsletter_template_id']);
                                     set_message("Newsletter template deleted successfully");
                                     redirect_browser(self::link_open_template(false));
                                 }
                             }
                             $newsletter_template_id = $this->save_newsletter_template($_REQUEST['newsletter_template_id'], $_POST);
                             set_message("Newsletter template saved successfully");
                             redirect_browser($this->link_open_template($newsletter_template_id));
                         }
                     }
                 }
             }
         }
     }
     if (!count($errors)) {
         redirect_browser($_REQUEST['_redirect']);
         exit;
     }
     print_error($errors, true);
 }