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

global $UTIL_DIR;

include_once($UTIL_DIR . "/convert.php");
include_once($UTIL_DIR . "/forms.php");
include_once($UTIL_DIR . "/markdown.php");

class Member {
	public $id;
	public $name;
  public $image;
  public $startyear;
  public $stopyear;
	public $tags;
	public $tagnames;

	private function showTag($title, $id, $value)
	{
		$str = "";
		if($value != "") {
			$str .= "  <div class=\"member_tag\"><div class=\"member_tags_".$id."\">\n";
			$str .= "    <div class=\"member_tag_name\">".$title.":</div>\n";
			$str .= "    <div class=\"member_tag_value\">".Markdown($value)."</div>\n";
			$str .= "  </div></div>\n";
		}
		return $str;
	}

  public function show()
  {
		global $MEMBERS_DIR;
    $str  = "<div class=\"member_entry\">\n";
    $str .= "  <div class=\"member_name\">" . htmlspecialchars_decode($this->name, ENT_QUOTES) . "</div>\n";
		$str .= "  <img alt=\"member\" class=\"member_image\" src=\"" . $MEMBERS_DIR."/".$this->image."\"/>\n";
		$str .= $this->showTag("Member Since", "startyear", $this->startyear);
		$str .= $this->showTag("Quit", "stopyear", $this->stopyear);
		foreach($this->tags as $name => $val) {
			$str .= $this->showTag($this->tagnames[$name], $name, $val);
		}
    $str .= "</div>\n";
		$str .= "<div class=\"member_footer\"></div>\n";
    return $str;
  }

	public function write($fp)
	{
		fwrite($fp, "  <member id=\"" . $this->id . "\"\n");
		fwrite($fp, "          name=\"" . $this->name . "\"\n");
		fwrite($fp, "          image=\"" . $this->image . "\"\n");
		fwrite($fp, "          startyear=\"" . $this->startyear . "\"\n");
		fwrite($fp, "          stopyear=\"" . $this->stopyear . "\">\n");
		foreach($this->tags as $name => $val) {
			fwrite($fp, "    <tag name=\"".$name."\" value=\"".$val."\"/>\n");
		}
		fwrite($fp, "  </member>\n");
	}

  public function Member($id, $name, $image, $startyear, $stopyear, $tags, $tagnames)
  {
		$this->id = $id;
		$this->name = $name;
		$this->image = $image;
		$this->startyear = $startyear;
		$this->stopyear = $stopyear;
		$this->tags = $tags;
		$this->tagnames = $tagnames;
  }
}

class Members {

  private $file;
  private $members = array();
	private $tags = array();

  // Admin config
  public $admin_title = "Members";
  public $admin_submodules = array("Add Member" => "add",
																	 "Edit Member" => "edit",
																	 "Tag Editor" => "tags");
	
  public function admin_add($action, $vars)
	{
		global $MEMBERS_DIR;

		switch($action) {
		case "add":
			$tags = $this->getTagsFromArray($vars, "tags_");
			$member = new Member($this->getNextID(), $vars["name"], $vars["image"],
													 $vars["startyear"], $vars["stopyear"], $tags, $this->tags);
			echo "\"" .$member->name . "\" has now been added.";
			$this->add($member);
			$this->write();
			break;
			
		case "preview":
			$tags = $this->getTagsFromArray($vars, "tags_");
			$member = new Member($this->getNextID(), $vars["name"], $vars["image"],
													 $vars["startyear"], $vars["stopyear"], $tags, $this->tags);
			echo "<p>Looking ok?</p>";
			$form = new Form("add");
			$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();
			echo "<div class=\"preview\">\n";
			echo "<div class=\"content\">\n";
			echo $member->show();
			echo "</div>\n";
			echo "</div>\n";
			break;
			
		case "retry":
			$name = $vars["name"];
			$image = $vars["image"];
			$startyear = $vars["startyear"];
			$stopyear = $vars["stopyear"];
			$tags = $this->getTagsFromArray($vars, "tags_");
		default:
			$form = new Form("preview");
			$form->addWidget(new LineEdit("Name", "name", $name));
			$form->addWidget(new LineEdit("Start Year", "startyear", $startyear));
			$form->addWidget(new LineEdit("Stop Year (if no longer a member)", "stopyear", $stopyear));
			foreach($this->tags as $id => $title) {
				$form->addWidget(new TextEdit($title, "tags_".$id, $tags[$id]));
			}
			$form->addWidget(new ImageComboBox("Image", "image", $image, new Icons($MEMBERS_DIR."/")));
			$form->addWidget(new Button("Add member"));
			$form->render();
			break;
		}
	}

	public function admin_edit($action, $vars)
	{
		global $MEMBERS_DIR;

		switch($action) {
		case "add":
			$tags = $this->getTagsFromArray($vars, "tags_");
			$this->members[$vars["memberid"]]->show();
			$this->members[$vars["memberid"]]->name = $vars["name"];
			$this->members[$vars["memberid"]]->image = $vars["image"];
			$this->members[$vars["memberid"]]->startyear = $vars["startyear"];
			$this->members[$vars["memberid"]]->stopyear = $vars["stopyear"];
			$this->members[$vars["memberid"]]->tags = $tags;
			$this->write();
			echo "\"" . $this->members[$vars["memberid"]]->name . "\" has now been edited.";
			break;
			
		case "preview":
			$tags = $this->getTagsFromArray($vars, "tags_");
			$member = new Member($vars["memberid"], $vars["name"], $vars["image"],
													 $vars["startyear"], $vars["stopyear"], $tags, $this->tags);
			echo "<p>Looking ok?</p>";
			$form = new Form("add");
			$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();

			echo "<div class=\"preview\">\n";
			echo "<div class=\"content\">\n";
			echo $member->show();
			echo "</div>\n";
			echo "</div>\n";
			break;
			
		case "edit":
		case "retry":
			if(isset($vars["name"])) $name = $vars["name"];
			else $name = $this->members[$vars["memberid"]]->name;
			if(isset($vars["image"])) $image = $vars["image"];
			else $image = $this->members[$vars["memberid"]]->image;
			if(isset($vars["startyear"])) $startyear = $vars["startyear"];
			else $startyear = $this->members[$vars["memberid"]]->startyear;
			if(isset($vars["stopyear"])) $stopyear = $vars["stopyear"];
			else $stopyear = $this->members[$vars["memberid"]]->stopyear;
			
			// HACK, this should work, but we should check on the tags_ vars instead.
			if(isset($vars["name"])) $tags = $this->getTagsFromArray($vars, "tags_");
			else $tags = $this->members[$vars["memberid"]]->tags;
			
			$form = new Form("preview");
			$form->addWidget(new Hidden($vars));
			$form->addWidget(new LineEdit("Name", "name", $name));
			$form->addWidget(new LineEdit("Start Year", "startyear", $startyear));
			$form->addWidget(new LineEdit("Stop Year (if no longer a member)", "stopyear", $stopyear));
			foreach($this->tags as $id => $title) {
				$form->addWidget(new TextEdit($title, "tags_".$id, $tags[$id], 2));
			}
			$form->addWidget(new ImageComboBox("Image", "image", $image, new Icons($MEMBERS_DIR."/")));
			$form->addWidget(new Button("Preview"));
			$form->render();
			break;
			
		case "select":
		default:
			$memberlist = array();
			foreach($this->members as $member) {
				$memberlist[$member->name] = sprintf("%d", $member->id);
			}

			$form = new Form("edit");
			$form->addWidget(new ComboBox("Edit this member:", "memberid", "", $memberlist));
			$form->addWidget(new Button("Edit..."));
			$form->render();
			break;
		}
	}

  public function admin_tags($action, $vars)
  {
		global $GLOBALS;
    switch($action) {
    case "update":
			$taglist = $GLOBALS["taglist"];
			$this->tags = ListEditor::splitValues($taglist);
      $this->write();
      break;
			
    default:
      $form = new Form("update");
			$form->addWidget(new ListEditor("Tags", "taglist",
																			new LineEdit("Title (must not contain ':')", "title"),
																			new LineEdit("ID (must only contains letters a-z)", "id"),
																			$this->tags));
      $form->addWidget(new Button("Update"));
      $form->render();
      break;
    }
  }

	public function getTagsFromArray($array, $prefix)
	{
		$out = array();
		foreach($array as $name => $value) {
			if(strpos($name, $prefix) !== FALSE && strpos($name, $prefix) == 0)
				$out[substr($name, strlen($prefix))] = $value;
		}
		return $out;
	}

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

    case "edit":
			$this->admin_edit($action, $vars);
      break;

    case "tags":
			$this->admin_tags($action, $vars);
      break;
    }
  }

  public function run($params)
  {
    foreach($params as $param) {
      switch($param) {
      case "all":
				$str = "";
				foreach($this->members as $member) {
					$str .= $member->show();
				}
				return $str;

      case "old":
				$str = "";
				foreach($this->members as $member) {
					if($member->stopyear) $str .= $member->show();
				}
				return $str;

			default:
      case "current":
				$str = "";
				foreach($this->members as $member) {
					if($member->stopyear == "") $str .= $member->show();
				}
				return $str;
      }
    }



    return $str;
  }

  public function add($member) {
    $key = $member->id;
    $this->members[$key] = $member;
  }
	
	public function getNextID()
	{
		$maxid = -1;
    foreach($this->members as $member) {
			if($member->id > $maxid) $maxid = $member->id;
    }
		return $maxid + 1;
	}

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

    fwrite($fp, "<members tags=\"".htmlspecialchars(serialize($this->tags), ENT_QUOTES, "UTF-8")."\">\n");
    foreach($this->members as $member) {
			$member->write($fp);
    }
    fwrite($fp, "</members>\n");

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

    $ts = $dom->getElementsByTagName('members');
		foreach($ts as $t) {
			$this->tags = unserialize(htmlspecialchars_decode($t->getAttribute('tags'), ENT_QUOTES));
		}

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

    foreach ($params as $param) {
			$tags = array();
			$ps = $param->getElementsByTagName('tag');
			foreach ($ps as $p) {
				$tags[$p->getAttribute('name')] = $p->getAttribute('value');
			}
			
      $member = new Member($param->getAttribute('id'),
													 $param->getAttribute('name'),
													 $param->getAttribute('image'),
													 $param->getAttribute('startyear'),
													 $param->getAttribute('stopyear'),
													 $tags,
													 $this->tags);
      $this->add($member);
    }
  }

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

}

function members_init()
{
  global $DATA_DIR;
  return new Members($DATA_DIR . "/members.xml");
}
?>