<?php if (!defined('PmWiki')) exit();

$FmtPV['$ZAPchatversion'] = "'November 20, 2006'";

## DESCRIPTION:  ZAPchat adds a couple markups to enrich ZAP's potential for chat, and creates a mini command language to enhance your chatting experience.  Note you can offer fairly powerful chat-like capabilities just within ZAP (if you are clever).  This just makes more possible.  For more info, see http://www.pmwiki.org/wiki/Cookbook/ZAPdata, or visit the ZAP demo site at WWW.ZAPSITE.ORG.  Author: Dan Vis aka Caveman <editor àt fast döt st>, Copyright 2006.  License http://www.gnu.org/licenses/gpl.html GNU General Public License

SDV($ZAPmodule[chat], " chat private ");  

function ZAPchat($field, $value) {
	global $WorkDir, $WikiDir, $pagename, $MessagesFmt, $m, $ZAPtime, $ZAPprofiles, $_POST;
	$admin = InList("item=$GLOBALS[AuthId] page=Chatrooms.$_POST[room] list=adminlist");
	if (CondAuth($pagename, "admin")) $admin = true;

	if($lock != "nolock") {

		if (($field == "chat") && ($value != "")) {

			if (substr($value, 0, 1) != "!") {
				$oldpage = ReadPage($_POST[datapage]);
				$newpage = $oldpage;
				$newpage['text'] = $_POST[chatformat];
				UpdatePage($_POST[datapage], $oldpage, $newpage);
				}
				
			else {
				if (strpos($value, " ")) {
					$c = substr($value, 1, strpos($value, " ") - 1);
					$cc = substr($value, strpos($value, " ") + 1);
					}
				else {
					$c = substr($value, 1);
					$cc = "";
					}

				switch ($c) {
					case "list" :
						if (PageExists("Chat.List")) Redirect(FmtPageName("Chat.List?return=$_POST[room]", $pagename));
						break;
						
					case "join" :
						if (PageExists("Chatrooms.$cc")) Redirect(FmtPageName("Chat.Chat?room=$cc", $pagename));
						else $m .= "Room does not exist. ";
						break;

					case "leave" :
						if ($cc == "") $cc = $_POST[room];
						$x = "Chat-$cc.Member-$GLOBALS[AuthId]";
						if (PageExists($x)) $WikiDir->delete("$x");
						if ($cc == $_POST[room]) Redirect(FmtPageName("Chat.Chat", $pagename));
						break;

					case "exit" :
						$g = "Chatrooms";
						$r = ListPages("/^$g\./");
						foreach ($r as $rr) {
							$room = substr($rr, strpos($rr, ".") + 1);
							$x = "Chat-$room.Member-$GLOBALS[AuthId]";
							if (PageExists($x)) $WikiDir->delete("$x");
							}
						Redirect(FmtPageName("Chat.Chat", $pagename));
						break;

					case "help" :
						if (PageExists("Chat.Help")) Redirect(FmtPageName("Chat.Help?return=$_POST[room]", $pagename));
						break;

					case "info" :
						if ($cc == "") $cc = $_POST[room];
						if (PageExists("Chat.Info")) Redirect(FmtPageName("Chat.Info?room=$cc?return=$_POST[room]", $pagename));
						break;

					case "members" :
						if ($cc == "") $cc = $_POST[room];
						if (PageExists("Chat.Members")) Redirect(FmtPageName("Chat.Members?room=$cc?return=$_POST[room]", $pagename));
						break;

					case "whois" :
						if (PageExists("Chat.WhoIs")) 	Redirect(FmtPageName("Chat.WhoIs?return=$_POST[room]?room=$_POST[room]?member=$cc", $pagename));					
						break;

					case "away" :
						$x = "Chat-$_POST[room].Member-$GLOBALS[AuthId]";
						$oldpage = ReadPage("$x");
						$newpage = $oldpage;
						$newpage['text'] = "(:Member: $GLOBALS[AuthId]-(away):)\n\n";
						UpdatePage($x, $oldpage, $newpage);
						break;

					case "back" :
						$x = "Chat-$_POST[room].Member-$GLOBALS[AuthId]";
						$oldpage = ReadPage("Chat-$_POST[datapage].Member-$GLOBALS[AuthId]");
						$newpage = $oldpage;
						$newpage['text'] = "(:Member: $GLOBALS[AuthId]:)\n\n";
						UpdatePage($x, $oldpage, $newpage);
						break;

					case "action" :
						$oldpage = ReadPage($_POST[datapage]);
						$newpage = $oldpage;
						$newpage['text'] = "%green%<$cc>%%";
						UpdatePage($_POST[datapage], $oldpage, $newpage);
						break;

					case "private" :
						ZAPprivate($cc);
						break;					

//ADMIN ONLY FUNCTIONS
					case "warn" :
						if (! $admin) break;
						$oldpage = ReadPage($_POST[datapage]);
						$newpage = $oldpage;
						$newpage['text'] = "%blue%WARNING $cc%%";
						UpdatePage($_POST[datapage], $oldpage, $newpage);
						break;

					case "kick" :
						if (! $admin) break;
						$x = "Chat-$_POST[room].Member-$cc";
						if (PageExists($x)) $WikiDir->delete("$x");
						$oldpage = ReadPage($_POST[datapage]);
						$newpage = $oldpage;
						$newpage['text'] = "%blue%$cc has been KICKED out of the room%%";
						UpdatePage($_POST[datapage], $oldpage, $newpage);
						break;

					case "ban" :
						if (! $admin) break;
						$x = "Chat-$_POST[room].Member-$cc";
						if (PageExists($x)) $WikiDir->delete("$x");
						$oldpage = ReadPage($_POST[datapage]);
						$newpage = $oldpage;
						$newpage['text'] = "%blue%$cc has been BANNED from the room%%";
						UpdatePage($_POST[datapage], $oldpage, $newpage);
						$_POST[datapage] = "Chatrooms.$_POST[room]";
						ZAPlist("banlist", "+$cc");
						$data = ZAPsetdata("+banlist");
						ZAPsavepage("Chatrooms.$_POST[room]",$text,$data);
						break;

					case "unban" :
						if (! $admin) break;
						$oldpage = ReadPage($_POST[datapage]);
						$newpage = $oldpage;
						$newpage['text'] = "%blue%$cc has been UNBANNED%%";
						UpdatePage($_POST[datapage], $oldpage, $newpage);
						$_POST[datapage] = "Chatrooms.$_POST[room]";
						ZAPlist("banlist", "-$cc");
						$data = ZAPsetdata("+banlist");
						ZAPsavepage("Chatrooms.$_POST[room]",$text,$data);
						break;

					case "admin" :
						if (! $admin) break;
						if (! PageExists("Profiles." . substr($cc, 1))) ZAPwarning("No such member exists");
						$_POST[datapage] = "Chatrooms.$_POST[room]";
						ZAPlist("adminlist", "$cc");
						$data = ZAPsetdata("+");
						ZAPsavepage("Chatrooms.$_POST[room]",$text,$data);
						break;

					case "clear" :
						if (! $admin) break;
						$g = "Chat-$_POST[room]";
						$t = bcsub(time(), $cc);
						$p = ListPages("/^$g\./");
						foreach ($p as $pp) {
							$n = substr($pp, strpos($pp, ".") + 1);
							if (! ereg("^[0-9]{10}.+$", $n)) continue;
							if (bccomp(substr($n, 0, 10), $t) == 1) continue;
							$a = strftime("%Y-%m-%d-%H%M%S", substr($n, 0, 10));
							$newname = "Chat-Archives.$_POST[room]-$a-" . substr($n,11);
							rename("$WorkDir/$pp", "$WorkDir/$newname");
							}
						$m .= "Chat has been cleared. ";
						break;

					case "archives" :
						if (! $admin) break;
						if ($cc == "") $room = $_POST[room];
						elseif (strpos($cc, "-")) {
							$room = substr($cc, 0, strpos($cc, "-"));
							$cc = substr($cc, strpos($cc, "-"));
							}
						else {
							$room = $cc;
							$cc = "";
							}
						if (PageExists("Chat.Archives")) Redirect(FmtPageName("Chat.Archives?room=$room?archive=$cc?return=$_POST[room]", $pagename));
						break;

					case "create" :
						if (! $admin) break;
						if (! PageExists("Chatrooms.$cc")) {
							$text = "";
							$data = "(:adminlist: $GLOBALS[AuthId]:)\n\n";
							ZAPsavepage("Chatrooms.$cc",$text,$data);
							Redirect(FmtPageName("Chat.Chat?room=$cc", $pagename));
							}
						else $m .= "Room $cc already exists. ";				
						break;

					case "destroy" :
						if (! $admin) break;
						if (! PageExists("Chatrooms.$cc")) break;
						$g = "Chat-$cc";
						$p = ListPages("/^$g\./");
						foreach ($p as $pp) {
							$n = substr($pp, strpos($pp, ".") + 1);
							if (! ereg("^[0-9]{10}.+$", $n)) {
								$WikiDir->delete("$pp");
								continue;
								}
							$a = strftime("%Y-%m-%d-%H%M%S", substr($n, 0, 10));
							$newname = "Chat-Archives.$_POST[room]-$a-" . substr($n,11);
							rename("$WorkDir/$pp", "$WorkDir/$newname");
							}
						$WikiDir->delete("Chatrooms.$cc");
						$m .= "Room $cc has been destroyed. ";
						if ($cc == $_POST[room]) Redirect(FmtPageName("Chat.Chat", $pagename));
						break;

					default :
						break;
					}
				}
			}
				
		if (($field == "private") && ($value != "")) ZAPprivate($value);

	}

	return;
	}


function ZAPprivate($value) {
	global $WikiDir, $ZAPtime, $ZAPprofiles, $_POST;
	if ($value == "clear") {
		$g = "Private-$GLOBALS[AuthId]";
		$p = ListPages("/^$g\./");
		foreach ($p as $pp) $WikiDir->delete("$pp");
		$m .= "Private messages have been cleared. ";
		}
	else {
		$to = substr($value, 0, strpos($value, " "));
		$from = $GLOBALS[AuthId];
		$message = substr($value, strpos($value, " ") + 1);
		if (! PageExists("$ZAPprofiles.$to")) ZAPwarning("Member does not exist");
		$oldpage = ReadPage($_POST[datapage]);
		$newpage = $oldpage;
		$newpage['text'] = "%silver%<private>$from: $message%%";
		UpdatePage("Private-$to.$ZAPtime", $oldpage, $newpage);
		if ($to != $from) UpdatePage("Private-$from.$ZAPtime", $oldpage, $newpage);
		}
	return;
	}


Markup('zapchat', '>{$var}', '/\(:zapchat(.*?):\)/ei', "Keep(ZAPframe('$1'))"); 
Markup('zaprefresh', '>{$var}', '/\(:zaprefresh(.*?):\)/ei', "Keep(ZAPrefresh('$1'))"); 


function ZAPframe($x) { 
	global $ScriptUrl, $GET;
	$r = $_GET[room];
	$g = "Chatroom";
	if (isset($_GET[group])) $g = $_GET[group];
	$w = "95%";
	$h = "300";
	if (strpos($x, "|")) {
		$h = substr($x, 1, strpos($x, "|"));
		$w = substr($x, strpos($x, "|") + 1);
		}
	$chat = "<iframe src='" . $ScriptUrl . "?n=$g.$r" . "' width='" . $w . "' height='" . $h . "' border='0' marginheight='0' marginwidth='0' style='border:solid #0f0 0.0em'>\nYour browser does not support chatting.\n</iframe>\n";
	return $chat;
	}

function ZAPrefresh($t) { 
	if ($t == "") $t = "10";
	$t = $t * 1000;
	$refresh .= "
<script>
var i = 0;
function chat(i) {
   ii = chat[0] + 1;
   xx = $t * 20;
   if (i < 8) xx = $t * 4; 
   if (i < 4) xx = $t;
   window.frames[0].location.reload();
   setTimeout('chat(ii)',xx);
   }
setTimeout('chat(i)',$t);
</script>
	";
	return $refresh;
	}