summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--admin/admin_newsletter_subscriptions.php154
-rw-r--r--admin/index.php191
-rw-r--r--admin/schema_inc.php61
-rw-r--r--icons/pkg_newsletters.pngbin0 -> 2867 bytes
-rw-r--r--index.php189
-rw-r--r--nl_lib.php280
-rw-r--r--send.php190
-rw-r--r--templates/admin_newsletter_subscriptions.tpl84
-rw-r--r--templates/admin_newsletters.tpl96
-rw-r--r--templates/confirm_newsletter_subscription.tpl9
-rw-r--r--templates/index.php6
-rw-r--r--templates/menu_newsletters.tpl5
-rw-r--r--templates/menu_newsletters_admin.tpl4
-rw-r--r--templates/newsletter_byebye.tpl6
-rw-r--r--templates/newsletter_welcome.tpl10
-rw-r--r--templates/newsletters.tpl98
-rw-r--r--templates/send_newsletters.tpl108
-rw-r--r--tiki_setup_inc.php9
18 files changed, 1500 insertions, 0 deletions
diff --git a/admin/admin_newsletter_subscriptions.php b/admin/admin_newsletter_subscriptions.php
new file mode 100644
index 0000000..45ab8d3
--- /dev/null
+++ b/admin/admin_newsletter_subscriptions.php
@@ -0,0 +1,154 @@
+<?php
+
+// $Header: /cvsroot/bitweaver/_bit_newsletters/admin/admin_newsletter_subscriptions.php,v 1.1 2005/12/09 06:59:54 bitweaver Exp $
+
+// Copyright (c) 2002-2003, Luis Argerich, Garland Foster, Eduardo Polidor, et. al.
+// All Rights Reserved. See copyright.txt for details and a complete list of authors.
+// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
+
+// Initialization
+require_once( '../../tiki_setup_inc.php' );
+
+include_once( NEWSLETTERS_PKG_PATH.'nl_lib.php' );
+
+if ($feature_newsletters != 'y') {
+ $smarty->assign('msg', tra("This feature is disabled").": feature_newsletters");
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if (!isset($_REQUEST["nl_id"])) {
+ $smarty->assign('msg', tra("No newsletter indicated"));
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+$smarty->assign('nl_id', $_REQUEST["nl_id"]);
+
+$smarty->assign('individual', 'n');
+
+if ($userlib->object_has_one_permission($_REQUEST["nl_id"], 'newsletter')) {
+ $smarty->assign('individual', 'y');
+
+ if ($tiki_p_admin != 'y') {
+ $perms = $userlib->get_permissions(0, -1, 'perm_name_desc', '', 'newsletters');
+
+ foreach ($perms["data"] as $perm) {
+ $perm_name = $perm["perm_name"];
+
+ if ($userlib->object_has_permission($user, $_REQUEST["nl_id"], 'newsletter', $perm_name)) {
+ $$perm_name = 'y';
+
+ $smarty->assign("$perm_name", 'y');
+ } else {
+ $$perm_name = 'n';
+
+ $smarty->assign("$perm_name", 'n');
+ }
+ }
+ }
+}
+
+if ($tiki_p_admin_newsletters != 'y') {
+ $smarty->assign('msg', tra("You dont have permission to use this feature"));
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if ($_REQUEST["nl_id"]) {
+ $info = $nllib->get_newsletter($_REQUEST["nl_id"]);
+} else {
+ $info = array();
+
+ $info["name"] = '';
+ $info["description"] = '';
+ $info["allow_any_sub"] = 'n';
+ $info["frequency"] = 7 * 24 * 60 * 60;
+}
+
+$smarty->assign('nl_info', $info);
+
+if (isset($_REQUEST["remove"])) {
+ check_ticket('admin-nl-subsriptions');
+ $nllib->remove_newsletter_subscription($_REQUEST["remove"], $_REQUEST["email"]);
+}
+
+if (isset($_REQUEST["add_all"])) {
+ check_ticket('admin-nl-subsriptions');
+ $nllib->add_all_users($_REQUEST["nl_id"]);
+}
+
+if (isset($_REQUEST["save"])) {
+ check_ticket('admin-nl-subsriptions');
+ $sid = $nllib->newsletter_subscribe($_REQUEST["nl_id"], $_REQUEST["email"]);
+}
+
+if ( empty( $_REQUEST["sort_mode"] ) ) {
+ $sort_mode = 'subscribed_desc';
+} else {
+ $sort_mode = $_REQUEST["sort_mode"];
+}
+
+if (!isset($_REQUEST["offset"])) {
+ $offset = 0;
+} else {
+ $offset = $_REQUEST["offset"];
+}
+
+$smarty->assign_by_ref('offset', $offset);
+
+if (isset($_REQUEST["find"])) {
+ $find = $_REQUEST["find"];
+} else {
+ $find = '';
+}
+
+$smarty->assign('find', $find);
+
+$smarty->assign_by_ref('sort_mode', $sort_mode);
+$channels = $nllib->list_newsletter_subscriptions($_REQUEST["nl_id"], $offset, $maxRecords, $sort_mode, $find);
+
+$cant_pages = ceil($channels["cant"] / $maxRecords);
+$smarty->assign_by_ref('cant_pages', $cant_pages);
+$smarty->assign('actual_page', 1 + ($offset / $maxRecords));
+
+if ($channels["cant"] > ($offset + $maxRecords)) {
+ $smarty->assign('next_offset', $offset + $maxRecords);
+} else {
+ $smarty->assign('next_offset', -1);
+}
+
+// If offset is > 0 then prev_offset
+if ($offset > 0) {
+ $smarty->assign('prev_offset', $offset - $maxRecords);
+} else {
+ $smarty->assign('prev_offset', -1);
+}
+
+$smarty->assign_by_ref('channels', $channels["data"]);
+
+// Fill array with possible number of questions per page
+$freqs = array();
+
+for ($i = 0; $i < 90; $i++) {
+ $aux["i"] = $i;
+
+ $aux["t"] = $i * 24 * 60 * 60;
+ $freqs[] = $aux;
+}
+
+$smarty->assign('freqs', $freqs);
+
+/*
+$cat_type='newsletter';
+$cat_objid = $_REQUEST["nl_id"];
+include_once( CATEGORIES_PKG_PATH.'categorize_list_inc.php' );
+*/
+ask_ticket('admin-nl-subsriptions');
+// Display the template
+$gTikiSystem->display( 'tikipackage:newsletters/admin_newsletter_subscriptions.tpl');
+
+?>
diff --git a/admin/index.php b/admin/index.php
new file mode 100644
index 0000000..775d227
--- /dev/null
+++ b/admin/index.php
@@ -0,0 +1,191 @@
+<?php
+
+// $Header: /cvsroot/bitweaver/_bit_newsletters/admin/Attic/index.php,v 1.1 2005/12/09 06:59:54 bitweaver Exp $
+
+// Copyright (c) 2002-2003, Luis Argerich, Garland Foster, Eduardo Polidor, et. al.
+// All Rights Reserved. See copyright.txt for details and a complete list of authors.
+// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
+
+// Initialization
+require_once( '../../tiki_setup_inc.php' );
+
+include_once( NEWSLETTERS_PKG_PATH.'nl_lib.php' );
+
+if ($feature_newsletters != 'y') {
+ $smarty->assign('msg', tra("This feature is disabled").": feature_newsletters");
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if (!isset($_REQUEST["nl_id"])) {
+ $_REQUEST["nl_id"] = 0;
+}
+
+$smarty->assign('nl_id', $_REQUEST["nl_id"]);
+
+$smarty->assign('individual', 'n');
+
+if ($userlib->object_has_one_permission($_REQUEST["nl_id"], 'newsletter')) {
+ $smarty->assign('individual', 'y');
+
+ if ($tiki_p_admin != 'y') {
+ $perms = $userlib->get_permissions(0, -1, 'perm_name_desc', '', 'newsletters');
+
+ foreach ($perms["data"] as $perm) {
+ $perm_name = $perm["perm_name"];
+
+ if ($userlib->object_has_permission($user, $_REQUEST["nl_id"], 'newsletter', $perm_name)) {
+ $$perm_name = 'y';
+
+ $smarty->assign("$perm_name", 'y');
+ } else {
+ $$perm_name = 'n';
+
+ $smarty->assign("$perm_name", 'n');
+ }
+ }
+ }
+}
+
+if ($tiki_p_admin_newsletters != 'y') {
+ $smarty->assign('msg', tra("You do not have permission to use this feature"));
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if ($_REQUEST["nl_id"]) {
+ $info = $nllib->get_newsletter($_REQUEST["nl_id"]);
+} else {
+ $info = array();
+
+ $info["name"] = '';
+ $info["description"] = '';
+ $info["allow_user_sub"] = 'y';
+ $info["allow_any_sub"] = 'n';
+ $info["unsub_msg"] = 'y';
+ $info["validate_addr"] = 'y';
+}
+
+$smarty->assign('info', $info);
+
+if (isset($_REQUEST["remove"])) {
+ check_ticket('admin-nl');
+ $nllib->remove_newsletter($_REQUEST["remove"]);
+}
+
+if (isset($_REQUEST["save"])) {
+ check_ticket('admin-nl');
+ if (isset($_REQUEST["allow_user_sub"]) && $_REQUEST["allow_user_sub"] == 'on') {
+ $_REQUEST["allow_user_sub"] = 'y';
+ } else {
+ $_REQUEST["allow_user_sub"] = 'n';
+ }
+
+ if (isset($_REQUEST["allow_any_sub"]) && $_REQUEST["allow_any_sub"] == 'on') {
+ $_REQUEST["allow_any_sub"] = 'y';
+ } else {
+ $_REQUEST["allow_any_sub"] = 'n';
+ }
+
+ if (isset($_REQUEST["unsub_msg"]) && $_REQUEST["unsub_msg"] == 'on') {
+ $_REQUEST["unsub_msg"] = 'y';
+ } else {
+ $_REQUEST["unsub_msg"] = 'n';
+ }
+
+ if (isset($_REQUEST["validate_addr"]) && $_REQUEST["validate_addr"] == 'on') {
+ $_REQUEST["validate_addr"] = 'y';
+ } else {
+ $_REQUEST["validate_addr"] = 'n';
+ }
+
+ $sid = $nllib->replace_newsletter($_REQUEST["nl_id"], $_REQUEST["name"], $_REQUEST["description"], $_REQUEST["allow_user_sub"], $_REQUEST["allow_any_sub"], $_REQUEST["unsub_msg"], $_REQUEST["validate_addr"]);
+ /*
+ $cat_type='newsletter';
+ $cat_objid = $sid;
+ $cat_desc = substr($_REQUEST["description"],0,200);
+ $cat_name = $_REQUEST["name"];
+ $cat_href= NEWSLETTERS_PKG_URL."newsletters.php?nl_id=".$cat_objid;
+ include_once( CATEGORIES_PKG_PATH.'categorize_inc.php' );
+ */
+ $info["name"] = '';
+ $info["description"] = '';
+ $info["allow_user_sub"] = 'y';
+ $info["allow_any_sub"] = 'n';
+ $info["unsub_msg"] = 'y';
+ $info["validate_addr"] = 'y';
+ //$info["frequency"] = 7 * 24 * 60 * 60;
+ $smarty->assign('nl_id', 0);
+ $smarty->assign('info', $info);
+}
+
+if ( empty( $_REQUEST["sort_mode"] ) ) {
+ $sort_mode = 'created_desc';
+} else {
+ $sort_mode = $_REQUEST["sort_mode"];
+}
+
+if (!isset($_REQUEST["offset"])) {
+ $offset = 0;
+} else {
+ $offset = $_REQUEST["offset"];
+}
+
+$smarty->assign_by_ref('offset', $offset);
+
+if (isset($_REQUEST["find"])) {
+ $find = $_REQUEST["find"];
+} else {
+ $find = '';
+}
+
+$smarty->assign('find', $find);
+
+$smarty->assign_by_ref('sort_mode', $sort_mode);
+$channels = $nllib->list_newsletters($offset, $maxRecords, $sort_mode, $find);
+
+$cant_pages = ceil($channels["cant"] / $maxRecords);
+$smarty->assign_by_ref('cant_pages', $cant_pages);
+$smarty->assign('actual_page', 1 + ($offset / $maxRecords));
+
+if ($channels["cant"] > ($offset + $maxRecords)) {
+ $smarty->assign('next_offset', $offset + $maxRecords);
+} else {
+ $smarty->assign('next_offset', -1);
+}
+
+// If offset is > 0 then prev_offset
+if ($offset > 0) {
+ $smarty->assign('prev_offset', $offset - $maxRecords);
+} else {
+ $smarty->assign('prev_offset', -1);
+}
+
+$smarty->assign_by_ref('channels', $channels["data"]);
+
+// Fill array with possible number of questions per page
+/*
+$freqs = array();
+
+for ($i = 0; $i < 90; $i++) {
+ $aux["i"] = $i;
+
+ $aux["t"] = $i * 24 * 60 * 60;
+ $freqs[] = $aux;
+}
+
+$smarty->assign('freqs', $freqs);
+*/
+/*
+$cat_type='newsletter';
+$cat_objid = $_REQUEST["nl_id"];
+include_once( CATEGORIES_PKG_PATH.'categorize_list_inc.php' );
+*/
+ask_ticket('admin-nl');
+
+// Display the template
+$gTikiSystem->display( 'tikipackage:newsletters/admin_newsletters.tpl');
+
+?>
diff --git a/admin/schema_inc.php b/admin/schema_inc.php
new file mode 100644
index 0000000..2e96914
--- /dev/null
+++ b/admin/schema_inc.php
@@ -0,0 +1,61 @@
+<?php
+
+$tables = array(
+
+'tiki_newsletter_subscriptions' => "
+ nl_id I4 PRIMARY,
+ email C(160) PRIMARY,
+ code C(32),
+ valid C(1),
+ subscribed I8
+",
+
+'tiki_newsletters' => "
+ nl_id I4 AUTO PRIMARY,
+ name C(200),
+ description X,
+ created I8,
+ last_sent I8,
+ editions I8,
+ users I8,
+ allow_user_sub C(1) default 'y',
+ allow_any_sub C(1),
+ unsub_msg C(1) default 'y',
+ validate_addr C(1) default 'y',
+ frequency I8
+",
+
+'tiki_sent_newsletters' => "
+ edition_id I4 AUTO PRIMARY,
+ nl_id I4 NOTNULL,
+ users I8,
+ sent I8,
+ subject C(200),
+ data B
+"
+
+);
+
+global $gTikiInstaller;
+
+foreach( array_keys( $tables ) AS $tableName ) {
+ $gTikiInstaller->registerSchemaTable( NEWSLETTERS_PKG_DIR, $tableName, $tables[$tableName] );
+}
+
+
+$gTikiInstaller->registerSchemaDefault( NEWSLETTERS_PKG_DIR, array(
+
+ "INSERT INTO `".TIKI_DB_PREFIX."tiki_menu_options` (`menu_id` , `type` , `name` , `url` , `position` , `section` , `perm` , `groupname`) VALUES (42,'s','Newsletters','tiki-newsletters.php',900,'feature_newsletters','','')",
+ "INSERT INTO `".TIKI_DB_PREFIX."tiki_menu_options` (`menu_id` , `type` , `name` , `url` , `position` , `section` , `perm` , `groupname`) VALUES (42,'o','Send newsletters','tiki-send_newsletters.php',905,'feature_newsletters','tiki_p_admin_newsletters','')",
+ "INSERT INTO `".TIKI_DB_PREFIX."tiki_menu_options` (`menu_id` , `type` , `name` , `url` , `position` , `section` , `perm` , `groupname`) VALUES (42,'o','Admin newsletters','tiki-admin_newsletters.php',910,'feature_newsletters','tiki_p_admin_newsletters','')",
+
+ "INSERT INTO `".TIKI_DB_PREFIX."users_permissions` (`perm_name`, `perm_desc`, `level`, `package`) VALUES ('tiki_p_admin_newsletters', 'Can admin newsletters', 'editors', 'newsletters')",
+ "INSERT INTO `".TIKI_DB_PREFIX."users_permissions` (`perm_name`, `perm_desc`, `level`, `package`) VALUES ('tiki_p_subscribe_newsletters', 'Can subscribe to newsletters', 'basic', 'newsletters')",
+ "INSERT INTO `".TIKI_DB_PREFIX."users_permissions` (`perm_name`, `perm_desc`, `level`, `package`) VALUES ('tiki_p_subscribe_email', 'Can subscribe any email to newsletters', 'editors', 'newsletters')",
+
+
+ "INSERT INTO `".TIKI_DB_PREFIX."tiki_preferences`(`package`,`name`,`value`) VALUES ('', 'feature_newsletters','n')"
+
+) );
+
+?>
diff --git a/icons/pkg_newsletters.png b/icons/pkg_newsletters.png
new file mode 100644
index 0000000..5b8c836
--- /dev/null
+++ b/icons/pkg_newsletters.png
Binary files differ
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..c795852
--- /dev/null
+++ b/index.php
@@ -0,0 +1,189 @@
+<?php
+
+// $Header: /cvsroot/bitweaver/_bit_newsletters/index.php,v 1.1 2005/12/09 06:59:54 bitweaver Exp $
+
+// Copyright (c) 2002-2003, Luis Argerich, Garland Foster, Eduardo Polidor, et. al.
+// All Rights Reserved. See copyright.txt for details and a complete list of authors.
+// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
+
+// Initialization
+require_once( '../tiki_setup_inc.php' );
+
+include_once( NEWSLETTERS_PKG_PATH.'nl_lib.php' );
+include_once( WEBMAIL_PKG_PATH.'htmlMimeMail.php' );
+
+if ($feature_newsletters != 'y') {
+ $smarty->assign('msg', tra("This feature is disabled").": feature_newsletters");
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if (isset($_REQUEST["confirm_subscription"])) {
+ check_ticket('newsletters');
+ $conf = $nllib->confirm_subscription($_REQUEST["confirm_subscription"]);
+
+ if ($conf) {
+ $smarty->assign('confirm', 'y');
+
+ $smarty->assign('nl_info', $conf);
+ }
+}
+
+$smarty->assign('unsub', 'n');
+
+if (isset($_REQUEST["unsubscribe"])) {
+ check_ticket('newsletters');
+ $conf = $nllib->unsubscribe($_REQUEST["unsubscribe"]);
+
+ if ($conf) {
+ $smarty->assign('unsub', 'y');
+
+ $smarty->assign('nl_info', $conf);
+ }
+}
+
+if (!$user && $tiki_p_subscribe_newsletters != 'y' && !isset($_REQUEST["confirm_subscription"])) {
+ $smarty->assign('msg', tra("You must be logged in to subscribe to newsletters"));
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if (!isset($_REQUEST["nl_id"])) {
+ $_REQUEST["nl_id"] = 0;
+}
+
+$smarty->assign('nl_id', $_REQUEST["nl_id"]);
+
+$smarty->assign('subscribe', 'n');
+$smarty->assign('subscribed', 'n');
+
+$foo = parse_url($_SERVER["REQUEST_URI"]);
+$smarty->assign('url_subscribe', httpPrefix(). $foo["path"]);
+
+if (isset($_REQUEST["nl_id"])) {
+ $smarty->assign('individual', 'n');
+
+ if ($userlib->object_has_one_permission($_REQUEST["nl_id"], 'newsletter')) {
+ $smarty->assign('individual', 'y');
+
+ if ($tiki_p_admin != 'y') {
+ $perms = $userlib->get_permissions(0, -1, 'perm_name_desc', '', 'newsletters');
+
+ foreach ($perms["data"] as $perm) {
+ $perm_name = $perm["perm_name"];
+
+ if ($userlib->object_has_permission($user, $_REQUEST["nl_id"], 'newsletter', $perm_name)) {
+ $$perm_name = 'y';
+
+ $smarty->assign("$perm_name", 'y');
+ } else {
+ $$perm_name = 'n';
+
+ $smarty->assign("$perm_name", 'n');
+ }
+ }
+ }
+ }
+}
+
+if ($user) {
+ $user_email = $tikilib->get_user_email($user);
+} else {
+ $user_email = '';
+}
+
+$smarty->assign('email', $user_email);
+
+$smarty->assign('confirm', 'n');
+
+if ($tiki_p_subscribe_newsletters == 'y') {
+ if (isset($_REQUEST["subscribe"])) {
+ check_ticket('newsletters');
+ $smarty->assign('subscribed', 'y');
+
+ if ($tiki_p_subscribe_email != 'y') {
+ $_REQUEST["email"] = $userlib->get_user_email($user);
+ }
+
+ // Now subscribe the email address to the newsletter
+ $nllib->newsletter_subscribe($_REQUEST["nl_id"], $_REQUEST["email"]);
+ }
+}
+
+if (isset($_REQUEST["info"])) {
+ $nl_info = $nllib->get_newsletter($_REQUEST["nl_id"]);
+
+ $smarty->assign('nl_info', $nl_info);
+ $smarty->assign('subscribe', 'y');
+}
+/* List newsletters */
+if ( empty( $_REQUEST["sort_mode"] ) ) {
+ $sort_mode = 'created_desc';
+} else {
+ $sort_mode = $_REQUEST["sort_mode"];
+}
+
+if (!isset($_REQUEST["offset"])) {
+ $offset = 0;
+} else {
+ $offset = $_REQUEST["offset"];
+}
+
+$smarty->assign_by_ref('offset', $offset);
+
+if (isset($_REQUEST["find"])) {
+ $find = $_REQUEST["find"];
+} else {
+ $find = '';
+}
+
+$smarty->assign('find', $find);
+
+$smarty->assign_by_ref('sort_mode', $sort_mode);
+$channels = $nllib->list_newsletters($offset, $maxRecords, $sort_mode, $find);
+
+for ($i = 0; $i < count($channels["data"]); $i++) {
+ if ($userlib->object_has_one_permission($channels["data"][$i]["nl_id"], 'newsletters')) {
+ $channels["data"][$i]["individual"] = 'y';
+
+ if ($userlib->object_has_permission($user, $channels["data"][$i]["nl_id"], 'newsletter', 'tiki_p_subscribe_newsletters')) {
+ $channels["data"][$i]["individual_tiki_p_subscribe_newsletters"] = 'y';
+ } else {
+ $channels["data"][$i]["individual_tiki_p_subscribe_newsletters"] = 'n';
+ }
+
+ if ($tiki_p_admin == 'y'
+ || $userlib->object_has_permission($user, $channels["data"][$i]["nl_id"], 'newsletter', 'tiki_p_admin_newsletters')) {
+ $channels["data"][$i]["individual_tiki_p_subscribe_newsletters"] = 'y';
+ }
+ } else {
+ $channels["data"][$i]["individual"] = 'n';
+ }
+}
+
+$cant_pages = ceil($channels["cant"] / $maxRecords);
+$smarty->assign_by_ref('cant_pages', $cant_pages);
+$smarty->assign('actual_page', 1 + ($offset / $maxRecords));
+
+if ($channels["cant"] > ($offset + $maxRecords)) {
+ $smarty->assign('next_offset', $offset + $maxRecords);
+} else {
+ $smarty->assign('next_offset', -1);
+}
+
+// If offset is > 0 then prev_offset
+if ($offset > 0) {
+ $smarty->assign('prev_offset', $offset - $maxRecords);
+} else {
+ $smarty->assign('prev_offset', -1);
+}
+
+$smarty->assign_by_ref('channels', $channels["data"]);
+ask_ticket('newsletters');
+
+// Display the template
+$gTikiSystem->display( 'tikipackage:newsletters/newsletters.tpl');
+
+?>
diff --git a/nl_lib.php b/nl_lib.php
new file mode 100644
index 0000000..e27b635
--- /dev/null
+++ b/nl_lib.php
@@ -0,0 +1,280 @@
+<?php
+
+class NlLib extends TikiLib {
+ function NlLib() {
+ parent::TikiLib();
+ }
+
+ function replace_newsletter($nl_id, $name, $description, $allow_user_sub, $allow_any_sub, $unsub_msg, $validate_addr) {
+ if ($nl_id) {
+ $query = "update `".TIKI_DB_PREFIX."tiki_newsletters` set `name`=?, `description`=?, `allow_user_sub`=?, `allow_any_sub`=?, `unsub_msg`=?, `validate_addr`=? where `nl_id`=?";
+ $result = $this->query($query, array($name,$description,$allow_user_sub,$allow_any_sub,$unsub_msg,$validate_addr,(int)$nl_id));
+ } else {
+ $now = date("U");
+ $query = "insert into `".TIKI_DB_PREFIX."tiki_newsletters`(`name`,`description`,`allow_user_sub`,`allow_any_sub`,`unsub_msg`,`validate_addr`,`last_sent`,`editions`,`users`,`created`) ";
+ $query.= " values(?,?,?,?,?,?,?,?,?,?)";
+ $result = $this->query($query, array($name,$description,$allow_user_sub,$allow_any_sub,$unsub_msg,$validate_addr,(int)$now,0,0,(int)$now));
+ $queryid = "select max(`nl_id`) from `".TIKI_DB_PREFIX."tiki_newsletters` where `created`=?";
+ $nl_id = $this->getOne($queryid, array((int)$now));
+ }
+ return $nl_id;
+ }
+
+ function replace_edition($nl_id, $subject, $data, $users) {
+ $now = date("U");
+ $query = "insert into `".TIKI_DB_PREFIX."tiki_sent_newsletters`(`nl_id`,`subject`,`data`,`sent`,`users`) values(?,?,?,?,?)";
+ $result = $this->query($query,array((int)$nl_id,$subject,$data,(int)$now,$users));
+ }
+
+ function get_subscribers($nl_id) {
+ $query = "select email from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `valid`=? and `nl_id`=?";
+ $result = $this->query($query, array('y',(int)$nl_id));
+ $ret = array();
+ while ($res = $result->fetchRow()) {
+ $ret[] = $res["email"];
+ }
+ return $ret;
+ }
+
+ function remove_newsletter_subscription($nl_id, $email) {
+ $valid = $this->getOne("select `valid` from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `nl_id`=? and `email`=?", array((int)$nl_id,$email));
+ $query = "delete from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `nl_id`=? and `email`=?";
+ $result = $this->query($query, array((int)$nl_id,$email));
+ $this->update_users($nl_id);
+ }
+
+ function newsletter_subscribe($nl_id, $email) {
+ global $smarty;
+ global $user;
+ global $sender_email;
+ $info = $this->get_newsletter($nl_id);
+ $smarty->assign('info', $info);
+ $code = md5($this->genPass());
+ $now = date("U");
+ if ($info["validate_addr"] == 'y') {
+ // Generate a code and store it and send an email with the
+ // URL to confirm the subscription put valid as 'n'
+ $foo = parse_url($_SERVER["REQUEST_URI"]);
+ $foopath = preg_replace('/tiki-admin_newsletter_subscriptions.php/', 'tiki-newsletters.php', $foo["path"]);
+ $url_subscribe = httpPrefix(). $foopath;
+ $query = "delete from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `nl_id`=? and `email`=?";
+ $result = $this->query($query,array((int)$nl_id,$email));
+ $query = "insert into `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions`(`nl_id`,`email`,`code`,`valid`,`subscribed`) values(?,?,?,?,?)";
+ $result = $this->query($query,array((int)$nl_id,$email,$code,'n',(int)$now));
+ // Now send an email to the address with the confirmation instructions
+ $smarty->assign('mail_date', date("U"));
+ $smarty->assign('mail_user', $user);
+ $smarty->assign('code', $code);
+ $smarty->assign('url_subscribe', $url_subscribe);
+ $smarty->assign('server_name', $_SERVER["SERVER_NAME"]);
+ $mail_data = $smarty->fetch('tikipackage:newsletters/confirm_newsletter_subscription.tpl');
+ @mail($email, tra('Newsletter subscription information at '). $_SERVER["SERVER_NAME"], $mail_data,
+ "From: $sender_email\r\nContent-type: text/plain;charset=utf-8\r\n");
+ } else {
+ $query = "delete from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `nl_id`=? and `email`=?";
+ $result = $this->query($query,array((int)$nl_id,$email));
+ $query = "insert into `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions`(`nl_id`,`email`,`code`,`valid`,`subscribed`) values(?,?,?,?,?)";
+ $result = $this->query($query,array((int)$nl_id,$email,$code,'y',(int)$now));
+ }
+ $this->update_users($nl_id);
+ }
+
+ function confirm_subscription($code) {
+ global $smarty;
+ global $user;
+ global $sender_email;
+ $foo = parse_url($_SERVER["REQUEST_URI"]);
+ $url_subscribe = httpPrefix(). $foo["path"];
+ $query = "select * from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `code`=?";
+ $result = $this->query($query,array($code));
+
+ if (!$result->numRows()) return false;
+
+ $res = $result->fetchRow();
+ $info = $this->get_newsletter($res["nl_id"]);
+ $smarty->assign('info', $info);
+ $query = "update `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` set `valid`=? where `code`=?";
+ $result = $this->query($query,array('y',$code));
+ // Now send a welcome email
+ $smarty->assign('mail_date', date("U"));
+ $smarty->assign('mail_user', $user);
+ $smarty->assign('code', $res["code"]);
+ $smarty->assign('url_subscribe', $url_subscribe);
+ $mail_data = $smarty->fetch('tikipackage:newsletters/newsletter_welcome.tpl');
+ @mail($res["email"], tra('Welcome to '). $info["name"] . tra(' at '). $_SERVER["SERVER_NAME"], $mail_data,
+ "From: $sender_email\r\nContent-type: text/plain;charset=utf-8\r\n");
+ return $this->get_newsletter($res["nl_id"]);
+ }
+
+ function unsubscribe($code) {
+ global $smarty;
+ global $user;
+ global $sender_email;
+ $foo = parse_url($_SERVER["REQUEST_URI"]);
+ $url_subscribe = httpPrefix(). $foo["path"];
+ $query = "select * from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `code`=?";
+ $result = $this->query($query,array($code));
+
+ if (!$result->numRows()) return false;
+
+ $res = $result->fetchRow();
+ $info = $this->get_newsletter($res["nl_id"]);
+ $smarty->assign('info', $info);
+ $smarty->assign('code', $res["code"]);
+ $query = "delete from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `code`=?";
+ $result = $this->query($query,array($code));
+ // Now send a bye bye email
+ $smarty->assign('mail_date', date("U"));
+ $smarty->assign('mail_user', $user);
+ $smarty->assign('url_subscribe', $url_subscribe);
+ $mail_data = $smarty->fetch('tikipackage:newsletters/newsletter_byebye.tpl');
+ @mail($res["email"], tra('Bye bye from '). $info["name"] . tra(' at '). $_SERVER["SERVER_NAME"], $mail_data,
+ "From: $sender_email\r\nContent-type: text/plain;charset=utf-8\r\n");
+ $this->update_users($res["nl_id"]);
+ return $this->get_newsletter($res["nl_id"]);
+ }
+
+ function add_all_users($nl_id) {
+ $query = "select `email` from `".TIKI_DB_PREFIX."users_users`";
+ $result = $this->query($query,array());
+ while ($res = $result->fetchRow()) {
+ $email = $res["email"];
+ if (!empty($email)) {
+ $this->newsletter_subscribe($nl_id, $email);
+ }
+ }
+ }
+
+ function get_newsletter($nl_id) {
+ $query = "select * from `".TIKI_DB_PREFIX."tiki_newsletters` where `nl_id`=?";
+ $result = $this->query($query,array((int)$nl_id));
+ if (!$result->numRows()) return false;
+ $res = $result->fetchRow();
+ return $res;
+ }
+
+ function get_edition($edition_id) {
+ $query = "select * from `".TIKI_DB_PREFIX."tiki_sent_newsletters` where `edition_id`=?";
+ $result = $this->query($query,array((int)$edition_id));
+ if (!$result->numRows()) return false;
+ $res = $result->fetchRow();
+ return $res;
+ }
+
+ function update_users($nl_id) {
+ $users = $this->getOne("select count(*) from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `nl_id`=?",array((int)$nl_id));
+ $query = "update `".TIKI_DB_PREFIX."tiki_newsletters` set `users`=? where `nl_id`=?";
+ $result = $this->query($query,array($users,(int)$nl_id));
+ }
+
+ function list_newsletters($offset, $maxRecords, $sort_mode, $find) {
+ $bindvars = array();
+ if ($find) {
+ $findesc = '%' . $find . '%';
+ $mid = " where (`name` like ? or `description` like ?)";
+ $bindvars[] = $findesc;
+ $bindvars[] = $findesc;
+ } else {
+ $mid = " ";
+ }
+
+ $query = "select * from `".TIKI_DB_PREFIX."tiki_newsletters` $mid order by ".$this->convert_sortmode("$sort_mode");
+ $query_cant = "select count(*) from `".TIKI_DB_PREFIX."tiki_newsletters` $mid";
+ $result = $this->query($query,$bindvars,$maxRecords,$offset);
+ $cant = $this->getOne($query_cant,$bindvars);
+ $ret = array();
+
+ while ($res = $result->fetchRow()) {
+ $res["confirmed"] = $this->getOne("select count(*) from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `valid`=? and `nl_id`=?",array('y',(int)$res["nl_id"]));
+ $ret[] = $res;
+ }
+ $retval = array();
+ $retval["data"] = $ret;
+ $retval["cant"] = $cant;
+ return $retval;
+ }
+
+ function list_editions($offset, $maxRecords, $sort_mode, $find) {
+ $bindvars = array();
+ if ($find) {
+ $findesc = '%' . $find . '%';
+ $mid = " and (`subject` like ? or `data` like ?)";
+ $bindvars[] = $findesc;
+ $bindvars[] = $findesc;
+ } else {
+ $mid = " ";
+ }
+
+ $query = "select tsn.`edition_id`,tn.`nl_id`,`subject`,`data`,tsn.`users`,`sent`,`name` from `".TIKI_DB_PREFIX."tiki_newsletters` tn, `".TIKI_DB_PREFIX."tiki_sent_newsletters` tsn ";
+ $query.= " where tn.`nl_id`=tsn.`nl_id` $mid order by ".$this->convert_sortmode("$sort_mode");
+ $query_cant = "select count(*) from `".TIKI_DB_PREFIX."tiki_newsletters` tn, `".TIKI_DB_PREFIX."tiki_sent_newsletters` tsn where tn.`nl_id`=tsn.`nl_id` $mid";
+ $result = $this->query($query,$bindvars,$maxRecords,$offset);
+ $cant = $this->getOne($query_cant,$bindvars);
+ $ret = array();
+
+ while ($res = $result->fetchRow()) {
+ $ret[] = $res;
+ }
+
+ $retval = array();
+ $retval["data"] = $ret;
+ $retval["cant"] = $cant;
+ return $retval;
+ }
+
+ function list_newsletter_subscriptions($nl_id, $offset, $maxRecords, $sort_mode, $find) {
+ $bindvars = array((int)$nl_id);
+ if ($find) {
+ $findesc = '%' . $find . '%';
+ $mid = " where `nl_id`=? and (`name` like ? or `description` like ?)";
+ $bindvars[] = $findesc;
+ $bindvars[] = $findesc;
+ } else {
+ $mid = " where `nl_id`=? ";
+ }
+
+ $query = "select * from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` $mid order by ".$this->convert_sortmode("$sort_mode");
+ $query_cant = "select count(*) from tiki_newsletter_subscriptions $mid";
+ $result = $this->query($query,$bindvars,$maxRecords,$offset);
+ $cant = $this->getOne($query_cant,$bindvars);
+ $ret = array();
+
+ while ($res = $result->fetchRow()) {
+ $ret[] = $res;
+ }
+ $retval = array();
+ $retval["data"] = $ret;
+ $retval["cant"] = $cant;
+ return $retval;
+ }
+
+ function get_unsub_msg($nl_id, $email) {
+ $foo = parse_url($_SERVER["REQUEST_URI"]);
+
+ $foo = str_replace('send_newsletters', 'newsletters', $foo);
+ $url_subscribe = httpPrefix(). $foo["path"];
+ $code = $this->getOne("select `code` from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `nl_id`=? and `email`=?",array((int)$nl_id,$email));
+ $url_unsub = $url_subscribe . '?unsubscribe=' . $code;
+ $msg = '<br/><br/>' . tra( 'You can unsubscribe from this newsletter following this link'). ": <a href='$url_unsub'>$url_unsub</a>";
+ return $msg;
+ }
+
+ function remove_newsletter($nl_id) {
+ $query = "delete from `".TIKI_DB_PREFIX."tiki_newsletters` where `nl_id`=?";
+ $result = $this->query($query,array((int)$nl_id));
+ $query = "delete from `".TIKI_DB_PREFIX."tiki_newsletter_subscriptions` where `nl_id`=?";
+ $result = $this->query($query,array((int)$nl_id));
+ $this->remove_object('newsletter', $nl_id);
+ return true;
+ }
+
+ function remove_edition($edition_id) {
+ $query = "delete from `".TIKI_DB_PREFIX."tiki_sent_newsletters` where `edition_id`=$edition_id";
+ $result = $this->query($query,array((int)$edition_id));
+ }
+
+}
+
+$nllib = new NlLib();
+
+?>
diff --git a/send.php b/send.php
new file mode 100644
index 0000000..7c2f0f8
--- /dev/null
+++ b/send.php
@@ -0,0 +1,190 @@
+<?php
+
+// $Header: /cvsroot/bitweaver/_bit_newsletters/Attic/send.php,v 1.1 2005/12/09 06:59:54 bitweaver Exp $
+
+// Copyright (c) 2002-2003, Luis Argerich, Garland Foster, Eduardo Polidor, et. al.
+// All Rights Reserved. See copyright.txt for details and a complete list of authors.
+// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
+
+// Initialization
+require_once( '../tiki_setup_inc.php' );
+
+include_once( NEWSLETTERS_PKG_PATH.'nl_lib.php' );
+include_once( WEBMAIL_PKG_PATH.'htmlMimeMail.php' );
+
+if ($feature_newsletters != 'y') {
+ $smarty->assign('msg', tra("This feature is disabled").": feature_newsletters");
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if ($tiki_p_admin_newsletters != 'y') {
+ $smarty->assign('msg', tra("You dont have permission to use this feature"));
+
+ $gTikiSystem->display( 'error.tpl' );
+ die;
+}
+
+if (!isset($_REQUEST["nl_id"]))
+ $_REQUEST["nl_id"] = 0;
+
+$smarty->assign('nl_id', $_REQUEST["nl_id"]);
+
+$newsletters = $nllib->list_newsletters(0, -1, 'created_desc', '');
+$smarty->assign('newsletters', $newsletters["data"]);
+
+$nl_info = $nllib->get_newsletter($_REQUEST["nl_id"]);
+// $nl_info["name"] = '';
+// $nl_info["description"] = '';
+// $nl_info["allow_user_sub"] = 'y';
+// $nl_info["allow_any_sub"] = 'n';
+// $nl_info["unsub_msg"] = 'y';
+// $nl_info["validate_addr"] = 'y';
+
+if (!isset($_REQUEST["edition_id"]))
+ $_REQUEST["edition_id"] = 0;
+
+if ($_REQUEST["edition_id"]) {
+ $info = $nllib->get_edition($_REQUEST["edition_id"]);
+} else {
+ $info = array();
+
+ $info["data"] = '';
+ $info["subject"] = '';
+}
+
+$smarty->assign('info', $info);
+
+if (isset($_REQUEST["remove"])) {
+ check_ticket('send-newsletter');
+ $nllib->remove_edition($_REQUEST["remove"]);
+}
+
+if (isset($_REQUEST["template_id"]) && $_REQUEST["template_id"] > 0) {
+ $template_data = $tikilib->get_template($_REQUEST["template_id"]);
+
+ $_REQUEST["data"] = $template_data["content"];
+ $_REQUEST["preview"] = 1;
+}
+
+$smarty->assign('preview', 'n');
+
+if (isset($_REQUEST["preview"])) {
+ $smarty->assign('preview', 'y');
+
+ //$parsed = $tikilib->parse_data($_REQUEST["content"]);
+ $parsed = $_REQUEST["data"];
+ $smarty->assign('parsed', $parsed);
+ $info["data"] = $_REQUEST["data"];
+ $info["subject"] = $_REQUEST["subject"];
+ $smarty->assign('info', $info);
+}
+
+$smarty->assign('presend', 'n');
+
+if (isset($_REQUEST["save"])) {
+ check_ticket('send-newsletter');
+ // Now send the newsletter to all the email addresses and save it in sent_newsletters
+ $smarty->assign('presend', 'y');
+
+ $subscribers = $nllib->get_subscribers($_REQUEST["nl_id"]);
+ $smarty->assign('nl_id', $_REQUEST["nl_id"]);
+ $smarty->assign('data', $_REQUEST["data"]);
+ $smarty->assign('subject', $_REQUEST["subject"]);
+ $cant = count($subscribers);
+ $smarty->assign('subscribers', $cant);
+}
+
+$smarty->assign('emited', 'n');
+
+if (isset($_REQUEST["send"])) {
+ check_ticket('send-newsletter');
+ $subscribers = $nllib->get_subscribers($_REQUEST["nl_id"]);
+
+ $mail = new htmlMimeMail();
+ $mail->setFrom('noreply@noreply.com');
+ $mail->setSubject($_REQUEST["subject"]);
+ $sent = 0;
+
+ foreach ($subscribers as $email) {
+ $to_array = array();
+
+ $to_array[] = $email;
+ if ($nl_info["unsub_msg"] = 'y') {
+ $unsubmsg = $nllib->get_unsub_msg($_REQUEST["nl_id"], $email);
+ } else {
+ $unsubmsg = ' ';
+ }
+ $mail->setHeadCharset("utf-8");
+ $mail->setTextCharset("utf-8");
+ $mail->setHtmlCharset("utf-8");
+ $mail->setFrom($sender_email);
+ $mail->setHTML($_REQUEST["data"] . $unsubmsg, strip_tags($_REQUEST["data"]));
+
+ if ($mail->send($to_array, 'mail'))
+ $sent++;
+ }
+
+ $smarty->assign('sent', $sent);
+ $smarty->assign('emited', 'y');
+ $nllib->replace_edition($_REQUEST["nl_id"], $_REQUEST["subject"], $_REQUEST["data"], $sent);
+}
+
+if ( empty( $_REQUEST["sort_mode"] ) ) {
+ $sort_mode = 'sent_desc';
+} else {
+ $sort_mode = $_REQUEST["sort_mode"];
+}
+
+if (!isset($_REQUEST["offset"])) {
+ $offset = 0;
+} else {
+ $offset = $_REQUEST["offset"];
+}
+
+$smarty->assign_by_ref('offset', $offset);
+
+if (isset($_REQUEST["find"])) {
+ $find = $_REQUEST["find"];
+} else {
+ $find = '';
+}
+
+$smarty->assign('find', $find);
+
+$smarty->assign_by_ref('sort_mode', $sort_mode);
+$channels = $nllib->list_editions($offset, $maxRecords, $sort_mode, $find);
+
+$cant_pages = ceil($channels["cant"] / $maxRecords);
+$smarty->assign_by_ref('cant_pages', $cant_pages);
+$smarty->assign('actual_page', 1 + ($offset / $maxRecords));
+
+if ($channels["cant"] > ($offset + $maxRecords)) {
+ $smarty->assign('next_offset', $offset + $maxRecords);
+} else {
+ $smarty->assign('next_offset', -1);
+}
+
+// If offset is > 0 then prev_offset
+if ($offset > 0) {
+ $smarty->assign('prev_offset', $offset - $maxRecords);
+} else {
+ $smarty->assign('prev_offset', -1);
+}
+
+$smarty->assign_by_ref('channels', $channels["data"]);
+
+if ($tiki_p_use_content_templates == 'y') {
+ $templates = $tikilib->list_templates('newsletters', 0, -1, 'name_asc', '');
+}
+
+$smarty->assign_by_ref('templates', $templates["data"]);
+
+ask_ticket ('send-newsletter');
+
+// Display the template
+$gTikiSystem->display( 'tikipackage:newsletters/send_newsletters.tpl');
+
+?>
+
diff --git a/templates/admin_newsletter_subscriptions.tpl b/templates/admin_newsletter_subscriptions.tpl
new file mode 100644
index 0000000..9cc8330
--- /dev/null
+++ b/templates/admin_newsletter_subscriptions.tpl
@@ -0,0 +1,84 @@
+<a class="pagetitle" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}">{tr}Admin newsletter subscriptions{/tr}</a>
+<br /><br />
+
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}index.php">{tr}list newsletters{/tr}</a>
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php">{tr}admin newsletters{/tr}</a>
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?nl_id={$nl_id}">{tr}send newsletters{/tr}</a>
+<br /><br />
+
+<table class="panel">
+<caption>Newsletters</caption>
+<tr>
+ <td>{tr}Name{/tr}:</td>
+ <td>{$nl_info.name}</td>
+</tr>
+<tr>
+ <td>{tr}Description{/tr}:</td>
+ <td>{$nl_info.description}</td>
+</tr>
+</table>
+
+<h2>{tr}Add a subscription newsletters{/tr}</h2>
+<form action="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php" method="post">
+<input type="hidden" name="nl_id" value="{$nl_id|escape}" />
+<table class="panel">
+<tr><td>{tr}Email{/tr}:</td><td><input type="text" name="email" /></td></tr>
+<tr class="panelsubmitrow"><td colspan="2"><input type="submit" name="save" value="{tr}Save{/tr}" /></td></tr>
+</table>
+</form>
+
+<h2>{tr}Add all your site users to this newsletter (broadcast){/tr}</h2>
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;offset={$offset}&amp;sort_mode={$sort_mode}&amp;find={$find}&amp;add_all=1">{tr}Add users{/tr}</a>
+
+<h2>{tr}Subscriptions{/tr}</h2>
+<table class="find">
+<tr><td>{tr}Find{/tr}</td>
+ <td>
+ <form method="get" action="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php">
+ <input type="text" name="find" value="{$find|escape}" />
+ <input type="submit" value="{tr}find{/tr}" name="search" />
+ <input type="hidden" name="sort_mode" value="{$sort_mode|escape}" />
+ </form>
+ </td>
+</tr>
+</table>
+
+<table>
+<tr>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;offset={$offset}&amp;sort_mode={if $sort_mode eq 'email_desc'}email_asc{else}email_desc{/if}">{tr}email{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;offset={$offset}&amp;sort_mode={if $sort_mode eq 'valid_desc'}valid_asc{else}valid_desc{/if}">{tr}valid{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;offset={$offset}&amp;sort_mode={if $sort_mode eq 'subscribed_desc'}subscribed_asc{else}subscribed_desc{/if}">{tr}subscribed{/tr}</a></th>
+<th>{tr}action{/tr}</th>
+</tr>
+{cycle values="even,odd" print=false}
+{section name=user loop=$channels}
+<tr class="{cycle}">
+<td>{$channels[user].email}</td>
+<td>{$channels[user].valid}</td>
+<td>{$channels[user].subscribed|tiki_short_datetime}</td>
+<td>
+ <a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;offset={$offset}&amp;sort_mode={$sort_mode}&amp;remove={$channels[user].nl_id}&amp;email={$channels[user].email}">{tr}remove{/tr}</a>
+</td>
+</tr>
+{/section}
+</table>
+
+<div class="pagination">
+{if $prev_offset >= 0}
+[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;find={$find}&amp;offset={$prev_offset}&amp;sort_mode={$sort_mode}">{tr}prev{/tr}</a>]&nbsp;
+{/if}
+
+{tr}Page{/tr}: {$actual_page}/{$cant_pages}
+
+{if $next_offset >= 0}
+&nbsp;[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;find={$find}&amp;offset={$next_offset}&amp;sort_mode={$sort_mode}">{tr}next{/tr}</a>]
+{/if}
+{if $direct_pagination eq 'y'}
+<br />
+{section loop=$cant_pages name=foo}
+{assign var=selector_offset value=$smarty.section.foo.index|times:$maxRecords}
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$nl_id}&amp;find={$find}&amp;offset={$selector_offset}&amp;sort_mode={$sort_mode}">
+{$smarty.section.foo.index_next}</a>&nbsp;
+{/section}
+{/if}
+</div>
diff --git a/templates/admin_newsletters.tpl b/templates/admin_newsletters.tpl
new file mode 100644
index 0000000..1d68c44
--- /dev/null
+++ b/templates/admin_newsletters.tpl
@@ -0,0 +1,96 @@
+<a class="pagetitle" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php">{tr}Admin newsletters{/tr}</a>
+
+{if $gTikiSystemPrefs.feature_help eq 'y'}
+<a href="http://tikipro.org/wiki/index.php?page=Newsletters" target="help" title="{tr}Tikiwiki.org help{/tr}: {tr}Newsletters{/tr}"><img class="icon" src="{$gTikiLoc.IMG_PKG_URL}icons/help.gif" alt="help" /></a>
+{/if}
+
+{if $gTikiSystemPrefs.feature_view_tpl eq 'y'}
+<a href="{$gTikiLoc.THEMES_PKG_URL}edit_templates.php?template=templates/admin_newsletters.tpl" target="help" title="{tr}View tpl{/tr}: {tr}admin newsletters tpl{/tr}"><img class="icon" src="{$gTikiLoc.IMG_PKG_URL}icons/info.gif" alt="edit tpl" /></a>
+{/if}
+<br /><br />
+
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}index.php">{tr}list newsletters{/tr}</a>
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php">{tr}send newsletters{/tr}</a>
+<br /><br />
+
+<h2>{tr}Create/edit newsletters{/tr}</h2>
+{if $individual eq 'y'}
+<a href="{$gTikiLoc.KERNEL_PKG_URL}object_permissions.php?objectName=newsletter%20{$info.name}&amp;object_type=newsletter&amp;permType=newsletters&amp;object_id={$info.nl_id}">{tr}There are individual permissions set for this newsletter{/tr}</a><br /><br />
+{/if}
+
+<form action="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php" method="post">
+<input type="hidden" name="nl_id" value="{$info.nl_id|escape}" />
+<table class="panel">
+<tr><td>{tr}Name{/tr}:</td><td><input type="text" name="name" value="{$info.name|escape}" /></td></tr>
+<tr><td>{tr}Description{/tr}:</td><td><textarea name="description" rows="4" cols="40">{$info.description|escape}</textarea></td></tr>
+<tr><td>{tr}Users can subscribe/unsubscribe to this list{/tr}</td><td>
+<input type="checkbox" name="allow_user_sub" {if $info.allow_user_sub eq 'y'}checked="checked"{/if} /></td></tr>
+<tr><td>{tr}Users can subscribe any email address{/tr}</td><td>
+<input type="checkbox" name="allow_any_sub" {if $info.allow_any_sub eq 'y'}checked="checked"{/if} /></td></tr>
+<tr><td>{tr}Add unsubscribe instructions to each newsletter{/tr}</td><td>
+<input type="checkbox" name="unsub_msg" {if $info.unsub_msg eq 'y'}checked="checked"{/if} /></td></tr>
+<tr><td>{tr}Validate email addresses{/tr}</td><td>
+<input type="checkbox" name="validate_addr" {if $info.validate_addr eq 'y'}checked="checked"{/if} /></td></tr>
+<tr class="panelsubmitrow"><td colspan="2"><input type="submit" name="save" value="{tr}Save{/tr}" /></td></tr>
+</table>
+</form>
+
+<h2>{tr}Newsletters{/tr}</h2>
+<table class="find">
+<tr><td>{tr}Find{/tr}</td>
+ <td>
+ <form method="get" action="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php">
+ <input type="text" name="find" value="{$find|escape}" />
+ <input type="submit" value="{tr}find{/tr}" name="search" />
+ <input type="hidden" name="sort_mode" value="{$sort_mode|escape}" />
+ </form>
+ </td>
+</tr>
+</table>
+
+<table class="panel">
+<tr>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'nl_id_desc'}nl_id_asc{else}nl_id_desc{/if}">{tr}ID{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'name_desc'}name_asc{else}name_desc{/if}">{tr}name{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'description_desc'}description_asc{else}description_desc{/if}">{tr}description{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'users_desc'}users_asc{else}users_desc{/if}">{tr}users{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'editions_desc'}editions_asc{else}editions_desc{/if}">{tr}editions{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'last_sent_desc'}last_sent_asc{else}last_sent_desc{/if}">{tr}last sent{/tr}</a></th>
+<th>{tr}action{/tr}</th>
+</tr>
+{cycle values="even,odd" print=false}
+{section name=user loop=$channels}
+<tr class="{cycle}">
+<td>{$channels[user].nl_id}</td>
+<td>{$channels[user].name}</td>
+<td>{$channels[user].description}</td>
+<td>{$channels[user].users} ({$channels[user].confirmed})</td>
+<td>{$channels[user].editions}</td>
+<td>{$channels[user].last_sent|tiki_short_datetime}</td>
+<td>
+ <a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={$sort_mode}&amp;remove={$channels[user].nl_id}">{tr}remove{/tr}</a>
+ <a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={$sort_mode}&amp;nl_id={$channels[user].nl_id}">{tr}edit{/tr}</a>
+ <a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/admin_newsletter_subscriptions.php?nl_id={$channels[user].nl_id}">{tr}subscriptions{/tr}</a>
+ {if $channels[user].individual eq 'y'}({/if}<a href="{$gTikiLoc.KERNEL_PKG_URL}object_permissions.php?objectName=newsletter%20{$channels[user].name}&amp;object_type=newsletter&amp;permType=newsletters&amp;object_id={$channels[user].nl_id}">{tr}perms{/tr}</a>{if $channels[user].individual eq 'y'}){/if}
+</td>
+</tr>
+{/section}
+</table>
+
+<div class="pagination">
+{if $prev_offset >= 0}
+[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?find={$find}&amp;offset={$prev_offset}&amp;sort_mode={$sort_mode}">{tr}prev{/tr}</a>]&nbsp;
+{/if}
+{tr}Page{/tr}: {$actual_page}/{$cant_pages}
+{if $next_offset >= 0}
+&nbsp;[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?find={$find}&amp;offset={$next_offset}&amp;sort_mode={$sort_mode}">{tr}next{/tr}</a>]
+{/if}
+{if $direct_pagination eq 'y'}
+<br />
+{section loop=$cant_pages name=foo}
+{assign var=selector_offset value=$smarty.section.foo.index|times:$maxRecords}
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?find={$find}&amp;offset={$selector_offset}&amp;sort_mode={$sort_mode}">
+{$smarty.section.foo.index_next}</a>&nbsp;
+{/section}
+{/if}
+</div>
diff --git a/templates/confirm_newsletter_subscription.tpl b/templates/confirm_newsletter_subscription.tpl
new file mode 100644
index 0000000..9c3b462
--- /dev/null
+++ b/templates/confirm_newsletter_subscription.tpl
@@ -0,0 +1,9 @@
+{tr}Somebody or you tried to subscribe this email address at our site:{/tr} {$server_name}
+{tr}To the newsletter:{/tr} {$info.name}
+
+{tr}Description:{/tr}
+{$info.description}
+
+{tr}In order to confirm your subscription you must access the following URL:{/tr}
+
+{$url_subscribe}?confirm_subscription={$code} \ No newline at end of file
diff --git a/templates/index.php b/templates/index.php
new file mode 100644
index 0000000..3e305fe
--- /dev/null
+++ b/templates/index.php
@@ -0,0 +1,6 @@
+<?php
+
+ // This is not a package.
+ header ("location: ../index.php");
+
+?> \ No newline at end of file
diff --git a/templates/menu_newsletters.tpl b/templates/menu_newsletters.tpl
new file mode 100644
index 0000000..fcfb736
--- /dev/null
+++ b/templates/menu_newsletters.tpl
@@ -0,0 +1,5 @@
+<a class="menuoption" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}index.php">{tr}List newsletters{/tr}</a>
+{if $tiki_p_admin_newsletters eq 'y'}
+ <a class="menuoption" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php">{tr}Send newsletters{/tr}</a>
+ <a class="menuoption" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php">{tr}Admin newsletters{/tr}</a>
+{/if}
diff --git a/templates/menu_newsletters_admin.tpl b/templates/menu_newsletters_admin.tpl
new file mode 100644
index 0000000..c6172d9
--- /dev/null
+++ b/templates/menu_newsletters_admin.tpl
@@ -0,0 +1,4 @@
+{if $tiki_p_admin_newsletters eq 'y'}
+ <a class="menuoption" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php">{tr}Newsletters Settings{/tr}</a>
+ <a class="menuoption" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php">{tr}Send Newsletters{/tr}</a>
+{/if}
diff --git a/templates/newsletter_byebye.tpl b/templates/newsletter_byebye.tpl
new file mode 100644
index 0000000..244ac9d
--- /dev/null
+++ b/templates/newsletter_byebye.tpl
@@ -0,0 +1,6 @@
+{tr}Bye bye!{/tr}
+{tr}This email address has been removed to the list of subscriptors of:{/tr}
+{tr}Newsletter:{/tr} {$info.name}
+
+{tr}Description:{/tr}
+{$info.description} \ No newline at end of file
diff --git a/templates/newsletter_welcome.tpl b/templates/newsletter_welcome.tpl
new file mode 100644
index 0000000..bb87988
--- /dev/null
+++ b/templates/newsletter_welcome.tpl
@@ -0,0 +1,10 @@
+{tr}Welcome to our newsletter!{/tr}
+{tr}This email address has been added to the list of subscriptors of:{/tr}
+{tr}Newsletter:{/tr} {$info.name}
+
+{tr}Description:{/tr}
+{$info.description}
+
+{tr}You can always cancel your subscription using:{/tr}
+
+{$url_subscribe}?unsubscribe={$code} \ No newline at end of file
diff --git a/templates/newsletters.tpl b/templates/newsletters.tpl
new file mode 100644
index 0000000..2e4faef
--- /dev/null
+++ b/templates/newsletters.tpl
@@ -0,0 +1,98 @@
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}index.php" class="pagetitle">{tr}Newsletters{/tr}</a><br /><br />
+{if $subscribed eq 'y'}
+{tr}Thanks for your subscription. You will receive an email soon to confirm your subscription. No newsletters will be sent to you until the subscription is confirmed.{/tr}<br /><br />
+{/if}
+{if $unsub eq 'y'}
+{tr}Your email address was removed from the list of subscriptors.{/tr}<br /><br />
+{/if}
+
+{if $confirm eq 'y'}
+<table class="panel">
+<caption>{tr}Subscription confirmed!{/tr}</caption>
+</tr>
+<tr>
+ <td>{tr}Name{/tr}:</td>
+ <td>{$nl_info.name}</td>
+</tr>
+<tr>
+ <td>{tr}Description{/tr}:</td>
+ <td>{$nl_info.description}</td>
+</tr>
+</table>
+{/if}
+
+{if $subscribe eq 'y'}
+<form method="post" action="{$gTikiLoc.NEWSLETTERS_PKG_URL}index.php">
+<input type="hidden" name="nl_id" value="{$nl_id|escape}" />
+<table class="panel">
+<caption>{tr}Subscribe to newsletter{/tr}</caption>
+<tr>
+ <td>{tr}Name{/tr}:</td>
+ <td>{$nl_info.name}</td>
+</tr>
+<tr>
+ <td>{tr}Description{/tr}:</td>
+ <td>{$nl_info.description}</td>
+</tr>
+{if ($nl_info.allow_user_sub eq 'y') or ($tiki_p_admin_newsletters eq 'y')}
+{if $tiki_p_subscribe_email eq 'y'}
+<tr>
+ <td>{tr}Email:{/tr}</td>
+ <td><input type="text" name="email" value="{$email|escape}" /></td>
+</tr>
+{else}
+ <input type="hidden" name="email" value="{$email|escape}" />
+{/if}
+<tr class="panelsubmitrow">
+ <td colspan="2"><input type="submit" name="subscribe" value="{tr}Subscribe{/tr}" /></td>
+</tr>
+{/if}
+</table>
+</form>
+{/if}
+
+<h2>{tr}Newsletters{/tr}</h2>
+<table class="find">
+<tr><td>{tr}Find{/tr}</td>
+ <td>
+ <form method="get" action="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php">
+ <input type="text" name="find" value="{$find|escape}" />
+ <input type="submit" value="{tr}find{/tr}" name="search" />
+ <input type="hidden" name="sort_mode" value="{$sort_mode|escape}" />
+ </form>
+ </td>
+</tr>
+</table>
+
+<table>
+<tr>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'name_desc'}name_asc{else}name_desc{/if}">{tr}name{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'description_desc'}description_asc{else}description_desc{/if}">{tr}description{/tr}</a></th>
+</tr>
+{cycle values="even,odd" print=false}
+{section name=user loop=$channels}
+{if $channels.individual ne 'y' or $channels.individual_tiki_p_subscribe_newsletters eq 'y'}
+<tr class="{cycle}">
+<td><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}index.php?nl_id={$channels[user].nl_id}&amp;info=1">{$channels[user].name}</a></td>
+<td>{$channels[user].description}</td>
+</tr>
+{/if}
+{/section}
+</table>
+
+<div class="pagination">
+{if $prev_offset >= 0}
+[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?find={$find}&amp;offset={$prev_offset}&amp;sort_mode={$sort_mode}">{tr}prev{/tr}</a>]&nbsp;
+{/if}
+{tr}Page{/tr}: {$actual_page}/{$cant_pages}
+{if $next_offset >= 0}
+&nbsp;[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?find={$find}&amp;offset={$next_offset}&amp;sort_mode={$sort_mode}">{tr}next{/tr}</a>]
+{/if}
+{if $direct_pagination eq 'y'}
+<br />
+{section loop=$cant_pages name=foo}
+{assign var=selector_offset value=$smarty.section.foo.index|times:$maxRecords}
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}admin/index.php?find={$find}&amp;offset={$selector_offset}&amp;sort_mode={$sort_mode}">{$smarty.section.foo.index_next}</a>&nbsp;
+{/section}
+{/if}
+</div>
diff --git a/templates/send_newsletters.tpl b/templates/send_newsletters.tpl
new file mode 100644
index 0000000..89483ee
--- /dev/null
+++ b/templates/send_newsletters.tpl
@@ -0,0 +1,108 @@
+<a class="pagetitle" href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php">{tr}Send newsletters{/tr}</a>
+<br /><br />
+
+{if $emited eq 'y'}
+ {tr}The newsletter was sent to {$sent} email addresses{/tr}<br /><br />
+{/if}
+{if $presend eq 'y'}
+<div class="wikibody">{$subject}</div>
+<div class="wikibody">{$data}</div>
+
+{tr}This newsletter will be sent to {$subscribers} email addresses.{/tr}
+
+<form method="post" action="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php">
+<input type="hidden" name="nl_id" value="{$nl_id|escape}" />
+<input type="hidden" name="subject" value="{$subject|escape}" />
+<input type="hidden" name="data" value="{$data|escape}" />
+<input type="submit" name="send" value="{tr}send{/tr}" />
+<input type="submit" name="preview" value="{tr}cancel{/tr}" />
+</form>
+{else}
+{if $preview eq 'y'}
+<br />
+<div class="wikibody">{$info.subject}</div>
+<div class="wikibody">{$parsed}</div>
+{/if}
+
+<h2>{tr}Prepare a newsletter to be sent{/tr}</h2>
+<form action="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php" method="post" id='editpageform'>
+<table class="panel">
+<tr><td>{tr}Subject{/tr}:</td><td><input type="text" maxlength="250" size="40" name="subject" value="{$info.subject|escape}" /></td></tr>
+<tr><td>{tr}Newsletter{/tr}:</td><td>
+<select name="nl_id">
+{section loop=$newsletters name=ix}
+<option value="{$newsletters[ix].nl_id|escape}" {if $newsletters[ix].nl_id eq $nl_id}selected="selected"{/if}>{$newsletters[ix].name}</option>
+{/section}
+</select>
+</td></tr>
+{if $tiki_p_use_content_templates eq 'y'}
+<tr><td>{tr}Apply template{/tr}</td><td>
+<select name="template_id" onchange="javascript:document.getElementById('editpageform').submit();">
+<option value="0">{tr}none{/tr}</option>
+{section name=ix loop=$templates}
+<option value="{$templates[ix].template_id|escape}">{$templates[ix].name}</option>
+{/section}
+</select>
+</td></tr>
+{/if}
+<tr><td>{tr}Data{/tr}:</td><td><textarea name="data" rows="25" cols="60">{$info.data|escape}</textarea></td></tr>
+<tr class="panelsubmitrow"><td colspan="2">
+<input type="submit" name="preview" value="{tr}Preview{/tr}" />&nbsp;<input type="submit" name="save" value="{tr}Send Newsletters{/tr}" />
+</td></tr>
+</table>
+</form>
+{/if}
+
+<h2>{tr}Sent editions{/tr}</h2>
+<table class="find">
+<tr><td>{tr}Find{/tr}</td>
+ <td>
+ <form method="get" action="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php">
+ <input type="text" name="find" value="{$find|escape}" />
+ <input type="submit" value="{tr}find{/tr}" name="search" />
+ <input type="hidden" name="sort_mode" value="{$sort_mode|escape}" />
+ </form>
+ </td>
+</tr>
+</table>
+
+<table>
+<tr>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'name_desc'}name_asc{else}name_desc{/if}">{tr}name{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'subject_desc'}subject_asc{else}subject_desc{/if}">{tr}subject{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'users_desc'}users_asc{else}users_desc{/if}">{tr}users{/tr}</a></th>
+<th><a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?offset={$offset}&amp;sort_mode={if $sort_mode eq 'sent_desc'}sent_asc{else}sent_desc{/if}">{tr}sent{/tr}</a></th>
+<th>{tr}action{/tr}</th>
+</tr>
+{cycle values="even,odd" print=false}
+{section name=user loop=$channels}
+<tr class="{cycle}">
+<td>{$channels[user].name}</td>
+<td>{$channels[user].subject}</td>
+<td>{$channels[user].users}</td>
+<td>{$channels[user].sent|tiki_short_datetime}</td>
+<td>
+ <a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?offset={$offset}&amp;sort_mode={$sort_mode}&amp;remove={$channels[user].edition_id}">{tr}remove{/tr}</a>
+ <a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?offset={$offset}&amp;sort_mode={$sort_mode}&amp;edition_id={$channels[user].edition_id}">{tr}use{/tr}</a>
+</td>
+</tr>
+{/section}
+</table>
+
+<div class="pagination">
+{if $prev_offset >= 0}
+[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?find={$find}&amp;offset={$prev_offset}&amp;sort_mode={$sort_mode}">{tr}prev{/tr}</a>]&nbsp;
+{/if}
+{tr}Page{/tr}: {$actual_page}/{$cant_pages}
+{if $next_offset >= 0}
+&nbsp;[<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?find={$find}&amp;offset={$next_offset}&amp;sort_mode={$sort_mode}">{tr}next{/tr}</a>]
+{/if}
+{if $direct_pagination eq 'y'}
+<br />
+{section loop=$cant_pages name=foo}
+{assign var=selector_offset value=$smarty.section.foo.index|times:$maxRecords}
+<a href="{$gTikiLoc.NEWSLETTERS_PKG_URL}send.php?find={$find}&amp;offset={$selector_offset}&amp;sort_mode={$sort_mode}">
+{$smarty.section.foo.index_next}</a>&nbsp;
+{/section}
+{/if}
+</div>
diff --git a/tiki_setup_inc.php b/tiki_setup_inc.php
new file mode 100644
index 0000000..1b3932f
--- /dev/null
+++ b/tiki_setup_inc.php
@@ -0,0 +1,9 @@
+<?php
+global $gTikiSystem;
+
+$gTikiSystem->registerPackage( 'Newsletters', dirname( __FILE__ ).'/' );
+
+if( $gTikiSystem->isPackageActive( 'NEWSLETTERS_PKG_NAME' ) ) {
+ $gTikiSystem->registerAppMenu( NEWSLETTERS_PKG_DIR, NEWSLETTERS_PKG_NAME, NEWSLETTERS_PKG_URL.'index.php', 'tikipackage:newsletters/menu_newsletters.tpl', true );
+}
+?>