<?php /* -*- mode: php; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */

global $UTIL_DIR;

include_once($UTIL_DIR . "/mail.php");

class Mailinglist {
	private $file;
	private $mailinglist = array();
  public $subj_prefix;
  public $sender;
  public $replyto;
  public $footer;
  public $unsubscribe_url;

	public function add($email) {
		$key = $email->email;
		if(array_key_exists($key, $this->mailinglist)) return false;
		$this->mailinglist[$key] = $email;
		return true;
	}
	
	public function remove($email) {
		if(array_key_exists($email, $this->mailinglist)) {
			unset($this->mailinglist[$email]);
			return true;
		}
		return false;
	}

	public function write()
	{
		$fp = fopen($this->file, "w");
		fwrite($fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");

		fwrite($fp, "<mailinglist subj_prefix=\"" . $this->subj_prefix . "\"\n");
    fwrite($fp, "             sender=\"" . $this->sender . "\"\n");
    fwrite($fp, "             replyto=\"" . $this->replyto . "\"\n");
    fwrite($fp, "             unsubscribe_url=\"" . $this->unsubscribe_url . "\">\n");
    fwrite($fp, "  <footer>" . $this->footer . "</footer>\n");
		foreach($this->mailinglist as $email) {
			fwrite($fp, "  <email email=\"" .
						 htmlspecialchars($email->email, ENT_QUOTES, "UTF-8") . "\"\n");
 			fwrite($fp, "         timestamp=\"" . $email->timestamp . "\">\n");
			fwrite($fp, "  </email>\n");
		}
		fwrite($fp, "</mailinglist>\n");

		fclose($fp);
	}
	
	private function read()
	{
		$dom = new DomDocument;
		$dom->preserveWhiteSpace = FALSE;
		$dom->load($this->file);

		$nl = $dom->documentElement;

    $this->subj_prefix = $nl->getAttribute('subj_prefix');
    $this->sender = $nl->getAttribute('sender');
    $this->replyto = $nl->getAttribute('replyto');
    $this->unsubscribe_url = $nl->getAttribute('unsubscribe_url');
    $footers = $dom->getElementsByTagName('footer');
    if($footers) {
      foreach($footers as $f) {
        $this->footer = $f->textContent;
      }
    }

		$params = $dom->getElementsByTagName('email');

		foreach ($params as $param) {
			$email = new Email($param->getAttribute('email'),
												 $param->getAttribute('timestamp'));
			$this->add($email);
		}
	}

	public function subscribe($emailaddr)
	{
		$str = "";
		if($emailaddr == "your@email.here") return "";
		$email = new EMail($emailaddr, time());
		if($this->add($email)) {
			$this->write();
			$str .= "<div class=\"newsletter_message\">The email: " . $emailaddr . " has now been subscribed.</div>";
		} else {
			$str .= "<div class=\"newsletter_message\">The email: " . $emailaddr . " is already subscribed.</div>";
		}
		return $str;
	}

	public function unsubscribe($emailaddr)
	{
		$str = "";
		if($this->remove($emailaddr)) {
			$this->write();
			$str .= "<div class=\"newsletter_message\">The email: " . $emailaddr . " has now been unsubscribed.</div>";
		} else {
			$str .= "<div class=\"newsletter_message\">The email: " . $emailaddr . " is not subscribed.</div>";
		}
		return $str;
	}

	public function postSingle($email, $subject, $message)
	{
    $subject = "[".$this->subj_prefix."] " . $subject;

    $message .= "\n\n".$this->footer;
    $message .= "\n\nTo stop receiving this newsletter, click the following link: ".
      $this->unsubscribe_url."&action=unsubscribe&email=". $email->email . "\n";

    $email->send($subject, $message, $this->sender, $this->replyto);
  }

	public function post($subject, $message)
	{
    $subject = "[".$this->subject_prefix."] " . $subject;

    $message .= "\n\n".$this->footer;
    $message .= "\n\nTo stop receiving this newsletter, click the following link: ".
      $this->unsubscribe_url."&action=unsubscribe&email=". $this->email . "\n";


		$sz = sizeof($this->mailinglist);

		echo "<div style=\"text-align: center; padding-top: 120px; padding-bottom: 100px; position: absolute; top: 25%; left: 0px; width: 99.4%; height: 150px; border: solid #0000ff 3px; background: #fff; color: #000;\">Sending ". $sz ." mails <br/>\n&lt;";
		ob_flush();
		flush();

		$num = 0;
		$lvl = 0;
		$steps = floor($sz / 10) + 1;

		foreach($this->mailinglist as $email) {

      $this->postSingle($email, $ubject, $message);

			$pct = $num / $sz * 100;
			if($pct >= $lvl) {
				printf("<font style=\"font-size: 9px;\">%.0f%%</font>", $lvl);
				$lvl += 100/$steps;
			} else {
				echo ".";
			}
			ob_flush();
			flush();
			$num++;
		}
		echo "<font style=\"font-size: 9px;\">[100%]</font>&gt;\n<br/>done<br/>\n";
		echo "<a style=\"font-size: 20px; font-weight: bold;\" href=\"?page=admin&amp;module=newsletter\">[CLOSE]</a>";
		echo "</div>\n";
		ob_flush();
		flush();
	}

	public function Mailinglist($file)
	{
		$this->file =  $file;
		if(file_exists($file)) $this->read();
	}
}

class Newsletter {

  private $file;
  private $mailinglist;

  // Admin config
  public $admin_title = "NewsLetter";
  public $admin_submodules = array("Send newsletter" => "send",
                                   "Config" => "config");

  public function admin_send($action, $vars)
	{
		global $UID, $ICONS_DIR;

		switch($action) {
		case "send":
      $this->mailinglist->post($vars["subject"], $vars["content"]);
			break;
			
		case "preview":
			$testmail = new Email($vars["testaddr"], 0);
			echo "<div class=\"preview\">\n";
			$this->mailinglist->postSingle($testmail, $vars["subject"], $vars["content"]);
			echo "A test mail has been sent to ".$vars["testaddr"]."</div>\n";
			echo "<p>Looking ok?</p>";
			$form = new Form("send");
			$form->addWidget(new Hidden($vars));
			$form->addWidget(new Button("yes"));
			$form->render();

			$form = new Form("retry");
			$form->addWidget(new Hidden($vars));
			$form->addWidget(new Button("no"));
			$form->render();
			break;
			
		case "retry":
			$testaddr = $vars["testaddr"];
			$subject = $vars["subject"];
			$content = $vars["content"];
		default:
			$form = new Form("preview");
			$form->addWidget(new LineEdit("Test address:", "testaddr", $testaddr));
			$form->addWidget(new LineEdit("Subject:", "subject", $subject));
			$form->addWidget(new TextEdit("Content:", "content", $content));
			$form->addWidget(new Button("Send"));
			$form->render();
			break;
		}
	}

  public function admin_config($action, $vars)
  {
    switch($action) {
    case "update":
      $this->mailinglist->subj_prefix = $vars["subj_prefix"];
      $this->mailinglist->sender = $vars["sender"];
      $this->mailinglist->replyto = $vars["replyto"];
      $this->mailinglist->footer = $vars["footer"];
      $this->mailinglist->unsubscribe_url = $vars["unsubscribe_url"];
			$this->mailinglist->write();
			break;
			
    default:
      $form = new Form("update");
      //http://www.executionroom.com/?page=news
      $form->addWidget(new LineEdit("Subject prefix:", "subj_prefix", $this->mailinglist->subj_prefix));
      $form->addWidget(new LineEdit("Sender:", "sender", $this->mailinglist->sender));
      $form->addWidget(new LineEdit("Reply to:", "replyto", $this->mailinglist->replyto));
      $form->addWidget(new TextEdit("Footer:", "footer", $this->mailinglist->footer));
      $form->addWidget(new LineEdit("Unsubscribe URL::", "unsubscribe_url", $this->mailinglist->unsubscribe_url));
      $form->addWidget(new Button("Update"));
      $form->render();
      break;
    }
  }

  public function admin($sub, $action, $vars)
  {
    switch($sub) {
    case "send":
			$this->admin_send($action, $vars);
      break;

    case "config":
			$this->admin_config($action, $vars);
      break;
    }
  }

  public function run($params)
  {
		global $page;
		global $newsletter_action;
		global $_POST, $GLOBALS;
		$email = $_POST["newsletter_email"]; // get from lineedit.
		if($email == "") $email = $GLOBALS["newsletter_email"]; // get from link.

		$str = "";

		$str .= "<div class=\"newsletter\">\n";
		$str .= "  <form class=\"newsletter_form\" " .
			"action=\"?page=".$page."&amp;newsletter_action=subscribe\" " .
			"method=\"post\">\n";
		$str .= "    <div>\n";
		$str .= "      <input name=\"newsletter_email\" value=\"your@email.here\"/>\n";
		$str .= "      <button type=\"submit\">Subscribe</button>\n";
		$str .= "    </div>\n";
		$str .= "  </form>\n";
		$str .= "</div>\n";

		if($newsletter_action == "subscribe") {
			$str .= $this->mailinglist->subscribe($email);
		}

		if($newsletter_action == "unsubscribe") {
			$str .= $this->mailinglist->unsubscribe($email);
		}

		return $str;
  }

  private function read()
  {
		$this->mailinglist = new Mailinglist($this->file);
  }

  public function Newsletter($file)
  {
    $this->file =  $file;
    if(file_exists($file)) $this->read();
  }
}


function newsletter_init()
{
  global $DATA_DIR;
  return new Newsletter($DATA_DIR . "/newsletter.xml");
}

?>