#include <infodrom.style>
#include "lt.style"
#include "functions.inc"
#include "edit.style"
#include "jobs.inc"

<postgresconnect>
<build_timeframe>
<tab_frag_stubs>
<normal_time>
<fragment_ok>
<ltpage title="Jobs">

# This page intends to provide an overview about a given job and
# provide means to assign a person to the job.  Hence, the page contains:
#  . All Job fragments through the entire week
#  . Fragments and assignments splitted by day
#  . Including hooks to unassigned supporters for assignments

<?
  if (!is_supporter() && !is_also_supporter()) {
    die ("Only supporters may read these page.");
  }

  $title = '';
  if (isset ($id)) {
    $query = sprintf ("SELECT title,location,description,priority,comment,section FROM job WHERE id = %d", $id);
    $sth = pg_exec ($dbh, $query) or die("Datenbank-Abfrage!");

    if (pg_NumRows ($sth) > 0) {
      $row = pg_fetch_array ($sth, 0);

      printf ("<h3>%s</h3>", $row['title']);

      if (strlen ($row['section']) > 0) { printf ("<br>Section: %s</p>", $row['section']); }
      if ($row['priority'] > 0) { printf ("<br>Priority: %s</p>", $row['priority']); }
      if (strlen ($row['location']) > 0) { printf ("<br>Location: %s</p>", $row['location']); }
      if (strlen ($row['comment']) > 0) { printf ("<br>Comment: %s</p>", $row['comment']); }

      $title = $row['title'];
      $description = $row['description'];
    }
  }

  if ($id > 0 && strlen ($title) > 0) {
    $query = sprintf ("SELECT oid,* FROM fragment WHERE job = %d ORDER BY starttime", $id);
    $sth = pg_exec ($dbh, $query) or die("Datenbank-Abfrage!");

    for ($nr=0; $nr < pg_NumRows ($sth); $nr++) {
      $row = pg_fetch_array ($sth, $nr);

      $foo = explode (" ", $row['starttime']);
      $time = build_timeframe ($row['starttime'], $row['endtime']);
      if (strlen ($frag[$foo[0]]) > 0) {
	$frag[$foo[0]] .= "&nbsp;" . $time;
      } else {
	$frag[$foo[0]] = $time;
      }

      $foo = normal_time ($row['starttime'], $row['endtime']);
      $fragments[$foo[0]][] = array ('start' => $foo[1],
				     'end' => $foo[2],
				     'id' => $row['id'],
				     'oid' => $row['oid']);
    }

    $query = sprintf ("SELECT assignment.starttime,assignment.endtime,assignment.person,assignment.oid,person.id,name "
		     ."FROM assignment,fragment,job,person WHERE job.id = %d "
		     ."AND assignment.fragment = fragment.id "
		     ."AND fragment.job = job.id "
		     ."AND person.id = assignment.person "
		     ."ORDER BY starttime", $id);
    $sth = pg_exec ($dbh, $query) or die("Datenbank-Abfrage!");

    for ($nr=0; $nr < pg_NumRows ($sth); $nr++) {
      $row = pg_fetch_array ($sth, $nr);

      $foo = normal_time ($row['starttime'], $row['endtime']);
      $assignment[$foo[0]][] = array ('start' => $foo[1],
				      'end'   => $foo[2],
				      'person'=> $row['person'],
				      'name'  => $row['name'],
				      'oid'   => $row['oid']);
    }
?>

# Basically, this table is a copy of a single line from jobs
#
<p><table cellpadding=0 cellspacing=1>
<?
    printf ($f_header_head, "<colh>");
    reset ($ltdays);
    while (list($key,$day) = each ($ltdays)) {
      $foo = explode (",", $day);
      printf ($f_header_day, $foo[0]);
      $col[] = $key;
    }
    echo ($f_header_tail);

    if (is_admin()) {
      printf ($f_row_head, "<cold>", "edit_job", $id, $title);
    } else {
      printf ($f_row_head, "<cold>", "job", $id, $title);
    }

    reset ($ltdays);
    while (list($date,$day) = each ($ltdays)) {
      if (strlen ($frag[$date]) > 0) {
        printf ($f_row_day, $frag[$date]);
      } else {
        printf ($f_row_day, "&nbsp;");
      }
    }
    echo ($f_row_tail);
?>
</table>
<hr>
<?
  function display_supporters ($dbh, $date, $start, $end, $fragment)
  {
    global $LINUXTAG_AUTH;

    if (is_supporter() && is_admin()) {
      $where = '';
    } else {
      $where = sprintf ("AND name = '%s' ", $LINUXTAG_AUTH['name']);
    }

    if ($start == "24:00") { $start = "23:59"; }
    if ($end == "24:00") { $end = "23:59"; }

    $query = sprintf ("SELECT name,id,person.oid FROM person,availability "
		     ."WHERE starttime <= '%s %s' AND endtime >= '%s %s' "
		     ."AND person.id = availability.person %sORDER BY name",
		     $date, $start, $date, $end, $where);
    $sth = pg_exec ($dbh, $query) or die("Datenbank-Abfrage!");

    if ( pg_NumRows ($sth) > 0) {
      for ($nr=0; $nr < pg_NumRows ($sth); $nr++) {
        $row = pg_fetch_array ($sth, $nr);

# Fragment                     [----------------]       a=assignment && f=fragment
# Illegal Assignment  (a)   [-------]                    a.s <= f.s && a.e >= f.s
# Illegal Assignment  (b)         [-------]              a.s >= f.s && a.e <= f.e
# Illegal Assignment  (c)                   [-------]    a.s <= f.e && a.e >= f.e
# Illegal Assignment  (a/c) [------------------------]
<protect>

	$query = sprintf ("SELECT person FROM assignment "
			 ."WHERE person = %d "
			 ."AND ( starttime <= '%s %s' AND endtime > '%s %s' "
			 ."OR  starttime >= '%s %s' AND endtime <= '%s %s' "
			 ."OR  starttime < '%s %s' AND endtime >= '%s %s' ) ",
			 $row['id'],
			 $date, $start, $date, $start,
			 $date, $start, $date, $end,
			 $date, $end, $date, $end);
</protect>
        $sth2 = pg_exec ($dbh, $query) or die("Datenbank-Abfrage!");
	if ( pg_NumRows ($sth2) == 0) {
	  echo ("<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;");

	  printf (" %s-%s: <a href=\"supporter.php3?id=%d\">%s</a> "
		 ."(<a href=\"update.php3?type=assign&fragment=%d&person=%d\">assign</a>)",
		  $start, $end, $row['id'], $row['name'],
		  $fragment, urlencode ($row['id']));
	}
      }
    }
  }

    reset ($ltdays);
    while (list($date,$day) = each ($ltdays)) {
      if (strlen ($frag[$date]) > 0) {
	printf ("<h3>%s</h3>", $day);
	# printf ("<p><b>Fragments:</b> %s (DEBUG)", $frag[$date]);

	if (is_array ($assignment[$date])) {
	  $assign = $assignment[$date];
	} else {
	  $assign = array ();
	}

	if (is_array ($fragments[$date])) {
	  $fragment = $fragments[$date];
	} else {
	  $fragment = array ();
	}

	$as_pivot = 0;   // assignment
	for ($nr=0; $nr < count ($fragment); $nr++) {
	  while ($as_pivot < count ($assign) && time_lt ($assign[$as_pivot]['start'], $fragment[$nr]['start'])) { $as_pivot++; }
	  if ($as_pivot < count ($assign)) {
	    if ( ($assign[$as_pivot]['start'] == $fragment[$nr]['start'])
	      && ($assign[$as_pivot]['end'] == $fragment[$nr]['end'])) {

	      while ( ($assign[$as_pivot]['start'] == $fragment[$nr]['start'])
		   && ($assign[$as_pivot]['end'] == $fragment[$nr]['end'])) {
		if ((is_admin() && is_supporter()) || $LINUXTAG_AUTH['id'] == $assign[$as_pivot]['person']) {
		  printf ("<br>%s-%s: <a href=\"supporter.php3?id=%d\">%s</a> "
			 ."(<a href=\"update.php3?type=loose&assignment=%d\">loose this</a>)",
			 $fragment[$nr]['start'], $fragment[$nr]['end'],
			 $assign[$as_pivot]['person'], $assign[$as_pivot]['name'],
			 $assign[$as_pivot]['oid']);
	        } else {
		  printf ("<br>%s-%s: <a href=\"supporter.php3?id=%d\">%s</a>",
			 $fragment[$nr]['start'], $fragment[$nr]['end'],
			 $assign[$as_pivot]['person'], $assign[$as_pivot]['name']);
		}
		$as_pivot++;
	      }

	      if (!fragment_ok ($dbh, $fragment[$nr]['id'])) {
		display_supporters ($dbh, $date, $fragment[$nr]['start'], $fragment[$nr]['end'], $fragment[$nr]['id']);
	      }
	      # FIXME
	    } else {
	      printf ("<br>%s-%s: free", $fragment[$nr]['start'], $fragment[$nr]['end']);
	      display_supporters ($dbh, $date, $fragment[$nr]['start'], $fragment[$nr]['end'], $fragment[$nr]['id']);
	    }
	  } else {
	    printf ("<br>%s-%s: free", $fragment[$nr]['start'], $fragment[$nr]['end']);
	    display_supporters ($dbh, $date, $fragment[$nr]['start'], $fragment[$nr]['end'], $fragment[$nr]['id']);
	  }
	}
      }
    }

    if (strlen ($description) > 0) {
      printf ("<h3>Description of %s</h3><blockquote>%s</blockquote>", $title, $description);
    }
  } else {
    echo "<p><b>No such job found.</b></p>";
  }
?>

</ltpage>

# Local variables:
# mode: text
# mode: auto-fill
# end:
