<?php
/* Tiki-Wiki plugin tracker  
 *
 * This is an example plugin to let you know how to create
 * a plugin. Plugins are called using the syntax
 * {NAME(params)}content{NAME}
 * Name must be in uppercase!
 * params is in the form: name=>value,name2=>value2 (don't use quotes!)
 * If the plugin doesn't use params use {NAME()}content{NAME}
 *
 * The function will receive the plugin content in $data and the params
 * in the asociative array $params (using extract to pull the arguments
 * as in the example is a good practice)
 * The function returns some text that will replace the content in the
 * wiki page.
 */

function wikiplugin_taskgantt_help() {
	//Mensagem que decreve o plugin no Wiki Help
	return tra("Check the tracker items added between date range specified").":<br />~np~{PACKETLIST(min_date=>, max_date=>)}".tra("trackerID")."{PACKETLIST}~/np~";
}
function wikiplugin_taskgantt($data, $params) {
	//inicialização de constantes
	global $array_days_off;
	require_once("taskgantt_config.php");

	global $tikilib;
	$min_stamp = 0;
	$max_stamp = 0;
	$string="";
	
	//Verifica se os parâmetros necessários foram inseridos
	extract ($params,EXTR_SKIP);

	if (isset($nr_days)) {
		$nr_days_total = $nr_days;
		if ($nr_days_total <= 366) {
			$now = time();
			$min_stamp = mktime(0, 0, 0, date("m", $now), date("d", $now), date("Y", $now));
			$max_stamp = mktime(0, 0, 0, date("m", $now), date("d", $now) + $nr_days_total, date("Y", $now));
		} else {
			return ("<b>Alcance das datas demasiado grande, deverÃ¡ ser no mÃ¡ximo 365 dias.</b><br/>");
		}
	} 
	else {
		if (!isset($min_date)) {
			return ("<b>Missing min_date parameter for plugin.</b><br/>");
		}
		if (!isset($max_date)) {
			return ("<b>Missing max_date parameter for plugin.</b><br/>");
		}
		if (($min_stamp = strtotime($min_date)) === -1) {
			return ("<b>min_date: O formato da data deve ser yyyy-mm-dd.</b><br/>");
		}
		if (($max_stamp = strtotime($max_date)) === -1) {
			return ("<b>max_date: O formato da data deve ser yyyy-mm-dd.</b><br/>");
		}
		list($min_year, $min_month, $min_day) = explode("-", $min_date);
		if ((!(ctype_digit($min_year)) || !(strlen($min_year) == 4))
			|| (!(ctype_digit($min_month)) || !(strlen($min_month) == 2) || !((int) $min_month < 13))
			|| (!(ctype_digit($min_day)) || !(strlen($min_day) == 2) || !((int) $min_day < 32))) {
			return ("<b>min_date: O formato da data deve ser yyyy-mm-dd.</b><br/>");
		}
		list($max_year, $max_month, $max_day) = explode("-", $max_date);
		if ((!(ctype_digit($max_year)) || !(strlen($max_year) == 4))
			|| (!(ctype_digit($max_month)) || !(strlen($max_month) == 2) || !((int) $max_month < 13))
			|| (!(ctype_digit($max_day)) || !(strlen($max_day) == 2) || !((int) $max_day < 32))) {
			return ("<b>max_date: O formato da data deve ser yyyy-mm-dd.</b><br/>");
		}
		if ($min_stamp > $max_stamp) {
			return ("<b>min_date deve ser anterior a max_date.</b><br/>");
		}
	}

	if (isset($users)) {
		$userlist = explode("|", $users);
	}

	if (isset($projects)) {
		$projectlist = explode("|", $projects);
	}

	if (isset($types)) {
		$typelist = explode("|", $types);
	}

	if (isset($states)) {
		$statelist = explode("|", $states);
		$statelist = str_replace("Open", "o", $statelist);
		$statelist = str_replace("Pending", "p", $statelist);
		$statelist = str_replace("Closed", "c", $statelist);
	}
		
	//Retira eventuais espaços que o utilizador tenha inserido
	$data = trim($data);
	$datalist = explode("|", $data);

	if (!isset($nr_days_total)) {
		$stamp = $max_stamp - $min_stamp;
		$nr_days_total = date("z", $stamp);
		$control_stamp = mktime(0, 0, 0, 01, 01, 1971);
		if ($stamp > $control_stamp) {
			return ("<b>Alcance das datas demasiado grande, deverÃ¡ ser no mÃ¡ximo 365 dias.</b><br/>");
		}
	}

	//Acrescenta um dia ao max_stamp pois o filtro das datas é inclusive
	$max_stamp = mktime(23, 59, 59, date("m", $max_stamp), date("d", $max_stamp), date("Y", $max_stamp));

	//Variavel usada para testes do dia actual
	$today = mktime(0,0,0);
	
	//Cabeçalho da tabela
	$tableheader = "<table border=\"0\">";
	$tableheader .= "<tr><th rowspan=\"3\">Tarefa<br>[tiki-view_tracker.php?trackerId=".TRACKERID_TASKS."#newitem|(+)]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>";
	$tableheader .= "<th rowspan=\"3\">ResponsÃ¡vel<br>&nbsp;</th>";
	$month = $min_stamp;
	$min_day_aux = date("d", $min_stamp) - 1;
	$month_string = "";
	for ($i = 0; $i <= $nr_days_total; $i++) {
		$month_string_aux = date("F", $month);
		if (strcmp($month_string_aux, $month_string) <> 0) {
			$month_string = $month_string_aux;
			$nr_days = date("t", $month);
			$tableheader .= "<th colspan=\"";
			$tableheader .= ($nr_days - $min_day_aux)."\">".$month_string."</th>";
			$min_day_aux = 0;
		}
		$month = mktime(0, 0, 0, date("m", $month), date("d", $month)+1, date("Y", $month));
	}
	$tableheader .= "</tr><tr>";
	$first_weekday = date("w", $min_stamp);
	$day = mktime(0, 0, 0, date("m", $min_stamp), date("d", $min_stamp), date("Y", $min_stamp));
	for ($i = 0; $i <= $nr_days_total; $i++) {
		$tableheader .= "<th ";
		if ($day == $today)
			$tableheader .= "style=\"border:solid 2px #000";
		else
			$tableheader .= "style=\"";
		if ($first_weekday == 6) {
			$tableheader .= ";background-color: lightyellow\">".date("d", $day)."</th>";
			$first_weekday = 0;
		} else if ($first_weekday == 0) {
			$tableheader .= ";background-color: lightyellow\">".date("d", $day)."</th>";
			$first_weekday += 1;
		} else if (in_array($day, $array_days_off)) {
			$tableheader .= ";background-color: lightyellow\">".date("d", $day)."</th>";
			$first_weekday += 1;
		} else {
			$tableheader .= "\" >".date("d", $day)."</th>";
			$first_weekday += 1;
		}
		$day = mktime(0, 0, 0, date("m", $day), date("d", $day)+1, date("Y", $day));
	}
	$tableheader .= "</tr><tr>";
	$first_weekday = date("w", $min_stamp);
	$day = mktime(0, 0, 0, date("m", $min_stamp), date("d", $min_stamp), date("Y", $min_stamp));
	$weekdays = array("D", "S", "T", "Q", "Q", "S", "S");
	for ($i = 0; $i <= $nr_days_total; $i++) {
		$tableheader .= "<th ";
		if ($day == $today)
			$tableheader .= "style=\"border:solid 2px #000";
		else
			$tableheader .= "style=\"";
		if ($first_weekday == 6) {
			$tableheader .= ";background-color: lightyellow\">".$weekdays[$first_weekday]."</th>";
			$first_weekday = 0;
		} else if ($first_weekday == 0) {
			$tableheader .= ";background-color: lightyellow\">".$weekdays[$first_weekday]."</th>";
			$first_weekday += 1;
		} else if (in_array($day, $array_days_off)) {
			$tableheader .= ";background-color: lightyellow\">".$weekdays[$first_weekday]."</th>";
			$first_weekday += 1;
		} else {
			$tableheader .= "\">".$weekdays[$first_weekday]."</th>";
			$first_weekday += 1;
		}
		$day = mktime(0, 0, 0, date("m", $day), date("d", $day)+1, date("Y", $day));
	}
	$tableheader .= "</tr>";
	
	//Obtem a lista de items do tracker por ordem decrescente de data.
	if (in_array(TRACKERID_TASKS, $datalist)) {
		$items = $tikilib->list_tracker_items(TRACKERID_TASKS, 0, -1, 'created_desc', '', '');
		$items = $items['data']; //é necessário pois a ordenação fica ascendente mesmo com created_desc
		$array = array();
		foreach ($items as $item) {
			if (($max_stamp > $item['field_values'][TASK_INI]['value'] && $item['field_values'][TASK_INI]['value'] > $min_stamp) || ($max_stamp > $item['field_values'][TASK_END]['value'] && $item['field_values'][TASK_END]['value'] > $min_stamp)
			|| ($min_stamp > $item['field_values'][TASK_INI]['value'] && $item['field_values'][TASK_END]['value'] > $max_stamp))
			{
				if (isset($projectlist)) {
					if(!in_array($item['field_values'][TASK_PROJECT]['value'], $projectlist)) continue;
				}
				if (isset($userlist)) {
					$listparticipants = explode('|', $item['field_values'][TASK_PARTICIPANTS]['value']);
					$user_in = in_array($item['field_values'][TASK_USER]['value'], $userlist);
					$array_int = array_intersect($userlist, $listparticipants);
					if (count($array_int) == 0) { $participant_in = false; } else { $participant_in = true; }
					if (!$user_in && !$participant_in) {
						 continue;
					}
				}
				if (isset($typelist)) {
					if(!in_array($item['field_values'][TASK_TYPE]['value'], $typelist)) continue;
				}
				if (isset($statelist)) {
					if(!in_array($item['status'], $statelist)) continue;
				}

				$client = $item['field_values'][TASK_PROJECT]['value'];
				switch($client) {
					case "CustomerA": $color = "DarkBlue";
						break;
					case "CustomerB": $color = "DarkOrange";
						break;
					case "CustomerC": $color = "DarkGreen";
						break;
					case "CustomerD": $color = "Purple";
						break;
					case "CustomerE": $color = "Silver";
						break;
					case "CustomerF": $color = "LightSeaGreen";
						break;
					default: $color = "lightgrey";
						break;
				}
				$user = $item['field_values'][TASK_USER]['value'];
				$usertd = "<td align=\"center\">((UserPage".$user."|".$user."))</td>";
				$begin_date_stamp_orig = $item['field_values'][TASK_INI]['value'];
				$begin_date_stamp = mktime(0, 0, 0, date("m", $begin_date_stamp_orig), date("d", $begin_date_stamp_orig), date("Y", $begin_date_stamp_orig));
				$end_date_stamp = $item['field_values'][TASK_END]['value'];
				$end_date_stamp = mktime(0, 0, 0, date("m", $end_date_stamp), date("d", $end_date_stamp), date("Y", $end_date_stamp));
				$itemID = $item['itemId'];
				$desc = $item['field_values'][TASK_DESC]['value'];
				$desc_sub = str_replace("<br>", " ", str_replace("\n", " ", $desc));
				$desc_sub = substr($desc, 0, 26) . "...";
				$tooltip = "ResponsÃ¡vel: <b>". $user . "</b><br>Projecto: <b>" . $item['field_values'][TASK_PROJECT]['value'] . "</b><br>Estado: <b>" . $item['status'] . "</b><br>Tipo: <b>" .$item['field_values'][TASK_TYPE]['value'] . "</b><br>Data Fim: <b>" . date("d-m-Y", $item['field_values'][TASK_FINAL]['value']) . "</b>";
				if (isset($listparticipants)) {
					$tooltip .= "<br>Participantes: <b>";
					foreach($listparticipants as $participant)
						$tooltip .= $participant . ", ";
					$tooltip = substr($tooltip, 0, -2);
					$tooltip .= "</b><br>DescriÃ§Ã£o: <b>~np~" . str_replace("\r\n", "<br>", addslashes($desc)) . "~/np~</b>";
				}
				$name = "<td onmouseout=\"return cClick()\" onmouseover=\"return overlib('$tooltip')\">[tiki-view_tracker_item.php?itemId=" . $itemID . "&show=view&trackerId=".TRACKERID_TASKS."|" . $desc_sub . "]</td>";
				
				$string = "<tr>" . $name . $usertd;
				$day = mktime(0, 0, 0, date("m", $min_stamp), date("d", $min_stamp), date("Y", $min_stamp));
				$first_weekday = date("w", $min_stamp);
				for ($i = 0; $i <= $nr_days_total; $i++) {
					$string .= "<td ";
					if ($day == $today)
						$string .= "style=\"border:solid 2px #000\" ";
					if ($first_weekday == 6) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday = 0;
					} else if ($first_weekday == 0) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday += 1;
					} else if (in_array($day, $array_days_off)) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday += 1;
					} else {
						if ($day >= $begin_date_stamp && $day <= $end_date_stamp) {
							$string .= "bgcolor=\"".$color."\">&nbsp;</td>";
						} else $string .= ">&nbsp;</td>";
						$first_weekday += 1;
					}
					$day = mktime(0, 0, 0, date("m", $day), date("d", $day)+1, date("Y", $day));
				}
				$string .= "</tr>";
				$array_id = $begin_date_stamp_orig . '_' . $itemID;
				$array[$user][$array_id] = $string;
			} /*elseif ($item['created'] < $min_stamp) {
				break;
			}*/
		}
	}
	//Obtem a lista de items do tracker por ordem decrescente de data.
	if (in_array(TRACKERID_SUPPORT, $datalist)) {
		$items = $tikilib->list_tracker_items(TRACKERID_SUPPORT, 0, -1, 'created_desc', '', '');
		$items = $items['data']; //é necessário pois a ordenação fica ascendente mesmo com created_desc
		foreach ($items as $item) {
			if (($max_stamp > $item['field_values'][SUPPORT_INI]['value'] && $item['field_values'][SUPPORT_INI]['value'] > $min_stamp) || ($max_stamp > $item['field_values'][SUPPORT_END]['value'] && $item['field_values'][SUPPORT_END]['value'] > $min_stamp)
			|| ($min_stamp > $item['field_values'][SUPPORT_INI]['value'] && $item['field_values'][SUPPORT_END]['value'] > $max_stamp)) {
				if (isset($projectlist)) {
					if(!in_array($item['field_values'][SUPPORT_PROJECT]['value'], $projectlist)) continue;
				}
				if (isset($userlist)) {
					if(!in_array($item['field_values'][SUPPORT_USER]['value'], $userlist)) continue;
				}
				if (isset($statelist)) {
					if(!in_array($item['status'], $statelist)) continue;
				}
				
				$color = "Red";
				$user = $item['field_values'][SUPPORT_USER]['value'];
				$usertd = "<td align=\"center\">((UserPage".$user."|".$user."))</td>";
				$begin_date_stamp_orig = $item['field_values'][SUPPORT_INI]['value'];
				$begin_date_stamp = mktime(0, 0, 0, date("m", $begin_date_stamp_orig), date("d", $begin_date_stamp_orig), date("Y", $begin_date_stamp_orig));
				$end_date_stamp = $item['field_values'][SUPPORT_END]['value'];
				$end_date_stamp = mktime(0, 0, 0, date("m", $end_date_stamp), date("d", $end_date_stamp), date("Y", $end_date_stamp));
				$itemID = $item['itemId'];
				$desc = "Suporte";
				$tooltip = "ResponsÃ¡vel: <b>". $user . "</b><br>Projecto: <b>" . $item['field_values'][SUPPORT_PROJECT]['value'] . "</b>";
				$name = "<td onmouseout=\"return cClick()\" onmouseover=\"return overlib('$tooltip')\">[tiki-view_tracker_item.php?itemId=" . $itemID . "&show=view&trackerId=".TRACKERID_SUPPORT."|" . $desc . "]</td>";
				
				$string = "<tr>" . $name . $usertd;
				$day = mktime(0, 0, 0, date("m", $min_stamp), date("d", $min_stamp), date("Y", $min_stamp));
				$first_weekday = date("w", $min_stamp);
				for ($i = 0; $i <= $nr_days_total; $i++) {
					$string .= "<td ";
					if ($day == $today)
						$string .= "style=\"border:solid 2px #000\" ";
					if ($day >= $begin_date_stamp && $day <= $end_date_stamp) {
						$string .= "bgcolor=\"".$color."\">&nbsp;</td>";
						if ($first_weekday == 6)
							$first_weekday = 0;
						else
							$first_weekday += 1;
					} else if ($first_weekday == 6) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday = 0;
					} else if ($first_weekday == 0) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday += 1;
					} else if (in_array($day, $array_days_off)) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday += 1;
					} else {
						$string .= ">&nbsp;</td>";
						$first_weekday += 1;
					}
					$day = mktime(0, 0, 0, date("m", $day), date("d", $day)+1, date("Y", $day));
				}
				$string .= "</tr>";
				$array_id = $begin_date_stamp_orig . '_' . $itemID;
				$array[$user][$array_id] = $string;
			} /*elseif ($item['created'] < $min_stamp) {
				break;
			}*/
		}
	}
	//Obtem a lista de items do tracker por ordem decrescente de data.
	if (in_array(TRACKERID_RESTS, $datalist)) {
		$items = $tikilib->list_tracker_items(TRACKERID_RESTS, 0, -1, 'created_desc', '', '');
		$items = $items['data']; //é necessário pois a ordenação fica ascendente mesmo com created_desc
		foreach ($items as $item) {
			if (($max_stamp > $item['field_values'][RESTS_INI]['value'] && $item['field_values'][RESTS_INI]['value'] > $min_stamp) || ($max_stamp > $item['field_values'][RESTS_END]['value'] && $item['field_values'][RESTS_END]['value'] > $min_stamp)
			|| ($min_stamp > $item['field_values'][RESTS_INI]['value'] && $item['field_values'][RESTS_END]['value'] > $max_stamp)) {
				if (isset($userlist)) {
					if(!in_array($item['field_values'][RESTS_USER]['value'], $userlist)) continue;
				}
				if (isset($statelist)) {
					if(!in_array($item['status'], $statelist)) continue;
				}
				
				$color = "Gold";
				$user = $item['field_values'][RESTS_USER]['value'];
				$usertd = "<td align=\"center\">((UserPage".$user."|".$user."))</td>";
				$begin_date_stamp_orig = $item['field_values'][RESTS_INI]['value'];
				$begin_date_stamp = mktime(0, 0, 0, date("m", $begin_date_stamp_orig), date("d", $begin_date_stamp_orig), date("Y", $begin_date_stamp_orig));
				$end_date_stamp = $item['field_values'][RESTS_END]['value'];
				$end_date_stamp = mktime(0, 0, 0, date("m", $end_date_stamp), date("d", $end_date_stamp), date("Y", $end_date_stamp));
				$itemID = $item['itemId'];
				$desc = "FÃ©rias";
				$name = "<td >[tiki-view_tracker_item.php?itemId=" . $itemID . "&show=view&trackerId=".TRACKERID_RESTS."|" . $desc . "]</td>";
				
				$string = "<tr>" . $name . $usertd;
				$day = mktime(0, 0, 0, date("m", $min_stamp), date("d", $min_stamp), date("Y", $min_stamp));
				$first_weekday = date("w", $min_stamp);
				for ($i = 0; $i <= $nr_days_total; $i++) {
					$string .= "<td ";
					if ($day == $today)
						$string .= "style=\"border:solid 2px #000\" ";
					if ($first_weekday == 6) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday = 0;
					} else if ($first_weekday == 0) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday += 1;
					} else if (in_array($day, $array_days_off)) {
						$string .= "bgcolor=\"lightyellow\">&nbsp;</td>";
						$first_weekday += 1;
					} else {
						if ($day >= $begin_date_stamp && $day <= $end_date_stamp) {
							$string .= "bgcolor=\"".$color."\">&nbsp;</td>";
						} else $string .= ">&nbsp;</td>";
						$first_weekday += 1;
					}
					$day = mktime(0, 0, 0, date("m", $day), date("d", $day)+1, date("Y", $day));
				}
				$string .= "</tr>";
				$array_id = $begin_date_stamp_orig . '_' . $itemID;
				$array[$user][$array_id] = $string;
			} /*elseif ($item['created'] < $min_stamp) {
				break;
			}*/
		}
	}
	$teste = ksort($array);
	foreach ($array as $key => $val) {
		$teste = ksort($val);
		$array[$key] = $val;
	}
	$size = count($array);
	$string = "";

	if ($size == 0) {
		$string = "NÃ£o hÃ¡ tarefas entre as datas indicadas (" . date("Y-m-d", $min_stamp) . " e " . date("Y-m-d", $max_stamp) ."), para o(s) tracker(s) " . $data . ".";
	} else {
		foreach ($array as $key => $val) {
			foreach($val as $td => $value) {
				$string .= $value;
			}
		}
		$string .= "</table>";
		$string = $tableheader.$string;
	}

	return $string;
}
?>
