示例#1
0
 /**
  * Send a message to a user
  */
 function post_message($user, $from, $to, $cc, $subject, $body, $priority, $replyto_hash = '')
 {
     global $smarty, $userlib, $prefs;
     $subject = strip_tags($subject);
     $body = strip_tags($body, '<a><b><img><i>');
     // Prevent duplicates
     $hash = md5($subject . $body);
     if ($this->getOne("select count(*) from `messu_messages` where `user`=? and `user_from`=? and `hash`=?", array($user, $from, $hash))) {
         return false;
     }
     $query = "insert into `messu_messages`(`user`,`user_from`,`user_to`,`user_cc`,`subject`,`body`,`date`,`isRead`,`isReplied`,`isFlagged`,`priority`,`hash`,`replyto_hash`) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
     $this->query($query, array($user, $from, $to, $cc, $subject, $body, (int) $this->now, 'n', 'n', 'n', (int) $priority, $hash, $replyto_hash));
     // Now check if the user should be notified by email
     $foo = parse_url($_SERVER["REQUEST_URI"]);
     $machine = $this->httpPrefix() . $foo["path"];
     $machine = str_replace('messu-compose', 'messu-mailbox', $machine);
     if ($this->get_user_preference($user, 'minPrio', 6) <= $priority) {
         if (!isset($_SERVER["SERVER_NAME"])) {
             $_SERVER["SERVER_NAME"] = $_SERVER["HTTP_HOST"];
         }
         $email = $userlib->get_user_email($user);
         if ($email) {
             include_once 'lib/webmail/tikimaillib.php';
             $smarty->assign('mail_site', $_SERVER["SERVER_NAME"]);
             $smarty->assign('mail_machine', $machine);
             $smarty->assign('mail_date', $this->now);
             $smarty->assign('mail_user', stripslashes($user));
             $smarty->assign('mail_from', stripslashes($from));
             $smarty->assign('mail_subject', stripslashes($subject));
             $smarty->assign('mail_body', stripslashes($body));
             $mail = new TikiMail($user);
             $lg = $this->get_user_preference($user, 'language', $prefs['site_language']);
             $s = $smarty->fetchLang($lg, 'mail/messu_message_notification_subject.tpl');
             $mail->setSubject(sprintf($s, $_SERVER["SERVER_NAME"]));
             $mail_data = $smarty->fetchLang($lg, 'mail/messu_message_notification.tpl');
             $mail->setText($mail_data);
             if ($userlib->get_user_preference($from, 'email is public', 'n') == 'y') {
                 $prefs['sender_email'] = $userlib->get_user_email($from);
             }
             if (strlen($prefs['sender_email']) > 1) {
                 $mail->setHeader("Reply-To", $prefs['sender_email']);
                 $mail->setHeader("From", $prefs['sender_email']);
             }
             if (!$mail->send(array($email), 'mail')) {
                 return false;
             }
             //TODO echo $mail->errors;
         }
     }
     return true;
 }
function payment_behavior_cart_send_confirm_email($u, $email_template_ids = array())
{
    global $prefs, $smarty, $userlib;
    require_once 'lib/webmail/tikimaillib.php';
    $email = $userlib->get_user_email($u);
    if (!$email) {
        return false;
    }
    $smarty->assign("email_template_ids", $email_template_ids);
    $mail_subject = $smarty->fetch('mail/cart_order_received_reg_subject.tpl');
    $mail_data = $smarty->fetch('mail/cart_order_received_reg.tpl');
    $mail = new TikiMail();
    $mail->setSubject($mail_subject);
    if ($mail_data == strip_tags($mail_data)) {
        $mail->setText($mail_data);
    } else {
        $mail->setHtml($mail_data);
    }
    $mail->setHeader("From", $prefs['sender_email']);
    $mail->send($email);
    return true;
}
示例#3
0
function wikiplugin_tracker($data, $params)
{
    global $tikilib, $userlib, $dbTiki, $user, $group, $page, $tiki_p_admin_trackers, $smarty, $prefs, $trklib, $tiki_p_view;
    static $iTRACKER = 0;
    ++$iTRACKER;
    include_once 'lib/trackers/trackerlib.php';
    //var_dump($_REQUEST);
    extract($params, EXTR_SKIP);
    if ($prefs['feature_trackers'] != 'y') {
        return $smarty->fetch("wiki-plugins/error_tracker.tpl");
    }
    if (empty($trackerId) || !($tracker = $trklib->get_tracker($trackerId))) {
        return $smarty->fetch("wiki-plugins/error_tracker.tpl");
    }
    if ($t = $trklib->get_tracker_options($trackerId)) {
        $tracker = array_merge($tracker, $t);
    }
    if (empty($trackerId) && !empty($view) && $view == 'user' && $prefs['userTracker'] == 'y') {
        // the user tracker item
        $utid = $userlib->get_tracker_usergroup($user);
        if (!empty($utid) && !empty($utid['usersTrackerId'])) {
            $itemId = $trklib->get_item_id($utid['usersTrackerId'], $utid['usersFieldId'], $user);
            $trackerId = $utid['usersTrackerId'];
            $usertracker = true;
        }
    } elseif (!empty($trackerId) && !empty($view) && $view == 'user') {
        // the user item of a tracker
        $itemId = $trklib->get_user_item($trackerId, $tracker);
        $usertracker = true;
    } elseif (!empty($trackerId) && !empty($view) && $view == 'page' && !empty($_REQUEST['page']) && ($f = $trklib->get_field_id_from_type($trackerId, 'k', '1%'))) {
        // the page item
        $itemId = $trklib->get_item_id($trackerId, $f, $_REQUEST['page']);
    } elseif (!empty($trackerId) && !empty($_REQUEST['view_user'])) {
        $itemId = $trklib->get_user_item($trackerId, $tracker, $_REQUEST['view_user']);
    } elseif (!empty($_REQUEST['itemId'])) {
        $itemId = $_REQUEST['itemId'];
        $item = $trklib->get_tracker_item($itemId);
        $trackerId = $item['trackerId'];
    } elseif (!empty($view) && $view == 'group') {
        $gtid = $userlib->get_grouptrackerid($group);
        if (isset($gtid['groupTrackerId'])) {
            $trackerId = $gtid['groupTrackerId'];
            $itemId = $trklib->get_item_id($trackerId, $gtid['groupFieldId'], $group);
            $grouptracker = true;
        }
    }
    if (!isset($trackerId)) {
        return $smarty->fetch("wiki-plugins/error_tracker.tpl");
    }
    if (!isset($embedded)) {
        $embedded = "n";
    }
    if (!isset($showtitle)) {
        $showtitle = "n";
    }
    if (!isset($showdesc)) {
        $showdesc = "n";
    }
    if (!isset($sort)) {
        $sort = 'n';
    }
    if (!isset($action)) {
        $action = 'Save';
    }
    if (isset($preview)) {
        if (empty($preview)) {
            $preview = 'Preview';
        }
    } else {
        unset($_REQUEST['tr_preview']);
    }
    if (!isset($showmandatory)) {
        $showmandatory = 'y';
    }
    $smarty->assign('showmandatory', $showmandatory);
    if (!empty($wiki)) {
        $wiki = trim($wiki);
    }
    if (isset($values)) {
        if (!is_array($values)) {
            $values = $tikilib->quotesplit(':', $values);
            foreach ($values as $i => $v) {
                $values[$i] = preg_replace('/^"(.*)"$/', '$1', $v);
            }
        }
    }
    if (isset($_REQUEST['values'])) {
        if (is_array($_REQUEST['values'])) {
            foreach ($_REQUEST['values'] as $i => $k) {
                $_REQUEST['values'][$i] = urldecode($k);
            }
        } else {
            $_REQUEST['values'] = urldecode($_REQUEST['values']);
        }
    }
    if (empty($_SERVER['SCRIPT_NAME']) || !strstr($_SERVER['SCRIPT_NAME'], 'tiki-register.php')) {
        if (!empty($itemId) && $tracker['writerCanModify'] == 'y' && isset($usertracker) && $usertracker) {
            // user tracker he can modify
        } elseif (!empty($itemId) && $tracker['writerCanModify'] == 'y' && $user && (($itemUser = $trklib->get_item_creator($trackerId, $itemId)) == $user || $tracker['userCanTakeOwnership'] == 'y' && empty($itemUser))) {
        } elseif (!empty($itemId) && isset($grouptracker) && $grouptracker) {
        } else {
            $perms = $tikilib->get_perm_object($trackerId, 'tracker', $tracker, false);
            if ($perms['tiki_p_create_tracker_items'] == 'n' && empty($itemId)) {
                return '<b>' . tra("You do not have permission to insert an item") . '</b>';
            } elseif (!empty($itemId)) {
                $item_info = $trklib->get_tracker_item($itemId);
                if (!(($perms['tiki_p_modify_tracker_items'] == 'y' and $item_info['status'] != 'p' and $item_info['status'] != 'c') || ($perms['tiki_p_modify_tracker_items_pending'] == 'y' and $item_info['status'] == 'p') || ($perms['tiki_p_modify_tracker_items_closed'] == 'y' and $item_info['status'] == 'c'))) {
                    if ($tracker['writerGroupCanModify'] == 'y' && in_array($trklib->get_item_group_creator($trackerId, $itemId), $tikilib->get_user_groups($user))) {
                        global $group;
                        $smarty->assign_by_ref('ours', $group);
                    } else {
                        return '<b>' . tra("You do not have permission to modify an item") . '</b>';
                    }
                }
            }
        }
    }
    if (isset($_REQUEST['removeattach']) && $tracker['useAttachments'] == 'y') {
        $owner = $trklib->get_item_attachment_owner($_REQUEST['removeattach']);
        if ($perms['tiki_p_admin_trackers'] == 'y' || $user && $user == $owner) {
            $trklib->remove_item_attachment($_REQUEST["removeattach"]);
            unset($_REQUEST['removeattach']);
        }
    }
    if (isset($_REQUEST['removeImage']) && !empty($_REQUEST['trackerId']) && !empty($_REQUEST['itemId']) && !empty($_REQUEST['fieldId']) && !empty($_REQUEST['fieldName'])) {
        $img_field = array('data' => array());
        $img_field['data'][] = array('fieldId' => $_REQUEST['fieldId'], 'type' => 'i', 'name' => $_REQUEST['fieldName'], 'value' => 'blank');
        $trklib->replace_item($_REQUEST['trackerId'], $_REQUEST['itemId'], $img_field);
    }
    $back = '';
    $js = '';
    $thisIsThePlugin = isset($_REQUEST['iTRACKER']) && $_REQUEST['iTRACKER'] == $iTRACKER;
    if (!isset($_REQUEST["ok"]) || $_REQUEST["ok"] == "n" || !$thisIsThePlugin || isset($_REQUEST['tr_preview'])) {
        $field_errors = array('err_mandatory' => array(), 'err_value' => array());
        global $notificationlib;
        include_once 'lib/notifications/notificationlib.php';
        $tracker = $trklib->get_tracker($trackerId);
        $tracker = array_merge($tracker, $trklib->get_tracker_options($trackerId));
        if (!empty($tracker['start']) && $tikilib->now < $tracker['start'] || !empty($tracker['end']) && $tikilib->now > $tracker['end']) {
            return;
        }
        $flds = $trklib->list_tracker_fields($trackerId, 0, -1, "position_asc", "");
        if (empty($fields) && (!empty($wiki) || !empty($tpl))) {
            if (!empty($wiki)) {
                $outf = $trklib->get_pretty_fieldIds($wiki, 'wiki');
            } else {
                $outf = $trklib->get_pretty_fieldIds($tpl, 'tpl');
            }
            $ret = array();
            foreach ($flds['data'] as $field) {
                if ($field['type'] == 'q' || $field['type'] == 'k' || $field['type'] == 'u' || $field['type'] == 'g' || in_array($field['fieldId'], $outf)) {
                    $ret[] = $field;
                }
            }
            $flds['cant'] = sizeof($ret);
            $flds['data'] = $ret;
        }
        $bad = array();
        $embeddedId = false;
        $onemandatory = false;
        $full_fields = array();
        $mainfield = '';
        if ($thisIsThePlugin) {
            /* ------------------------------------- Recup all values from REQUEST -------------- */
            $cpt = 0;
            if (isset($fields)) {
                $fields_plugin = split(':', $fields);
            }
            foreach ($flds['data'] as $fl) {
                // store value to display it later if form
                // isn't fully filled.
                if ($flds['data'][$cpt]['type'] == 's' && $flds['data'][$cpt]['name'] == 'Rating') {
                    if (isset($_REQUEST['track'][$fl['fieldId']])) {
                        $newItemRate = $_REQUEST['track'][$fl['fieldId']];
                        $newItemRateField = $fl['fieldId'];
                    } else {
                        $newItemRate = NULL;
                    }
                } elseif (($flds['data'][$cpt]['type'] == 'u' || $flds['data'][$cpt]['type'] == 'g' || $flds['data'][$cpt]['type'] == 'I' || $flds['data'][$cpt]['type'] == 'k') && ($flds['data'][$cpt]['options_array'][0] == '1' || $flds['data'][$cpt]['options_array'][0] == '2') && empty($_REQUEST['track'][$fl['fieldId']])) {
                    if (empty($itemId) && ($flds['data'][$cpt]['options_array'][0] == '1' || $flds['data'][$cpt]['options_array'][0] == '2')) {
                        if ($flds['data'][$cpt]['type'] == 'u') {
                            $_REQUEST['track'][$fl['fieldId']] = empty($user) ? empty($_REQUEST['name']) ? '' : $_REQUEST['name'] : $user;
                        } elseif ($flds['data'][$cpt]['type'] == 'g') {
                            $_REQUEST['track'][$fl['fieldId']] = $group;
                        } elseif ($flds['data'][$cpt]['type'] == 'I') {
                            $_REQUEST['track'][$fl['fieldId']] = $tikilib->get_ip_address();
                        } elseif ($flds['data'][$cpt]['type'] == 'k') {
                            $_REQUEST['track'][$fl['fieldId']] = isset($_REQUEST['page']) ? $_REQUEST['page'] : '';
                        }
                    } elseif (!empty($itemId) && $flds['data'][$cpt]['options_array'][0] == '2') {
                        if ($flds['data'][$cpt]['type'] == 'u') {
                            $_REQUEST['track'][$fl['fieldId']] = $user;
                        } elseif ($flds['data'][$cpt]['type'] == 'g') {
                            $_REQUEST['track'][$fl['fieldId']] = $group;
                        } elseif ($flds['data'][$cpt]['type'] == 'I') {
                            $_REQUEST['track'][$fl['fieldId']] = $tikilib->get_ip_address();
                        }
                    }
                } elseif (($flds['data'][$cpt]['type'] == 'C' || $flds['data'][$cpt]['type'] == 'e') && empty($_REQUEST['track'][$fl['fieldId']])) {
                    $_REQUEST['track'][$fl['fieldId']] = '';
                } elseif ($flds['data'][$cpt]['type'] == 'f') {
                    $ins_id = 'track_' . $fl['fieldId'];
                    if (isset($_REQUEST[$ins_id . 'Day'])) {
                        if (empty($_REQUEST['$ins_id' . 'Hour'])) {
                            $_REQUEST['$ins_id' . 'Hour'] = 0;
                        }
                        if (empty($_REQUEST['$ins_id' . 'Minute'])) {
                            $_REQUEST['$ins_id' . 'Minute'] = 0;
                        }
                        $_REQUEST['track'][$fl['fieldId']] = $tikilib->make_time($_REQUEST["{$ins_id}" . "Hour"], $_REQUEST["{$ins_id}" . "Minute"], 0, $_REQUEST["{$ins_id}" . "Month"], $_REQUEST["{$ins_id}" . "Day"], $_REQUEST["{$ins_id}" . "Year"]);
                    } else {
                        $_REQUEST['track'][$fl['fieldId']] = $tikilib->now;
                    }
                } elseif ($f['type'] == 'N' && !empty($itemId)) {
                    if (empty($itemUser)) {
                        $itemUser = $this->get_item_creator($trackerId, $itemId);
                    }
                    $flds['data'][$i]['value'] = $trklib->in_group_value($flds['data'][$i], $itemUser);
                }
                if (isset($_REQUEST['ins_cat_' . $fl['fieldId']])) {
                    // to remember if error
                    $_REQUEST['track'][$fl['fieldId']] = $_REQUEST['ins_cat_' . $fl['fieldId']];
                }
                if (isset($_REQUEST['track'][$fl['fieldId']])) {
                    $flds['data'][$cpt]['value'] = $_REQUEST['track'][$fl['fieldId']];
                } else {
                    $flds['data'][$cpt]['value'] = '';
                    if ($fl['type'] == 'c') {
                        $_REQUEST['track'][$fl['fieldId']] = 'n';
                    } elseif ($fl['type'] == 'R' && $fl['isMandatory'] == 'y') {
                        // if none radio is selected, there will be no value and no error if mandatory
                        $_REQUEST['track'][$fl['fieldId']] = '';
                    }
                }
                if (!empty($_REQUEST['other_track'][$fl['fieldId']])) {
                    $flds['data'][$cpt]['value'] = $_REQUEST['other_track'][$fl['fieldId']];
                }
                if ($flds['data'][$cpt]['isMultilingual'] == 'y') {
                    foreach ($prefs['available_languages'] as $num => $tmplang) {
                        if (isset($_REQUEST['track'][$fl['fieldId']][$tmplang])) {
                            $fl['lingualvalue'][$num]['value'] = $_REQUEST['track'][$fl['fieldId']][$tmplang];
                            $fl['lingualvalue'][$num]['lang'] = $tmplang;
                        }
                    }
                }
                $full_fields[$fl['fieldId']] = $fl;
                if ($embedded == 'y' and $fl['name'] == 'page') {
                    $embeddedId = $fl['fieldId'];
                }
                if ($fl['isMain'] == 'y') {
                    $mainfield = $flds['data'][$cpt]['value'];
                }
                $cpt++;
            }
            /*foreach */
            if (isset($_REQUEST['track'])) {
                foreach ($_REQUEST['track'] as $fld => $val) {
                    //$ins_fields["data"][] = array('fieldId' => $fld, 'value' => $val, 'type' => 1);
                    if (!empty($_REQUEST['other_track'][$fld])) {
                        $val = $_REQUEST['other_track'][$fld];
                    }
                    $ins_fields["data"][] = array_merge(array('value' => $val), $full_fields[$fld]);
                }
            }
            if (isset($_FILES['track'])) {
                // image or attachment fields
                foreach ($_FILES['track'] as $label => $w) {
                    foreach ($w as $fld => $val) {
                        if ($label == 'tmp_name' && is_uploaded_file($val)) {
                            $fp = fopen($val, 'rb');
                            $data = '';
                            while (!feof($fp)) {
                                $data .= fread($fp, 8192 * 16);
                            }
                            fclose($fp);
                            $files[$fld]['old_value'] = $files[$fld]['value'];
                            $files[$fld]['value'] = $data;
                        } else {
                            $files[$fld]['file_' . $label] = $val;
                        }
                    }
                }
                foreach ($files as $fld => $file) {
                    $ins_fields['data'][] = array_merge($file, $full_fields[$fld]);
                }
            }
            if ($embedded == 'y' && isset($_REQUEST['page'])) {
                $ins_fields["data"][] = array('fieldId' => $embeddedId, 'value' => $_REQUEST['page']);
            }
            $ins_categs = array();
            $categorized_fields = array();
            while (list($postVar, $postVal) = each($_REQUEST)) {
                if (preg_match("/^ins_cat_([0-9]+)/", $postVar, $m)) {
                    foreach ($postVal as $v) {
                        $ins_categs[] = $v;
                    }
                    $categorized_fields[] = $m[1];
                }
            }
            /* ------------------------------------- End recup all values from REQUEST -------------- */
            /* ------------------------------------- Check field values for each type and presence of mandatory ones ------------------- */
            $field_errors = $trklib->check_field_values($ins_fields, $categorized_fields);
            if (empty($user) && $prefs['feature_antibot'] == 'y' && !$_SESSION['in_tracker']) {
                // in_tracker session var checking is for tiki-register.php
                if (!isset($_SESSION['random_number']) || $_SESSION['random_number'] != $_REQUEST['antibotcode']) {
                    $field_errors['err_antibot'] = 'y';
                }
            }
            if (count($field_errors['err_mandatory']) == 0 && count($field_errors['err_value']) == 0 && empty($field_errors['err_antibot']) && !isset($_REQUEST['tr_preview'])) {
                /* ------------------------------------- save the item ---------------------------------- */
                if (!isset($itemId) && $tracker['oneUserItem'] == 'y') {
                    $itemId = $trklib->get_user_item($trackerId, $tracker);
                }
                if (isset($_REQUEST['status'])) {
                    $status = $_REQUEST['status'];
                } elseif (isset($newstatus) && ($newstatus == 'o' || $newstatus == 'c' || $newstatus == 'p')) {
                    $status = $newstatus;
                } elseif (empty($itemId) && isset($tracker['newItemStatus'])) {
                    $status = $tracker['newItemStatus'];
                } else {
                    $status = '';
                }
                $rid = $trklib->replace_item($trackerId, $itemId, $ins_fields, $status, $ins_categs);
                $trklib->categorized_item($trackerId, $rid, $mainfield, $ins_categs);
                if (isset($newItemRate)) {
                    $trklib->replace_rating($trackerId, $rid, $newItemRateField, $user, $newItemRate);
                }
                if (!empty($email)) {
                    $emailOptions = split("\\|", $email);
                    if (is_numeric($emailOptions[0])) {
                        $emailOptions[0] = $trklib->get_item_value($trackerId, $rid, $emailOptions[0]);
                    }
                    if (empty($emailOptions[0])) {
                        // from
                        $emailOptions[0] = $prefs['sender_email'];
                    }
                    if (empty($emailOptions[1])) {
                        // to
                        $emailOptions[1][0] = $prefs['sender_email'];
                    } else {
                        $emailOptions[1] = split(',', $emailOptions[1]);
                        foreach ($emailOptions[1] as $key => $email) {
                            if (is_numeric($email)) {
                                $emailOptions[1][$key] = $trklib->get_item_value($trackerId, $rid, $email);
                            }
                        }
                    }
                    if (!empty($emailOptions[2])) {
                        //tpl
                        if (!preg_match('/\\.tpl$/', $emailOptions[2])) {
                            $emailOptions[2] .= '.tpl';
                        }
                        $tplSubject = str_replace('.tpl', '_subject.tpl', $emailOptions[2]);
                    } else {
                        $emailOptions[2] = 'tracker_changed_notification.tpl';
                    }
                    if (empty($tplSubject)) {
                        $tplSubject = 'tracker_changed_notification_subject.tpl';
                    }
                    include_once 'lib/webmail/tikimaillib.php';
                    $mail = new TikiMail();
                    @($mail_data = $smarty->fetch('mail/' . $tplSubject));
                    if (empty($mail_data)) {
                        $mail_data = tra('Tracker was modified at ') . $_SERVER["SERVER_NAME"];
                    }
                    $mail->setSubject($mail_data);
                    $mail_data = $smarty->fetch('mail/' . $emailOptions[2]);
                    $mail->setText($mail_data);
                    $mail->setHeader('From', $emailOptions[0]);
                    $mail->send($emailOptions[1]);
                }
                if (empty($url)) {
                    if (!empty($page)) {
                        $url = "tiki-index.php?page=" . urlencode($page) . "&ok=y&iTRACKER={$iTRACKER}";
                        $url .= "#wikiplugin_tracker{$iTRACKER}";
                        header("Location: {$url}");
                        die;
                    } else {
                        return '';
                    }
                } else {
                    if (strstr($url, 'itemId')) {
                        $url = str_replace('itemId', 'itemId=' . $rid, $url);
                    }
                    header("Location: {$url}");
                    die;
                }
                /* ------------------------------------- end save the item ---------------------------------- */
            } elseif (isset($_REQUEST['trackit']) and $_REQUEST['trackit'] == $trackerId) {
                $smarty->assign('wikiplugin_tracker', $trackerId);
                //used in vote plugin
            }
        } else {
            if (empty($itemId) && !empty($values) || (!empty($_REQUEST['values']) and empty($_REQUEST['prefills']))) {
                // assign default values for each filedId specify
                if (empty($values)) {
                    // url with values[]=x&values[] witouth the list of fields
                    $values = $_REQUEST['values'];
                }
                if (!is_array($values)) {
                    $values = array($values);
                }
                if (isset($fields)) {
                    $fl = split(':', $fields);
                    for ($j = 0, $count_fl = count($fl); $j < $count_fl; $j++) {
                        for ($i = 0, $count_flds = count($flds['data']); $i < $count_flds; $i++) {
                            if ($flds['data'][$i]['fieldId'] == $fl[$j]) {
                                $flds['data'][$i]['value'] = $values[$j];
                            }
                        }
                    }
                } else {
                    // values contains all the fields value in the default order
                    $i = 0;
                    foreach ($values as $value) {
                        $flds['data'][$i++]['value'] = $value;
                    }
                }
            } elseif (!empty($itemId)) {
                if (isset($fields)) {
                    $fl = split(':', $fields);
                    $filter = '';
                    foreach ($flds['data'] as $f) {
                        if (in_array($f['fieldId'], $fl)) {
                            $filter[] = $f;
                        }
                    }
                } else {
                    $filter =& $flds['data'];
                }
                if (!empty($filter)) {
                    foreach ($filter as $f) {
                        $filter2[$f['fieldId']] = $f;
                    }
                    $flds['data'] = $trklib->get_item_fields($trackerId, $itemId, $filter2, $itemUser);
                }
            } else {
                if (isset($_REQUEST['values']) && isset($_REQUEST['prefills'])) {
                    //url:prefields=1:2&values[]=x&values[]=y
                    if (!is_array($_REQUEST['values'])) {
                        $_REQUEST['values'] = array($_REQUEST['values']);
                    }
                    $fl = split(':', $_REQUEST['prefills']);
                } else {
                    unset($fl);
                }
                for ($i = 0, $count_flds2 = count($flds['data']); $i < $count_flds2; $i++) {
                    if (isset($fl) && ($j = array_search($flds['data'][$i]['fieldId'], $fl)) !== false) {
                        $flds['data'][$i]['value'] = $_REQUEST['values'][$j];
                    } else {
                        $flds['data'][$i]['value'] = '';
                        // initialize fields with blank values
                    }
                }
            }
        }
        $optional = array();
        $outf = array();
        if (isset($fields) && !empty($fields)) {
            $fl = split(":", $fields);
            if ($sort == 'y') {
                $flds = $trklib->sort_fields($flds, $fl);
            }
            foreach ($fl as $l) {
                if (substr($l, 0, 1) == '-') {
                    $l = substr($l, 1);
                    $optional[] = $l;
                }
                $ok = false;
                foreach ($flds['data'] as $f) {
                    if ($f['fieldId'] == $l) {
                        $ok = true;
                        break;
                    }
                }
                if (!$ok) {
                    $back .= tra('Incorrect fieldId:') . ' ' . $l;
                }
                $outf[] = $l;
            }
        } elseif (empty($fields) && !empty($wiki)) {
            $wiki_info = $tikilib->get_page_info($wiki);
            preg_match_all('/\\$f_([0-9]+)/', $wiki_info['data'], $matches);
            $outf = $matches[1];
        } elseif (empty($fields) && !empty($tpl)) {
            $f = $smarty->get_filename($tpl);
            if (!empty($f)) {
                $f = file_get_contents($f);
                preg_match_all('/\\$f_([0-9]+)/', $f, $matches);
                $outf = $matches[1];
            }
        } elseif (empty($fields) && empty($wiki)) {
            foreach ($flds['data'] as $f) {
                if ($f['isMandatory'] == 'y') {
                    $optional[] = $f['fieldId'];
                }
                $outf[] = $f['fieldId'];
            }
        }
        // Display warnings when needed
        if (count($field_errors['err_mandatory']) > 0) {
            $back .= '<div class="simplebox highlight"><img src="pics/icons/exclamation.png" alt=" ' . tra('Error') . '" style="vertical-align:middle" /> ';
            $back .= tra('Following mandatory fields are missing') . '&nbsp;:<br/>';
            $coma_cpt = count($field_errors['err_mandatory']);
            foreach ($field_errors['err_mandatory'] as $f) {
                $back .= $f['name'];
                $back .= --$coma_cpt > 0 ? ',&nbsp;' : '';
            }
            $back .= '</div><br />';
            $_REQUEST['error'] = 'y';
        }
        if (count($field_errors['err_value']) > 0) {
            $back .= '<div class="simplebox highlight">';
            $b = '';
            foreach ($field_errors['err_value'] as $f) {
                if (!empty($f['errorMsg'])) {
                    $back .= tra($f['errorMsg']) . '<br>';
                } else {
                    if (!empty($b)) {
                        $b .= ' : ';
                    }
                    $b .= $f['name'];
                }
            }
            if (!empty($b)) {
                $back .= tra('Following fields are incorrect') . '&nbsp;:<br/>' . $b;
            }
            $back .= '</div><br />';
            $_REQUEST['error'] = 'y';
        }
        if (isset($field_errors['err_antibot'])) {
            $back .= '<div class="simplebox highlight"><img src="pics/icons/exclamation.png" alt=" ' . tra('Error') . '" style="vertical-align:middle" /> ';
            $back .= tra('You have mistyped the anti-bot verification code; please try again.');
            $back .= '</div><br />';
            $_REQUEST['error'] = 'y';
        }
        if (count($field_errors['err_mandatory']) > 0 || count($field_errors['err_value']) > 0 || isset($field_errors['err_antibot'])) {
            $smarty->assign('input_err', 'y');
        }
        if (!empty($page)) {
            $back .= '~np~';
        }
        $smarty->assign_by_ref('tiki_p_admin_trackers', $perms['tiki_p_admin_trackers']);
        $back .= '<form enctype="multipart/form-data" method="post"' . (isset($target) ? ' target="' . $target . '"' : '') . ' action="' . $_SERVER['REQUEST_URI'] . '"><input type="hidden" name="trackit" value="' . $trackerId . '" />';
        $back .= '<input type="hidden" name="iTRACKER" value="' . $iTRACKER . '" />';
        $back .= '<input type="hidden" name="refresh" value="1" />';
        if (isset($_REQUEST['page'])) {
            $back .= '<input type="hidden" name="page" value="' . $_REQUEST["page"] . '" />';
        }
        // for registration
        if (isset($_REQUEST['name'])) {
            $back .= '<input type="hidden" name="name" value="' . $_REQUEST["name"] . '" />';
        }
        if (isset($_REQUEST['pass'])) {
            $back .= '<input type="hidden" name="pass" value="' . $_REQUEST["pass"] . '" />';
            $back .= '<input type="hidden" name="passAgain" value="' . $_REQUEST["pass"] . '" />';
        }
        if (isset($_REQUEST['email'])) {
            $back .= '<input type="hidden" name="email" value="' . $_REQUEST["email"] . '" />';
        }
        if (isset($_REQUEST['regcode'])) {
            $back .= '<input type="hidden" name="regcode" value="' . $_REQUEST["regcode"] . '" />';
        }
        if (isset($_REQUEST['chosenGroup'])) {
            // for registration
            $back .= '<input type="hidden" name="chosenGroup" value="' . $_REQUEST["chosenGroup"] . '" />';
        }
        if (isset($_REQUEST['register'])) {
            $back .= '<input type="hidden" name="register" value="' . $_REQUEST["register"] . '" />';
        }
        if ($showtitle == 'y') {
            $back .= '<div class="titlebar">' . $tracker["name"] . '</div>';
        }
        if ($showdesc == 'y' && $tracker['description']) {
            if ($tracker['descriptionIsParsed'] == 'y') {
                $back .= '<div class="wikitext">' . $tikilib->parse_data($tracker['description']) . '</div><br />';
            } else {
                $back .= '<div class="wikitext">' . $tracker["description"] . '</div><br />';
            }
        }
        if (isset($_REQUEST['tr_preview'])) {
            // use for the computed and join fields
            $assocValues = array();
            $assocNumerics = array();
            foreach ($flds['data'] as $f) {
                if (empty($f['value']) && ($f['type'] == 'u' || $f['type'] == 'g' || $f['type'] == 'I') && ($f['options_array'][0] == '1' || $f['options_array'][0] == '2')) {
                    //need to fill the selector fields for the join
                    $f['value'] = $f['type'] == 'I' ? $tikilib->get_ip_address() : ($f['type'] == 'g' ? $group : $user);
                }
                $assocValues[$f['fieldId']] = $f['value'];
                $assocNumerics[$f['fieldId']] = preg_replace('/[^0-9\\.\\+]/', '', $f['value']);
                // get rid off the $ and such unit
            }
        }
        if (!empty($itemId)) {
            $item = array('itemId' => $itemId, 'trackerId' => $trackerId);
        }
        foreach ($flds['data'] as $i => $f) {
            // collect additional infos
            if (in_array($f['fieldId'], $outf)) {
                $flds['data'][$i]['ins_id'] = $f['type'] == 'e' ? 'ins_cat_' . $f['fieldId'] : ($f['type'] == 'f' ? 'track_' . $f['fieldId'] : 'track[' . $f['fieldId'] . ']');
                if ($f['isHidden'] == 'c' && !empty($itemId) && !isset($item['creator'])) {
                    $item['creator'] = $trklib->get_item_creator($trackerId, $itemId);
                }
                if ($f['type'] == 's' && ($f['name'] == 'Rating' || $f['name'] == tra('Rating')) && $perms['tiki_p_tracker_vote_ratings'] == 'y' && isset($item)) {
                    $item['my_rate'] = $tikilib->get_user_vote("tracker{$trackerId}.{$itemId}", $user);
                }
                if ($f['isMultilingual'] == 'y') {
                    $multi_languages = $prefs['available_languages'];
                    foreach ($multi_languages as $num => $tmplang) {
                        $flds['data'][$i]['lingualvalue'][$num]['lang'] = $tmplang;
                    }
                }
                if ($f['type'] == 'r') {
                    $flds['data'][$i]['list'] = array_unique($trklib->get_all_items($f['options_array'][0], $f['options_array'][1], 'poc'));
                    if (isset($f['options_array'][3])) {
                        $flds['data'][$i]['displayedList'] = array_unique($trklib->concat_all_items_from_fieldslist($f['options_array'][0], $f['options_array'][3]));
                    }
                } elseif ($f['type'] == 'y') {
                    $flds['data'][$i]['flags'] = $tikilib->get_flags();
                    if ($prefs['language'] != 'en') {
                        foreach ($flags as $flag) {
                            $flagsTranslated[] = $tikilib->take_away_accent(tra($flag));
                        }
                        array_multisort($flagsTranslated, $flds['data'][$i]['flags']);
                    }
                } elseif ($f['type'] == 'u') {
                    if ($perms['tiki_p_admin_trackers'] == 'y' || $f['options_array'][0] != 1 && $f['options_array'][0] != 2) {
                        $flds['data'][$i]['list'] = $userlib->list_all_users();
                    } elseif ($f['options_array'][0] == 1) {
                        $flds['data'][$i]['value'] = $user;
                    }
                } elseif ($f['type'] == 'g') {
                    if ($perms['tiki_p_admin_trackers'] == 'y' || $f['options_array'][0] != 1 && $f['options_array'][0] != 2) {
                        $flds['data'][$i]['list'] = $userlib->list_all_groups();
                    } elseif ($f['options_array'][0] == 1) {
                        global $group;
                        $flds['data'][$i]['value'] = $group;
                    }
                } elseif ($f['type'] == 'k') {
                    if ($f['options_array'][0] == 1) {
                        if (isset($page)) {
                            $flds['data'][$i]['value'] = $page;
                        }
                    }
                } elseif ($f['type'] == 'e') {
                    global $categlib;
                    include_once 'lib/categories/categlib.php';
                    $flds['data'][$i]['list'] = $categlib->get_viewable_child_categories($f["options_array"][0]);
                } elseif ($f['type'] == 'A') {
                    if (!empty($f['value'])) {
                        $flds['data'][$i]['info'] = $trklib->get_item_attachment($f['value']);
                    }
                } elseif ($f['type'] == 'a') {
                    if ($f['options_array'][0] == 1 && empty($toolbars)) {
                        // all in the smarty object now
                    }
                } elseif ($f['type'] == 'l' && isset($itemId)) {
                    $opts[1] = split(':', $f['options_array'][1]);
                    $finalFields = explode('|', $f['options_array'][3]);
                    $flds['data'][$i]['value'] = $trklib->get_join_values($itemId, array_merge(array($f['options_array'][2]), array($f['options_array'][1]), array($finalFields[0])), $f['options_array'][0], $finalFields);
                } elseif ($f['type'] == 'w') {
                    $refFieldId = $f['options_array'][2];
                    foreach ($flds['data'] as $i => $ff) {
                        if ($ff['fieldId'] == $refFieldId) {
                            $refFieldId = $i;
                        }
                    }
                    if (!isset($flds['data'][$refFieldId]['http_request'])) {
                        $flds['data'][$refFieldId]['http_request'] = array('', '', '', '', '', '', '', '', '');
                    }
                    for ($i = 0; $i < 5; $i++) {
                        $flds['data'][$refFieldId]['http_request'][$i] .= ($flds['data'][$refFieldId]['http_request'][$i] ? "," : "") . isset($f['options_array'][$i]) ? $f['options_array'][$i] : '';
                    }
                    $flds['data'][$refFieldId]['http_request'][5] .= ($flds['data'][$refFieldId]['http_request'][5] ? "," : "") . $f['fieldId'];
                    $flds['data'][$refFieldId]['http_request'][6] .= ($flds['data'][$refFieldId]['http_request'][6] ? "," : "") . $f['isMandatory'];
                    $flds['data'][$refFieldId]['http_request'][7] .= $flds['data'][$refFieldId]['value'];
                    $flds['data'][$refFieldId]['http_request'][8] .= ($flds['data'][$refFieldId]['http_request'][8] ? "," : "") . $f['value'];
                }
            }
        }
        // Loop on tracker fields and display form
        if (empty($tpl) && empty($wiki)) {
            $back .= '<table class="wikiplugin_tracker">';
        } else {
            $back .= '<div class="wikiplugin_tracker">';
        }
        $backLength0 = strlen($back);
        foreach ($flds['data'] as $f) {
            if ($f['type'] == 'u' and $f['options_array'][0] == '1') {
                $back .= '<input type="hidden" name="authorfieldid" value="' . $f['fieldId'] . '" />';
            }
            if ($f['type'] == 'I' and $f['options_array'][0] == '1') {
                $back .= '<input type="hidden" name="authoripid" value="' . $f['fieldId'] . '" />';
            }
            if ($f['type'] == 'g' and $f['options_array'][0] == '1') {
                $back .= '<input type="hidden" name="authorgroupfieldid" value="' . $f['fieldId'] . '" />';
            }
            if ($f['type'] == 'q') {
                $back .= '<input type="hidden" name="track[' . $f['fieldId'] . ']" />';
            }
            if (in_array($f['fieldId'], $outf)) {
                if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                    $onemandatory = true;
                }
                if (!empty($tpl) || !empty($wiki)) {
                    $smarty->assign_by_ref('field_value', $f);
                    $smarty->assign('showmandatory', $showmandatory);
                    if (isset($item)) {
                        $smarty->assign_by_ref('item', $item);
                    }
                    $smarty->assign('f_' . $f['fieldId'], $smarty->fetch('tracker_item_field_input.tpl'));
                } else {
                    if (in_array($f['fieldId'], $optional)) {
                        $f['name'] = "<i>" . $f['name'] . "</i>";
                    }
                    if ($f['type'] != 'h') {
                        $back .= "<tr><td";
                        if (!empty($colwidth)) {
                            $back .= " width='" . $colwidth . "'";
                        }
                        $back .= ">" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<strong class='mandatory_star'>*</strong>&nbsp;";
                        }
                        $back .= "</td><td>";
                    } else {
                        $back .= "<tr><th colspan='2'>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                    }
                    $smarty->assign_by_ref('field_value', $f);
                    if (isset($item)) {
                        $smarty->assign_by_ref('item', $item);
                    }
                    $back .= $smarty->fetch('tracker_item_field_input.tpl');
                }
                if (!empty($f['description']) && $f['type'] != 'h' && $f['type'] != 'S') {
                    $back .= '<br />';
                    if ($f['descriptionIsParsed'] == 'y') {
                        $back .= $tikilib->parse_data($f['description']);
                    } else {
                        $back .= '<i>' . $f['description'] . '</i>';
                    }
                }
                if (empty($tpl) && empty($wiki)) {
                    if ($f['type'] != 'h') {
                        $back .= "</td></tr>";
                    } else {
                        $back .= "</th></tr>";
                    }
                }
                if (!empty($f['http_request']) && !empty($itemId)) {
                    $js .= 'selectValues("trackerIdList=' . $f['http_request'][0] . '&fieldlist=' . $f['http_request'][3] . '&filterfield=' . $f['http_request'][1] . '&status=' . $f['http_request'][4] . '&mandatory=' . $f['http_request'][6] . '&filtervalue=' . $f['http_request'][7] . '&selected=' . $f['http_request'][8] . '","' . $f['http_request'][5] . '");';
                }
            }
        }
        if (!empty($tpl)) {
            $smarty->security = true;
            $back .= $smarty->fetch($tpl);
        } elseif (!empty($wiki)) {
            $smarty->security = true;
            $back .= $smarty->fetch('wiki:' . $wiki);
        }
        if ($prefs['feature_antibot'] == 'y' && empty($user) && !$_SESSION['in_tracker']) {
            // in_tracker session var checking is for tiki-register.php
            $back .= $smarty->fetch('antibot.tpl');
        }
        if (empty($tpl) && empty($wiki)) {
            $back .= "<tr><td></td><td>";
        }
        if (!empty($preview)) {
            $back .= "<input type='submit' name='tr_preview' value='" . tra($preview) . "' />";
        }
        $back .= "<input type='submit' name='action' value='" . tra($action) . "' />";
        if ($showmandatory == 'y' and $onemandatory) {
            $back .= "<em class='mandatory_note'>" . tra("Fields marked with a * are mandatory.") . "</em>";
        }
        if (empty($tpl) && empty($wiki)) {
            $back .= "</td></tr>";
            $back .= "</table>";
        } else {
            $back .= '</div>';
        }
        $back .= '</form>';
        if (!empty($js)) {
            $back .= '<script type="text/javascript">' . $js . '</script>';
        }
        if (!empty($page)) {
            $back .= '~/np~';
        }
        $smarty->assign_by_ref('tiki_p_admin_trackers', $tiki_p_admin_trackers);
        return $back;
    } else {
        if (isset($_REQUEST['trackit']) and $_REQUEST['trackit'] == $trackerId) {
            $smarty->assign('wikiplugin_tracker', $trackerId);
        }
        //used in vote plugin
        $id = ' id="wikiplugin_tracker' . $iTRACKER . '"';
        if ($showtitle == 'y') {
            $back .= '<div class="titlebar"' . $id . '>' . $tracker["name"] . '</div>';
            $id = '';
        }
        if ($showdesc == 'y') {
            $back .= '<div class="wikitext"' . $id . '>' . $tracker["description"] . '</div><br />';
            $id = '';
        }
        $back .= "<div{$id}>" . $data . '</div>';
        return $back;
    }
}
 function remove_tracker_item($itemId)
 {
     global $user;
     $query = "select * from `tiki_tracker_items` where `itemId`=?";
     $result = $this->query($query, array((int) $itemId));
     $res = $result->fetchRow();
     $trackerId = $res['trackerId'];
     $status = $res['status'];
     // ---- save image list before sql query ---------------------------------
     $fieldList = $this->list_tracker_fields($trackerId, 0, -1, 'name_asc', '');
     $imgList = array();
     foreach ($fieldList['data'] as $f) {
         if ($f['type'] == 'i') {
             $imgList[] = $this->get_item_value($trackerId, $itemId, $f['fieldId']);
         }
     }
     $watchers = $this->get_notification_emails($trackerId, $itemId, $this->get_tracker_options($trackerId));
     if (count($watchers > 0)) {
         global $smarty;
         $trackerName = $this->getOne("select `name` from `tiki_trackers` where `trackerId`=?", array((int) $trackerId));
         $smarty->assign('mail_date', $this->now);
         $smarty->assign('mail_user', $user);
         $smarty->assign('mail_action', 'deleted');
         $smarty->assign('mail_itemId', $itemId);
         $smarty->assign('mail_trackerId', $trackerId);
         $smarty->assign('mail_trackerName', $trackerName);
         $foo = parse_url($_SERVER["REQUEST_URI"]);
         $machine = $this->httpPrefix() . $foo["path"];
         $smarty->assign('mail_machine', $machine);
         $parts = explode('/', $foo['path']);
         if (count($parts) > 1) {
             unset($parts[count($parts) - 1]);
         }
         $smarty->assign('mail_machine_raw', $this->httpPrefix() . implode('/', $parts));
         if (!isset($_SERVER["SERVER_NAME"])) {
             $_SERVER["SERVER_NAME"] = $_SERVER["HTTP_HOST"];
         }
         include_once 'lib/webmail/tikimaillib.php';
         $smarty->assign('server_name', $_SERVER['SERVER_NAME']);
         foreach ($watchers as $w) {
             $mail = new TikiMail($w['user']);
             $mail->setHeader("From", $prefs['sender_email']);
             $mail->setSubject($smarty->fetchLang($w['lang'], 'mail/tracker_changed_notification_subject.tpl'));
             $mail->setText($smarty->fetchLang($w['lang'], 'mail/tracker_changed_notification.tpl'));
             $mail->send(array($w['email']));
         }
     }
     $query = "update `tiki_trackers` set `lastModif`=? where `trackerId`=?";
     $result = $this->query($query, array((int) $this->now, (int) $trackerId));
     $query = "update `tiki_trackers` set `items`=`items`-1 where `trackerId`=?";
     $result = $this->query($query, array((int) $trackerId));
     $query = "delete from `tiki_tracker_item_fields` where `itemId`=?";
     $result = $this->query($query, array((int) $itemId));
     $query = "delete from `tiki_tracker_items` where `itemId`=?";
     $result = $this->query($query, array((int) $itemId));
     $query = "delete from `tiki_tracker_item_comments` where `itemId`=?";
     $result = $this->query($query, array((int) $itemId));
     $query = "delete from `tiki_tracker_item_attachments` where `itemId`=?";
     $result = $this->query($query, array((int) $itemId));
     // ---- delete image from disk -------------------------------------
     foreach ($imgList as $img) {
         if (file_exists($img)) {
             unlink($img);
         }
     }
     global $cachelib;
     require_once 'lib/cache/cachelib.php';
     $cachelib->invalidate('trackerItemLabel' . $itemId);
     foreach ($fieldList['data'] as $f) {
         $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . $status));
         $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'opc'));
         $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'opc'));
         if ($status == 'o') {
             $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'op'));
             $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'oc'));
         } elseif ($status == 'c') {
             $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'oc'));
             $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'pc'));
         } elseif ($status == 'p') {
             $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'op'));
             $cachelib->invalidate(md5('trackerfield' . $f['fieldId'] . 'pc'));
         }
     }
     $options = $this->get_tracker_options($trackerId);
     if (isset($option) && isset($option['autoCreateCategories']) && $option['autoCreateCategories'] == 'y') {
         $currentCategId = $categlib->get_category_id("Tracker Item {$itemId}");
         $categlib->remove_category($currentCategId);
     }
     return true;
 }
function wikiplugin_tracker($data, $params)
{
    global $tikilib, $userlib, $dbTiki, $user, $group, $page, $tiki_p_admin, $tiki_p_create_tracker_items, $smarty, $prefs, $trklib, $tiki_p_tracker_vote_ratings;
    include_once 'lib/trackers/trackerlib.php';
    //var_dump($_REQUEST);
    extract($params, EXTR_SKIP);
    if ($prefs['feature_trackers'] != 'y') {
        return $smarty->fetch("wiki-plugins/error_tracker.tpl");
    }
    if (empty($trackerId) || !($tracker = $trklib->get_tracker($trackerId))) {
        return $smarty->fetch("wiki-plugins/error_tracker.tpl");
    }
    if ($t = $trklib->get_tracker_options($trackerId)) {
        $tracker = array_merge($tracker, $t);
    }
    if (empty($trackerId) && !empty($view) && $view == 'user' && $prefs['userTracker'] == 'y') {
        // the user tracker item
        $utid = $userlib->get_tracker_usergroup($user);
        if (!empty($utid) && !empty($utid['usersTrackerId'])) {
            $itemId = $trklib->get_item_id($utid['usersTrackerId'], $utid['usersFieldId'], $user);
            $trackerId = $utid['usersTrackerId'];
            $usertracker = true;
        }
    } elseif (!empty($trackerId) && !empty($view) && $view == 'user') {
        // the user item of a tracker
        $itemId = $trklib->get_user_item($trackerId, $tracker);
        $usertracker = true;
    } elseif (!empty($trackerId) && !empty($_REQUEST['view_user'])) {
        $itemId = $trklib->get_user_item($trackerId, $tracker, $_REQUEST['view_user']);
    }
    if (!isset($trackerId)) {
        return $smarty->fetch("wiki-plugins/error_tracker.tpl");
    }
    if (!isset($embedded)) {
        $embedded = "n";
    }
    if (!isset($showtitle)) {
        $showtitle = "n";
    }
    if (!isset($showdesc)) {
        $showdesc = "n";
    }
    if (!isset($sort)) {
        $sort = 'n';
    }
    if (!isset($action)) {
        $action = 'Save';
    }
    if (isset($preview)) {
        if (empty($preview)) {
            $preview = 'Preview';
        }
    } else {
        unset($_REQUEST['tr_preview']);
    }
    if (!isset($showmandatory)) {
        $showmandatory = 'y';
    }
    $smarty->assign('showmandatory', $showmandatory);
    if (isset($values)) {
        if (!is_array($values)) {
            $values = explode(':', $values);
        }
    }
    if (isset($_REQUEST['values'])) {
        if (is_array($_REQUEST['values'])) {
            foreach ($_REQUEST['values'] as $i => $k) {
                $_REQUEST['values'][$i] = urldecode($k);
            }
        } else {
            $_REQUEST['values'] = urldecode($_REQUEST['values']);
        }
    }
    if (empty($_SERVER['SCRIPT_NAME']) || !strstr($_SERVER['SCRIPT_NAME'], 'tiki-register.php')) {
        if (!empty($itemId) && $tracker['writerCanModify'] == 'y' && isset($usertracker) && $usertracker) {
            // user tracker he can modify
        } else {
            $perms = $tikilib->get_perm_object($trackerId, 'tracker', $tracker, false);
            if ($perms['tiki_p_create_tracker_items'] == 'n' && empty($itemId)) {
                return '<b>' . tra("You do not have permission to insert an item") . '</b>';
            } elseif ($perms['tiki_p_modify_tracker_items'] == 'n' && !empty($itemId)) {
                return '<b>' . tra("You do not have permission to modify an item") . '</b>';
            }
        }
    }
    if (isset($_REQUEST['removeattach']) && $tracker['useAttachments'] == 'y') {
        $owner = $trklib->get_item_attachment_owner($_REQUEST['removeattach']);
        if ($tiki_p_wiki_admin_attachments == 'y' || $user && $user == $owner) {
            $trklib->remove_item_attachment($_REQUEST["removeattach"]);
            unset($_REQUEST['removeattach']);
        }
    }
    if (isset($_REQUEST['removeImage']) && !empty($_REQUEST['trackerId']) && !empty($_REQUEST['itemId']) && !empty($_REQUEST['fieldId']) && !empty($_REQUEST['fieldName'])) {
        $img_field = array('data' => array());
        $img_field['data'][] = array('fieldId' => $_REQUEST['fieldId'], 'type' => 'i', 'name' => $_REQUEST['fieldName'], 'value' => 'blank');
        $trklib->replace_item($_REQUEST['trackerId'], $_REQUEST['itemId'], $img_field);
    }
    $back = '';
    $thisIsThePlugin = isset($_REQUEST['trackit']) && $_REQUEST['trackit'] == $trackerId && (isset($_REQUEST['fields']) && isset($params['fields']) && $_REQUEST['fields'] == $params['fields'] || !isset($_REQUEST['fields']) && !isset($params['fields']));
    if (!isset($_REQUEST["ok"]) || $_REQUEST["ok"] == "n" || !$thisIsThePlugin || isset($_REQUEST['tr_preview'])) {
        $field_errors = array('err_mandatory' => array(), 'err_value' => array());
        global $notificationlib;
        include_once 'lib/notifications/notificationlib.php';
        $tracker = $trklib->get_tracker($trackerId);
        $tracker = array_merge($tracker, $trklib->get_tracker_options($trackerId));
        if (!empty($tracker['start']) && $tikilib->now < $tracker['start'] || !empty($tracker['end']) && $tikilib->now > $tracker['end']) {
            return;
        }
        $flds = $trklib->list_tracker_fields($trackerId, 0, -1, "position_asc", "");
        $bad = array();
        $embeddedId = false;
        $onemandatory = false;
        $full_fields = array();
        $mainfield = '';
        if ($thisIsThePlugin) {
            /* ------------------------------------- Recup all values from REQUEST -------------- */
            $cpt = 0;
            if (isset($fields)) {
                $fields_plugin = split(':', $fields);
            }
            foreach ($flds['data'] as $fl) {
                // store value to display it later if form
                // isn't fully filled.
                if (($flds['data'][$cpt]['type'] == 'u' || $flds['data'][$cpt]['type'] == 'g' || $flds['data'][$cpt]['type'] == 'I') && ($flds['data'][$cpt]['options_array'][0] == '1' || $flds['data'][$cpt]['options_array'][0] == '2') && $tiki_p_admin_trackers != 'y' && empty($_REQUEST['track'][$fl['fieldId']])) {
                    if (empty($itemId) && ($flds['data'][$cpt]['options_array'][0] == '1' || $flds['data'][$cpt]['options_array'][0] == '2')) {
                        if ($flds['data'][$cpt]['type'] == 'u') {
                            $_REQUEST['track'][$fl['fieldId']] = empty($user) ? empty($_REQUEST['name']) ? '' : $_REQUEST['name'] : $user;
                        } elseif ($flds['data'][$cpt]['type'] == 'g') {
                            $_REQUEST['track'][$fl['fieldId']] = $group;
                        } elseif ($flds['data'][$cpt]['type'] == 'I') {
                            $_REQUEST['track'][$fl['fieldId']] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
                        }
                    } elseif (!empty($itemId) && $flds['data'][$cpt]['options_array'][0] == '2') {
                        if ($flds['data'][$cpt]['type'] == 'u') {
                            $_REQUEST['track'][$fl['fieldId']] = $user;
                        } elseif ($flds['data'][$cpt]['type'] == 'g') {
                            $_REQUEST['track'][$fl['fieldId']] = $group;
                        } elseif ($flds['data'][$cpt]['type'] == 'I') {
                            $_REQUEST['track'][$fl['fieldId']] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
                        }
                    }
                } elseif ($flds['data'][$cpt]['type'] == 'f') {
                    $ins_id = 'track_' . $fl['fieldId'];
                    if (isset($_REQUEST[$ins_id . 'Day'])) {
                        if (empty($_REQUEST['$ins_id' . 'Hour'])) {
                            $_REQUEST['$ins_id' . 'Hour'] = 0;
                        }
                        if (empty($_REQUEST['$ins_id' . 'Minute'])) {
                            $_REQUEST['$ins_id' . 'Minute'] = 0;
                        }
                        $_REQUEST['track'][$fl['fieldId']] = $tikilib->make_time($_REQUEST["{$ins_id}" . "Hour"], $_REQUEST["{$ins_id}" . "Minute"], 0, $_REQUEST["{$ins_id}" . "Month"], $_REQUEST["{$ins_id}" . "Day"], $_REQUEST["{$ins_id}" . "Year"]);
                    } else {
                        $_REQUEST['track'][$fl['fieldId']] = $tikilib->now;
                    }
                }
                if (isset($_REQUEST['ins_cat_' . $fl['fieldId']])) {
                    // to remember if error
                    $_REQUEST['track'][$fl['fieldId']] = $_REQUEST['ins_cat_' . $fl['fieldId']];
                }
                if (isset($_REQUEST['track'][$fl['fieldId']])) {
                    $flds['data'][$cpt]['value'] = $_REQUEST['track'][$fl['fieldId']];
                } else {
                    $flds['data'][$cpt]['value'] = '';
                    if ($fl['type'] == 'c' && (empty($fields_plugin) || in_array($fl['fieldId'], $fields_plugin))) {
                        $_REQUEST['track'][$fl['fieldId']] = 'n';
                    } elseif ($fl['type'] == 'R' && $fl['isMandatory'] == 'y' && !isset($_REQUEST['track'][$fl['fieldId']])) {
                        // if none radio is selected, there will be no value and no error if mandatory
                        if (empty($fields_plugin) || in_array($fl['fieldId'], $fields_plugin)) {
                            $_REQUEST['track'][$fl['fieldId']] = '';
                        }
                    }
                }
                if (!empty($_REQUEST['other_track'][$fl['fieldId']])) {
                    $flds['data'][$cpt]['value'] = $_REQUEST['other_track'][$fl['fieldId']];
                }
                $full_fields[$fl['fieldId']] = $fl;
                if ($embedded == 'y' and $fl['name'] == 'page') {
                    $embeddedId = $fl['fieldId'];
                }
                if ($fl['isMain'] == 'y') {
                    $mainfield = $flds['data'][$cpt]['value'];
                }
                $cpt++;
            }
            /*foreach */
            if (isset($_REQUEST['track'])) {
                foreach ($_REQUEST['track'] as $fld => $val) {
                    //$ins_fields["data"][] = array('fieldId' => $fld, 'value' => $val, 'type' => 1);
                    if (!empty($_REQUEST['other_track'][$fld])) {
                        $val = $_REQUEST['other_track'][$fld];
                    }
                    $ins_fields["data"][] = array_merge(array('value' => $val), $full_fields[$fld]);
                }
            }
            if (isset($_FILES['track'])) {
                // image or attachment fields
                foreach ($_FILES['track'] as $label => $w) {
                    foreach ($w as $fld => $val) {
                        if ($label == 'tmp_name' && is_uploaded_file($val)) {
                            $fp = fopen($val, 'rb');
                            $data = '';
                            while (!feof($fp)) {
                                $data .= fread($fp, 8192 * 16);
                            }
                            fclose($fp);
                            $files[$fld]['old_value'] = $files[$fld]['value'];
                            $files[$fld]['value'] = $data;
                        } else {
                            $files[$fld]['file_' . $label] = $val;
                        }
                    }
                }
                foreach ($files as $fld => $file) {
                    $ins_fields['data'][] = array_merge($file, $full_fields[$fld]);
                }
            }
            if ($embedded == 'y' && isset($_REQUEST['page'])) {
                $ins_fields["data"][] = array('fieldId' => $embeddedId, 'value' => $_REQUEST['page']);
            }
            $ins_categs = array();
            $categorized_fields = array();
            while (list($postVar, $postVal) = each($_REQUEST)) {
                if (preg_match("/^ins_cat_([0-9]+)/", $postVar, $m)) {
                    foreach ($postVal as $v) {
                        $ins_categs[] = $v;
                    }
                    $categorized_fields[] = $m[1];
                }
            }
            /* ------------------------------------- End recup all values from REQUEST -------------- */
            /* ------------------------------------- Check field values for each type and presence of mandatory ones ------------------- */
            $field_errors = $trklib->check_field_values($ins_fields, $categorized_fields);
            if (empty($user) && $prefs['feature_antibot'] == 'y') {
                if (!isset($_SESSION['random_number']) || $_SESSION['random_number'] != $_REQUEST['antibotcode']) {
                    $field_errors['err_antibot'] = 'y';
                }
            }
            if (count($field_errors['err_mandatory']) == 0 && count($field_errors['err_value']) == 0 && empty($field_errors['err_antibot']) && !isset($_REQUEST['tr_preview'])) {
                /* ------------------------------------- save the item ---------------------------------- */
                if (!isset($itemId)) {
                    $itemId = $trklib->get_user_item($trackerId, $tracker);
                }
                if (isset($_REQUEST['status'])) {
                    $status = $_REQUEST['status'];
                } elseif (isset($newstatus) && ($newstatus == 'o' || $newstatus == 'c' || $newstatus == 'p')) {
                    $status = $newstatus;
                } elseif (empty($itemId) && isset($tracker['newItemStatus'])) {
                    $status = $tracker['newItemStatus'];
                } else {
                    $status = '';
                }
                $rid = $trklib->replace_item($trackerId, $itemId, $ins_fields, $status, $ins_categs);
                $trklib->categorized_item($trackerId, $rid, $mainfield, $ins_categs);
                if (!empty($email)) {
                    $emailOptions = split("\\|", $email);
                    if (is_numeric($emailOptions[0])) {
                        $emailOptions[0] = $trklib->get_item_value($trackerId, $rid, $emailOptions[0]);
                    }
                    if (empty($emailOptions[0])) {
                        // from
                        $emailOptions[0] = $prefs['sender_email'];
                    }
                    if (empty($emailOptions[1])) {
                        // to
                        $emailOptions[1][0] = $prefs['sender_email'];
                    } else {
                        $emailOptions[1] = split(',', $emailOptions[1]);
                        foreach ($emailOptions[1] as $key => $email) {
                            if (is_numeric($email)) {
                                $emailOptions[1][$key] = $trklib->get_item_value($trackerId, $rid, $email);
                            }
                        }
                    }
                    if (!empty($emailOptions[2])) {
                        //tpl
                        if (!preg_match('/\\.tpl$/', $emailOptions[2])) {
                            $emailOptions[2] .= '.tpl';
                        }
                        $tplSubject = str_replace('.tpl', '_subject.tpl', $emailOptions[2]);
                    } else {
                        $emailOptions[2] = 'tracker_changed_notification.tpl';
                    }
                    if (empty($tplSubject)) {
                        $tplSubject = 'tracker_changed_notification_subject.tpl';
                    }
                    include_once 'lib/webmail/tikimaillib.php';
                    $mail = new TikiMail();
                    @($mail_data = $smarty->fetch('mail/' . $tplSubject));
                    if (empty($mail_data)) {
                        $mail_data = tra('Tracker was modified at ') . $_SERVER["SERVER_NAME"];
                    }
                    $mail->setSubject($mail_data);
                    $mail_data = $smarty->fetch('mail/' . $emailOptions[2]);
                    $mail->setText($mail_data);
                    $mail->setHeader('From', $emailOptions[0]);
                    $mail->send($emailOptions[1]);
                }
                if (empty($url)) {
                    if (!empty($page)) {
                        $url = "tiki-index.php?page=" . urlencode($page) . "&ok=y&trackit={$trackerId}";
                        if (!empty($params['fields'])) {
                            $url .= "&fields=" . urlencode($params['fields']);
                        }
                        $url .= "#wikiplugin_tracker{$trackerId}";
                        header("Location: {$url}");
                        die;
                    } else {
                        return '';
                    }
                } else {
                    header("Location: {$url}");
                    die;
                }
                /* ------------------------------------- end save the item ---------------------------------- */
            } elseif (isset($_REQUEST['trackit']) and $_REQUEST['trackit'] == $trackerId) {
                $smarty->assign('wikiplugin_tracker', $trackerId);
                //used in vote plugin
            }
        } else {
            if (!empty($values) || (!empty($_REQUEST['values']) and empty($_REQUEST['prefills']))) {
                // assign default values for each filedId specify
                if (empty($values)) {
                    // url with values[]=x&values[] witouth the list of fields
                    $values = $_REQUEST['values'];
                }
                if (!is_array($values)) {
                    $values = array($values);
                }
                if (isset($fields)) {
                    $fl = split(':', $fields);
                    for ($j = 0; $j < count($fl); $j++) {
                        for ($i = 0; $i < count($flds['data']); $i++) {
                            if ($flds['data'][$i]['fieldId'] == $fl[$j]) {
                                $flds['data'][$i]['value'] = $values[$j];
                            }
                        }
                    }
                } else {
                    // values contains all the fields value in the default order
                    $i = 0;
                    foreach ($values as $value) {
                        $flds['data'][$i++]['value'] = $value;
                    }
                }
            } elseif (!empty($itemId)) {
                if (isset($fields)) {
                    $fl = split(':', $fields);
                    $filter = '';
                    foreach ($flds['data'] as $f) {
                        if (in_array($f['fieldId'], $fl)) {
                            $filter[] = $f;
                        }
                    }
                } else {
                    $filter =& $flds['data'];
                }
                if (!empty($filter)) {
                    $flds['data'] = $trklib->get_item_fields($trackerId, $itemId, $filter, $itemUser);
                }
            } else {
                if (isset($_REQUEST['values']) && isset($_REQUEST['prefills'])) {
                    //url:prefields=1:2&values[]=x&values[]=y
                    if (!is_array($_REQUEST['values'])) {
                        $_REQUEST['values'] = array($_REQUEST['values']);
                    }
                    $fl = split(':', $_REQUEST['prefills']);
                } else {
                    unset($fl);
                }
                for ($i = 0; $i < count($flds['data']); $i++) {
                    if (isset($fl) && ($j = array_search($flds['data'][$i]['fieldId'], $fl)) !== false) {
                        $flds['data'][$i]['value'] = $_REQUEST['values'][$j];
                    } else {
                        $flds['data'][$i]['value'] = '';
                        // initialize fields with blank values
                    }
                }
            }
        }
        $optional = array();
        $outf = array();
        if (isset($fields) && !empty($fields)) {
            $fl = split(":", $fields);
            if ($sort == 'y') {
                $flds = $trklib->sort_fields($flds, $fl);
            }
            foreach ($fl as $l) {
                if (substr($l, 0, 1) == '-') {
                    $l = substr($l, 1);
                    $optional[] = $l;
                }
                $ok = false;
                foreach ($flds['data'] as $f) {
                    if ($f['fieldId'] == $l) {
                        $ok = true;
                        break;
                    }
                }
                if (!$ok) {
                    $back .= tra('Incorrect fieldId:') . ' ' . $l;
                }
                $outf[] = $l;
            }
        } elseif (!isset($fields)) {
            foreach ($flds['data'] as $f) {
                if ($f['isMandatory'] == 'y') {
                    $optional[] = $f['fieldId'];
                }
                $outf[] = $f['fieldId'];
            }
        }
        // Display warnings when needed
        if (count($field_errors['err_mandatory']) > 0) {
            $back .= '<div class="simplebox highlight"><img src="pics/icons/exclamation.png" alt=" ' . tra('Error') . '" style="vertical-align:middle" /> ';
            $back .= tra('Following mandatory fields are missing') . '&nbsp;:<br/>';
            $coma_cpt = count($field_errors['err_mandatory']);
            foreach ($field_errors['err_mandatory'] as $f) {
                $back .= $f['name'];
                $back .= --$coma_cpt > 0 ? ',&nbsp;' : '';
            }
            $back .= '</div><br />';
            $_REQUEST['error'] = 'y';
        }
        if (count($field_errors['err_value']) > 0) {
            $back .= '<div class="simplebox highlight">';
            $b = '';
            foreach ($field_errors['err_value'] as $f) {
                if (!empty($f['errorMsg'])) {
                    $back .= tra($f['errorMsg']) . '<br>';
                } else {
                    if (!empty($b)) {
                        $b .= ' : ';
                    }
                    $b .= $f['name'];
                }
            }
            if (!empty($b)) {
                $back .= tra('Following fields are incorrect') . '&nbsp;:<br/>' . $b;
            }
            $back .= '</div><br />';
            $_REQUEST['error'] = 'y';
        }
        if (isset($field_errors['err_antibot'])) {
            $back .= '<div class="simplebox highlight"><img src="pics/icons/exclamation.png" alt=" ' . tra('Error') . '" style="vertical-align:middle" /> ';
            $back .= tra('You have mistyped the anti-bot verification code; please try again.');
            $back .= '</div><br />';
            $_REQUEST['error'] = 'y';
        }
        if (count($field_errors['err_mandatory']) > 0 || count($field_errors['err_value']) > 0 || isset($field_errors['err_antibot'])) {
            $smarty->assign('input_err', 'y');
        }
        if (!empty($page)) {
            $back .= '~np~';
        }
        $back .= '<form enctype="multipart/form-data" method="post"><input type="hidden" name="trackit" value="' . $trackerId . '" />';
        if (isset($fields)) {
            $back .= '<input type="hidden" name="fields" value="' . $params['fields'] . '" />';
        }
        //if plugin inserted twice with the same trackerId
        if (!empty($_REQUEST['page'])) {
            $back .= '<input type="hidden" name="page" value="' . $_REQUEST["page"] . '" />';
        }
        $back .= '<input type="hidden" name="refresh" value="1" />';
        if (isset($_REQUEST['page'])) {
            $back .= '<input type="hidden" name="page" value="' . $_REQUEST["page"] . '" />';
        }
        // for registration
        if (isset($_REQUEST['name'])) {
            $back .= '<input type="hidden" name="name" value="' . $_REQUEST["name"] . '" />';
        }
        if (isset($_REQUEST['pass'])) {
            $back .= '<input type="hidden" name="pass" value="' . $_REQUEST["pass"] . '" />';
            $back .= '<input type="hidden" name="passAgain" value="' . $_REQUEST["pass"] . '" />';
        }
        if (isset($_REQUEST['email'])) {
            $back .= '<input type="hidden" name="email" value="' . $_REQUEST["email"] . '" />';
        }
        if (isset($_REQUEST['regcode'])) {
            $back .= '<input type="hidden" name="regcode" value="' . $_REQUEST["regcode"] . '" />';
        }
        if (isset($_REQUEST['chosenGroup'])) {
            // for registration
            $back .= '<input type="hidden" name="chosenGroup" value="' . $_REQUEST["chosenGroup"] . '" />';
        }
        if (isset($_REQUEST['register'])) {
            $back .= '<input type="hidden" name="register" value="' . $_REQUEST["register"] . '" />';
        }
        if ($showtitle == 'y') {
            $back .= '<div class="titlebar">' . $tracker["name"] . '</div>';
        }
        if ($showdesc == 'y' && $tracker['description']) {
            if ($tracker["descriptionIsParsed"] == 'y') {
                $back .= '<div class="wikitext">' . $tikilib->parse_data($tracker["description"], 'false') . '</div><br />';
            } else {
                $back .= '<div class="wikitext">' . $tracker["description"] . '</div><br />';
            }
        }
        if (isset($_REQUEST['tr_preview'])) {
            // use for the computed and join fields
            $assocValues = array();
            $assocNumerics = array();
            foreach ($flds['data'] as $f) {
                if (empty($f['value']) && ($f['type'] == 'u' || $f['type'] == 'g' || $f['type'] == 'I') && ($f['options_array'][0] == '1' || $f['options_array'][0] == '2')) {
                    //need to fill the selector fields for the join
                    $f['value'] = $f['type'] == 'I' ? $_SERVER['REMOTE_ADDR'] : ($f['type'] == 'g' ? $group : $user);
                }
                $assocValues[$f['fieldId']] = $f['value'];
                $assocNumerics[$f['fieldId']] = preg_replace('/[^0-9\\.\\+]/', '', $f['value']);
                // get rid off the $ and such unit
            }
        }
        if (!empty($itemId)) {
            $item = array('itemId' => $itemId, 'trackerId' => $trackerId);
        }
        foreach ($flds['data'] as $i => $f) {
            // collect additional infos
            if (in_array($f['fieldId'], $outf)) {
                $flds['data'][$i]['ins_id'] = $f['type'] == 'e' ? 'ins_cat_' . $f['fieldId'] : ($f['type'] == 'f' ? 'track_' . $f['fieldId'] : 'track[' . $f['fieldId'] . ']');
                if ($f['isHidden'] == 'c' && !empty($itemId) && !isset($item['creator'])) {
                    $item['creator'] = $trklib->get_item_creator($trackerId, $itemId);
                }
                if ($f['type'] == 's' && ($f['name'] == 'Rating' || $f['name'] == tra('Rating')) && $tiki_p_tracker_vote_ratings == 'y' && isset($item)) {
                    $item['my_rate'] = $tikilib->get_user_vote("tracker{$trackerId}.{$itemId}", $user);
                }
                if ($f['type'] == 'r') {
                    $flds['data'][$i]['list'] = array_unique($trklib->get_all_items($f['options_array'][0], $f['options_array'][1], 'o'));
                    if (isset($f['options_array'][3])) {
                        $flds['data'][$i]['displayedList'] = array_unique($trklib->concat_all_items_from_fieldslist($f['options_array'][0], $f['options_array'][3]));
                    }
                } elseif ($f['type'] == 'y') {
                    $flds['data'][$i]['flags'] = $tikilib->get_flags();
                    if ($prefs['language'] != 'en') {
                        foreach ($flags as $flag) {
                            $flagsTranslated[] = $tikilib->take_away_accent(tra($flag));
                        }
                        array_multisort($flagsTranslated, $flds['data'][$i]['flags']);
                    }
                } elseif ($f['type'] == 'u') {
                    if ($tiki_p_admin == 'y' || $f['options_array'][0] != 1 && $f['options_array'][0] != 2) {
                        $flds['data'][$i]['list'] = $userlib->list_all_users();
                    }
                } elseif ($f['type'] == 'g') {
                    if ($tiki_p_admin == 'y' || $f['options_array'][0] != 1 && $f['options_array'][0] != 2) {
                        $flds['data'][$i]['list'] = $userlib->list_all_groups();
                    }
                } elseif ($f['type'] == 'e') {
                    global $categlib;
                    include_once 'lib/categories/categlib.php';
                    $flds['data'][$i]['list'] = $categlib->get_child_categories($f["options_array"][0]);
                } elseif ($f['type'] == 'A') {
                    if (!empty($f['value'])) {
                        $flds['data'][$i]['info'] = $trklib->get_item_attachment($f['value']);
                    }
                } elseif ($f['type'] == 'a') {
                    if ($f['options_array'][0] == 1 && empty($quicktags)) {
                        global $quicktagslib;
                        include_once 'lib/quicktags/quicktagslib.php';
                        $quicktags = $quicktagslib->list_quicktags(0, -1, 'taglabel_desc', '', 'trackers');
                        $smarty->assign_by_ref('quicktags', $quicktags['data']);
                    }
                }
            }
        }
        // Loop on tracker fields and display form
        if (empty($tpl) && empty($wiki)) {
            $back .= '<table class="wikiplugin_tracker">';
        } else {
            $back .= '<div class="wikiplugin_tracker">';
        }
        $backLength0 = strlen($back);
        foreach ($flds['data'] as $f) {
            if ($f['type'] == 'u' and $f['options_array'][0] == '1') {
                $back .= '<input type="hidden" name="authorfieldid" value="' . $f['fieldId'] . '" />';
            }
            if ($f['type'] == 'I' and $f['options_array'][0] == '1') {
                $back .= '<input type="hidden" name="authoripid" value="' . $f['fieldId'] . '" />';
            }
            if ($f['type'] == 'g' and $f['options_array'][0] == '1') {
                $back .= '<input type="hidden" name="authorgroupfieldid" value="' . $f['fieldId'] . '" />';
            }
            if ($f['type'] == 'q') {
                $back .= '<input type="hidden" name="track[' . $f['fieldId'] . ']" />';
            }
            if (in_array($f['fieldId'], $outf)) {
                if (!empty($tpl) || !empty($wiki)) {
                    $smarty->assign_by_ref('field_value', $f);
                    $smarty->assign('f_' . $f['fieldId'], $smarty->fetch('tracker_item_field_input.tpl'));
                } elseif (true) {
                    // comment this block in problem
                    if (in_array($f['fieldId'], $optional)) {
                        $f['name'] = "<i>" . $f['name'] . "</i>";
                    }
                    if ($f['type'] != 'h') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                    } else {
                        $back .= "<tr><td class='heading' colspan='2'>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                    }
                    $smarty->assign_by_ref('field_value', $f);
                    if (isset($item)) {
                        $smarty->assign_by_ref('item', $item);
                    }
                    $back .= $smarty->fetch('tracker_item_field_input.tpl');
                } else {
                    //old
                    // numeric or text field
                    if ($f['type'] == 't' or $f['type'] == 'n' and $f["fieldId"] != $embeddedId or $f['type'] == 'm') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        if ($f['type'] != 'h') {
                            $back .= "</td><td>";
                        }
                        $back .= '<input type="text" name="track[' . $f["fieldId"] . ']" value="' . $f['value'] . '"';
                        if (isset($f['options_array'][1])) {
                            $back .= 'size="' . $f['options_array'][1] . '" maxlength="' . $f['options_array'][1] . '"';
                        } else {
                            $back .= 'size="30"';
                        }
                        $back .= '/>';
                        // item link
                    } elseif ($f['type'] == 'r') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                        $back .= '<select name="track[' . $f["fieldId"] . ']">';
                        $back .= '<option value=""></option>';
                        foreach ($f['list'] as $key => $item) {
                            $selected = $f['value'] == $item ? 'selected="selected"' : '';
                            $back .= '<option value="' . $item . '" ' . $selected . '>';
                            $back .= isset($f['displayedList'][$key]) ? $f['displayedList'][$key] : $item;
                            $back .= '</option>';
                        }
                        $back .= "</select>";
                        // country
                    } elseif ($f['type'] == 'y') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                        $back .= '<select name="track[' . $f["fieldId"] . ']">';
                        $back .= '<option value=""></option>';
                        foreach ($f['flags'] as $flag) {
                            $selected = $f['value'] == $flag ? 'selected="selected"' : '';
                            if (!isset($f['options_array'][0]) || $f['options_array'][0] != '1') {
                                $selected .= ' style="background-image:url(\'img/flags/' . $flag . '.gif\');background-repeat:no-repeat;padding-left:25px;padding-bottom:3px;"';
                            }
                            $back .= '<option value="' . $flag . '" ' . $selected . '>' . tra($flag) . '</option>';
                        }
                        $back .= "</select>";
                        // textarea
                    } elseif ($f['type'] == 'a') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                        if (isset($f['options_array'][1])) {
                            $back .= '<textarea cols="' . $f['options_array'][1] . '" rows="' . $f['options_array'][2] . '" name="track[' . $f["fieldId"] . ']" wrap="soft">' . $f['value'] . '</textarea>';
                        } else {
                            $back .= '<textarea cols="29" rows="7" name="track[' . $f["fieldId"] . ']" wrap="soft">' . $f['value'] . '</textarea>';
                        }
                        // user selector
                    } elseif (($f['type'] == 'u' or $f['type'] == 'g' or $f['type'] == 'I') and ($f['options_array'][0] == '1' or $f['options_array'][0] == '2')) {
                        $back .= '<tr><td>' . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors) . '</td><td>';
                        $back .= $f['type'] == 'I' ? $_SERVER['REMOTE_ADDR'] : ($f['type'] == 'g' ? $group : $user);
                        // drop down, user selector or group selector
                    } elseif ($f['type'] == 'd' or $f['type'] == 'D' or $f['type'] == 'u' or $f['type'] == 'g' or $f['type'] == 'r' or $f['type'] == 'R') {
                        if ($f['type'] == 'd' or $f['type'] == 'D' or $f['type'] == 'R') {
                            $list = $f['options_array'];
                        } elseif ($f['type'] == 'u') {
                            $list = $f['list'];
                        } elseif ($f['type'] == 'g') {
                            $list = $f['list'];
                        }
                        if ($list) {
                            $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                            if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                                $back .= "&nbsp;<b>*</b>&nbsp;";
                                $onemandatory = true;
                            }
                            $back .= "</td><td>";
                            if ($f['type'] == 'R') {
                                foreach ($list as $item) {
                                    $selected = $f['value'] == $item || empty($f['value']) && !empty($f['defaultvalue']) && $item == $f['defaultvalue'] ? 'checked="checked"' : '';
                                    $back .= '<div class="radio"><input type="radio" name="track[' . $f["fieldId"] . ']" value="' . $item . '" ' . $selected . ' />' . $item . '</div>';
                                }
                            } else {
                                $back .= '<select name="track[' . $f["fieldId"] . ']">';
                                $back .= '<option value=""></option>';
                                $otherValue = $f['value'];
                                foreach ($list as $item) {
                                    if ($f['value'] == $item || empty($f['value']) && !empty($f['defaultvalue']) && $item == $f['defaultvalue']) {
                                        $selected = 'selected="selected"';
                                        $otherValue = '';
                                    } else {
                                        $selected = '';
                                    }
                                    $back .= '<option value="' . $item . '" ' . $selected . '>' . tra($item) . '</option>';
                                }
                                $back .= "</select>";
                            }
                            if ($f['type'] == 'D') {
                                $back .= '<br />' . tra('Other:') . ' <input type="text" name="track_other[' . $f["fieldId"] . ']" value="' . $otherValue . '" />';
                            }
                        } else {
                            $back .= '<input type="hidden" name="track[' . $f["fieldId"] . ']" value="' . $user . '" />';
                        }
                    } elseif ($f['type'] == 'h') {
                        if (strlen($back) != $backLength0) {
                            $back .= '</td></tr>';
                        }
                        $back .= "<tr><td colspan=\"2\" class=\"trackerheader\"><h2>";
                        $n = wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        $back .= $n ? $n : ' ' . '</h2>';
                        if (!empty($f['description'])) {
                            $back .= '<i>' . $f['description'] . '</i>';
                        }
                    } elseif ($f['type'] == 'e') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                        $i = 0;
                        if (!empty($f['options_array'][2]) && ($f['options_array'][2] == '1' || $f['options_array'][2] == 'y')) {
                            $back .= '<script type="text/javascript"> /* <![CDATA[ */';
                            $back .= "document.write('<div class=\"categSelectAll\"><input type=\"checkbox\" onclick=\"switchCheckboxes(this.form,\\'ins_cat_{$f['fieldId']}[]\\',this.checked)\"/>";
                            $back .= tra('Select All');
                            $back .= "</div>')/* ]]> */</script>";
                        }
                        if (isset($f['options_array'][1]) && ($f['options_array'][1] == 'd' || $f['options_array'][1] == 'm')) {
                            $back .= '<select name="ins_cat_' . $f['fieldId'] . '[]"';
                            if ($f['options_array'][1] == 'm') {
                                $back .= ' multiple="multiple"';
                            }
                            $back .= '>';
                            if ($f['options_array'][1] == 'd') {
                                $back .= '<option value=""></option>"';
                            }
                            foreach ($f['list'] as $cat) {
                                $checked = $f['value'] == $cat['categId'] ? 'selected="selected"' : '';
                                $back .= '<option value="' . $cat['categId'] . '" ' . $checked . '>' . $cat['name'] . '</option>';
                            }
                            $back .= '</select>';
                        } else {
                            $t = isset($f["options_array"][1]) && $f["options_array"][1] == 'radio' ? 'radio' : 'checkbox';
                            foreach ($f['list'] as $cat) {
                                $checked = $f['value'] == $cat['categId'] ? 'checked="checked"' : '';
                                $back .= '<input type="' . $t . '" name="ins_cat_' . $f['fieldId'] . '[]" value="' . $cat["categId"] . '" ' . $checked . '>' . $cat['name'] . '</input><br />';
                            }
                        }
                    } elseif ($f['type'] == 'c') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $checked = $f['value'] == 'y' ? 'checked="checked"' : '';
                        $back .= '</td><td><input type="checkbox" name="track[' . $f["fieldId"] . ']" value="y" ' . $checked . '/>';
                    } elseif ($f['type'] == 'i') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                        $back .= '<input type="file" name="track[' . $f["fieldId"] . ']" />';
                    } elseif ($f['type'] == 'f') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                        include_once 'lib/smarty_tiki/function.html_select_date.php';
                        include_once 'lib/smarty_tiki/function.html_select_time.php';
                        $params['prefix'] = 'track_' . $f['fieldId'];
                        if (isset($f['options_array'][1])) {
                            $params['start_year'] = $f['options_array'][1];
                        }
                        if (isset($f['options_array'][2])) {
                            $params['end_year'] = $f['options_array'][2];
                        }
                        if (isset($f['value'])) {
                            $params['time'] = $f['value'];
                        }
                        $back .= smarty_function_html_select_date($params, $smarty);
                        if (empty($f['options_array'][0]) || $f['options_array'][0] != 'd') {
                            $params['display_seconds'] = false;
                            $back .= smarty_function_html_select_time($params, $smarty);
                        }
                    } elseif ($f['type'] == 'j') {
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors);
                        if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
                            $back .= "&nbsp;<b>*</b>&nbsp;";
                            $onemandatory = true;
                        }
                        $back .= "</td><td>";
                        include_once 'lib/smarty_tiki/function.jscalendar.php';
                        $params['id'] = 'track[' . $f['fieldId'] . ']';
                        $params['fieldname'] = 'track[' . $f['fieldId'] . ']';
                        if (empty($f['options_array'][0]) || $f['options_array'][0] != 'd') {
                            $params['showtime'] = 'y';
                        } else {
                            $params['showtime'] = 'n';
                        }
                        if (isset($f['value'])) {
                            $params['date'] = $f['value'];
                        }
                        $back .= smarty_function_jscalendar_body($params, $smarty);
                    } elseif ($f['type'] == 'C' && isset($_REQUEST['tr_preview'])) {
                        // computed
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors) . "</td><td>";
                        $calc = preg_replace('/#([0-9]+)/', '$assocNumerics[\\1]', $f['options_array'][0]);
                        eval('$computed = ' . $calc . ';');
                        $back .= $computed;
                    } elseif ($f['type'] == 'l' && isset($_REQUEST['tr_preview'])) {
                        // itemlist
                        $back .= "<tr><td>" . wikiplugin_tracker_name($f['fieldId'], $f['name'], $field_errors) . "</td><td>";
                        $items = $trklib->get_items_list($f['options_array'][0], $f['options_array'][1], $assocValues[$f['options_array'][2]]);
                        $i = 0;
                        foreach ($items as $id) {
                            $value = $trklib->get_item_value($f['options_array'][0], $id, $f['options_array'][3]);
                            $assocValues[$f['fieldId']] = $value;
                            // can be used in another computed field
                            $assocNumerics[$f['fieldId']] = preg_replace('/[^0-9\\.\\+]/', '', $value);
                            if ($i++ > 0) {
                                $back .= ',';
                            }
                            $back .= $value;
                        }
                    } else {
                    }
                }
                //old
                if (!empty($f['description']) && $f['type'] != 'h' && $f['type'] != 'S') {
                    $back .= '<br /><i>' . $f['description'] . '</i>';
                }
                if (empty($tpl) && empty($wiki)) {
                    $back .= "</td></tr>";
                }
            }
        }
        if (!empty($tpl)) {
            $smarty->security = true;
            $back .= $smarty->fetch($tpl);
        } elseif (!empty($wiki)) {
            $smarty->security = true;
            $back .= $smarty->fetch('wiki:' . $wiki);
        }
        if ($prefs['feature_antibot'] == 'y' && empty($user)) {
            $back .= $smarty->fetch('antibot.tpl');
        }
        if (empty($tpl) && empty($wiki)) {
            $back .= "<tr><td></td><td>";
        }
        if (!empty($preview)) {
            $back .= "<input type='submit' name='tr_preview' value='" . tra($preview) . "' />";
        }
        $back .= "<input type='submit' name='action' value='" . tra($action) . "' />";
        if ($showmandatory == 'y' and $onemandatory) {
            $back .= "<br /><i>" . tra("Fields marked with a * are mandatory.") . "</i>";
        }
        if (empty($tpl) && empty($wiki)) {
            $back .= "</td></tr>";
            $back .= "</table>";
        } else {
            $back .= '</div>';
        }
        $back .= '</form>';
        if (!empty($page)) {
            $back .= '~/np~';
        }
        return $back;
    } else {
        if (isset($_REQUEST['trackit']) and $_REQUEST['trackit'] == $trackerId) {
            $smarty->assign('wikiplugin_tracker', $trackerId);
        }
        //used in vote plugin
        $id = ' id="wikiplugin_tracker' . $trackerId . '"';
        if ($showtitle == 'y') {
            $back .= '<div class="titlebar"' . $id . '>' . $tracker["name"] . '</div>';
            $id = '';
        }
        if ($showdesc == 'y') {
            $back .= '<div class="wikitext"' . $id . '>' . $tracker["description"] . '</div><br />';
            $id = '';
        }
        $back .= "<div{$id}>" . $data . '</div>';
        return $back;
    }
}
/** \brief send the email notifications dealing with the forum changes to
 * \brief outbound address + admin notification addresses / forum admin email + watching users addresses
 * \param $event = 'forum_post_topic' or 'forum_post_thread'
 * \param $object = forumId watch if forum_post_topic or topicId watch if forum_post_thread
 * \param $threadId = topicId if forum_post_thread
 * \param $title of the message
 * \param $topicName name of the parent topic
 */
function sendForumEmailNotification($event, $object, $forum_info, $title, $data, $author, $topicName, $messageId = '', $inReplyTo = '', $threadId, $parentId, $contributions = '', $postId = '')
{
    global $tikilib, $prefs, $smarty, $userlib;
    // Per-forum From address overrides global default.
    if ($forum_info['outbound_from']) {
        $author = $userlib->clean_user($author);
        $my_sender = '"' . "{$author}" . '" <' . $forum_info['outbound_from'] . '>';
    } else {
        $my_sender = $prefs['sender_email'];
    }
    //outbound email ->  will be sent in utf8 - from sender_email
    if ($forum_info['outbound_address']) {
        include_once 'lib/webmail/tikimaillib.php';
        $mail = new TikiMail();
        $mail->setSubject($title);
        if (!empty($forum_info['outbound_mails_reply_link']) && $forum_info['outbound_mails_reply_link'] == 'y') {
            $foo = parse_url($_SERVER["REQUEST_URI"]);
            $machine = $tikilib->httpPrefix(true) . dirname($foo["path"]);
            if ($event == 'forum_post_topic') {
                $reply_link = "{$machine}/tiki-view_forum_thread.php?forumId=" . $forum_info['forumId'] . "&comments_parentId={$threadId}#form";
            } else {
                $reply_link = "{$machine}/tiki-view_forum_thread.php?forumId=" . $forum_info['forumId'] . "&comments_reply_threadId={$object}&comments_parentId={$threadId}&post_reply=1#form";
            }
        } else {
            $reply_link = '';
        }
        $smarty->assign('title', $title);
        $smarty->assign('data', $data);
        $smarty->assign('reply_link', $reply_link);
        $smarty->assign('author', $author);
        $mail_data = $smarty->fetch("mail/forum_outbound.tpl");
        $mail->setText($mail_data);
        $mail->setReplyTo($my_sender);
        $mail->setFrom($my_sender);
        $mail->setSubject($topicName);
        if ($inReplyTo) {
            $mail->setHeader("In-Reply-To", "<" . $inReplyTo . ">");
        }
        global $commentslib;
        $attachments = $commentslib->get_thread_attachments($event == 'forum_post_topic' ? $threadId : $object, 0);
        if (count($attachments) > 0) {
            foreach ($attachments as $att) {
                $att_data = $commentslib->get_thread_attachment($att['attId']);
                if ($att_data['dir'] . $att_data['path'] == "") {
                    // no path to file on disk
                    $file = $att_data['data'];
                    // read file from database
                } else {
                    $file = $mail->getFile($att_data['dir'] . $att_data['path']);
                    // read file from disk
                }
                $mail->addAttachment($file, $att_data['filename'], $att_data['filetype']);
            }
        }
        // Message-ID is set below buildMessage because otherwise lib/webmail/htmlMimeMail.php will over-write it.
        $mail->setHeader("Message-ID", "<" . $messageId . ">");
        $mail->send(array($forum_info['outbound_address']));
    }
    $nots = array();
    $defaultLanguage = $prefs['site_language'];
    // Users watching this forum or this post
    if ($prefs['feature_user_watches'] == 'y' || $prefs['feature_group_watches'] == 'y') {
        $nots_raw = $tikilib->get_event_watches($event, $event == 'forum_post_topic' ? $forum_info['forumId'] : $threadId, $forum_info);
        $nots = array();
        $users = array();
        foreach ($nots_raw as $n) {
            if ($n['user'] != $author && !in_array($n['user'], $users)) {
                // make sure user receive only one notification even if he is monitoring both the topic and thread
                $n['language'] = $tikilib->get_user_preference($n['user'], "language", $defaultLanguage);
                $nots[] = $n;
                $users[] = $n['user'];
            }
        }
    }
    // Special forward address
    //TODO: merge or use the admin notification feature
    if ($forum_info["useMail"] == 'y') {
        $not['email'] = $forum_info['mail'];
        if ($not['user'] = $userlib->get_user_by_email($forum_info['mail'])) {
            $not['language'] = $tikilib->get_user_preference($not['user'], "language", $defaultLanguage);
        } else {
            $not['language'] = $defaultLanguage;
        }
        $nots[] = $not;
    }
    if ($prefs['feature_user_watches'] == 'y' && $prefs['feature_daily_report_watches'] == 'y') {
        $reportsManager = Reports_Factory::build('Reports_Manager');
        $reportsManager->addToCache($nots, array("event" => $event, "forumId" => $forum_info['forumId'], "forumName" => $forum_info['name'], "topicId" => $threadId, "threadId" => $postId, "threadName" => $topicName, "user" => $author));
    }
    if (count($nots)) {
        include_once 'lib/webmail/tikimaillib.php';
        $smarty->assign('mail_forum', $forum_info["name"]);
        $smarty->assign('mail_title', $title);
        $smarty->assign('mail_date', $tikilib->now);
        $smarty->assign('mail_message', $data);
        $smarty->assign('mail_author', $author);
        if ($prefs['feature_contribution'] == 'y' && !empty($contributions)) {
            global $contributionlib;
            include_once 'lib/contribution/contributionlib.php';
            $smarty->assign('mail_contributions', $contributionlib->print_contributions($contributions));
        }
        $foo = parse_url($_SERVER["REQUEST_URI"]);
        $machine = $tikilib->httpPrefix(true) . dirname($foo["path"]);
        $machine = preg_replace("!/\$!", "", $machine);
        // just incase
        $smarty->assign('mail_machine', $machine);
        $smarty->assign('forumId', $forum_info["forumId"]);
        if ($event == "forum_post_topic") {
            $smarty->assign('new_topic', 'y');
        } else {
            $smarty->assign('threadId', $object);
        }
        $smarty->assign('topicId', $threadId);
        $smarty->assign('mail_topic', $topicName);
        foreach ($nots as $not) {
            $mail = new TikiMail();
            $mail->setUser($not['user']);
            $mail_data = $smarty->fetchLang($not['language'], "mail/user_watch_forum_subject.tpl");
            $mail->setSubject($mail_data);
            $mail_data = $smarty->fetchLang($not['language'], "mail/forum_post_notification.tpl");
            $mail->setText($mail_data);
            $mail->send(array($not['email']));
        }
    }
}
function wikiplugin_tracker($data, $params)
{
	global $tikilib, $userlib, $user, $group, $page, $smarty, $prefs, $trklib, $captchalib;
	$parserlib = TikiLib::lib('parser');

	static $iTRACKER = 0;
	++$iTRACKER;
	if (isset($params['itemId']) && empty($params['itemId']))
		return;
	include_once('lib/trackers/trackerlib.php');
	$default = array('overwrite' => 'n', 'embedded' => 'n', 'showtitle' => 'n', 'showdesc' => 'n', 'sort' => 'n', 'showmandatory'=>'y', 'status' => '', 'registration' => 'n', 'emailformat' => 'text');
	$params = array_merge($default, $params);
	$item = array();

	extract($params, EXTR_SKIP);

	if ($prefs['feature_trackers'] != 'y') {
		return $smarty->fetch("wiki-plugins/error_tracker.tpl");
	}
	if (empty($trackerId) || !($tracker = $trklib->get_tracker($trackerId))) {
		return $smarty->fetch("wiki-plugins/error_tracker.tpl");
	}
	if ($t = $trklib->get_tracker_options($trackerId)) {
		$tracker = array_merge($tracker, $t);
	}
	if (empty($trackerId) && !empty($view) && $view == 'user' && $prefs['userTracker'] == 'y') { // the user tracker item
		$utid = $userlib->get_tracker_usergroup($user);
		if (!empty($utid) && !empty($utid['usersTrackerId'])) {
			$itemId = $trklib->get_item_id($utid['usersTrackerId'], $utid['usersFieldId'], $user);
			$trackerId = $utid['usersTrackerId'];
			$usertracker = true;
		}
	} elseif (!empty($trackerId) && !empty($view) && $view == 'user') {// the user item of a tracker
		$itemId = $trklib->get_user_item($trackerId, $tracker, null, null, strlen($status) == 1 ? $status : '');
		$usertracker = true;
	} elseif (!empty($trackerId) && !empty($view) && $view == 'page' && !empty($_REQUEST['page']) && (($f = $trklib->get_field_id_from_type($trackerId, 'k', '1%')) || ($f = $trklib->get_field_id_from_type($trackerId, 'k', '%,1%')) || ($f =  $trklib->get_field_id_from_type($trackerId, 'k')))) {// the page item
		$itemId = $trklib->get_item_id($trackerId, $f, $_REQUEST['page']);
	} elseif (!empty($trackerId) && !empty($_REQUEST['view_user'])) {
		$itemId = $trklib->get_user_item($trackerId, $tracker, $_REQUEST['view_user']);
	} elseif (!empty($_REQUEST['itemId']) && (empty($ignoreRequestItemId) || $ignoreRequestItemId != 'y')) {
		$itemId = $_REQUEST['itemId'];
		$item = $trklib->get_tracker_item($itemId);
		$trackerId = $item['trackerId'];
	} elseif (!empty($view) && $view == 'group') {
		$gtid = $userlib->get_grouptrackerid($group);
		if (isset($gtid['groupTrackerId'])) {
			$trackerId = $gtid['groupTrackerId'];
			$itemId = $trklib->get_item_id($trackerId, $gtid['groupFieldId'], $group);
			$grouptracker = true;
		}
	}
	if (!isset($trackerId)) {
		return $smarty->fetch("wiki-plugins/error_tracker.tpl");
	}

	if (!isset($action)) {
		$action = array('Save');
	}
	if (!is_array($action)) {
		$action = array( $action );
	}
	if (isset($preview)) {
		if (empty($preview)) {
			$preview = 'Preview';
		}
	} else {
		unset($_REQUEST['tr_preview']);
	}
	if (isset($reset)) {
		if (empty($reset)) {
			$reset = 'reset';
		}
	} else {
		unset($_REQUEST['tr_reset']);
	}
	$smarty->assign('showmandatory', empty($wiki) && empty($tpl)? 'n': $showmandatory); 
	if (!empty($wiki)) {
		if (preg_match('/^wiki:(.+)$/', $wiki, $wiki_matches)) {
			$wiki = $wiki_matches[1];
		}

		$wiki = trim($wiki);
	}

	if (!isset($params['formtag'])) {
		$params['formtag'] = 'y';
	}

	$fields_prefix = 'ins_';

	if (isset($values)) {
		if (!is_array($values)) {
			$values = $parserlib->quotesplit(':', $values);
			foreach ($values as $i=>$v) {
				$values[$i] = preg_replace('/^"(.*)"$/', '$1', $v);
			}
		}
	}
	if (isset($_REQUEST['values'])) {
		if (is_array($_REQUEST['values'])) {
			foreach ($_REQUEST['values'] as $i=>$k) {
				$_REQUEST['values'][$i] = urldecode($k);
			}
		} else {
			$_REQUEST['values'] = urldecode($_REQUEST['values']);
		}
	}

	$perms = $tikilib->get_perm_object($trackerId, 'tracker', $tracker, false);
	
	if (empty($_SERVER['SCRIPT_NAME']) || strpos($_SERVER['SCRIPT_NAME'], 'tiki-register.php') === false) {
		if ($perms['tiki_p_create_tracker_items'] == 'n' && empty($itemId)) {
			return '<b>'.tra("You do not have permission to insert an item").'</b>';
		} elseif (!empty($itemId)) {
			$item_info = $trklib->get_tracker_item($itemId);
			if (empty($item_info)) {
				return '<b>'.tra("Incorrect item").'</b>';
			}
			$itemObject = Tracker_Item::fromInfo($item_info);
			if (! $itemObject->canModify()) {
				return '<b>'.tra("You do not have permission to modify an item").'</b>';
			}
		}
	}

	if (!empty($itemId)) {
		global $logslib; include_once('lib/logs/logslib.php');
		$logslib->add_action('Viewed', $itemId, 'trackeritem', $_SERVER['REQUEST_URI']);
	}

	if (isset($_REQUEST['removeattach']) && $tracker['useAttachments'] == 'y') {
		$owner = $trklib->get_item_attachment_owner($_REQUEST['removeattach']);
		if ($perms['tiki_p_admin_trackers'] == 'y' || ($user && $user == $owner)) {
			$trklib->remove_item_attachment($_REQUEST["removeattach"]);
			unset($_REQUEST['removeattach']);
		}
	}
	if (isset($_REQUEST['removeImage']) && !empty($_REQUEST['trackerId']) && !empty($_REQUEST['itemId']) && !empty($_REQUEST['fieldId']) && !empty($_REQUEST['fieldName'])) {
		$img_field = array('data' => array());
		$img_field['data'][] = array('fieldId' => $_REQUEST['fieldId'], 'type' => 'i', 'name' => $_REQUEST['fieldName'], 'value' => 'blank');
		$trklib->replace_item($_REQUEST['trackerId'], $_REQUEST['itemId'], $img_field);
	}
	$back = '';

	$thisIsThePlugin = isset($_REQUEST['iTRACKER']) && $_REQUEST['iTRACKER'] == $iTRACKER;

	if (!isset($_REQUEST["ok"]) || $_REQUEST["ok"]  == "n" || !$thisIsThePlugin || isset($_REQUEST['tr_preview'])) {
		$field_errors = array('err_mandatory'=>array(), 'err_value'=>array());

			global $notificationlib; include_once('lib/notifications/notificationlib.php');
			$tracker = $trklib->get_tracker($trackerId);
			$tracker = array_merge($tracker, $trklib->get_tracker_options($trackerId));
			if ((!empty($tracker['start']) && $tikilib->now < $tracker['start']) || (!empty($tracker['end']) && $tikilib->now > $tracker['end']))
				return;
			$outf = array();
			$auto_fieldId = array();
			$hidden_fieldId = array();
			if (!empty($fields)  || !empty($wiki) || !empty($tpl)) {
				if ($registration == 'y' && $prefs["user_register_prettytracker"] == 'y' && !empty($prefs["user_register_prettytracker_tpl"])) {
					$smarty->assign('register_login', $smarty->fetch('register-login.tpl'));
					$smarty->assign('register_email', $smarty->fetch('register-email.tpl'));
					$smarty->assign('register_pass', $smarty->fetch('register-pass.tpl'));
					$smarty->assign('register_pass2', $smarty->fetch('register-pass2.tpl'));
					$smarty->assign('register_passcode', $smarty->fetch('register-passcode.tpl'));
					$smarty->assign('register_groupchoice', $smarty->fetch('register-groupchoice.tpl'));
					$smarty->assign('register_antibot', $smarty->fetch('antibot.tpl'));
					$wiki = $prefs["user_register_prettytracker_tpl"];
				}
				if (!empty($wiki)) {
					$outf = $trklib->get_pretty_fieldIds($wiki, 'wiki', $outputPretty);
				} elseif (!empty($tpl)) {
					$outf = $trklib->get_pretty_fieldIds($tpl, 'tpl', $outputPretty);
				} elseif (!empty($fields)) {
					$outf = preg_split('/ *: */', $fields);
				}
				if (!empty($_REQUEST['autosavefields'])) {
					$autosavefields = explode(':', $_REQUEST['autosavefields']);
					$autosavevalues = explode(':', $_REQUEST['autosavevalues']);
					if (isset($params['autosavefields'])) {
						$autosavefields = array_merge($autosavefields, $params['autosavefields']);
						$autosavevalues = array_merge($autosavevalues, $params['autosavevalues']);
					}
				}
				if (!empty($autosavefields)) {
					$auto_fieldId = array_merge($auto_fieldId, $autosavefields);
				}
				if ($user) {
					$hidden_fieldId[] = $trklib->get_field_id_from_type($trackerId, 'u', '1%');	// user owner
					$hidden_fieldId[] = $trklib->get_field_id_from_type($trackerId, 'u', '2%');	// user modifier
					$hidden_fieldId[] = $trklib->get_field_id_from_type($trackerId, 'g', '1%');	// owner group
					$hidden_fieldId[] = $trklib->get_field_id_from_type($trackerId, 'g', '2%');	// owner modifier
				}
				$hidden_fieldId[] = $trklib->get_field_id_from_type($trackerId, 'I', '1%');	// IP auto-assign
				$hidden_fieldId[] = $trklib->get_field_id_from_type($trackerId, 'k', '1%');	// page creator
				$auto_fieldId[] = $trklib->get_field_id_from_type($trackerId, 'q');	// auto-increment	
				foreach ($auto_fieldId as $k => $v) {
					if (empty($v) || in_array($v, $outf)) {
						unset($auto_fieldId[$k]);
					} else {
						$outf[] = $v;
					}
				}
				foreach ($hidden_fieldId as $k => $v) {
					if (empty($v) || in_array($v, $outf)) {
						unset($hidden_fieldId[$k]);
					} else {
						$outf[] = $v;
					}
				}
			}

			$definition = Tracker_Definition::get($trackerId);
			$item_info = isset($item_info) ? $item_info : array();
			$factory = $definition->getFieldFactory();

			if (empty($item_info)) {
				$itemObject = Tracker_Item::newItem($trackerId);
			} elseif (! isset($itemObject)) {
				$itemObject = Tracker_Item::fromInfo($item_info);
			}

			if (empty($outf)) {
				$unfiltered = array('data' => $definition->getFields());
			} else {
				$unfiltered = array('data' => array());
				foreach ($outf as $fieldId) {
					$unfiltered['data'][] = $definition->getField($fieldId);
				}
			}

			$flds = array('data' => array());
			foreach ($unfiltered['data'] as $f) {
				if ($itemObject->canModifyField($f['fieldId']) || $registration == 'y' && empty($item_info)) {
					$flds['data'][] = $f;
				}
			}

			// If we create multiple items, get field Ids, default values and separator
			if (!empty($fieldsfill)) {
				$fill_fields = preg_split('/ *: */', $fieldsfill);	// Allow for superfluous spaces and ignore them
				$fill_flds = array('data' => array());
				$fill_defaults = array();
				$fill_flds_defaults = array();	// May be different from fill_defaults if some fields are not editable
				$fieldsfillnames = array();
				if (trim($fieldsfilldefaults) != '') {
					$fill_defaults = preg_split('/ *: */', $fieldsfilldefaults);
				}
				foreach ($fill_fields as $k=>$fieldId) {
					if ($itemObject->canModifyField($fieldId)) {
						$tmp = $definition->getField($fieldId);
						$fill_flds['data'][] = $tmp;
						if (isset($fill_defaults[$k])) {
							$fill_flds_defaults[] = $fill_defaults[$k];
						} else {
							$fill_flds_defaults[] = '';
						}
						$fieldsfillnames[] = $tmp['name'];
					}
				}
				$fill_line_cant = count($fill_flds['data']);
				if ($fieldsfillseparator == '') {
					$fieldsfillseparator = '|';
				}
			}

			$bad = array();
			$embeddedId = false;
			$onemandatory = false;
			$full_fields = array();
			$mainfield = '';

			if ($thisIsThePlugin) {
				/* ------------------------------------- Recup all values from REQUEST -------------- */
				if (!empty($autosavefields)) {
					foreach ($autosavefields as $i=>$f) {
						if (!$ff = $trklib->get_field($f, $flds['data'])) {
							continue;
						}
						if (preg_match('/categories\(([0-9]+)\)/', $autosavevalues[$i], $matches)) {
							if (ctype_digit($matches[1]) && $matches[1] > 0) {
								$filter = array('identifier'=>$matches[1], 'type'=>'descendants'); 
							} else {
								$filter = NULL;
							}
							global $categlib; include_once('lib/categories/categlib.php');
							$categs = $categlib->getCategories($filter, true, false);
							$_REQUEST["ins_$f"][] = $categs[0]['categId'];
						} elseif (preg_match('/preference\((.*)\)/', $autosavevalues[$i], $matches)) {
							$_REQUEST["ins_$f"] = $prefs[$matches[1]];
						} elseif ($ff['type'] == 'e') {
							$_REQUEST["ins_$f"][] = $autosavevalues[$i];
						} else {
							if (isset($params['levelupfields']) && in_array($f, $params['levelupfields'])) {
								$current_levelup_val = $trklib->get_item_value($trackerId, $itemId, $f);
								if ($autosavevalues[$i] <= $current_levelup_val) {
									continue;
								}
							}					
							$_REQUEST["ins_$f"] = $autosavevalues[$i];
						}
					}
				}
				foreach ($flds['data'] as $k => $field) {
					$handler = $factory->getHandler($field, $item_info);

					if ($handler) {
						$ins_fields['data'][$k] = array_merge($field, $handler->getFieldData($_REQUEST));
						if (isset($ins_fields['data'][$k]['value'])) {		// add ins value into field if creating or editing item
							$flds['data'][$k] = $ins_fields['data'][$k];	// to keep user input in case of errors (not only value)
						}
					}
				}
				$cpt = 0;
				if (isset($fields)) {
					$fields_plugin = preg_split('/:/', $fields);
				}
				if (!isset($itemId) && $tracker['oneUserItem'] == 'y') {
					$itemId = $trklib->get_user_item($trackerId, $tracker);
				}

				if ($embedded == 'y' && isset($_REQUEST['page'])) {
					$ins_fields["data"][] = array('fieldId' => $embeddedId, 'value' => $_REQUEST['page']);
				}

				if ($registration == 'y' && isset($params['userField'])) {
					$userField = $definition->getField($params['userField']);
					$userField['value'] = $_REQUEST['name'];
					$ins_fields['data'][] = $userField;
				}

				$ins_categs = 0; // important: non-array ins_categs means categories should remain unchanged
				$parent_categs_only = array();
				foreach ($ins_fields['data'] as $current_field) {
					if ($current_field['type'] == 'e' && isset($current_field['selected_categories'])) {
						if (!is_array($ins_categs)) {
							$ins_categs = array();
						}
						$ins_categs = array_merge($ins_categs, $current_field['selected_categories']);
						$parent_categs_only[] = $current_field['options_array'][0];
					}
				}
				$categorized_fields = $definition->getCategorizedFields();
				/* ------------------------------------- End recup all values from REQUEST -------------- */

				/* ------------------------------------- Check field values for each type and presence of mandatory ones ------------------- */
				$field_errors = $trklib->check_field_values($ins_fields, $categorized_fields, $trackerId, empty($itemId)?'':$itemId);

				if (empty($user) && $prefs['feature_antibot'] == 'y' && $registration != 'y') {
					// in_tracker session var checking is for tiki-register.php
					if (!$captchalib->validate()) {
						$field_errors['err_antibot'] = 'y';
					}
				}

				// check valid page name for wiki output if requested
				if (isset($outputtowiki) && !empty($outputwiki)) {
					$newpagename = '';
					foreach ($ins_fields["data"] as $fl) {
						if ($fl["fieldId"] == $outputtowiki) {
							$newpagename = $fl["value"];
						}
						if ($fl["type"] == 'F') {
							$newpagefreetags = $fl["value"];
						}
						$newpagefields[] = $fl["fieldId"];
					}
					if ($newpagename) {
						if ($tikilib->page_exists($newpagename)) {
							$field_errors['err_outputwiki'] = tra('The page to output the results to already exists. Try another name.');
						}
						$page_badchars_display = ":/?#[]@!$&'()*+,;=<>";
						$page_badchars = "/[:\/?#\[\]@!$&'()*+,;=<>]/";
						$matches = preg_match($page_badchars, $newpagename);
						if ($matches) {
							$field_errors['err_outputwiki'] = tr("The page to output the results to contains the following prohibited characters: %0. Try another name.", $page_badchars_display);
						} 
					} else {
						unset($outputtowiki);
					}
				}
				if ( count($field_errors['err_mandatory']) == 0  && count($field_errors['err_value']) == 0 && empty($field_errors['err_antibot']) && empty($field_errors['err_outputwiki']) && !isset($_REQUEST['tr_preview'])) {
					/* ------------------------------------- save the item ---------------------------------- */
					if (isset($_REQUEST['status'])) {
						$status = $_REQUEST['status'];
					} elseif (isset($newstatus) && ($newstatus == 'o' || $newstatus == 'c'|| $newstatus == 'p')) {
						$status = $newstatus;
					} elseif (empty($itemId) && isset($tracker['newItemStatus'])) {
						$status = $tracker['newItemStatus'];
					} else {
						$status = '';
					}

					if (!empty($fieldsfill) && !empty($_REQUEST['ins_fill']) ) {	// We create multiple items
						$fill_lines = explode("\n", $_REQUEST['ins_fill']);
						foreach ($fill_lines as $fill_line) {
							if (trim($fill_line) == '') {	// Ignore blank lines
								continue;
							}
							$fill_line_item = explode($fieldsfillseparator,$fill_line,$fill_line_cant);	// Extra fields are merged with the last field. this avoids data loss and permits a last text field with commas
							$rid = $trklib->replace_item($trackerId, $itemId, $ins_fields, $status, $ins_categs);
							for ($i=0;$i<$fill_line_cant;$i++) {
								if ($fill_line_item[$i] != '') {
									$fill_item = trim($fill_line_item[$i]);
								} else {
									$fill_item = $fill_flds_defaults[$i];
								}
								$fill_rid = $trklib->modify_field($rid, $fill_flds['data'][$i]['fieldId'], $fill_item);
							}
							if (is_array($ins_categs)) {
								if ($registration == 'y' && empty($item_info)) {
									$override_perms = true;
								} else {
									$override_perms = false;
								}
								$trklib->categorized_item($trackerId, $rid, $mainfield, $ins_categs, $parent_categs_only, $override_perms);	
							}
							if (isset($newItemRate)) {
								$trklib->replace_rating($trackerId, $rid, $newItemRateField, $user, $newItemRate);
							}
						}
					} else {
						if ($registration == 'y' && $_SERVER['REQUEST_METHOD'] != 'POST') {
							return false;
						}
						$rid = $trklib->replace_item($trackerId, $itemId, $ins_fields, $status, $ins_categs);
						if (is_array($ins_categs)) {
							if ($registration == 'y' && empty($item_info)) {
								$override_perms = true;
							} else {
								$override_perms = false;
							}
							$trklib->categorized_item($trackerId, $rid, $mainfield, $ins_categs, $parent_categs_only, $override_perms);	
						}
						if (isset($newItemRate)) {
							$trklib->replace_rating($trackerId, $rid, $newItemRateField, $user, $newItemRate);
						}
					}
					// now for wiki output if desired
					if (isset($outputtowiki) && !empty($outputwiki)) {
						// note that values will be raw - that is the limit of the capability of this feature for now
						$newpageinfo = $tikilib->get_page_info($outputwiki);
						$wikioutput = $newpageinfo["data"];
						$newpagefields = $trklib->get_pretty_fieldIds($outputwiki, 'wiki', $outputPretty);
						foreach ($newpagefields as $lf) {
							$wikioutput = str_replace('{$f_' . $lf . '}', $trklib->get_item_value($trackerId, $rid, $lf), $wikioutput);
						}
						if (isset($registration)) {
							 $wikioutput = str_replace('{$register_login}', $user, $wikioutput);
							 $wikioutput = str_replace('{$register_email}', $_REQUEST['email'], $wikioutput);
						}
						$tikilib->create_page($newpagename, 0, $wikioutput, $tikilib->now, '', $user, $tikilib->get_ip_address());
						$cat_desc = '';
						$cat_type = 'wiki page';
						$cat_name = $newpagename;
						$cat_objid = $newpagename;
						$cat_href = "tiki-index.php?page=".urlencode($newpagename);
						if (count($ins_categs)) {
							$_REQUEST['cat_categories'] = $ins_categs;
							$_REQUEST['cat_categorize'] = 'on';
							include_once("categorize.php");
						}
						if (isset($newpagefreetags) && $newpagefreetags) {
							$_REQUEST['freetag_string'] = $newpagefreetags;
							include_once("freetag_apply.php");
						}
						if ($discarditem == 'y') {
							$trklib->remove_tracker_item($rid);
						}
						if (empty($url)) {
							global $wikilib;
							$url[0] = $wikilib->sefurl($newpagename);
						}
					}
					// end wiki output
					if (!empty($email)) {
						$emailOptions = preg_split("#\|#", $email);
						if (is_numeric($emailOptions[0])) {
							$emailOptions[0] = $trklib->get_item_value($trackerId, $rid, $emailOptions[0]);
						}
						if (empty($emailOptions[0])) { // from
							$emailOptions[0] = $prefs['sender_email'];
						}
						if (empty($emailOptions[1])) { // to
							$emailOptions[1][0] = $prefs['sender_email'];
						} else {
							$emailOptions[1] = preg_split('/ *, */', $emailOptions[1]);
							foreach ($emailOptions[1] as $key=>$email) {
								if (is_numeric($email))
									$emailOptions[1][$key] = $trklib->get_item_value($trackerId, $rid, $email);
							}
						}
						include_once('lib/webmail/tikimaillib.php');
						$mail = new TikiMail();
						$mail->setHeader('From', $emailOptions[0]);
						
						if (!empty($emailOptions[2])) { //tpl
							$emailOptions[2] = preg_split('/ *, */', $emailOptions[2]);
							foreach ($emailOptions[2] as $ieo=>$eo) {
								if (!preg_match('/\.tpl$/', $eo))
									$emailOptions[2][$ieo] = $eo.'.tpl';
								$tplSubject[$ieo] = str_replace('.tpl', '_subject.tpl', $emailOptions[2][$ieo]);
							}
						} else {
							$emailOptions[2] = array('tracker_changed_notification.tpl');
						}
						if (empty($tplSubject)) {
							$tplSubject = array('tracker_changed_notification_subject.tpl');
						}
						$itpl = 0;
						$smarty->assign('mail_date', $tikilib->now);
						$smarty->assign('mail_itemId', $rid);
						foreach ($emailOptions[1] as $ieo=>$ueo) {
							@$mail_data = $smarty->fetch('mail/'.$tplSubject[$itpl]);
							if (empty($mail_data))
								$mail_data = tra('Tracker was modified at '). $_SERVER["SERVER_NAME"];
							$mail->setSubject($mail_data);
							$mail_data = $smarty->fetch('mail/'.$emailOptions[2][$itpl]);
							if ($emailformat == 'html') {
							$mail->setHtml($mail_data);
							} else {
							$mail->setText($mail_data);
							}
							$mail->buildMessage(array('text_encoding' => '8bit'));
							$mail->send($ueo);
							if (isset($tplSubject[$itpl+1]))
								++$itpl;
						}
					}
					if (empty($url)) {
						if (!empty($_REQUEST['ajax_add'])) {	// called by tracker ItemLink fields when adding new list items
							global $access;
							while ( ob_get_level() ) {
								ob_end_clean();
							}
							if ( $prefs['feature_obzip'] == 'y' ) {
								ob_start('ob_gzhandler');
							} else {
								ob_start();
							}
							// Need to add newly created itemId for item link selector
							$ins_fields['itemId'] = $rid;
							$access->output_serialized($ins_fields);
							ob_end_flush();
							die;
							
						} else if (!empty($page)) {
							$url = "tiki-index.php?page=".urlencode($page);
							if (!empty($itemId)) {
								$url .= "&itemId=".$itemId;
							}
							$url .= "&ok=y&iTRACKER=$iTRACKER";
							$url .= "#wikiplugin_tracker$iTRACKER";
							header("Location: $url");
							exit;
						} else {
							return '';
						}
					} else {
						$key = 0;
						foreach ($action as $key=>$act) {
							if (!empty($_REQUEST["action$key"])) {
								break;
							}
						}
						$itemIdPos = strpos($url[$key], 'itemId');
						if ($itemIdPos !== false) {
							if (strstr($url[$key], '#itemId')) {
								$url[$key] = str_replace('#itemId', $rid, $url[$key]);
							} else if (($itemIdPos+strlen('itemId') >= strlen($url[$key])-1) || (substr($url[$key], $itemIdPos+strlen('itemId'), 1) == "&")) {
								// replace by the itemId if in the end (or -1: for backward compatibility so that "&itemId=" also works) or if it is followed by an '&'
								$url[$key] = str_replace('itemId', 'itemId='.$rid, $url[$key]);
							}
						}
						header('Location: '.$url[$key]);
						exit;
					}
					/* ------------------------------------- end save the item ---------------------------------- */
				} elseif (isset($_REQUEST['trackit']) and $_REQUEST['trackit'] == $trackerId) {
					$smarty->assign('wikiplugin_tracker', $trackerId);//used in vote plugin
				}

			} else if ((empty($itemId) || $overwrite == 'y') && !empty($values) || (!empty($_REQUEST['values']) and empty($_REQUEST['prefills']))) { // assign default values for each filedId specify
				if (empty($values)) { // url with values[]=x&values[] witouth the list of fields
					$values = $_REQUEST['values'];
				}
				if (!is_array($values)) {
					$values = array($values);
				}
				if (isset($fields)) {
					$fl = preg_split('/:/', $fields);
					for ($j = 0, $count_fl = count($fl); $j < $count_fl; $j++) {
						for ($i = 0, $count_flds = count($flds['data']); $i < $count_flds; $i++) {
							if ($flds['data'][$i]['fieldId'] == $fl[$j]) { 
								$flds['data'][$i]['value'] = $values[$j];
							}	
						}
					}
				} else { // values contains all the fields value in the default order
					$i = 0;
					foreach ($values as $value) {
						$flds['data'][$i++]['value'] = $value;
					}
				}
			
			} elseif (!empty($itemId)) {
				if (isset($fields)) {
					$fl = preg_split('/:/', $fields);
					$filter = '';
					foreach ($flds['data'] as $f) {
						if (in_array($f['fieldId'], $fl))
							$filter[] = $f;
					}
				} else {
					$filter = &$flds['data'];
				}
				if (!empty($filter)) {
					foreach ($filter as $f) {
						$filter2[$f['fieldId']] = $f;
					}
					$flds['data'] = $trklib->get_item_fields($trackerId, $itemId, $filter2, $itemUser, true);
				}
				// todo: apply the values for fields with no values
			} else {
				if (isset($_REQUEST['values']) && isset($_REQUEST['prefills'])) { //url:prefields=1:2&values[]=x&values[]=y
					if (!is_array($_REQUEST['values']))
						$_REQUEST['values'] = array($_REQUEST['values']);
					$fl = preg_split('/:/', $_REQUEST['prefills']);
				} else {
					unset($fl);
				}
				for ($i = 0, $count_flds2 = count($flds['data']); $i < $count_flds2; $i++) {
					if (isset($fl) && ($j = array_search($flds['data'][$i]['fieldId'], $fl)) !== false) {
						$flds['data'][$i]['value'] = $_REQUEST['values'][$j];
					} else {
						$flds['data'][$i]['value'] = ''; // initialize fields with blank values
					}
				}
			}

			// Check that individual fields are in the tracker
			if (!empty($fields)) {
				$fl = preg_split('/:/', $fields);
				if ($sort == 'y') {
					$flds = $trklib->sort_fields($flds, $fl);
				}		
				foreach ($fl as $l) {
					$ok = false;
					foreach ($flds['data'] as $f) {
						if ($f['fieldId'] == $l) {
							$ok = true;
							break;
						}
					}
					if (!$ok) {
						$back .= '<div class="error">' . tra('Incorrect fieldId:').' '.$l . '</div>';
					}
				}
			} elseif (empty($fields) && empty($wiki) && empty($tpl)) {
				// in this case outf still be blank and needs to be filled
				foreach ($flds['data'] as $f) {
					$outf[] = $f['fieldId'];
				}
			}

			// Check that multiple fill fields are in the tracker
			if (!empty($fieldsfill)) {
				foreach ($fill_fields as $l) {	
					$ok = false;
					foreach ($fill_flds['data'] as $f) {
						if ($f['fieldId'] == $l) {
							$ok = true;
							break;
						}
					}
					if (!$ok) {
						$back .= '<div class="error">' . tra('Incorrect fieldId:').' '.$l . '</div>';
					}
				}
			}

			// Display warnings when needed
			
			if (count($field_errors['err_mandatory']) > 0) {
				$smarty->assign_by_ref('err_mandatory', $field_errors['err_mandatory']);
			}
			if (count($field_errors['err_value']) > 0) {
				$smarty->assign_by_ref('err_value', $field_errors['err_value']);
			}
			if (count($field_errors['err_mandatory']) > 0 || count($field_errors['err_value']) > 0) {
				$back .= $smarty->fetch('tracker_error.tpl');
				$_REQUEST['error'] = 'y';
			}
			if (isset($field_errors['err_antibot'])) {
				$back.= '<div class="simplebox highlight"><img src="img/icons/exclamation.png" alt=" '.tra('Error').'" style="vertical-align:middle" /> ';
				$back .= $captchalib->getErrors();
				$back.= '</div><br />';
				$_REQUEST['error'] = 'y';
			}
			if (isset($field_errors['err_outputwiki'])) {
				$back.= '<div class="simplebox highlight"><img src="img/icons/exclamation.png" alt=" '.tra('Error').'" style="vertical-align:middle" /> ';
				$back .= $field_errors['err_outputwiki'];
				$back.= '</div><br />';
				$_REQUEST['error'] = 'y';
			}
			if (count($field_errors['err_mandatory']) > 0 || count($field_errors['err_value']) > 0 || isset($field_errors['err_antibot']) || isset($field_errors['err_outputwiki'])) {
				$smarty->assign('input_err', 'y');
			}
			if (!empty($page))
				$back .= '~np~';
			$smarty->assign_by_ref('tiki_p_admin_trackers', $perms['tiki_p_admin_trackers']);
			$smarty->assign('trackerEditFormId', $iTRACKER);

		if (!empty($params['_ajax_form_ins_id'])) {
			global $headerlib;									// when called via AJAX take a copy of the JS so far to allow collection
			$old_js['js'] = $headerlib->js;						// of tracker form JS into a function to initialise it when the dialog is created
			$old_js['jq_onready'] = $headerlib->jq_onready;
			$headerlib->clear_js();								// so store existing js for later and clear
		}

			if ($prefs['feature_jquery'] == 'y' && $prefs['feature_jquery_validation'] == 'y') {
				global $validatorslib;
				include_once('lib/validatorslib.php');
				$customvalidation = '';
				$customvalidation_m = '';
				if ($registration == 'y') {
					// email validation
					$customvalidation .= 'email: { ';
					$customvalidation .= 'required: true, ';
					$customvalidation .= 'email: true }, ';
					$customvalidation_m .= 'email: { email: "'. tra("Invalid email") 
								. '", required: "' . tra("This field is required")
								. '"}, ';
					// password validation
					$customvalidation .= 'pass: { ';
					$customvalidation .= 'required: true, ';
					$customvalidation .= 'remote: { ';
					$customvalidation .= 'url: "validate-ajax.php", ';
					$customvalidation .= 'type: "post", ';
					$customvalidation .= 'data: { ';
					$customvalidation .= 'validator: "password", ';
					$customvalidation .= 'input: function() { ';
					$customvalidation .= 'return $("#pass1").val(); ';
					$customvalidation .= '} } } ';
					$customvalidation .= '}, ';
					$customvalidation_m .= 'pass: { required: "' . tra("This field is required") . '"}, ';
					// password repeat validation
					$customvalidation .= 'passAgain: { equalTo: "#pass1" }, ';
					$customvalidation_m .= 'passAgain: { equalTo: "'. tra("Passwords do not match") .  '"}, ';
					// username validation
					$customvalidation .= 'name: { ';
					$customvalidation .= 'required: true, ';
					$customvalidation .= 'remote: { ';
					$customvalidation .= 'url: "validate-ajax.php", ';
					$customvalidation .= 'type: "post", ';
					$customvalidation .= 'data: { ';
					$customvalidation .= 'validator: "username", ';
					$customvalidation .= 'input: function() { ';
					$customvalidation .= 'return $("#name").val(); ';
					$customvalidation .= '} } } ';
					$customvalidation .= '}, ';
					$customvalidation_m .= 'name: { required: "' . tra("This field is required") . '"}, ';
					if (extension_loaded('gd') && function_exists('imagepng') && function_exists('imageftbbox') && $prefs['feature_antibot'] == 'y' && empty($user) && $prefs['recaptcha_enabled'] != 'y') {
						// antibot validation   
						$customvalidation .= '"captcha[input]": { ';
						$customvalidation .= 'required: true, ';
						$customvalidation .= 'remote: { ';
						$customvalidation .= 'url: "validate-ajax.php", ';
						$customvalidation .= 'type: "post", ';
						$customvalidation .= 'data: { ';
						$customvalidation .= 'validator: "captcha", ';
						$customvalidation .= 'parameter: function() { ';
						$customvalidation .= 'return $jq("#captchaId").val(); ';
						$customvalidation .= '}, ';
						$customvalidation .= 'input: function() { ';
						$customvalidation .= 'return $jq("#antibotcode").val(); ';
						$customvalidation .= '} } } ';
						$customvalidation .= '}, ';
						$customvalidation_m .= '"captcha[input]": { required: "' . tra("This field is required") . '"}, ';
					}
					if ($prefs['useRegisterPasscode'] == 'y') {
						$customvalidation .= 'passcode: {
									required: true,
									remote: {
										url: "validate-ajax.php", 
										type: "post",
										data: {
											validator: "passcode", 
											input: function() {
												return $("#passcode").val();
												}
											}
										}
									}, ';
						$customvalidation_m .= 'passcode: { required: "' . tra("This field is required") . '"}, ';
					} 
				}
				$validationjs = $validatorslib->generateTrackerValidateJS($flds['data'], $fields_prefix, $customvalidation, $customvalidation_m);

				$smarty->assign('validationjs', $validationjs);
				$back .= $smarty->fetch('tracker_validator.tpl');
			}
			if ($params['formtag'] == 'y') {
				$back .= '<form name="editItemForm' . $iTRACKER . '" id="editItemForm' . $iTRACKER . '" enctype="multipart/form-data" method="post"'.(isset($target)?' target="'.$target.'"':'').' action="'. $_SERVER['REQUEST_URI'] .'"><input type="hidden" name="trackit" value="'.$trackerId.'" />';
				$back .= '<input type="hidden" name="refresh" value="1" />';
			}
			$back .= '<input type="hidden" name="iTRACKER" value="'.$iTRACKER.'" />';
			if (isset($_REQUEST['page']))
				$back.= '<input type="hidden" name="page" value="'.$_REQUEST["page"].'" />';
			 // for registration
			if (isset($_REQUEST['name']))
				$back.= '<input type="hidden" name="name" value="'.$_REQUEST["name"].'" />';
			if (isset($_REQUEST['pass'])) {
				$back.= '<input type="hidden" name="pass" value="'.$_REQUEST["pass"].'" />';
				$back.= '<input type="hidden" name="passAgain" value="'.$_REQUEST["pass"].'" />';
			}
			if (isset($_REQUEST['email']))
				$back.= '<input type="hidden" name="email" value="'.$_REQUEST["email"].'" />';
			if (isset($_REQUEST['antibotcode']))
				$back.= '<input type="hidden" name="antibotcode" value="'.$_REQUEST["antibotcode"].'" />';
			if (isset($_REQUEST['chosenGroup'])) // for registration
				$back.= '<input type="hidden" name="chosenGroup" value="'.$_REQUEST["chosenGroup"].'" />';
			if (isset($_REQUEST['register']))
				$back.= '<input type="hidden" name="register" value="'.$_REQUEST["register"].'" />';
			if ($showtitle == 'y') {
				$back.= '<div class="titlebar">'.$tracker["name"].'</div>';
			}
			if ($showdesc == 'y' && $tracker['description']) {

				if ($tracker['descriptionIsParsed'] == 'y') {
					$back .= '<div class="wikitext">'.$tikilib->parse_data($tracker['description']).'</div><br />';
				} else {
					$back.= '<div class="wikitext">'.tra($tracker["description"]).'</div><br />';
				}
			}
			if (isset($_REQUEST['tr_preview'])) { // use for the computed and join fields
				$assocValues = array();
				$assocNumerics = array();
				foreach ($flds['data'] as $f) {
					if (empty($f['value']) && ($f['type'] == 'u' || $f['type'] == 'g' || $f['type'] == 'I') && ($f['options_array'][0] == '1' || $f['options_array'][0] == '2')) { //need to fill the selector fields for the join
						$f['value'] = ($f['type'] == 'I')? $tikilib->get_ip_address(): (($f['type'] == 'g')? $group: $user);
					}
					$assocValues[$f['fieldId']] = $f['value'];
					$assocNumerics[$f['fieldId']] = preg_replace('/[^0-9\.\+]/', '', $f['value']); // get rid off the $ and such unit
				}
			}

			if (!empty($itemId)) {
				$item = array('itemId'=>$itemId, 'trackerId'=>$trackerId);
			} else {
				$item = array('itemId'=>'');
			}
			foreach ($flds['data'] as $i=>$f) { // collect additional infos
				if (in_array($f['fieldId'], $outf)) {
					$flds['data'][$i]['ins_id'] = ($f['type'] == 'e')?'ins_'.$f['fieldId']: $fields_prefix.$f['fieldId'];
					if (($f['isHidden'] == 'c' || $f['isHidden'] == 'p') && !empty($itemId) && !isset($item['creator'])) {
						$item['creator'] = $trklib->get_item_creator($trackerId, $itemId);
					}
				}
			}
			if (!empty($showstatus) && $showstatus == 'y') {
				$status_types = $trklib->status_types();
				$smarty->assign_by_ref('status_types', $status_types);
				$smarty->assign('form_status', 'status');
				$smarty->assign_by_ref('tracker', $tracker);
				if (!empty($item_info)) {
					$smarty->assign_by_ref('item', $item_info);
				}
				$status_input = $smarty->fetch('tracker_status_input.tpl');
			}

			if ($registration == "y") {
				$back .= '<input type="hidden" name="register" value="Register" />';
			}
			
			// Loop on tracker fields and display form
			if (empty($tpl) && empty($wiki)) {
				$back.= '<table class="wikiplugin_tracker">';
				if (!empty($showstatus) && $showstatus == 'y') {
					$back .= '<tr><td>'.tra('Status').'</td><td>'.$status_input.'</td></tr>';
				}
				if ($registration == 'y' && $prefs["user_register_prettytracker"] != 'y') {
					$back .= $smarty->fetch('register-form.tpl');
				}
			} else {
				$back .= '<div class="wikiplugin_tracker">';
				if (!empty($showstatus) && $showstatus == 'y') {
					$smarty->assign_by_ref('f_status_input', $status_input);
				}
			}
			$backLength0 = strlen($back);

			foreach ($flds['data'] as $f) {

				if (!in_array($f['fieldId'], $auto_fieldId) && in_array($f['fieldId'], $hidden_fieldId)) {
					// Show in hidden form
					$back.= '<span style="display:none;">' . wikiplugin_tracker_render_input($f, $item)  . '</span>';
				} elseif (!in_array($f['fieldId'], $auto_fieldId) && in_array($f['fieldId'], $outf)) {
					if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
						$onemandatory = true;
					}
					if ($f['type'] == 'A') {
						$smarty->assign_by_ref('tiki_p_attach_trackers', $perms['tiki_p_attach_trackers']);
					}
					if (!empty($tpl) || !empty($wiki)) {
						if (!empty($outputPretty) && in_array($f['fieldId'], $outputPretty)) {
							$smarty->assign('f_'.$f['fieldId'], '<span class="outputPretty" id="track_'.$f['fieldId'].'" name="track_'.$f['fieldId'].'">'. wikiplugin_tracker_render_value($f, $item) . '</span>');
						} else {
							$mand =  ($showmandatory == 'y' and $f['isMandatory'] == 'y')? "&nbsp;<strong class='mandatory_star'>*</strong>&nbsp;":'';
							$smarty->assign('f_'.$f['fieldId'], wikiplugin_tracker_render_input($f, $item).$mand);
						}
					} else {
						$back.= "<tr><td";
						if (!empty($colwidth)) {
							$back .= " width='".$colwidth."'";
						}
						$back .= '><label for="' . $f['ins_id'] . '">' 
									. wikiplugin_tracker_name($f['fieldId'], tra($f['name']), $field_errors) . '</label>';
						if ($showmandatory == 'y' and $f['isMandatory'] == 'y') {
							$back.= "&nbsp;<strong class='mandatory_star'>*</strong>&nbsp;";
						}
						$back.= '</td><td>';

						$back .= wikiplugin_tracker_render_input($f, $item);
					}

					if ($f['type'] != 'S') {
						$back .= '<div class="trackerplugindesc">';
					}
					if ($f['type'] != 'S') {
						if ($f['descriptionIsParsed'] == 'y') {
							$back .= $tikilib->parse_data($f['description']);
						} else {
							$back .= tra($f['description']);
						}
					}
					if ($f['type'] != 'S') {
						$back .= '</div>';
					}
				}
			}
			if ( isset($params['fieldsfill']) && !empty($params['fieldsfill']) && empty($itemId) ) {
				// $back.= '<tr><td><label for="ins_fill">' . tra("Create multiple items (one per line).") . '</label>';
				$back.= '<tr><td><label for="ins_fill">' . tra("Insert one item per line:") 
					. '<br />'
					. '<br />'
					. '<br />'
					. '</label>';
				$back.= <<<FILL
</td><td>
<input type="hidden" value="" name="mode_wysiwyg"/>
<input type="hidden" value="" name="mode_normal"/>
<div class="edit-zone">
<textarea id="ins_fill" class="wikiedit" style="width: 99%;" data-syntax="" data-codemirror="" onkeyup="" rows="15" cols="50" name="ins_fill" >
</textarea >
</div>
<input type="hidden" value="n" name="wysiwyg"/>
<div name="ins_fill_desc" class="trackerplugindesc" >
FILL;
				$back.= sprintf(tra('Each line is a list of %d field values separated with: %s'),$fill_line_cant,htmlspecialchars($fieldsfillseparator));
				$back .= '</div><div name="ins_fill_desc2" class="trackerplugindesc" >' . htmlspecialchars(implode($fieldsfillseparator,$fieldsfillnames)) ;
				$back .= '</div></td></tr>';
			}
			if (!empty($tpl)) {
				$smarty->security = true;
				$back .= $smarty->fetch($tpl);
			} elseif (!empty($wiki)) {
				$smarty->security = true;
				if ($tikilib->page_exists($wiki)) {
					$back .= $smarty->fetch('wiki:'.$wiki);
				} else {
					$back .= '<span class="error">' . tr('Missing wiki template page "%0"', htmlspecialchars($wiki)) . '</span>';
				}
			}
			include_once('lib/smarty_tiki/function.trackerheader.php');
			$back .= smarty_function_trackerheader(array('level'=>-1, 'title'=>'', 'inTable' =>(empty($tpl) && empty($wiki))?'wikiplugin_tracker':'' ), $smarty);

			if ($prefs['feature_antibot'] == 'y' && empty($user) && $formtag != 'n'
				&& ($registration != 'y' || $prefs["user_register_prettytracker"] != 'y') ) {
				// in_tracker session var checking is for tiki-register.php
				$smarty->assign('showmandatory', $showmandatory);
				$smarty->assign('antibot_table', empty($wiki) && empty($tpl)?'n': 'y');
				$back .= $smarty->fetch('antibot.tpl');
			}
			if (empty($tpl) && empty($wiki)) {
				$back.= "</table>";
			} else {
				$back .= '</div>';
			}

			if ($params['formtag'] == 'y') {
				$back .= '<div class="input_submit_container">';

				if (!empty($reset)) {
					$back .= '<input class="button submit preview" type="reset" name="tr_reset" value="'.tra($reset).'" />';
				}
				if (!empty($preview)) {
					$back .= '<input class="button submit preview" type="submit" name="tr_preview" value="'.tra($preview).'" />';
				}
				foreach ($action as $key=>$act) {
					$back .= '<input class="button submit" type="submit" name="action'.$key.'" value="'.tra($act).'" onclick="needToConfirm=false" />';
				}
				$back .= '</div>';
			}
			if ($showmandatory == 'y' and $onemandatory) {
				$back.= "<em class='mandatory_note'>".tra("Fields marked with a * are mandatory.")."</em>";
			}
			if ($params['formtag'] == 'y') {
				$back.= '</form>';
			}

			if (!empty($params['_ajax_form_ins_id'])) {	// save new js in a function for the form init fn

				$headerlib->add_js(' var ajaxTrackerFormInit_' . $params['_ajax_form_ins_id'] . ' = function() {' . $headerlib->output_js(false) . '}', 10);

				// put back the pre-existing js
				$headerlib->js = array_merge( $headerlib->js, $old_js['js']);
				$headerlib->jq_onready = array_merge( $headerlib->jq_onready, $old_js['jq_onready']);
			}

			if (!empty($page))
				$back .= '~/np~';
			$smarty->assign_by_ref('tiki_p_admin_trackers', $perms['tiki_p_admin_trackers']);
		return $back;
	} else {
		if (isset($_REQUEST['trackit']) and $_REQUEST['trackit'] == $trackerId)
			$smarty->assign('wikiplugin_tracker', $trackerId);//used in vote plugin
		$id = ' id="wikiplugin_tracker'.$iTRACKER.'"';
		if ($showtitle == 'y') {
			$back.= '<div class="titlebar"'.$id.'>'.$tracker["name"].'</div>';
			$id = '';
		}
		if ($showdesc == 'y') {
			$back.= '<div class="wikitext"'.$id.'>'.$tracker["description"].'</div><br />';
			$id = '';
		}
		$back.= "<div$id>".$data.'</div>';
		return $back;
	}
}
示例#8
0
/** \brief send the email notifications dealing with the forum changes to
 * \brief outbound address + admin notification addresses / forum admin email + watching users addresses
 * \param $event = 'forum_post_topic' or 'forum_post_thread'
 * \param $object = forumId watch if forum_post_topic or topicId watch if forum_post_thread
 * \param $threadId = topicId if forum_post_thread
 * \param $title of the message
 * \param $topicName name of the parent topic
 */
function sendForumEmailNotification($event, $object, $forum_info, $title, $data, $author, $topicName, $messageId = '', $inReplyTo = '', $threadId, $parentId = '')
{
    global $tikilib, $feature_user_watches, $smarty, $userlib, $sender_email;
    // Per-forum From address overrides global default.
    if ($forum_info['outbound_from']) {
        $my_sender = '"' . "{$author}" . '" <' . $forum_info['outbound_from'] . '>';
    } else {
        $my_sender = $sender_email;
    }
    //outbound email ->  will be sent in utf8 - from sender_email
    if ($forum_info['outbound_address']) {
        include_once 'lib/webmail/tikimaillib.php';
        $mail = new TikiMail();
        $mail->setSubject($title);
        $foo = parse_url($_SERVER["REQUEST_URI"]);
        $machine = $tikilib->httpPrefix() . dirname($foo["path"]);
        $reply_link = "\n\n----\n\nReply Link: <" . $machine . "tiki-view_forum_thread.php?forumId=" . $forum_info['forumId'] . "&comments_reply_threadId={$object}&comments_parentId={$threadId}&post_reply=1#form>\n";
        if (array_key_exists('outbound_mails_reply_link', $forum_info) && $forum_info['outbound_mails_reply_link']) {
            $mail->setText($title . "\n" . $data . $reply_link);
        } else {
            $mail->setText($title . "\n" . $data);
        }
        $mail->setHeader("Reply-To", $my_sender);
        $mail->setHeader("From", $my_sender);
        $mail->setSubject($topicName);
        if ($inReplyTo) {
            $mail->setHeader("In-Reply-To", "<" . $inReplyTo . ">");
        }
        global $commentslib;
        $attachments = $commentslib->get_thread_attachments($object, 0);
        if (count($attachments) > 0) {
            foreach ($attachments as $att) {
                $att_data = $commentslib->get_thread_attachment($att['attId']);
                $file = $mail->getFile($att_data['dir'] . $att_data['path']);
                $mail->addAttachment($file, $att_data['filename'], $att_data['filetype']);
            }
        }
        $mail->buildMessage();
        // Message-ID is set below buildMessage because otherwise lib/webmail/htmlMimeMail.php will over-write it.
        $mail->setHeader("Message-ID", "<" . $messageId . ">");
        $mail->send(array($forum_info['outbound_address']));
    }
    $nots = array();
    $defaultLanguage = $tikilib->get_preference("language", "en");
    // Users watching this forum or this post
    if ($feature_user_watches == 'y') {
        $nots = $tikilib->get_event_watches($event, $object);
        for ($i = count($nots) - 1; $i >= 0; --$i) {
            $nots[$i]['language'] = $tikilib->get_user_preference($nots[$i]['user'], "language", $defaultLanguage);
        }
    }
    // Special forward address
    //TODO: merge or use the admin notification feature
    if ($forum_info["useMail"] == 'y') {
        $not['email'] = $forum_info['mail'];
        if ($not['user'] = $userlib->get_user_by_email($forum_info['mail'])) {
            $not['language'] = $tikilib->get_user_preference($not['user'], "language", $defaultLanguage);
        } else {
            $not['language'] = $defaultLanguage;
        }
        $nots[] = $not;
    }
    if (count($nots)) {
        include_once 'lib/webmail/tikimaillib.php';
        $mail = new TikiMail();
        $smarty->assign('mail_forum', $forum_info["name"]);
        $smarty->assign('mail_title', $title);
        $smarty->assign('mail_date', date("U"));
        $smarty->assign('mail_message', $data);
        $smarty->assign('mail_author', $author);
        $foo = parse_url($_SERVER["REQUEST_URI"]);
        $machine = $tikilib->httpPrefix() . dirname($foo["path"]);
        $machine = preg_replace("!/\$!", "", $machine);
        // just incase
        $smarty->assign('mail_machine', $machine);
        $smarty->assign('forumId', $forum_info["forumId"]);
        if ($event == "forum_post_topic") {
            $smarty->assign('new_topic', 'y');
            $smarty->assign('topicId', $threadId);
        } else {
            $smarty->assign('topicId', $object);
        }
        $smarty->assign('mail_topic', $topicName);
        foreach ($nots as $not) {
            $mail->setUser($not['user']);
            $mail_data = $smarty->fetchLang($not['language'], "mail/notification_subject.tpl");
            $mail->setSubject($mail_data);
            $mail_data = $smarty->fetchLang($not['language'], "mail/forum_post_notification.tpl");
            $mail->setText($mail_data);
            $mail->buildMessage();
            $mail->send(array($not['email']));
        }
    }
}
示例#9
0
	function send_replace_item_notifications($args)
	{
		global $prefs, $user;

		// Don't send a notification if this operation is part of a bulk import
		if ($args['bulk_import']) {
			return;
		}

		$trackerId = $args['trackerId'];
		$itemId = $args['object'];

		$new_values = $args['values'];
		$old_values = $args['old_values'];

		$the_data = $this->generate_watch_data($old_values, $new_values, $trackerId, $itemId, $args['version']);

		$tracker_definition = Tracker_Definition::get($trackerId);
		$tracker_info = $tracker_definition->getInformation();

		$watchers = $this->get_notification_emails($trackerId, $itemId, $tracker_info, $new_values['status'], $old_values['status']);

		if (count($watchers) > 0) {
			$simpleEmail = isset($tracker_info['simpleEmail']) ? $tracker_info['simpleEmail'] : "n";

			$trackerName = $tracker_info['name'];
			if (!isset($_SERVER["SERVER_NAME"])) {
				$_SERVER["SERVER_NAME"] = $_SERVER["HTTP_HOST"];
			}
			include_once('lib/webmail/tikimaillib.php');
			if ( $simpleEmail == "n" ) {
				$desc = $this->get_isMain_value($trackerId, $itemId);
				if ($tracker_info['doNotShowEmptyField'] === 'y') {	// remove empty fields if tracker says so
					$the_data = preg_replace('/\[-\[.*?\]-\] -\[\(.*?\)\]-:\n\n----------\n/', '', $the_data);
				}

				$smarty = TikiLib::lib('smarty');

				$smarty->assign('mail_date', $this->now);
				$smarty->assign('mail_user', $user);
				$smarty->assign('mail_itemId', $itemId);
				$smarty->assign('mail_item_desc', $desc);
				$smarty->assign('mail_trackerId', $trackerId);
				$smarty->assign('mail_trackerName', $trackerName);
				$smarty->assign('server_name', $_SERVER['SERVER_NAME']);
				$foo = parse_url($_SERVER["REQUEST_URI"]);
				$machine = $this->httpPrefix(true). $foo["path"];
				$smarty->assign('mail_machine', $machine);
				$parts = explode('/', $foo['path']);
				if (count($parts) > 1)
					unset ($parts[count($parts) - 1]);
				$smarty->assign('mail_machine_raw', $this->httpPrefix(true). implode('/', $parts));
				$smarty->assign_by_ref('status', $new_values['status']);
				foreach ($watchers as $watcher) {
					$label = $itemId ? tra('Item Modification', $watcher['language']) : tra('Item creation', $watcher['language']);
					$mail_action = "\r\n$label\r\n\r\n";
					$mail_action.= tra('Tracker', $watcher['language']).":\n   $trackerName\r\n";
					$mail_action.= tra('Item', $watcher['language']).":\n   $itemId $desc";

					$smarty->assign('mail_action', $mail_action);
					$smarty->assign('mail_data', $the_data);
					if (isset($watcher['action']))
						$smarty->assign('mail_action', $watcher['action']);
					$smarty->assign('mail_to_user', $watcher['user']);
					$mail_data = $smarty->fetchLang($watcher['language'], 'mail/tracker_changed_notification.tpl');
					$mail = new TikiMail($watcher['user']);
					$mail->setSubject($smarty->fetchLang($watcher['language'], 'mail/tracker_changed_notification_subject.tpl'));
					$mail->setText($mail_data);
					$mail->setHeader("From", $prefs['sender_email']);
					$mail->send(array($watcher['email']));
				}
			} else {
					// Use simple email
				$foo = parse_url($_SERVER["REQUEST_URI"]);
				$machine = $this->httpPrefix(true). $foo["path"];
				$parts = explode('/', $foo['path']);
				if (count($parts) > 1) {
					unset ($parts[count($parts) - 1]);
				}
				$machine = $this->httpPrefix(true). implode('/', $parts);

				$userlib = TikiLib::lib('user');

				if (!empty($user)) {
					$my_sender = $userlib->get_user_email($user);
				} else { // look if a email field exists
					$fieldId = $this->get_field_id_from_type($trackerId, 'm');
					if (!empty($fieldId)) {
						$my_sender = $this->get_item_value($trackerId, $itemId, $fieldId);
					}
				}

				// Try to find a Subject in $the_data looking for strings marked "-[Subject]-" TODO: remove the tra (language translation by submitter)
				$the_string = '/^\[-\['.tra('Subject').'\]-\] -\[[^\]]*\]-:\n(.*)/m';
				$subject_test_unchanged = preg_match($the_string, $the_data, $unchanged_matches);
				$the_string = '/^\[-\['.tra('Subject').'\]-\]:\n(.*)\n(.*)\n\n(.*)\n(.*)/m';
				$subject_test_changed = preg_match($the_string, $the_data, $matches);
				$subject = '';

				if ( $subject_test_unchanged == 1 ) {
					$subject = $unchanged_matches[1];
				}
				if ( $subject_test_changed == 1 ) {
					$subject = $matches[1].' '.$matches[2].' '.$matches[3].' '.$matches[4];
				}

				$i = 0;
				foreach ($watchers as $watcher) {
					$mail = new TikiMail($watcher['user']);
					// first we look for strings marked "-[...]-" to translate by watcher language
					$translate_strings[$i] = preg_match_all('/-\[([^\]]*)\]-/', $the_data, $tra_matches);
					$watcher_subject = $subject;
					$watcher_data = $the_data;
					if ($translate_strings[$i] > 0) {
						foreach ($tra_matches[1] as $match) {
							// now we replace the marked strings with correct translations
							$tra_replace = tra($match, $watcher['language']);
							$tra_match = "/-\[".preg_quote($match)."\]-/m";
							$watcher_subject = preg_replace($tra_match, $tra_replace, $watcher_subject);
							$watcher_data = preg_replace($tra_match, $tra_replace, $watcher_data);
						}
					}

					$mail->setSubject('['.$trackerName.'] '.str_replace('> ', '', $watcher_subject).' (' . tra('Tracker was modified at %0 by %1', $watcher['language'], false, array($_SERVER["SERVER_NAME"], $user)) . ')');
					$mail->setText(tra('View the tracker item at:', $watcher['language'])." $machine/tiki-view_tracker_item.php?itemId=$itemId\n\n" . $watcher_data);
					if ( ! empty( $my_sender ) ) {
						$mail->setHeader("Reply-To", $my_sender);
					}
					$mail->send(array($watcher['email']));
					$i++;
				}
			}
		}
	}
function payment_behavior_cart_gift_certificate_purchase($productId = 0, $giftcertemail = '', $quantity = 1, $orderId = 0, $orderItemId = 0)
{
    global $trklib;
    require_once "lib/trackers/trackerlib.php";
    global $prefs;
    $params['trackerId'] = $prefs['payment_cart_giftcert_tracker'];
    $redeemCodeFieldId = $trklib->get_field_id($params['trackerId'], 'Redeem Code');
    $nameFieldId = $trklib->get_field_id($params['trackerId'], 'Name');
    $modeFieldId = $trklib->get_field_id($params['trackerId'], 'Mode');
    $onelineDescriptionFieldId = $trklib->get_field_id($params['trackerId'], 'One line description');
    $longDescriptionFieldId = $trklib->get_field_id($params['trackerId'], 'Long Description');
    $origbalanceFieldId = $trklib->get_field_id($params['trackerId'], 'Original Balance or Percentage');
    $curbalanceFieldId = $trklib->get_field_id($params['trackerId'], 'Current Balance or Percentage');
    $params['copyFieldIds'][] = $nameFieldId;
    $params['copyFieldIds'][] = $trklib->get_field_id($params['trackerId'], 'Type');
    $params['copyFieldIds'][] = $trklib->get_field_id($params['trackerId'], 'Type Reference');
    $params['copyFieldIds'][] = $origbalanceFieldId;
    $params['copyFieldIds'][] = $modeFieldId;
    $params['copyFieldIds'][] = $onelineDescriptionFieldId;
    $params['updateFieldIds'][] = $trklib->get_field_id($params['trackerId'], 'Gift Certificate ID');
    $params['updateFieldIds'][] = $trklib->get_field_id($params['trackerId'], 'Origination');
    $params['updateFieldIds'][] = $redeemCodeFieldId;
    $params['updateFieldIds'][] = $curbalanceFieldId;
    $params['updateFieldIds'][] = $trklib->get_field_id($params['trackerId'], 'Admin notes');
    $params['updateFieldIds'][] = $trklib->get_field_id($params['trackerId'], 'Order ID');
    $params['updateFieldIds'][] = $trklib->get_field_id($params['trackerId'], 'Order Item ID');
    $balancefield = 'f_' . $origbalanceFieldId;
    $params['updateFieldValues'] = array('', 'Order', '-randomstring-', $balancefield, "Purchased by {$giftcertemail}", $orderId, $orderItemId);
    // Product tracker info
    $productsTrackerId = $prefs['payment_cart_product_tracker'];
    $giftcertTemplateFieldId = $trklib->get_field_id($productsTrackerId, $prefs['payment_cart_giftcerttemplate_fieldname']);
    if (!$productId) {
        return false;
    }
    $giftcertId = $trklib->get_item_value($productsTrackerId, $productId, $giftcertTemplateFieldId);
    $params['itemId'] = $giftcertId;
    $params['copies_on_load'] = $quantity;
    $params['return_array'] = 'y';
    include_once 'lib/wiki-plugins/wikiplugin_trackeritemcopy.php';
    $return_array = wikiplugin_trackeritemcopy('', $params);
    $giftcerts = array();
    // Get additional information
    foreach ($return_array['items'] as $newItemId) {
        $newItem = $trklib->get_tracker_item($newItemId);
        $newGiftcert['name'] = $newItem[$nameFieldId];
        $newGiftcert['redeemCode'] = $newItem[$redeemCodeFieldId];
        $newGiftcert['onelineDescription'] = $newItem[$onelineDescriptionFieldId];
        $newGiftcert['longDescription'] = $newItem[$longDescriptionFieldId];
        $newGiftcert['value'] = $newItem[$curbalanceFieldId];
        if (strpos($newItem[$modeFieldId], 'Percentage') !== false) {
            $newGiftcert['isPercentage'] = true;
        } else {
            $newGiftcert['isPercentage'] = false;
        }
        $giftcerts[] = $newGiftcert;
    }
    // Send email to user with gift cert
    require_once 'lib/webmail/tikimaillib.php';
    global $smarty, $prefs;
    $smarty->assign('giftcerts', $giftcerts);
    $smarty->assign('numberCodes', count($return_array['items']));
    $mail_subject = $smarty->fetch('mail/cart_gift_cert_subject.tpl');
    $mail_data = $smarty->fetch('mail/cart_gift_cert.tpl');
    $mail = new TikiMail();
    $mail->setSubject($mail_subject);
    $mail->setText($mail_data);
    $mail->setHeader("From", $prefs['sender_email']);
    $mail->send($giftcertemail);
    return true;
}
 }
 if (!empty($_REQUEST['addresses'])) {
     $smarty->assign('addresses', $_REQUEST['addresses']);
 }
 if (!empty($_REQUEST['name'])) {
     $smarty->assign('name', $_REQUEST['name']);
 }
 if (!empty($_REQUEST['comment'])) {
     $smarty->assign('comment', $_REQUEST['comment']);
 }
 if (empty($errors)) {
     include_once 'lib/webmail/tikimaillib.php';
     $mail = new TikiMail();
     $smarty->assign_by_ref('mail_site', $_SERVER['SERVER_NAME']);
     $mail->setFrom($from);
     $mail->setHeader("Return-Path", "<{$from}>");
     $mail->setHeader("Reply-To", "<{$from}>");
     if (isset($_REQUEST['report']) && $_REQUEST['report'] == 'y') {
         $subject = tra('Report to the webmaster', $prefs['site_language']);
     } else {
         $subject = $smarty->fetch('mail/tellAFriend_subject.tpl');
     }
     $txt = $smarty->fetch('mail/tellAFriend.tpl');
     $mail->setSubject($subject);
     $mail->setText($txt);
     $mail->buildMessage();
     $ok = true;
     foreach ($emails as $email) {
         $ok = $ok && $mail->send(array($email));
     }
     if ($ok) {
示例#12
0
  */
 if (isset($_GET['fileId']) && $detailtoken['parameters'] == '{"fileId":"' . $_GET['fileId'] . '"}') {
     $_SESSION['allowed'][$_GET['fileId']] = true;
 }
 // If notification then alert
 if ($prefs['share_token_notification'] == 'y') {
     $nots = $tikilib->get_event_watches('auth_token_called', $detailtoken['tokenId']);
     $smarty->assign('prefix_url', $base_host);
     // Select in db the tokenId
     $notificationPage = '';
     $smarty->assign_by_ref('page_token', $notificationPage);
     if (is_array($nots)) {
         include_once 'lib/webmail/tikimaillib.php';
         $mail = new TikiMail();
         $mail->setFrom($prefs['sender_email']);
         $mail->setHeader('Return-Path', '<' . $prefs['sender_email'] . '>');
         $mail->setHeader('Reply-To', '<' . $prefs['sender_email'] . '>');
         $mail->setSubject($detailtoken['email'] . ' ' . tra(' has accessed your temporary shared content'));
         foreach ($nots as $i => $not) {
             $notificationPage = $not['url'];
             // Delete token from url
             $notificationPage = preg_replace('/[\\?&]TOKEN=' . $detailtoken['token'] . '/', '', $notificationPage);
             // If file Gallery
             $smarty->assign('filegallery', 'n');
             if (preg_match("/\\btiki-download_file.php\\b/i", $notificationPage)) {
                 include_once 'lib/filegals/filegallib.php';
                 $smarty->assign('filegallery', 'y');
                 $aParams = (array) json_decode($detailtoken['parameters']);
                 $smarty->assign('fileId', $aParams['fileId']);
                 $aFileInfos = $filegallib->get_file_info($aParams['fileId']);
                 $smarty->assign('filegalleryId', $aFileInfos['galleryId']);
/** 
 *\brief send the email notifications dealing with wiki page  changes to
 * admin notification addresses + watching users addresses (except editor is configured)
 * \$event: 'wiki_page_created'|'wiki_page_changed'|wiki_page_deleted |wiki_file_attached
 *
 */
function sendWikiEmailNotification($wikiEvent, $pageName, $edit_user, $edit_comment, $oldver, $edit_data, $machine = '', $diff = '', $minor = false, $contributions = '', $structure_parent_id = 0, $attId = 0, $lang = '')
{
    global $tikilib, $prefs, $smarty, $userlib;
    global $notificationlib;
    include_once 'lib/notifications/notificationlib.php';
    $nots = array();
    $defaultLanguage = $prefs['site_language'];
    if ($wikiEvent == 'wiki_file_attached') {
        $event = 'wiki_page_changed';
    } else {
        $event = $wikiEvent;
    }
    if ($prefs['feature_user_watches'] == 'y') {
        $nots = $tikilib->get_event_watches($event, $pageName);
    }
    if ($prefs['feature_user_watches'] == 'y' && $event == 'wiki_page_changed') {
        global $structlib;
        include_once 'lib/structures/structlib.php';
        $nots2 = $structlib->get_watches($pageName);
        if (!empty($nots2)) {
            $nots = array_merge($nots, $nots2);
        }
        if ($prefs['wiki_watch_editor'] != "y") {
            for ($i = count($nots) - 1; $i >= 0; --$i) {
                if ($nots[$i]['user'] == $edit_user) {
                    unset($nots[$i]);
                    break;
                }
            }
        }
        foreach (array_keys($nots) as $i) {
            $nots[$i]['language'] = $tikilib->get_user_preference($nots[$i]['user'], "language", $defaultLanguage);
        }
    }
    if ($prefs['feature_user_watches'] == 'y' && $event == 'wiki_page_created' && $structure_parent_id) {
        global $structlib;
        include_once 'lib/structures/structlib.php';
        $nots = array_merge($nots, $structlib->get_watches('', $structure_parent_id));
    }
    // admin notifications
    // If it's a minor change, get only the minor change watches.
    if ($minor) {
        $emails = $notificationlib->get_mail_events('wiki_page_changes_incl_minor', $pageName);
        // look for pageName and any page
    } else {
        // else if it's not minor change, get both watch types.
        $emails1 = $notificationlib->get_mail_events('wiki_page_changes', $pageName);
        // look for pageName and any page
        $emails2 = $notificationlib->get_mail_events('wiki_page_changes_incl_minor', $pageName);
        // look for pageName and any page
        $emails = array_merge($emails1, $emails2);
    }
    foreach ($emails as $email) {
        if ($prefs['wiki_watch_editor'] != "y" && $email == $edit_user) {
            continue;
        }
        if (!testEmailInList($nots, $email)) {
            $not = array('email' => $email);
            if ($not['user'] = $userlib->get_user_by_email($email)) {
                $not['language'] = $tikilib->get_user_preference($not['user'], "language", $defaultLanguage);
            } else {
                $not['language'] = $defaultLanguage;
            }
            $nots[] = $not;
        }
    }
    if ($edit_user == '') {
        $edit_user = tra('Anonymous');
    }
    if ($prefs['feature_user_watches'] == 'y' && $prefs['feature_daily_report_watches'] == 'y') {
        if ($wikiEvent == 'wiki_file_attached') {
            $reportsManager = Reports_Factory::build('Reports_Manager');
            $reportsManager->addToCache($nots, array("event" => $wikiEvent, "pageName" => $pageName, 'attId' => $attId, "editUser" => $edit_user, "editComment" => $edit_comment, 'filename' => $edit_data));
        } else {
            $reportsManager = Reports_Factory::build('Reports_Manager');
            $reportsManager->addToCache($nots, array("event" => $wikiEvent, "pageName" => $pageName, "object" => $pageName, "editUser" => $edit_user, "editComment" => $edit_comment, "oldVer" => $oldver));
        }
    }
    if (count($nots)) {
        $edit_data = TikiLib::htmldecode($edit_data);
        include_once 'lib/mail/maillib.php';
        $smarty->assign('mail_site', $_SERVER["SERVER_NAME"]);
        $smarty->assign('mail_page', $pageName);
        $smarty->assign('mail_date', $tikilib->now);
        $smarty->assign('mail_user', $edit_user);
        $smarty->assign('mail_comment', $edit_comment);
        $newver = $oldver + 1;
        $smarty->assign('mail_oldver', $oldver);
        $smarty->assign('mail_newver', $newver);
        $smarty->assign('mail_data', $edit_data);
        $smarty->assign('mail_attId', $attId);
        $foo = parse_url($_SERVER["REQUEST_URI"]);
        $machine = $tikilib->httpPrefix(true) . dirname($foo["path"]);
        $smarty->assign('mail_machine', $machine);
        if ($prefs['feature_contribution'] == 'y' && !empty($contributions)) {
            global $contributionlib;
            include_once 'lib/contribution/contributionlib.php';
            $smarty->assign('mail_contributions', $contributionlib->print_contributions($contributions));
        }
        $parts = explode('/', $foo['path']);
        if (count($parts) > 1) {
            unset($parts[count($parts) - 1]);
        }
        $smarty->assign('mail_machine_raw', $tikilib->httpPrefix(true) . implode('/', $parts));
        $smarty->assign_by_ref('mail_pagedata', $edit_data);
        $smarty->assign_by_ref('mail_diffdata', $diff);
        if ($event == 'wiki_page_created') {
            $smarty->assign('mail_action', 'new');
        } elseif ($event == 'wiki_page_deleted') {
            $smarty->assign('mail_action', 'delete');
        } elseif ($wikiEvent == 'wiki_file_attached') {
            $smarty->assign('mail_action', 'attach');
        } else {
            $smarty->assign('mail_action', 'edit');
        }
        include_once 'lib/webmail/tikimaillib.php';
        foreach ($nots as $not) {
            if (empty($not['email'])) {
                continue;
            }
            $smarty->assign('watchId', $not['watchId']);
            $mail_subject = $smarty->fetchLang($not['language'], "mail/user_watch_wiki_page_changed_subject.tpl");
            $mail_data = $smarty->fetchLang($not['language'], "mail/user_watch_wiki_page_changed.tpl");
            $mail = new TikiMail($not['user']);
            $mail->setSubject(sprintf($mail_subject, $pageName));
            $mail->setText($mail_data);
            $mail->setHeader("From", $prefs['sender_email']);
            $mail->send(array($not['email']));
        }
    }
}
示例#14
0
 function replace_item($trackerId, $itemId, $ins_fields, $status = '', $ins_categs = array(), $bulk_import = false)
 {
     global $user;
     global $smarty;
     global $notificationlib;
     global $sender_email;
     global $cachelib;
     global $categlib;
     global $feature_categories;
     global $tiki_p_admin_trackers;
     $now = date("U");
     if ($itemId) {
         if ($status) {
             $oldStatus = $this->getOne("select `status` from `tiki_tracker_items` where `itemId`=?", array($itemId));
             $query = "update `tiki_tracker_items` set `status`=?,`lastModif`=? where `itemId`=?";
             $result = $this->query($query, array($status, (int) $now, (int) $itemId));
         } else {
             $query = "update `tiki_tracker_items` set `lastModif`=? where `itemId`=?";
             $result = $this->query($query, array((int) $now, (int) $itemId));
         }
     } else {
         if (!$status) {
             $status = $this->getOne("select `value` from `tiki_tracker_options` where `trackerId`=? and `name`=?", array((int) $trackerId, 'newItemStatus'));
         }
         if (empty($status)) {
             $status = 'o';
         }
         $query = "insert into `tiki_tracker_items`(`trackerId`,`created`,`lastModif`,`status`) values(?,?,?,?)";
         $result = $this->query($query, array((int) $trackerId, (int) $now, (int) $now, $status));
         $new_itemId = $this->getOne("select max(`itemId`) from `tiki_tracker_items` where `created`=? and `trackerId`=?", array((int) $now, (int) $trackerId));
     }
     if ($feature_categories == 'y') {
         global $categlib;
         include_once 'lib/categories/categlib.php';
         $old_categs = $categlib->get_object_categories("tracker {$trackerId}", $itemId ? $itemId : $new_itemId);
         $new_categs = array_diff($ins_categs, $old_categs);
         $del_categs = array_diff($old_categs, $ins_categs);
         $remain_categs = array_diff($old_categs, $new_categs, $del_categs);
     }
     $the_data = tra('Status:') . ' ';
     $statusTypes = $this->status_types();
     if (isset($oldStatus) && $oldStatus != $status) {
         $the_data .= $statusTypes[$oldStatus]['label'] . ' -> ';
     }
     $the_data .= $statusTypes[$status]['label'] . "\n\n";
     foreach ($ins_fields["data"] as $i => $array) {
         if (!isset($ins_fields["data"][$i]["type"]) or $ins_fields["data"][$i]["type"] == 's' or ($ins_fields["data"][$i]["isHidden"] == 'p' or $ins_fields["data"][$i]["isHidden"] == 'y') and $tiki_p_admin_trackers != 'y') {
             // system type, do nothing
             // hidden field type require tracker amdin perm
         } else {
             // -----------------------------
             // save image on disk
             if ($ins_fields["data"][$i]["type"] == 'i' && isset($ins_fields["data"][$i]['value'])) {
                 $itId = $itemId ? $itemId : $new_itemId;
                 $old_file = $this->get_item_value($trackerId, $itemId, $ins_fields["data"][$i]['fieldId']);
                 if ($ins_fields["data"][$i]["value"] == 'blank') {
                     if (file_exists($old_file)) {
                         unlink($old_file);
                     }
                     $ins_fields["data"][$i]["value"] = '';
                 } else {
                     if ($ins_fields["data"][$i]['value'] != '' && $this->check_image_type($ins_fields["data"][$i]['file_type'])) {
                         $opts = split(',', $ins_fields['data'][$i]["options"]);
                         if (!empty($opts[4])) {
                             global $imagegallib;
                             include_once 'lib/imagegals/imagegallib.php';
                             $imagegallib->image = $ins_fields["data"][$i]['value'];
                             $imagegallib->rescaleImage($opts[4], $opts[4]);
                             $ins_fields["data"][$i]['value'] = $imagegallib->image;
                         }
                         if ($ins_fields["data"][$i]['file_size'] <= $this->imgMaxSize) {
                             $file_name = $this->get_image_filename($ins_fields["data"][$i]['file_name'], $itemId, $ins_fields["data"][$i]['fieldId']);
                             $fw = fopen($file_name, "wb");
                             fwrite($fw, $ins_fields["data"][$i]['value']);
                             fflush($fw);
                             fclose($fw);
                             $ins_fields['data'][$i]['value'] = $file_name;
                             if (file_exists($old_file) && $old_file != $file_name) {
                                 unlink($old_file);
                             }
                         }
                     } else {
                         continue;
                     }
                 }
             }
             // ---------------------------
             $fieldId = $ins_fields["data"][$i]["fieldId"];
             if (isset($ins_fields["data"][$i]["name"])) {
                 $name = $ins_fields["data"][$i]["name"];
             } else {
                 $name = $this->getOne("select `name` from `tiki_tracker_fields` where `fieldId`=?", array((int) $fieldId));
             }
             $value = @$ins_fields["data"][$i]["value"];
             if ($ins_fields["data"][$i]["type"] == 'e' && $feature_categories == 'y') {
                 // category type
                 $my_categs = $categlib->get_child_categories($ins_fields['data'][$i]["options"]);
                 $aux = array();
                 foreach ($my_categs as $cat) {
                     $aux[] = $cat['categId'];
                 }
                 $my_categs = $aux;
                 $my_new_categs = array_intersect($new_categs, $my_categs);
                 $my_del_categs = array_intersect($del_categs, $my_categs);
                 $my_remain_categs = array_intersect($remain_categs, $my_categs);
                 if (sizeof($my_new_categs) + sizeof($my_del_categs) == 0) {
                     $the_data .= "{$name} " . tra('(unchanged)') . ":\n";
                 } else {
                     $the_data .= "{$name} :\n";
                 }
                 if (sizeof($my_new_categs) > 0) {
                     $the_data .= "  " . tra("Added:") . "\n";
                     $the_data .= $this->_describe_category_list($my_new_categs);
                 }
                 if (sizeof($my_del_categs) > 0) {
                     $the_data .= "  " . tra("Removed:") . "\n";
                     $the_data .= $this->_describe_category_list($my_del_categs);
                 }
                 if (sizeof($my_remain_categs) > 0) {
                     $the_data .= "  " . tra("Remaining:") . "\n";
                     $the_data .= $this->_describe_category_list($my_remain_categs);
                 }
                 $the_data .= "\n";
                 if ($itemId) {
                     $query = "select `itemId` from `tiki_tracker_item_fields` where `itemId`=?";
                     if ($this->getOne($query, (int) $itemId)) {
                         $query = "update `tiki_tracker_item_fields` set `value`=? where `itemId`=? and `fieldId`=?";
                         $this->query($query, array('', (int) $itemId, (int) $fieldId));
                     } else {
                         $query = "insert into `tiki_tracker_item_fields`(`itemId`,`fieldId`,`value`) values(?,?,?)";
                         $this->query($query, array((int) $itemId, (int) $fieldId, ''));
                     }
                 } else {
                     $query = "insert into `tiki_tracker_item_fields`(`itemId`,`fieldId`,`value`) values(?,?,?)";
                     $this->query($query, array((int) $new_itemId, (int) $fieldId, ''));
                 }
             } else {
                 $is_date = (isset($ins_fields["data"][$i]["type"]) and ($ins_fields["data"][$i]["type"] == 'f' or $ins_fields["data"][$i]["type"] == 'j'));
                 $is_visible = !isset($ins_fields["data"][$i]["isHidden"]) || $ins_fields["data"][$i]["isHidden"] == 'n';
                 if ($itemId) {
                     $result = $this->query('select `value` from `tiki_tracker_item_fields` where `itemId`=? and `fieldId`=?', array((int) $itemId, (int) $fieldId));
                     if ($row = $result->fetchRow()) {
                         if ($is_visible) {
                             $old_value = $row['value'];
                             if ($is_date) {
                                 $old_value = date('r', (int) $old_value);
                                 $new_value = date('r', (int) $value);
                             } else {
                                 $new_value = $value;
                             }
                             if ($old_value != $new_value) {
                                 $the_data .= "{$name}" . ":\n " . tra("Old:") . " {$old_value}\n " . tra("New:") . " {$new_value}\n\n";
                             } else {
                                 $the_data .= "{$name} " . tra('(unchanged)') . ":\n {$value}\n\n";
                             }
                         }
                         $query = "update `tiki_tracker_item_fields` set `value`=? where `itemId`=? and `fieldId`=?";
                         $this->query($query, array($value, (int) $itemId, (int) $fieldId));
                     } else {
                         if ($is_visible) {
                             if ($is_date) {
                                 $new_value = date('r', (int) $value);
                             } else {
                                 $new_value = $value;
                             }
                             $the_data .= "{$name}" . ":\n   {$value}\n\n";
                         }
                         $query = "insert into `tiki_tracker_item_fields`(`itemId`,`fieldId`,`value`) values(?,?,?)";
                         $this->query($query, array((int) $itemId, (int) $fieldId, (string) $value));
                     }
                 } else {
                     if ($is_visible) {
                         if ($is_date) {
                             $new_value = date('r', (int) $value);
                         } else {
                             $new_value = $value;
                         }
                         $the_data .= "{$name}" . ":\n   {$value}\n\n";
                     }
                     $query = "insert into `tiki_tracker_item_fields`(`itemId`,`fieldId`,`value`) values(?,?,?)";
                     $this->query($query, array((int) $new_itemId, (int) $fieldId, (string) $value));
                 }
                 $cachelib->invalidate(md5('trackerfield' . $fieldId . 'o'));
                 $cachelib->invalidate(md5('trackerfield' . $fieldId . 'c'));
                 $cachelib->invalidate(md5('trackerfield' . $fieldId . 'p'));
                 $cachelib->invalidate(md5('trackerfield' . $fieldId . 'op'));
                 $cachelib->invalidate(md5('trackerfield' . $fieldId . 'oc'));
                 $cachelib->invalidate(md5('trackerfield' . $fieldId . 'pc'));
                 $cachelib->invalidate(md5('trackerfield' . $fieldId . 'opc'));
             }
         }
     }
     // Don't send a notification if this operation is part of a bulk import
     if (!$bulk_import) {
         $options = $this->get_tracker_options($trackerId);
         include_once 'lib/notifications/notificationlib.php';
         $emails = $notificationlib->get_mail_events('tracker_modified', $trackerId);
         $emails2 = $notificationlib->get_mail_events('tracker_item_modified', $itemId);
         if (array_key_exists("outboundEmail", $options) && $options["outboundEmail"]) {
             $emails3 = array($options["outboundEmail"]);
         } else {
             $emails3 = array();
         }
         $emails = array_merge($emails, $emails2, $emails3);
         if (!isset($_SERVER["SERVER_NAME"])) {
             $_SERVER["SERVER_NAME"] = $_SERVER["HTTP_HOST"];
         }
         if (array_key_exists("simpleEmail", $options)) {
             $simpleEmail = $options["simpleEmail"];
         } else {
             $simpleEmail = "n";
         }
         $trackerName = $this->getOne("select `name` from `tiki_trackers` where `trackerId`=?", array((int) $trackerId));
         if (count($emails) > 0) {
             if ($simpleEmail == "n") {
                 $smarty->assign('mail_date', $now);
                 $smarty->assign('mail_user', $user);
                 if ($itemId) {
                     $mail_action = "\r\n" . tra('Item Modification') . "\r\n\r\n";
                     $mail_action .= tra('Tracker') . ":\n   " . $trackerName . "\r\n";
                     $mail_action .= tra('Item') . ":\n   " . $itemId;
                 } else {
                     $mail_action = "\r\n" . tra('Item creation') . "\r\n\r\n";
                     $mail_action .= tra('Tracker') . ': ' . $trackerName;
                 }
                 $smarty->assign('mail_action', $mail_action);
                 $smarty->assign('mail_data', $the_data);
                 if ($itemId) {
                     $smarty->assign('mail_itemId', $itemId);
                 } else {
                     $smarty->assign('mail_itemId', $new_itemId);
                 }
                 $smarty->assign('mail_trackerId', $trackerId);
                 $smarty->assign('mail_trackerName', $trackerName);
                 $foo = parse_url($_SERVER["REQUEST_URI"]);
                 $machine = $this->httpPrefix() . $foo["path"];
                 $smarty->assign('mail_machine', $machine);
                 $parts = explode('/', $foo['path']);
                 if (count($parts) > 1) {
                     unset($parts[count($parts) - 1]);
                 }
                 $smarty->assign('mail_machine_raw', $this->httpPrefix() . implode('/', $parts));
                 $mail_data = $smarty->fetch('mail/tracker_changed_notification.tpl');
                 include_once 'lib/webmail/tikimaillib.php';
                 $mail = new TikiMail();
                 $mail->setSubject(tra('Tracker was modified at ') . $_SERVER["SERVER_NAME"]);
                 $mail->setText($mail_data);
                 $mail->setHeader("From", $sender_email);
                 $mail->send($emails);
             } else {
                 // Use simple email
                 global $userlib;
                 $user_email = $userlib->get_user_email($user);
                 $my_sender = $user_email;
                 // Default subject
                 $subject = '[' . $trackerName . '] ' . tra('Tracker was modified at ') . $_SERVER["SERVER_NAME"];
                 // Try to find a Subject in $the_data
                 $subject_test = preg_match('/^Subject:\\n   .*$/m', $the_data, $matches);
                 if ($subject_test == 1) {
                     $subject = preg_replace('/^Subject:\\n   /m', '', $matches[0]);
                     // Remove the subject from $the_data
                     $the_data = preg_replace('/^Subject:\\n   .*$/m', '', $the_data);
                 }
                 $the_data = preg_replace('/^.+:\\n   /m', '', $the_data);
                 //outbound email ->  will be sent in utf8 - from sender_email
                 include_once 'lib/webmail/tikimaillib.php';
                 $mail = new TikiMail();
                 $mail->setSubject($subject);
                 $mail->setText($the_data);
                 if (!empty($my_sender)) {
                     $mail->setHeader("From", $my_sender);
                 }
                 $mail->send($emails);
             }
         }
     }
     $cant_items = $this->getOne("select count(*) from `tiki_tracker_items` where `trackerId`=?", array((int) $trackerId));
     $query = "update `tiki_trackers` set `items`=?,`lastModif`=?  where `trackerId`=?";
     $result = $this->query($query, array((int) $cant_items, (int) $now, (int) $trackerId));
     if (!$itemId) {
         $itemId = $new_itemId;
     }
     global $cachelib;
     require_once 'lib/cache/cachelib.php';
     $cachelib->invalidate('trackerItemLabel' . $itemId);
     return $itemId;
 }
示例#15
0
 /**
  * Send a message to a user
  */
 function post_message($user, $from, $to, $cc, $subject, $body, $priority, $replyto_hash = '', $replyto_email = '', $bcc_sender = '')
 {
     global $smarty, $userlib, $prefs;
     $subject = strip_tags($subject);
     $body = strip_tags($body, '<a><b><img><i>');
     // Prevent duplicates
     $hash = md5($subject . $body);
     if ($this->getOne('select count(*) from `messu_messages` where `user`=? and `user_from`=? and `hash`=?', array($user, $from, $hash))) {
         return false;
     }
     $query = 'insert into `messu_messages`' . ' (`user`, `user_from`, `user_to`, `user_cc`, `subject`, `body`, `date`' . ', `isRead`, `isReplied`, `isFlagged`, `priority`, `hash`, `replyto_hash`)' . ' values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
     $this->query($query, array($user, $from, $to, $cc, $subject, $body, (int) $this->now, 'n', 'n', 'n', (int) $priority, $hash, $replyto_hash));
     // Now check if the user should be notified by email
     $foo = parse_url($_SERVER['REQUEST_URI']);
     $machine = $this->httpPrefix(true) . $foo['path'];
     $machine = str_replace('messu-compose', 'messu-mailbox', $machine);
     $machine = str_replace('messu-broadcast', 'messu-mailbox', $machine);
     if ($this->get_user_preference($user, 'minPrio', 6) <= $priority) {
         if (!isset($_SERVER['SERVER_NAME'])) {
             $_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
         }
         $email = $userlib->get_user_email($user);
         if ($email) {
             include_once 'lib/webmail/tikimaillib.php';
             $smarty->assign('mail_site', $_SERVER['SERVER_NAME']);
             $smarty->assign('mail_machine', $machine);
             $smarty->assign('mail_date', $this->now);
             $smarty->assign('mail_user', stripslashes($user));
             $smarty->assign('mail_from', stripslashes($from));
             $smarty->assign('mail_subject', stripslashes($subject));
             $smarty->assign('mail_body', stripslashes($body));
             $mail = new TikiMail($user);
             $lg = $this->get_user_preference($user, 'language', $prefs['site_language']);
             if (empty($subject)) {
                 $s = $smarty->fetchLang($lg, 'mail/messu_message_notification_subject.tpl');
                 $mail->setSubject(sprintf($s, $_SERVER['SERVER_NAME']));
             } else {
                 $mail->setSubject($subject);
             }
             $mail_data = $smarty->fetchLang($lg, 'mail/messu_message_notification.tpl');
             $mail->setText($mail_data);
             if ($userlib->user_exists($from)) {
                 $from_email = $userlib->get_user_email($from);
                 if ($bcc_sender === 'y' && !empty($from_email)) {
                     $mail->setHeader('Bcc', $from_email);
                 }
                 if ($replyto_email !== 'y' && $userlib->get_user_preference($from, 'email is public', 'n') == 'n') {
                     $from_email = '';
                     // empty $from_email if not to be used - saves getting it twice
                 }
                 if (!empty($from_email)) {
                     $mail->setHeader('Reply-To', $from_email);
                 }
             }
             if (!empty($prefs['sender_email'])) {
                 $mail->setHeader('From', $prefs['sender_email']);
             } else {
                 if (!empty($from_email)) {
                     $mail->setHeader('From', $from_email);
                 }
             }
             if (!$mail->send(array($email), 'mail')) {
                 return false;
                 //TODO echo $mail->errors;
             }
         }
     }
     return true;
 }
 function replace_item($trackerId, $itemId, $ins_fields, $status = '')
 {
     if (!$trackerId) {
         return;
     }
     global $user, $smarty, $notificationlib, $prefs, $cachelib;
     // update
     if ($itemId) {
         if ($status) {
             $query = "update `tiki_tracker_items` set `status`=?,`lastModif`=? where `itemId`=?";
             $result = $this->query($query, array($status, (int) $this->now, (int) $itemId));
         } else {
             $query = "update `tiki_tracker_items` set `lastModif`=? where `itemId`=?";
             $result = $this->query($query, array((int) $this->now, (int) $itemId));
         }
         // insert
     } else {
         if (!$status) {
             $status = $this->getOne("select `value` from `tiki_tracker_options` where `trackerId`=? and `name`=?", array((int) $trackerId, 'newItemStatus'));
         }
         if (empty($status)) {
             $status = 'o';
         }
         $query = "insert into `tiki_tracker_items`(`trackerId`,`created`,`lastModif`,`status`) values(?,?,?,?)";
         $result = $this->query($query, array((int) $trackerId, (int) $this->now, (int) $this->now, $status));
         $new_itemId = $this->getOne("select max(`itemId`) from `tiki_tracker_items` where `created`=? and `trackerId`=?", array((int) $this->now, (int) $trackerId));
     }
     $the_data = '';
     // --
     // inserts an empty item
     // if necessary
     $this->get_tracker_values_specs($trackerId, $explicit, $dsn);
     $tableId = $this->get_table_id($trackerId, $explicit);
     if ($itemId == false) {
         $query = "insert into {$tableId}(`itemId`)values(?)";
         $this->query($query, array((int) $new_itemId));
     }
     // --
     for ($i = 0; $i < count($ins_fields["data"]); $i++) {
         if (isset($ins_fields["data"][$i]["type"]) and $ins_fields["data"][$i]["type"] == 'e') {
         } elseif (isset($ins_fields["data"][$i]["fieldId"])) {
             $fieldId = $ins_fields["data"][$i]["fieldId"];
             if (isset($ins_fields["data"][$i]["name"])) {
                 $name = $ins_fields["data"][$i]["name"];
             } else {
                 $name = $this->getOne("select `name` from `tiki_tracker_fields` where `fieldId`=?", array((int) $fieldId));
             }
             if (isset($ins_fields["data"][$i]["value"])) {
                 $value = $ins_fields["data"][$i]["value"];
             } else {
                 $value = '';
             }
             if (isset($ins_fields["data"][$i]["type"]) and $ins_fields["data"][$i]["type"] == 'q' and $itemId == false) {
                 $value = $this->getOne("select max(cast(field_{$fieldId} as UNSIGNED)) from {$tableId}") + 1;
             }
             if (isset($ins_fields["data"][$i]["type"]) and ($ins_fields["data"][$i]["type"] == 'f' or $ins_fields["data"][$i]["type"] == 'j')) {
                 $human_value = $this->date_format("%a, %e %b %Y %H:%M:%S %O", $ins_fields["data"][$i]["value"]);
                 $the_data .= "  {$name} = {$human_value}\n";
             } else {
                 $the_data .= "  {$name} = {$value}\n";
             }
             $colId = $this->get_col_id($fieldId, $explicit);
             $itId = $itemId ? $itemId : $new_itemId;
             $query = "update {$tableId} set {$colId}=? where `itemId`=?";
             //echo "UPDATE : $colId -> $value<br>\n";
             $this->query($query, array($value, $itId));
             $cachelib->invalidate(md5('trackerfield' . $fieldId . 'o'));
             $cachelib->invalidate(md5('trackerfield' . $fieldId . 'c'));
             $cachelib->invalidate(md5('trackerfield' . $fieldId . 'p'));
             $cachelib->invalidate(md5('trackerfield' . $fieldId . 'op'));
             $cachelib->invalidate(md5('trackerfield' . $fieldId . 'oc'));
             $cachelib->invalidate(md5('trackerfield' . $fieldId . 'pc'));
             $cachelib->invalidate(md5('trackerfield' . $fieldId . 'opc'));
         }
     }
     //-------------------------------------------------------------------------
     $options = $this->get_tracker_options($trackerId);
     include_once 'lib/notifications/notificationlib.php';
     $emails = $notificationlib->get_mail_events('tracker_modified', $trackerId);
     $emails2 = $notificationlib->get_mail_events('tracker_item_modified', $itemId, array('trackerId' => $trackerId));
     if (array_key_exists("outboundEmail", $options)) {
         $emails3 = array($options["outboundEmail"]);
     } else {
         $emails3 = array();
     }
     $emails = array_merge($emails, $emails2, $emails3);
     if (!isset($_SERVER["SERVER_NAME"])) {
         $_SERVER["SERVER_NAME"] = $_SERVER["HTTP_HOST"];
     }
     if (array_key_exists("simpleEmail", $options)) {
         $simpleEmail = $options["simpleEmail"];
     } else {
         $simpleEmail = "n";
     }
     $trackerName = $this->getOne("select `name` from `tiki_trackers` where `trackerId`=?", array((int) $trackerId));
     if (count($emails) > 0) {
         if ($simpleEmail == "n") {
             $smarty->assign('mail_date', $this->now);
             $smarty->assign('mail_user', $user);
             if ($itemId) {
                 $mail_action = "\r\n" . tra('Item Modification') . "\r\n\r\n";
                 $mail_action .= tra('Tracker') . ': ' . $trackerName . "\r\n";
                 $mail_action .= tra('Item') . ': ' . $itemId;
             } else {
                 $mail_action = "\r\n" . tra('Item creation') . "\r\n\r\n";
                 $mail_action .= tra('Tracker') . ': ' . $trackerName;
             }
             $smarty->assign('mail_action', $mail_action);
             $smarty->assign('mail_data', $the_data);
             if ($itemId) {
                 $smarty->assign('mail_itemId', $itemId);
             } else {
                 $smarty->assign('mail_itemId', $new_itemId);
             }
             $smarty->assign('mail_trackerId', $trackerId);
             $smarty->assign('mail_trackerName', $trackerName);
             $foo = parse_url($_SERVER["REQUEST_URI"]);
             $machine = $this->httpPrefix() . $foo["path"];
             $smarty->assign('mail_machine', $machine);
             $parts = explode('/', $foo['path']);
             if (count($parts) > 1) {
                 unset($parts[count($parts) - 1]);
             }
             $smarty->assign('mail_machine_raw', $this->httpPrefix() . implode('/', $parts));
             $mail_data = $smarty->fetch('mail/tracker_changed_notification.tpl');
             $mail_subject = $smarty->fetch('mail/tracker_changed_notification_subject.tpl');
             include_once 'lib/mail/maillib.php';
             foreach ($emails as $email) {
                 if ($email != '') {
                     mail($email, encode_headers('[' . $trackerName . '] ' . $mail_subject, 'utf-8'), $mail_data, 'From: ' . $prefs['sender_email'] . "\r\nContent-type: text/plain;charset=utf-8");
                 }
             }
         } else {
             // Use simple email
             global $userlib;
             $user_email = $userlib->get_user_email($user);
             $my_sender = $user_email;
             $smarty->assign('mail_data', $the_data);
             $mail_subject = $smarty->fetch('mail/tracker_changed_notification_subject.tpl');
             // Default subject
             $subject = '[' . $trackerName . '] ' . $mail_subject . $_SERVER["SERVER_NAME"];
             // Try to find a Subject in $the_data
             $subject_test = preg_match('/^  Subject = .*$/m', $the_data, $matches);
             if ($subject_test == 1) {
                 $subject = preg_replace('/^  Subject = /m', '', $matches[0]);
                 // Remove the subject from $the_data
                 $the_data = preg_replace('/^  Subject = .*$/m', '', $the_data);
             }
             $the_data = preg_replace('/^  [A-Za-z]+ = /m', '', $the_data);
             //outbound email ->  will be sent in utf8 - from sender_email
             include_once 'lib/webmail/tikimaillib.php';
             $mail = new TikiMail();
             $mail->setSubject($subject);
             $mail->setText($the_data);
             if (!empty($my_sender)) {
                 $mail->setHeader("From", $my_sender);
             }
             $mail->send($emails);
         }
     }
     $cant_items = $this->getOne("select count(*) from `tiki_tracker_items` where `trackerId`=?", array((int) $trackerId));
     $query = "update `tiki_trackers` set `items`=?,`lastModif`=?  where `trackerId`=?";
     $result = $this->query($query, array((int) $cant_items, (int) $this->now, (int) $trackerId));
     if (!$itemId) {
         $itemId = $new_itemId;
     }
     if ($prefs['feature_search'] == 'y' && $prefs['feature_search_fulltext'] != 'y' && $prefs['search_refresh_index_mode'] == 'normal') {
         require_once 'lib/search/refresh-functions.php';
         refresh_index('tracker_items', $itemId);
     }
     return $itemId;
 }
示例#17
0
/**
 *
 * Sends a promotional email to the given recipients
 * @param string		$sender		Sender e-Mail address
 * @param string|array	$recipients	List of recipients either as array or comma/semi colon separated string
 * @param string		$subject	E-Mail subject
 * @param string		$url_for_friend		URL to share
 * @param array			$tokenlist
 * @return bool						true on success / false if the supplied parameters were incorrect/missing or an error occurred sending the mail
 */
function sendMail($sender, $recipients, $subject, $tokenlist = array())
{
	global $errors, $prefs, $smarty, $user, $userlib, $logslib;
	global $registrationlib; include_once ('lib/registration/registrationlib.php');

	if (empty($sender)) {
		$errors[] = tra('Your email is mandatory');
		return false;
	}

	if (function_exists('validate_email')) {
		$ok = validate_email($sender, $prefs['validateEmail']);
	} else {
		$ret = $registrationlib->SnowCheckMail($sender, '', 'mini');
		$ok = $ret[0];
	}

	if ($ok) {
		$from = str_replace(array("\r", "\n"), '', $sender);
	} else {
		$errors[] = tra('Invalid email') . ': ' . $_REQUEST['email'];
		return false;
	}

	$recipients=checkAddresses($recipients);

	if ($recipients === false) {
		return false;
	}

	include_once ('lib/webmail/tikimaillib.php');
	$mail = new TikiMail();
	$smarty->assign_by_ref('mail_site', $_SERVER['SERVER_NAME']);

	if (!empty($user) && $from == $userlib->get_user_email($user)) {
		$mail->setFrom($from);
		$mail->setHeader('Return-Path', "<$from>");
		$mail->setHeader('Reply-To', "<$from>");
	}

	$mail->setSubject($subject);

	$ok = true;
	foreach ($recipients as $i=>$recipient) {
		$url_for_friend = $tokenlist[$i]['url'];
		$smarty->assign('url_for_friend', $url_for_friend);
		$txt = $smarty->fetch('mail/share.tpl');
		// Rebuild email message texte
		$mail->is_built = false;
		$mail->setText($txt);
		$mailsent = $mail->send(array($recipient));
		if (!$mailsent) {
			$errors[] = tra('Error sending mail to'). " $recipient";
		} else {
			$logslib->add_log('share', tra('Share page').': '.$url_for_friend.' '.tra('to').' '.$recipient.' '.tra('by').' '.$user);
		}
		$ok = $ok && $mailsent;
	}
	return $ok;
}
示例#18
0
 $machine = $tikilib->httpPrefix(true) . dirname($foo["path"]);
 $machine = preg_replace("!/\$!", "", $machine);
 // just incase
 $smarty->assign('mail_machine', $machine);
 $smarty->assign('mail_site', $_SERVER["SERVER_NAME"]);
 $smarty->assign('mail_user', $name);
 $smarty->assign('mail_same', $prefs['feature_clear_passwords']);
 $smarty->assign('mail_pass', $pass);
 $smarty->assign('mail_apass', md5($pass));
 $smarty->assign('mail_ip', $tikilib->get_ip_address());
 $mail_data = sprintf($smarty->fetchLang($languageEmail, 'mail/password_reminder_subject.tpl'), $_SERVER["SERVER_NAME"]);
 $mail = new TikiMail($name);
 $mail->setSubject($mail_data);
 $mail->setText(stripslashes($smarty->fetchLang($languageEmail, 'mail/password_reminder.tpl')));
 // grab remote IP through forwarded-for header when served by cache
 $mail->setHeader('X-Password-Reset-From', $tikilib->get_ip_address());
 if (!$mail->send(array($_REQUEST['email']))) {
     $smarty->assign('msg', tra("The mail can't be sent. Contact the administrator"));
     $smarty->display("error.tpl");
     die;
 }
 // Just show "success" message and no form
 $smarty->assign('showmsg', 'y');
 $smarty->assign('showfrm', 'n');
 if ($prefs['feature_clear_passwords'] == 'y') {
     $tmp = tra("A password reminder email has been sent ");
 } else {
     $tmp = tra("An email with a link to reset your password has been sent ");
 }
 if ($prefs['login_is_email'] == 'y') {
     $tmp .= tra("to the email");
示例#19
0
 function request_payment()
 {
     global $prefs, $user, $tikilib;
     global $paymentlib;
     require_once 'lib/payment/paymentlib.php';
     //		if (!$user && $prefs['payment_cart_anonymous'] != 'y') {
     //			$access = TikiLib::lib('access');
     //			$access->redirect( $_SERVER['REQUEST_URI'], tra('Anonymous shopping feature is not enabled. Please log in to shop.') );
     //		}
     $total = $this->get_total();
     if ($total > 0 || $this->total_no_discount) {
         // if anonymous shopping to set pref as to which shopperinfo to show in description
         if (empty($user) && $prefs['payment_cart_anonymous'] === 'y') {
             $shopperinfo_descvar = 'email';
             // TODO: make this a pref
             if (!empty($_SESSION['shopperinfo'][$shopperinfo_descvar])) {
                 $shopperinfo_desc = $_SESSION['shopperinfo'][$shopperinfo_descvar];
                 $description = tra('Registration Check-Out') . " ({$shopperinfo_desc})";
             } else {
                 $description = tra('Registration Check-Out');
             }
         } else {
             $description = tra('Registration Check-Out') . " ({$user})";
         }
         $invoice = $paymentlib->request_payment($description, $total, $prefs['payment_default_delay'], $this->get_description());
         foreach ($this->get_behaviors() as $behavior) {
             $paymentlib->register_behavior($invoice, $behavior['event'], $behavior['behavior'], $behavior['arguments']);
         }
     } else {
         $invoice = 0;
         foreach ($this->get_behaviors() as $behavior) {
             if ($behavior['event'] == 'complete') {
                 $name = $behavior['behavior'];
                 $file = dirname(__FILE__) . "/behavior/{$name}.php";
                 $function = 'payment_behavior_' . $name;
                 require_once $file;
                 call_user_func_array($function, $behavior['arguments']);
             }
         }
     }
     require_once 'lib/profilelib/installlib.php';
     require_once 'lib/profilelib/profilelib.php';
     // Handle anonymous user (not logged in) shopping that require only email
     if (!$user || isset($_SESSION['forceanon']) && $_SESSION['forceanon'] == 'y') {
         if (!empty($_SESSION['shopperinfo'])) {
             // should also check for pref that this anonymous shopping feature is on
             // First create shopper info in shopper tracker
             global $record_profile_items_created;
             $record_profile_items_created = array();
             if (!empty($_SESSION['shopperinfoprofile'])) {
                 $shopper_profile_name = $_SESSION['shopperinfoprofile'];
             } else {
                 $shopper_profile_name = $prefs['payment_cart_anonshopper_profile'];
             }
             $shopperprofile = Tiki_Profile::fromDb($shopper_profile_name);
             $profileinstaller = new Tiki_Profile_Installer();
             $profileinstaller->forget($shopperprofile);
             // profile can be installed multiple times
             $profileinstaller->setUserData($_SESSION['shopperinfo']);
             $profileinstaller->install($shopperprofile);
             // Then set user to shopper ID
             $cartuser = $record_profile_items_created[0];
             $record_profile_items_created = array();
         } else {
             $this->empty_cart();
             return $invoice;
         }
     } else {
         $cartuser = $user;
     }
     $userInput = array('user' => $cartuser, 'time' => $tikilib->now, 'total' => $total, 'invoice' => $invoice);
     if (!$user || isset($_SESSION['forceanon']) && $_SESSION['forceanon'] == 'y') {
         $orderprofile = Tiki_Profile::fromDb($prefs['payment_cart_anonorders_profile']);
         $orderitemprofile = Tiki_Profile::fromDb($prefs['payment_cart_anonorderitems_profile']);
     } else {
         $orderprofile = Tiki_Profile::fromDb($prefs['payment_cart_orders_profile']);
         $orderitemprofile = Tiki_Profile::fromDb($prefs['payment_cart_orderitems_profile']);
     }
     if ($user && $prefs['payment_cart_orders'] == 'y' || !$user && $prefs['payment_cart_anonymous'] == 'y') {
         $profileinstaller = new Tiki_Profile_Installer();
         $profileinstaller->forget($orderprofile);
         // profile can be installed multiple times
         $profileinstaller->setUserData($userInput);
     } else {
         $profileinstaller = '';
     }
     global $record_profile_items_created;
     $record_profile_items_created = array();
     if ($user && $prefs['payment_cart_orders'] == 'y' || !$user && $prefs['payment_cart_anonymous'] == 'y') {
         $profileinstaller->install($orderprofile);
     }
     $content = $this->get_content();
     foreach ($content as $info) {
         if (!isset($info['is_gift_certificate']) || !$info['is_gift_certificate']) {
             $process_info = $this->process_item($invoice, $total, $info, $userInput, $cartuser, $profileinstaller, $orderitemprofile);
         }
     }
     $email_template_ids = array();
     if (isset($process_info['product_classes']) && is_array($process_info['product_classes'])) {
         $product_classes = array_unique($process_info['product_classes']);
     } else {
         $product_classes = array();
     }
     foreach ($product_classes as $pc) {
         if ($email_template_id = $this->get_tracker_value_custom($prefs['payment_cart_productclasses_tracker_name'], 'Email Template ID', $pc)) {
             $email_template_ids[] = $email_template_id;
         }
     }
     if (!empty($record_profile_items_created)) {
         if ($total > 0) {
             $paymentlib->register_behavior($invoice, 'complete', 'record_cart_order', array($record_profile_items_created));
             $paymentlib->register_behavior($invoice, 'cancel', 'cancel_cart_order', array($record_profile_items_created));
             if ($user) {
                 $paymentlib->register_behavior($invoice, 'complete', 'cart_send_confirm_email', array($user, $email_template_ids));
             }
         } else {
             require_once 'lib/payment/behavior/record_cart_order.php';
             payment_behavior_record_cart_order($record_profile_items_created);
             if ($user) {
                 require_once 'lib/payment/behavior/cart_send_confirm_email.php';
                 payment_behavior_cart_send_confirm_email($user, $email_template_ids);
             }
         }
     }
     if (!$user || isset($_SESSION['forceanon']) && $_SESSION['forceanon'] == 'y') {
         $shopperurl = 'tiki-index.php?page=' . $prefs['payment_cart_anon_reviewpage'] . '&shopper=' . intval($cartuser);
         global $tikiroot, $prefs;
         $shopperurl = $tikilib->httpPrefix(true) . $tikiroot . $shopperurl;
         require_once 'lib/auth/tokens.php';
         $tokenlib = AuthTokens::build($prefs);
         $shopperurl = $tokenlib->includeToken($shopperurl, array($prefs['payment_cart_anon_group'], 'Anonymous'));
         if (!empty($_SESSION['shopperinfo']['email'])) {
             require_once 'lib/webmail/tikimaillib.php';
             global $smarty;
             $smarty->assign('shopperurl', $shopperurl);
             $smarty->assign('email_template_ids', $email_template_ids);
             $mail_subject = $smarty->fetch('mail/cart_order_received_anon_subject.tpl');
             $mail_data = $smarty->fetch('mail/cart_order_received_anon.tpl');
             $mail = new TikiMail();
             $mail->setSubject($mail_subject);
             if ($mail_data == strip_tags($mail_data)) {
                 $mail->setText($mail_data);
             } else {
                 $mail->setHtml($mail_data);
             }
             $mail->setHeader("From", $prefs['sender_email']);
             $mail->send($_SESSION['shopperinfo']['email']);
             // the field to use probably needs to be configurable as well
         }
     }
     $this->update_gift_certificate($invoice);
     $this->update_group_discount($invoice);
     $this->empty_cart();
     return $invoice;
 }