#include <infocon.style>
#include "common.inc"

<future>
<page func=InfoCon title="Stempeluhr">
<script type="text/javascript" src="<root_prefix>jquery.editable.js"></script>
<style type="text/css">
table.smallfont.border tr.sep td {
    border-bottom: 1px solid #555;
}
</style>

<?php
  session_name('STEMPEL');
  session_start();

  $stati = false;
  function display_tables()
  {
    global $dbh;
    global $stati;
    $wdays = array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');

    $name = load_customers();

    $table_head = '<h3 class="bar">Kunde: %s</h3><script type="text/javascript">plant(%d,%.2f);</script>
  <form action="status.php" method="POST">
  <table class="smallfont border" id="table_%d" width="100%%" cellpadding=0 cellspacing=0>
  <thead>
  <tr class="head">
    <th width=15%% colspan="2">Datum</th>
    <th width=5%%>Dauer</th>
    <th width=5%%>St.</th>
    <th width=75%% align=left>Arbeitsbeschreibung</th>
  </tr>
  </thead>
  <tbody>';

    if (!is_array($stati))
      $stati = find_status();

    $table_foot = '</table><div align="center"><p>';

    foreach ($stati as $k=>$v)
	$table_foot .= sprintf('<input type="radio" name="status" value="%s"%s><span class="radio" data-value="%d" onclick="set_status(event)">%s</span>&nbsp;', $k, 0==$k?' checked':'', $k, $v);
    $table_foot .= '<input type="submit" class="button" value="Aktualisieren" onclick="return status_change(event)"></p></div>'.
		  '<input type="hidden" name="fields" value="%d">'.
		  '</form>';

    $table_row = '<tr class="t%d" status="%d"><td>%s</td><td>%s</td><td align="center" onclick="toggle_checkbox(%d,this)">%s</td>' .
      '<td align="center" onclick="toggle_checkbox(%d,this)">%s</td><td><span class="edit" route="Stempel/EditTask" item_id="%d">%s</span></td></tr>';
    $table_sum = '</tbody><tfoot><tr class="t%d" onclick="edit_task_finish(this)">' .
	'<td colspan="2">&nbsp;</td><td align="center">%s</td><td>&nbsp;</td><td>Summe</td></tr></tfoot>';

    $query = "SELECT stempel.oid,stempel.id,stempel.status,start,customer,time,task,kurz FROM stempel JOIN stempel_status ON (stempel.status = stempel_status.id) WHERE time IS NOT NULL ";
    if (isset($_SESSION['save']['month']) && strlen($_SESSION['save']['month']))
      $query .= "AND cast(start AS TEXT) LIKE '".$_SESSION['save']['month']."-%' ";
    if (isset($_SESSION['save']['customer']) && strlen($_SESSION['save']['customer']))
      $query .= "AND customer ='".$_SESSION['save']['customer']."' ";
    if (isset($_SESSION['save']['keyword1']) && strlen($_SESSION['save']['keyword1']))
      $query .= "AND task ILIKE '%".$_SESSION['save']['keyword1']."%' ";
    if (isset($_SESSION['save']['keyword2']) && strlen($_SESSION['save']['keyword2']))
      $query .= "AND task ILIKE '%".$_SESSION['save']['keyword2']."%' ";
    if (isset($_SESSION['save']['time_from']) && strlen($_SESSION['save']['time_from']))
      $query .= "AND start >= '".$_SESSION['save']['time_from']."' ";
    if (isset($_SESSION['save']['time_to']) && strlen($_SESSION['save']['time_to']))
      $query .= "AND stop <= '".$_SESSION['save']['time_to']."' ";

    if (isset($_SESSION['save']['status']) && strlen($_SESSION['save']['status'])) {
      if ($_SESSION['save']['status'] != 'all')
        $query .= "AND status = ".$_SESSION['save']['status']." ";
    } else
      $query .= "AND status = 0 ";
    $query .= "ORDER BY customer,start";

    $sth = pg_exec ($dbh, $query);

    $form = 0;
    $customer = '';
    $lastmonth = false;
    while ($row = pg_fetch_array ($sth)) {

      if ($customer != $row['customer']) {
	if (strlen($customer)) {
	  printf($table_sum, $color, min2hour($sum));
	  printf($table_foot, $fieldnr);
	  $form++;
	}
	$cname = $name[$row['customer']]['name'];
	if (!strlen($cname)) $cname = ucfirst($row['customer']);
	printf($table_head, $cname, $form, $name[$row['customer']]['rate'], $form);
	$customer = $row['customer'];
	$fieldnr = 0;
	$sum = 0;
	$color = 0;
      }

      $sum += $row['time'];
      $d = explode(' ', $row['start']);

      $check = sprintf('<input type="checkbox" class="checkbox" name="id_%d" value="%d" onclick="add_sum(%d,this)">',
		       $fieldnr++,
		       $row['id'],
		       $form);
      $dt = new Datetime($d[0]);
      if ($lastmonth !== false && $lastmonth != $dt->format('Y-m'))
	  printf('<tr class="sep"><td colspan="100%%"></td></tr>');
      $date = sprintf('<span onclick="toggle_checkbox(%d,this)">%s, %s</span>', $form, $wdays[$dt->format('w')], $d[0]);
      printf($table_row, $color, $row['status'], $check, $date, $form, min2hour($row['time']), $form, $row['kurz'],
	     $row['id'],
	     htmlspecialchars($row['task'], ENT_COMPAT | ENT_HTML401, 'ISO-8859-1'));
      $color = !$color;
      $lastmonth = $dt->format('Y-m');
    }
    if (pg_num_rows($sth) > 0) {
      printf($table_sum, $color, min2hour($sum));
      printf($table_foot, $fieldnr);
    }
  }

  function find_customers()
  {
    global $dbh;

    $a = array();
    $query = "SELECT DISTINCT customer FROM stempel ORDER BY customer";
    $sth = pg_exec ($dbh, $query);

    while ($row = pg_fetch_array ($sth))
      $a[] = $row[0];

    return $a;
  }

  $dbh = pg_pconnect ("<dbhost>", "<dbport>", "<dbname>")
	 or die("Unable to connect to SQL server");

  pg_exec ($dbh, "SET DateStyle = 'ISO'") or die("Datenbank-Abfrage!");

  if (isset($_POST["filter"])) {
      $_SESSION['save']['month'] = $_POST['month'];
      $_SESSION['save']['customer'] = $_POST['customer'];
      $_SESSION['save']['status'] = $_POST['status'];
      $_SESSION['save']['time_from'] = $_POST['time_from'];
      $_SESSION['save']['time_to'] = $_POST['time_to'];
      $_SESSION['save']['keyword1'] = $_POST['keyword1'];
      $_SESSION['save']['keyword2'] = $_POST['keyword2'];
      $_SESSION['redirect'] = true;
      header('Location: status.php');
      exit;
  } elseif (isset($_POST["status"]) && isset($_POST["fields"])) {
    $msg = update_db();
    $_SESSION['redirect'] = true;
    header('Location: status.php');
    exit;
  } elseif (isset($_SESSION['redirect'])) {
    $_SESSION['redirect'] = false;
  } else {
    if (isset($_GET['month'])) {
      $_SESSION['save']['month'] = $_GET['month'];
      unset($_SESSION['save']['customer']);
      unset($_SESSION['save']['status']);
    } else {
      $_SESSION['save']['month'] = date('Y-m');
    }
  }
?>

<script src="<root_prefix>basics.js"></script>
<script type="text/javascript">
<protect>
var color_checked = '#c4ffc3';
function format_int(value, width)
{
  var s = value.toString();

  while (s.length < width)
    s = '0' + s;

  return s;
}

function timestr(duration)
{
    return format_int(Math.floor(duration / 60), 1) + ':'
	+ format_int(duration - (Math.floor(duration / 60) * 60), 2);
}

function strtime(time)
{
    var a = time.split(':');
    return parseInt(a[0],10) * 60 + parseInt(a[1],10);
}

function check(id, value)
{
    var hours = $('#time_'+id);
    var rate = $('#rate_'+id);
    var sum = $('#sum_'+id);
    var newval = 0;

    $('table#table_'+id+' tbody tr:visible').each(function(i,e){
	if (e.className == 'sep')
	    return;

	if (e.className.indexOf('sep ') > -1)
	    return;

	var checkbox = $(this).find('input[type="checkbox"]');
	if (checkbox.prop('checked') != value) {
	    checkbox.prop('checked', !checkbox.prop('checked'));
	    if (checkbox.prop('checked'))
		$(this).css('background-color', color_checked);
	    else
		$(this).css('background-color', '');
	    add_sum(id, checkbox);
	}
    });

    return false;
}

function plant(form, rate)
{
  document.write('<div class="jscode">');
  document.write('<input class="filter" id="filter_'+form+'" size="10" value="">');
  document.write('<img class="filter" id="img_'+form+'" src="/pix/Actions-edit-delete-icon.png" border="0" ' +
		 'title="Filter löschen">');
  document.write('<input type="hidden" id="rate_'+form+'" value="'+rate+'">');
  document.write('<a href="#" onclick="return check('+form+',true)">Check all</a>');
  document.write("&nbsp;/&nbsp;");
  document.write('<a href="#" onclick="return check('+form+',false)">Uncheck all</a>');
  document.write("&nbsp;");
  document.write('<span id="time_'+form+'" class="sum">0:00</span>' );
  document.write('<span id="sum_'+form+'" class="sum">&euro;0.00</span>');
  document.write("&nbsp;");
  document.write('</div>');
}

function add_sum(form, checkbox)
{
    var hours = $('#time_'+form);
    var rate = $('#rate_'+form);
    var sum = $('#sum_'+form);
    var time = strtime($(checkbox).parents('tr:first').find('td:nth-child(3)').text());
    var newval;

    if ($(checkbox).prop('checked')) {
	newval = strtime(hours.text()) + time;
	$(checkbox).parents('tr:first').css('background-color', color_checked);
    } else {
	newval = strtime(hours.text()) - time;
	$(checkbox).parents('tr:first').css('background-color', '');
    }
    hours.text(timestr(newval));
    sum.html('&euro;' + ((newval/60)*rate.val()).toFixed(2));
}

var task_parent = null;
var task_title = '';
var task_id = 0;
function edit_task(obj)
{
    if (task_id) {
	if (task_id != obj.parentNode.children[0].children[0].value)
	    edit_task_save();
    }

    if (!task_id) {
	task_parent = obj;
	task_title = obj.innerHTML;
	task_id = obj.parentNode.children[0].children[0].value;

	var input = $('<input>');
	input.val(obj.innerHTML.replace('&gt;', '>').replace('&lt;', '<').replace('&amp;', '&'));
	input.css('fontSize', '100%').css('width', '100%').css('background', 'yellow');
	obj.innerHTML = '';
	$(obj).append(input);
	input.focus();
    }
}

function edit_task_save()
{
    if (!task_parent) return;

    if (task_parent.children[0].value != task_title)
	$.invoke('Stempel/Task', {id: task_id, content: task_parent.children[0].value});

    task_parent.innerHTML = task_parent.children[0].value;
    task_parent = null;
    task_title = '';
    task_id = 0;
}

function edit_task_finish(obj)
{
    if (task_id)
	edit_task_save();
}

function toggle_checkbox(form, obj)
{
    var row = $(obj).parents('tr:first');
    var checkbox = row.find('input[type="checkbox"]')
    checkbox.prop('checked', !checkbox.prop('checked'));

    checkbox.checked = !checkbox.checked;
    add_sum(form, checkbox);
}

function filter_change(e)
{
    var form = $(this).attr('id').split('_')[1];
    var filter = $('input#filter_'+form).val().toLowerCase();

    var cnum = 0;
    $('table#table_'+form+' tbody tr').not('.sep').not('.deleted').each(function(i,e){
	if (filter.length) {
	    var td = $(this).find('td:nth-child(5)');
	    if (td.text().toLowerCase().indexOf(filter) > -1) {
		$(this).removeClass('t0').removeClass('t1').addClass('t'+cnum).show();
		cnum = cnum ? 0 : 1;
	    } else {
		if ($(this).find('input[type="checkbox"]').prop('checked')) {
		    toggle_checkbox(form, td);
		}
		$(this).hide();
	    }
	} else {
	    $(this).removeClass('t0').removeClass('t1').addClass('t'+cnum).show();
	    cnum = cnum ? 0 : 1;
	}
    });
}

function filter_clear(e)
{
    var form = $(this).attr('id').split('_')[1];
    $('div.jscode input.filter#filter_'+form).val('').keyup();
}

function status_change(e)
{
    var ids = [];
    var form = $(e.target).parents('form:first');
    var p = $(e.target).parents('p:first');
    form.find('tr').not('.deleted').find('input.checkbox').each(function(i,e){
	if ($(this).prop('checked') == true)
	    ids.push($(this).val());
    });

    var new_status = 0;
    p.find('input[name="status"]').each(function(i,e){
	if ($(this).prop('checked') == true)
	    new_status = $(this).val();
    });

    $.invoke('Stempel/SetStatus', {status: new_status, ids: ids}, function(data){
	for (var i=0; i < ids.length; i++) {
	    show_message('Positionen aktualisiert');
	    var checkbox = form.find('input.checkbox[value="'+ids[i]+'"]');
	    var row = checkbox.parents('tr:first');

	    checkbox.prop('checked',false);
	    add_sum(form.find('table:first').attr('id').split('_')[1], checkbox);

	    if (row.attr('status') != new_status)
		row.addClass('deleted').hide();
	}
    });

    return false;
}

function set_status(e)
{
    var form = $(e.target).parents('form:first');

    form.find('input[type="radio"]').each(function(i,el){
	$(this).prop('checked', false);
    });
    $('input[type="radio"][value="'+$(e.target).attr('data-value')+'"]').prop('checked', true);

    form.find('span.radio').each(function(i,el){
	($(this).css('fontWeight', ''))
    });
    $('span.radio[data-value="'+$(e.target).attr('data-value')+'"]').css('fontWeight', 'bold');
}

$(function(){
    $('div.jscode input.filter').keyup(filter_change);
    $('div.jscode img.filter').click(filter_clear);
    make_editable('table.smallfont tr span.edit');
});
</protect>
</script>

<style type="text/css">
div.jscode {
  text-align: right;
  margin-top: -13px;
  font-size: 12px;
}
div.jscode input.filter {
  font-size: 90%;
  position: relative;
  bottom: 2px;
}
div.jscode img.filter {
  position: relative;
  bottom: -3px;
  margin-left: 1px;
  margin-right: 10px;
}
span.sum {
  display: inline;
  border: 1px solid #9b9b9b;
  background: #d9e2ea;
  width: 20px;
  margin-left: 3px;
}
</style>

<?
  if (!empty($msg))
    echo $msg;
  else {
    display_tables();
?>

<h3 class=bar>Display</h3>

<form action=status.php method=POST>
<select name=month>
<?
  $month = isset($_SESSION['save']['month']) ? $_SESSION['save']['month'] : date('Y-m');
  if (!isset($months) || !is_array($months))
    $months = find_months();

  printf('<option value=""%s>alle</option>', !strlen($month)?' selected':'');
  foreach ($months as $m) {
    printf('<option value="%s"%s>%s</option>', $m, $month==$m?' selected':'', $m);
  }
?>
</select>

<select name=customer>
<?
  $cust = isset($_SESSION['save']['customer']) ? $_SESSION['save']['customer'] : '';
  if (!isset($customers) || !is_array($customers))
    $customers = find_customers();

  printf('<option value=""%s>alle</option>', !strlen($cust)?' selected':'');
  foreach ($customers as $c) {
    printf('<option value="%s"%s>%s</option>', $c, $cust==$c?' selected':'', $c);
  }
?>
</select>

<?
  $status = isset($_SESSION['save']['status']) ? $_SESSION['save']['status'] : 0;
  if (!is_array($stati))
    $stati = find_status();

  printf('<input type="radio" name="status" value="all"%s>alle&nbsp;', $status=='all'?' checked':'');
  foreach ($stati as $k=>$v)
    printf('<input type="radio" name="status" value="%s"%s>%s&nbsp;', $k, $status==$k?' checked':'', $v);
?>

<input type="hidden" name="filter" value="form">
<input class="button" type="submit" value="Display">

     <br><br>
     <input type="date" name="time_from" id="time_from" value="<?php echo isset($_SESSION['save']['time_from'])?$_SESSION['save']['time_from']:''?>">
     &ndash;
     <input type="date" name="time_to" id="time_to" value="<?php echo isset($_SESSION['save']['time_to'])?$_SESSION['save']['time_to']:''?>">

	  &nbsp;&nbsp;Keywords:
     <input type="text" name="keyword1" id="keyword1" value="<?php echo isset($_SESSION['save']['keyword1'])?$_SESSION['save']['keyword1']:''?>">
     <input type="text" name="keyword2" id="keyword2" value="<?php echo isset($_SESSION['save']['keyword2'])?$_SESSION['save']['keyword2']:''?>">
</form>

<? } ?>
</page>

# Local variables:
# mode: php
# end:
