file, "w");
		fwrite($fp, "\n");
		fwrite($fp, "subj_prefix) . "\"\n");
    fwrite($fp, "             sender=\"" . xmlenc($this->sender) . "\"\n");
    fwrite($fp, "             replyto=\"" . xmlenc($this->replyto) . "\"\n");
    fwrite($fp, "             unsubscribe_url=\"" . xmlenc($this->unsubscribe_url) . "\">\n");
    fwrite($fp, "  " .  xmlenc($this->footer) . " \n");
		foreach($this->mailinglist as $email) {
			fwrite($fp, "  email) . "\"\n");
 			fwrite($fp, "         timestamp=\"" . xmlenc($email->timestamp) . "\">\n");
			fwrite($fp, "   \n");
		}
		fwrite($fp, " \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 = "";
    // TODO: Make more elaborate check if input as an email address.
		if($emailaddr == "your@email.here" || $emailaddr == "") return "";
		$email = new EMail($emailaddr, time());
		if($this->add($email)) {
			$this->write();
			$str .= "
The email: " .
        $emailaddr . " has now been subscribed.
";
		} else {
			$str .= "The email: " .
        $emailaddr . " is already subscribed.
";
		}
		return $str;
	}
	public function unsubscribe($emailaddr)
	{
		$str = "";
		if($this->remove($emailaddr)) {
			$this->write();
			$str .= "The email: " .
        $emailaddr . " has now been unsubscribed.
";
		} else {
			$str .= "The email: " .
        $emailaddr . " is not subscribed.
";
		}
		return $str;
	}
  /**
   * Overrides the postSingle method in the _Mailinglist class.
   */
	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";
    return $email->send($subject, $message, $this->sender, $this->replyto);
  }
	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",
                                   "View list" => "view");
  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 "\n";
			$this->mailinglist->postSingle($testmail, $vars["subject"], $vars["content"]);
			echo "A test mail has been sent to ".$vars["testaddr"]."
\n";
			echo "Looking ok?
";
			$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_view($action, $vars)
  {
    switch($action) {
    default:
      echo "There are " . sizeof($this->mailinglist->mailinglist) . " receivers:
\n";
      echo "\n";
      foreach($this->mailinglist->mailinglist as $m) {
        echo "  ".xmlenc($m->email)." (added ".date("M jS, Y - H:i:s", $m->timestamp).") \n";
      }
      echo " \n";
      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;
    case "view":
			$this->admin_view($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 .= "\n";
		$str .= "  
\n";
		$str .= "