+ aptyp-Gef?hrdung, fkt_ma_report, Korrekturen
authorBettina Schwarzer <schwarzer@fhi-berlin.mpg.de>
Fri, 08 Jun 2012 15:04:22 +0200
changeset 27 d92bbe898f32
parent 26 3c1e3ac7089f
child 28 8d8bce56918f
+ aptyp-Gef?hrdung, fkt_ma_report, Korrekturen
fhiiqm/ap_gefahr_ed.php
fhiiqm/ap_gefahr_flist.php
fhiiqm/ap_vorsorge_ed.php
fhiiqm/ap_vorsorge_flist.php
fhiiqm/css/db.css
fhiiqm/css/db_print.css
fhiiqm/form/ap_gefahr_form.inc.php
fhiiqm/form/ap_vorsorge_form.inc.php
fhiiqm/form/ma_fkt_form.inc.php
fhiiqm/form/prozess_form.inc.php
fhiiqm/inc/menu.inc.php
fhiiqm/js/jquery/jquery-ui-timepicker-addon.js
fhiiqm/logout.php
fhiiqm/ma_fkt_ed.php
fhiiqm/prozess_flist.php
fhiiqm/raum_aptyp_ed.php
fhiiqm/recht_ed.php
fhiiqm/report/fkt_ma_report.php
fhiiqm/report/vtr_kuend_emaila.php
fhiiqm/test/email_attach.php
fhiiqm/test/raum_list.php
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fhiiqm/ap_gefahr_ed.php	Fri Jun 08 15:04:22 2012 +0200
@@ -0,0 +1,193 @@
+<?php
+
+/**
+ * @author Bettina Schwarzer, Fritz-Haber-Institut
+ * @copyright 06/2012
+ * 
+ * INSERT/UPDATE Arbeitsplatz - Gefahr
+ * 
+ */
+
+
+    error_reporting(E_ALL ^ E_NOTICE);
+    
+    session_start();
+    if (! isset($_SESSION["userid"]))
+    { 
+        include_once ("inc/func_lib.inc.php");	
+        login($_SERVER["PHP_SELF"]);
+        exit;
+    }
+    
+    if (is_null($_SESSION["recht"]) || (!is_null($_SESSION["recht"]) && !in_array("asr",$_SESSION["recht"]) && !in_array("ase",$_SESSION["recht"])))
+    {
+        header("Location: start.php");
+        exit;
+    }    
+
+	include_once($_SERVER['DOCUMENT_ROOT'] ."/fhiiqm/inc/dbconnect.inc.php");
+	if (!isset($dbc) || !$dbc) $dbc = new dbconnection();
+
+    $sub = $_POST["eintragen"];
+    $ap  = $_POST["ap"];
+    $ok  = $_POST["ok"];
+    $apid = $_GET["i"]; // arbeitsplatz_ID
+    
+
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
+   	<link href="/fhiiqm/css/db.css" rel="STYLESHEET" type="TEXT/CSS" media="screen"/> 
+   	<link href="/fhiiqm/css/db_print.css" rel="STYLESHEET" type="TEXT/CSS" media="print"/> 
+	<title>Arbeitsplatztyp - Gef&auml;hrdung</title>
+
+    <script type="text/javascript">
+    <!--
+    var counter = 0;
+    var limit = 99;
+    var arr = new Array();
+    function addInput(divName){
+         if (counter == limit)  {
+              alert("Das Limit von " + counter + " zusätzlichen inputs ist erreicht");
+         }
+         else {
+              var newdiv = document.createElement('div');
+              var count;
+              var opt="<option value='-1'></option>";
+              for (var key in arr)  
+              {
+                opt = opt.concat("<option value='",key,"'>",key, " - ",arr[key],"</option>\n" );
+              }
+              opt += "</select>\n";
+              newdiv.innerHTML += "<select name='ap[gf][]'>"+opt;
+              document.getElementById(divName).appendChild(newdiv);
+              counter++;
+         }
+    }
+    function delInput(divId){
+            var kn = document.getElementById(divId); 
+            while (kn.childNodes.length>0 && kn.lastChild.nodeName != "SELECT" && kn.lastChild.nodeName != "A")
+            {
+//                alert ("vor "+kn.lastChild.nodeName+", nodetyp = "+ kn.lastChild.nodeType);
+                var knc = kn.lastChild;
+                    document.getElementById(divId).removeChild(knc);
+            }
+            if (kn.lastChild.nodeName == "SELECT") document.getElementById(divId).removeChild(kn.lastChild);
+    }
+    //-->
+    </script>
+
+</head>
+
+<body>
+
+<?php
+    echo "&nbsp;";  
+    echo "<div class=\"float-br smaller\" valign='top'>";
+    echo "&nbsp;&nbsp;&nbsp;user: " . $_SESSION["userid"];
+    echo "&nbsp;&nbsp;&nbsp;<a class='sc' href='/fhiiqm/logout.php' title='Session beenden'>logout</a></div>\n";
+    echo "<div class=\"float-r\"><img src=\"img/role.png\" border=\"0\" alt=\"Arbeitsplatztyp - Gef&auml;hrdung bearbeiten\" title=\"Arbeitsplatztyp - Gef&auml;hrdung bearbeiten\"/></div>\n";
+
+    if ($apid) $text = "editieren"; else $text = "erfassen";
+    echo "<div align=\"center\">";
+    echo "<h3>Arbeitsplatztyp - Gef&auml;hrdung $text</h3>";
+    echo "</div>\n";
+    if (!$sub || !isset($ap) || !$ok) 
+    {
+        if ($apid && !$sub && !isset($ap))
+        {
+            $sql = "SELECT gefahr_ID, arbplatz_typ FROM Gefahr_Arbplatz WHERE arbplatz_typ = '" . $apid . "'";
+            if ($res = $dbc -> queryObjectArray($sql))
+            {
+                foreach ($res as $row)
+                {
+                    $ap["aptyp"] = $row->arbplatz_typ;
+                    $ap["gf"][]  = $row->gefahr_ID;   
+                }
+            }
+            else $ap["aptyp"] = $apid;
+        }
+        include ($_SERVER["DOCUMENT_ROOT"]."/fhiiqm/form/ap_gefahr_form.inc.php");
+        
+	  	if ($sub)
+        {
+            $frage = "Alle Angaben ok?";
+			echo "<tr>
+			  <td class=\"red\" valign=\"top\" align=\"left\">$frage</td>
+			        <td><input type=\"checkbox\" name=\"ok\" value=\"1\"";
+			        if ($ok)  echo "checked=\"checked\""; 
+			echo " /></td>\n</tr>\n";
+        }
+        if (!is_null($_SESSION["recht"]) && in_array("ase",$_SESSION["recht"]))
+        {
+            echo "
+           	<tr><td>&nbsp;</td>\n
+            	<td><input  class=\"button\" type=\"submit\" name=\"eintragen\" value=\"  eintragen  \" />";
+           	echo "</td></tr>\n";
+        }
+        echo "</table>\n";
+        echo "</div>\n";
+    echo "<p class='sc'>&nbsp;&nbsp;&nbsp;<a href=\"ap_gefahr_flist.php\" target=\"_self\" title=\"Arbplatztyp-Gef&auml;hrdungen-Liste\">&laquo; zur Arbeitsplatztyp-Gef&auml;hrdungen-Liste</a></p>\n"; 
+    echo "</form>\n";
+    }
+    else
+    {
+        echo "<div align='center'>\n";
+
+        if (!isset($dbc) || !$dbc) $dbc = new dbconnection();
+        
+        $stmt = $dbc -> stmtinit();
+        if (is_object($stmt))
+        {
+            $retd = 1;
+            if ($apid && is_array($ap['gf']))
+            {   //UPDATE
+                // Loeschen alte Arbeitsplatztypen
+                $retd = $dbc -> execute("DELETE FROM Gefahr_Arbplatz WHERE arbplatz_typ = '". $ap["aptyp"] ."'");
+            }
+            
+            if ($retd && is_array($ap['gf']))
+            {
+                $rett = 1;
+                $stmt -> prepare("INSERT INTO Gefahr_Arbplatz (gefahr_ID,arbplatz_typ) VALUES(?,?)");
+                for ($k=0; $k<count($ap["gf"]); $k++)
+                {
+                    if ($ap["gf"][$k] && $ap["gf"][$k] != -1) 
+                    {
+                        $stmt -> bind_param('ss',$ap["gf"][$k], $ap["aptyp"]);
+                        $rett = $stmt -> execute();
+                        if (!$rett) $rett = false;
+                    }
+                }
+                if (!$rett) echo "error INSERT Gefahr: $stmt->error<br />\n";
+                
+            }
+        }
+            if ($rett)
+            {
+                echo "<p class='green'><b>Gef&auml;hrdungen für Arbeitsplatztyp '$apid' wurden erfolgreich gespeichert.</b></p>\n";
+                echo "<table>\n";
+                if (is_array($ap["gf"]))
+                {
+                    echo "<tr><td>Gefahren: </td>";
+                    foreach ($ap["gf"] as $gf)
+                    { 
+                        if ($next) $next ="<tr><td>&nbsp;</td>"; else $next =" ";
+                        if ($gf && $gf != -1) echo "$next<td>$gf</td></tr>\n";
+                    }
+                }
+                echo "</table>\n";
+            }   
+            else
+                echo "<p class='red'><b>Gef&auml;hrdungen für Arbeitsplatztyp '$apid'' wurden nicht oder nur teilweise gespeichert</b></p>\n";
+        
+        echo "</div>";
+        echo "<p class='sc'>&nbsp;&nbsp;&nbsp;<a href=\"ap_gefahr_flist.php\" target=\"_self\" title=\"Arbplatztyp-Gef&auml;hrdungen-Liste\">&laquo; zur Arbeitsplatztyp-Gef&auml;hrdung-Liste</a></p>\n"; 
+    }
+?>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fhiiqm/ap_gefahr_flist.php	Fri Jun 08 15:04:22 2012 +0200
@@ -0,0 +1,147 @@
+<?php
+
+/**
+ * @author Bettina Schwarzer, Fritz-Haber-Institut
+ * @copyright 05/2012
+ * 
+ * Liste Arbeitsplatztyp - Gefahr
+ * 
+ */
+
+    error_reporting(E_ALL ^ E_NOTICE);
+    
+    session_start();
+    if (! isset($_SESSION["userid"]))
+    { 
+        include_once ($_SERVER['DOCUMENT_ROOT'] ."/fhiiqm/inc/func_lib.inc.php");	
+        login($_SERVER["PHP_SELF"]);
+        exit;
+    }
+    
+    if (is_null($_SESSION["recht"]) || (!is_null($_SESSION["recht"]) && !in_array("asr",$_SESSION["recht"]) && !in_array("ase",$_SESSION["recht"])))
+    {
+        header("Location: start.php");
+        exit;
+    }    
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
+   	<link href="css/db.css" rel="STYLESHEET" type="TEXT/CSS" media="screen"/> 
+   	<link href="css/db_print.css" rel="STYLESHEET" type="TEXT/CSS" media="print"/> 
+
+	<title>Arbplatztyp-Gefährdung-Liste</title>
+</head>
+
+<body onload="document.ffilter.filter.focus();">
+    
+<?php
+    include_once ($_SERVER['DOCUMENT_ROOT'] ."/fhiiqm/inc/func_lib.inc.php");
+	include_once($_SERVER['DOCUMENT_ROOT'] ."/fhiiqm/inc/dbconnect.inc.php");
+	$dbc = new dbconnection();
+
+    echo "&nbsp;";  
+    echo "<div class=\"float-br smaller\" valign='top'>";
+    echo "&nbsp;&nbsp;&nbsp;user: " . $_SESSION["userid"];
+    echo "&nbsp;&nbsp;&nbsp;<a class='sc' href='/fhiiqm/logout.php' title='Session beenden'>logout</a></div>\n";
+    echo "<div class=\"float-r\"><img src=\"img/role.png\" border=\"0\" alt=\"Arbeitsplatztypen\" title=\"Arbeitsplatztypen\"/></div>\n";
+    
+    // Felder, nach denen gefiltert werden kann
+    $fields = array(2=>"Gefahr-Nr.");
+
+	$sort   = $_GET["s"];   // Sortierung nach Spalte
+    if (!isset($sort) && !$sort) $sort = $_POST["s"];      
+
+    $dir    = $_GET["d"];   // Sortierrichtung
+    if (!isset($dir) && !$dir) $dir = $_POST["d"];
+
+    $fnum   = $_GET["f"];   // Spaltennummer, nach der aktuell gefiltert wird
+    if (!isset($fnum) && !$fnum) $fnum = $_POST["f"];
+
+    $filter = $_POST["filter"];
+    if (!isset($filter) && !$filter) $filter = $_GET["b"];   
+
+    $subf   = $_POST["subf"]; // submit
+    
+    if (!isset($fnum) && !$fnum) $fnum = 1;
+    if (!isset($filter) && !$filter) $filter = "";
+    if (!isset($sort) && !$sort) $sort = 1;
+    if (!isset($dir) && !$dir)  $dir = "";
+
+
+    $sql = "SELECT t.arbplatz_typ, a.gefahr_ID, arbplatz_typ_bez, gefahr_bez 
+            FROM Arbplatz_Typ t LEFT OUTER JOIN Gefahr_Arbplatz a ON a.arbplatz_typ=t.arbplatz_typ
+            LEFT OUTER JOIN Gefahr g ON a.gefahr_ID=g.gefahr_ID ";
+    if ($fnum == 2 & $filter > " ")
+        $sql .= " WHERE a.gefahr_ID LIKE '%$filter%' ";
+    $sql .= "ORDER BY $sort $dir";
+    
+    $result = $dbc ->queryObjectArray($sql);
+    
+    if ($result)
+    {
+		$bg1 = "#F8F8F8";
+		$bg2 = "#DEDFE1";
+		$bg = "#FFFFFF";
+     
+        echo "<div align='center'>\n";
+        echo "<p><b>Liste Arbeitsplatztypen - Gefährdung</b></p>\n";
+        
+        echo "<table border='0' cellspacing='0'>\n";
+        echo "<tr><td class='bigger'>Mittels '<img src='/fhiiqm/img/auf.gif' border='0' width='11' hight='11' />' / '<img src='/fhiiqm/img/ab.gif' border='0' width='11' hight='11' />' 
+            können Sie nach jeder Spalte auf- bzw. absteigend sortieren</td></tr>
+            <td class='bigger'>'<img src='/fhiiqm/img/filter.gif' border='0' width='14' hight='11' />' erm&ouml;glicht das Filtern nach Gefährdung</td></tr>\n
+                <tr><td class='bigger'>Klick auf '<img src='/fhiiqm/img/edit.gif' border='0' width='11' hight='11'>' - Bearbeiten Arbeitsplatztyp - Gefährdung</td></tr>\n
+                <tr><td class='bigger'>&nbsp;</td></tr>";
+        echo "</table>\n";
+        if (isset($fnum) && $fnum>1 && !$filter && !$subf)
+        {
+            // Formular anzeigen fuer Filterbegriff
+            $text = $fields[$fnum];
+            echo "<form action=" . $_SERVER['PHP_SELF'] . " method='post' enctype='application/x-www-form-urlencoded' id='ffilter' name='ffilter' target='_self'>\n";
+            echo "<input type='hidden' name='f' value='$fnum'>";
+            echo "<table width=\"30%\" border=\"0\">\n";
+            echo "<tr><td>filtern nach $text: </td>";
+            echo "<td><input id='filter' name='filter' type=\"text\" size=\"30\" maxlength=\"30\" value=\"$filter\"/></td>";
+            echo "<td><input class=\"button\" type=\"submit\" value=\"finden\" name=\"subf\" title=\"subf\" /></td></tr></table>\n";
+            echo "</form>\n";
+            echo "<p>&nbsp;&nbsp;&nbsp;</p>\n";
+        }
+        echo "<table border='0'>\n";
+        // Listenkopf generieren
+        echo "<tr bgcolor='#68ACBF'>";
+        tab_column(1,"Arbeitsplatz-Typ",$sort,$dir,0,$fnum,$filter,0,9999);
+        tab_column(2,"Gefährdung",$sort,$dir,2,$fnum,$filter,0,9999);
+        echo "<th>&nbsp;</th></tr>";
+   
+        $vt = "?";
+        if ($bg == $bg1) $bg = $bg2; else $bg = $bg1;
+        
+        foreach ($result as $row)
+        {
+            if ($row->arbplatz_typ != $vt)
+            {    
+                if ($vt != "?")
+                { 
+                    echo "</td><td><a href='/fhiiqm/ap_gefahr_ed.php?i=$vt'><img src=\"/fhiiqm/img/edit.gif\" alt='edit' title='edit' border='0'/></a></td></tr>\n";
+                    if ($bg == $bg1) $bg = $bg2; else $bg = $bg1;
+                }
+                echo "<tr bgcolor='" . $bg . "'>";
+                echo "<td>$row->arbplatz_typ - $row->arbplatz_typ_bez</td>";
+                echo "<td>$row->gefahr_ID - $row->gefahr_bez";  
+            }    
+            else
+            {
+                echo "<br />$row->gefahr_ID - $row->gefahr_bez";
+            }   
+            $vt = $row->arbplatz_typ;
+        }
+        echo "</td><td><a href='/fhiiqm/ap_gefahr_ed.php?i=$vt'><img src=\"/fhiiqm/img/edit.gif\" alt='edit' title='edit' border='0'/></a></td></tr>\n";
+        echo "</table>\n</div>\n";
+    }
+?>
+</body>
+</html>
\ No newline at end of file
--- a/fhiiqm/ap_vorsorge_ed.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/ap_vorsorge_ed.php	Fri Jun 08 15:04:22 2012 +0200
@@ -130,7 +130,7 @@
         }
         echo "</table>\n";
         echo "</div>\n";
-    echo "<p class='sc'>&nbsp;&nbsp;&nbsp;<a href=\"ap_vorsorge_flist.php\" target=\"_self\" title=\"Arbplatztyp-Liste\">&laquo; zur Arbeitsplatztyp-Liste</a></p>\n"; 
+    echo "<p class='sc'>&nbsp;&nbsp;&nbsp;<a href=\"ap_vorsorge_flist.php\" target=\"_self\" title=\"Arbplatztyp-Vorsorge-Liste\">&laquo; zur Arbeitsplatztyp-Vorsorge-Liste</a></p>\n"; 
     echo "</form>\n";
     }
     else
@@ -185,7 +185,7 @@
                 echo "<p class='red'><b>Vorsorgegrunds&auml;tze für Arbeitsplatztyp '$apid'' wurden nicht oder nur teilweise gespeichert</b></p>\n";
         
         echo "</div>";
-        echo "<p class='sc'>&nbsp;&nbsp;&nbsp;<a href=\"ap_vorsorge_flist.php\" target=\"_self\" title=\"Arbplatztyp-Liste\">&laquo; zur Arbeitsplatztyp-Liste</a></p>\n"; 
+        echo "<p class='sc'>&nbsp;&nbsp;&nbsp;<a href=\"ap_vorsorge_flist.php\" target=\"_self\" title=\"Arbplatztyp-Vorsorge-Liste\">&laquo; zur Arbeitsplatztyp-Vorsorge-Liste</a></p>\n"; 
     }
 ?>
 </body>
--- a/fhiiqm/ap_vorsorge_flist.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/ap_vorsorge_flist.php	Fri Jun 08 15:04:22 2012 +0200
@@ -33,7 +33,7 @@
    	<link href="css/db.css" rel="STYLESHEET" type="TEXT/CSS" media="screen"/> 
    	<link href="css/db_print.css" rel="STYLESHEET" type="TEXT/CSS" media="print"/> 
 
-	<title>Arbeitsplatztyp-Liste</title>
+	<title>Arbplatztyp-Vorsorge-Liste</title>
 </head>
 
 <body onload="document.ffilter.filter.focus();">
@@ -82,7 +82,6 @@
         echo "<table border='0' cellspacing='0'>\n";
         echo "<tr><td class='bigger'>'<img src='/fhiiqm/img/filter.gif' border='0' width='14' hight='11' />' erm&ouml;glicht das Filtern nach Vorsorgegrundsatz</td></tr>\n
                 <tr><td class='bigger'>Klick auf '<img src='/fhiiqm/img/edit.gif' border='0' width='11' hight='11'>' - Bearbeiten Arbeitsplatztyp - Vorsorgegrundsatz</td></tr>\n
-                <tr><td class='red'>alle hier gezeigten G-Nummern sind fiktiv(07.05.2012) - bitte durch reale ersetzen</td></tr>
                 <tr><td class='bigger'>&nbsp;</td></tr>";
         echo "</table>\n";
 
--- a/fhiiqm/css/db.css	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/css/db.css	Fri Jun 08 15:04:22 2012 +0200
@@ -85,6 +85,7 @@
     font-style: normal;
     font-weight: bold;
     color: #000066;
+    vertical-align: top;
     text-align: left;}
 
 body {
--- a/fhiiqm/css/db_print.css	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/css/db_print.css	Fri Jun 08 15:04:22 2012 +0200
@@ -36,6 +36,7 @@
     font-style: normal;
     font-weight: bold;
     color: #000066;
+    vertical-align: top;
     text-align: left;}
 
 body {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fhiiqm/form/ap_gefahr_form.inc.php	Fri Jun 08 15:04:22 2012 +0200
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * @author Bettina Schwarzer, Fritz-Haber-Institut
+ * @copyright 06/2012
+ * 
+ * Form Arbeitsplatztyp - Grfahr
+ * 
+ */
+
+	include_once($_SERVER['DOCUMENT_ROOT'] ."/fhiiqm/inc/dbconnect.inc.php");
+	if (!isset($dbc) || !$dbc) $dbc = new dbconnection();
+
+?>
+    <form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" enctype="application/x-www-form-urlencoded" name="form_info" target="_self">
+    <div align="center"> 	
+    <table width="55%" border="0" cellspacing="3" cellpadding="3">
+    <tr>
+        <td width="20%">Arbeitsplatztyp *</td>        
+        <td>
+            <select name="ap[aptyp]" size="1">
+            <?php
+                $select = null;
+                $sql = "SELECT arbplatz_typ, arbplatz_typ_bez FROM fhiiqm.Arbplatz_Typ ORDER BY 1";
+                if ($result = $dbc->queryObjectArray($sql))
+                {
+                    foreach ($result as $row)
+                    {
+                        $select = ( $row->arbplatz_typ==$ap['aptyp'] ) ? ' selected' : null;
+    					echo "<option $select value=\"$row->arbplatz_typ\">$row->arbplatz_typ - $row->arbplatz_typ_bez</option>\n";
+                    }
+                }
+            ?>
+            </select>
+        </td>   
+    </tr>
+    <tr>
+        <td>Gef&auml;hrdung *
+            <br />&nbsp;&nbsp;&nbsp;leeres Feld = L&ouml;schen
+        </td>        
+        <td>
+        <div id="add">
+            <select name="ap[gf][]" size="1">
+            <?php
+                $select = null;
+                $select = ( "-1"==$ap['gf'][0] ) ? ' selected' : null;
+                echo "<option $select value=\"-1\"></option>\n";
+                $sql = "SELECT gefahr_ID, gefahr_bez FROM fhiiqm.Gefahr ORDER BY (gefahr_ID+1)";
+                if ($result = $dbc->queryObjectArray($sql))
+                {
+                    foreach ($result as $row)
+                    {
+                        $select = ( $row->gefahr_ID==$ap['gf'][0] ) ? ' selected' : null;
+    					echo "<option $select value=\"$row->gefahr_ID\">$row->gefahr_ID - $row->gefahr_bez</option>\n";
+                        $sgf .= "'".$row->gefahr_ID."':'".$row->gefahr_bez."',";
+                    }
+                }
+                $sgf = substr($sgf,0,strlen($sgf)-1);
+            ?>
+            ?>
+            </select>
+            <script type="text/javascript">
+            <!--
+                arr = {<?php echo ($sgf); ?>}; // Ergebnis: {'key':'value','key':'value',...} 
+            //-->
+            </script>
+
+            &nbsp;&nbsp;&nbsp;<a href="<?php echo "javascript:addInput('add');" ?>" title="weitere Gef&auml;hrdung"><img src="/fhiiqm/img/add.png" /></a>
+            &nbsp;&nbsp;&nbsp;<a href="<?php echo "javascript:delInput('add');" ?>" title="l&ouml;schen letzte Gef&auml;hrdung"><img src="/fhiiqm/img/delete.png" /></a>
+        <?php
+            if ($apid || ($sub && isset($ap) && !$ok))
+            {
+                if (count($ap['gf'])>1)
+                {
+                    $i=0;
+                    foreach ($ap['gf'] as $gfe)
+                    {
+                        if ($i>0)
+                        {
+                            echo "<select name=\"ap[gf][]\" size=\"1\">";
+            
+                            $select = ( "-1" == $gfe ) ? ' selected' : null;
+                            echo "<option $select value=\"-1\"></option>\n";
+                            foreach ($result as $row)
+                            {
+                                $select = ( $row->gefahr_ID == $gfe ) ? ' selected' : null;
+            					echo "<option $select value=\"$row->gefahr_ID\">$row->gefahr_ID - $row->gefahr_bez</option>\n";
+                            }
+                            echo "</select><br/>\n";
+                        }
+                        $i++;
+                    }
+                }
+            }
+        ?>
+        </div>
+        </td>   
+    </tr>
+<!--
+    </table>
+    </form>
+-->
\ No newline at end of file
--- a/fhiiqm/form/ap_vorsorge_form.inc.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/form/ap_vorsorge_form.inc.php	Fri Jun 08 15:04:22 2012 +0200
@@ -79,7 +79,7 @@
                         {
                             echo "<select name=\"ap[vs][]\" size=\"1\">";
             
-                            $select = ( "-1" == $apte ) ? ' selected' : null;
+                            $select = ( "-1" == $vse ) ? ' selected' : null;
                             echo "<option $select value=\"-1\"></option>\n";
                             foreach ($result as $row)
                             {
--- a/fhiiqm/form/ma_fkt_form.inc.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/form/ma_fkt_form.inc.php	Fri Jun 08 15:04:22 2012 +0200
@@ -26,7 +26,8 @@
         <tr><td>Funktion *</td>
             <td valign="top">
                 <!--<input class="long20" type="text" name="fkt[func]" id="func" value="<?php echo $fkt['func']; ?>"/> -->
-                <select name="fkt[func]" onchange="this.form.submit();">
+                <!--<select name="fkt[func]" onchange="this.form.submit();"> -->
+                <select name="fkt[func]">
                 <?php 
                     $sql = "SELECT fkt_bez, fkt_ID FROM `fhiiqm`.`Funktion` ORDER BY 1";
                     if ($result = $dbc->queryObjectArray($sql))
--- a/fhiiqm/form/prozess_form.inc.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/form/prozess_form.inc.php	Fri Jun 08 15:04:22 2012 +0200
@@ -24,7 +24,7 @@
 <table width="60%" border="0" cellspacing="3" cellpadding="3">
     <tr>
         <td>Prozess-Bezeichnung *</td>
-        <td><input name="pz[bez]" id="bez" type="text" size="30" maxlength="30" value="<?php echo $pz['bez']; ?>" />
+        <td><input name="pz[bez]" id="bez" type="text" size="50" maxlength="50" value="<?php echo $pz['bez']; ?>" />
         <?php
 			if (isset($pz['bez']) && $pz['bez']<'!')
 			{
--- a/fhiiqm/inc/menu.inc.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/inc/menu.inc.php	Fri Jun 08 15:04:22 2012 +0200
@@ -118,6 +118,7 @@
                 </li>\n";
         }	
 
+        // 's' wie 'Sonstige' oder 'Stammdaten' - Rechtegruppe
         if (is_array($arg) && in_array("s",$arg))
         {
           if (in_array("asr",$_SESSION["recht"]) || (in_array("ase",$_SESSION["recht"])))
@@ -125,19 +126,30 @@
             echo "<li>Arbeitssicherheit\n
                        <ul>\n";
                 echo "<li><a href=\"/fhiiqm/ap_vorsorge_flist.php\" target=\"_blank\" title=\"Arbeitsplatztyp-Vorsorge-Liste\">Arb.platztypen - Vorsorge filtern,  bearbeiten</a></li>\n";            
+                echo "<li><a href=\"/fhiiqm/ap_gefahr_flist.php\" target=\"_blank\" title=\"Arbeitsplatztyp-Gefährdung-Liste\">Arb.platztypen - Gefährdung sortieren, filtern</a></li>\n";            
                 echo "<li><a href=\"/fhiiqm/raum_report.php\" target=\"_blank\" title=\"Report Arbeitssicherheit\">Berichte Arbeitssicherheit</a></li>\n";
             echo "   </ul>\n
                     </li>\n";
           }
-          if (in_array("re",$_SESSION["recht"]))
+          if (in_array("re",$_SESSION["recht"]) || in_array("fmr",$_SESSION["recht"]) || in_array("fme",$_SESSION["recht"]))
           {
-            echo "<li>Bewegungsdaten\n    
-                	   <ul>\n";    // Bearbeitung von ausgewaehlten Stamm-Daten
-        		echo "<li><a href=\"/fhiiqm/raum_flist_ed.php\" target=\"_blank\" title=\"Raumliste edit\">R&auml;ume - Reinig.-Daten sortieren, filtern, bearbeiten</a></li>\n";
-        		echo "<li><a href=\"/fhiiqm/raum_aptyp_flist.php\" target=\"_blank\" title=\"Raum-Arbeitsplatztyp-Liste edit\">R&auml;ume - Arb.platztypen sortieren, filtern,  bearbeiten</a></li>\n";
-            echo "   </ul>\n
+                echo "<li>Bewegungsdaten\n";
+                echo "<ul>\n";    // Bearbeitung von ausgewaehlten Stamm-Daten
+                if (in_array("re",$_SESSION["recht"]))
+                {                
+                	echo "<li><a href=\"/fhiiqm/raum_flist_ed.php\" target=\"_blank\" title=\"Raumliste edit\">R&auml;ume - Reinig.-Daten sortieren, filtern, bearbeiten</a></li>\n";
+                	echo "<li><a href=\"/fhiiqm/raum_aptyp_flist.php\" target=\"_blank\" title=\"Raum-Arbeitsplatztyp-Liste edit\">R&auml;ume - Arb.platztypen sortieren, filtern,  bearbeiten</a></li>\n";
+                }
+                if (in_array("fmr",$_SESSION["recht"]) || in_array("fme",$_SESSION["recht"]))
+                		echo "<li><a href=\"/fhiiqm/ma_fkt_flist.php\" target=\"_blank\" title=\"MA-Funktionen-Liste\">Mitarbeiter - Funktion sort., filtern, bearbeiten</a></li>\n";
+                if (in_array("fme",$_SESSION["recht"]))
+                		echo "<li><a href=\"/fhiiqm/ma_fkt_ed.php\" target=\"_blank\" title=\"MA-Funktionen\">Mitarbeiter - Funktion erfassen</a></li>\n";
+                if (in_array("fmr",$_SESSION["recht"]) || in_array("fme",$_SESSION["recht"]))
+                        echo "<li><a href=\"/fhiiqm/report/fkt_ma_report.php\" target=\"_blank\" title=\"Beauftragte\">Bericht Beauftragte</a></li>\n";
+                echo "   </ul>\n
                     </li>\n";
           }      
+                    
           echo "<li>Stammdaten\n
             	   <ul>\n";
           if (in_array("pr",$_SESSION["recht"]) || in_array("pe",$_SESSION["recht"]))
@@ -148,10 +160,6 @@
             		echo "<li><a href=\"/fhiiqm/raum_flist.php\" target=\"_blank\" title=\"Raumliste\">R&auml;ume sortieren, filtern, bearbeiten</a></li>\n";
           if (in_array("re",$_SESSION["recht"]))
             		echo "<li><a href=\"/fhiiqm/raum_ins.php\" target=\"_blank\" title=\"Raum erfassen\">Raum erfassen</a></li>\n";
-          if (in_array("fmr",$_SESSION["recht"]) || in_array("fme",$_SESSION["recht"]))
-            		echo "<li><a href=\"/fhiiqm/ma_fkt_flist.php\" target=\"_blank\" title=\"MA-Funktionen-Liste\">Mitarbeiter - Funktion sort., filtern, bearbeiten</a></li>\n";
-          if (in_array("fme",$_SESSION["recht"]))
-            		echo "<li><a href=\"/fhiiqm/ma_fkt_ed.php\" target=\"_blank\" title=\"MA-Funktionen\">Mitarbeiter - Funktion erfassen</a></li>\n";
           if (in_array("rtr",$_SESSION["recht"]) || in_array("rte",$_SESSION["recht"]))
             		echo "<li><a href=\"/fhiiqm/recht_list.php\" target=\"_blank\" title=\"Nutzerliste\">Nutzer - Rechte bearbeiten</a></li>\n";
           if (in_array("rte",$_SESSION["recht"]))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fhiiqm/js/jquery/jquery-ui-timepicker-addon.js	Fri Jun 08 15:04:22 2012 +0200
@@ -0,0 +1,1325 @@
+/*
+* jQuery timepicker addon
+* By: Trent Richardson [http://trentrichardson.com]
+* Version 0.9.9
+* Last Modified: 02/05/2012
+* 
+* Copyright 2012 Trent Richardson
+* Dual licensed under the MIT and GPL licenses.
+* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
+* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
+* 
+* HERES THE CSS:
+* .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
+* .ui-timepicker-div dl { text-align: left; }
+* .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }
+* .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
+* .ui-timepicker-div td { font-size: 90%; }
+* .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
+*/
+
+(function($) {
+
+$.extend($.ui, { timepicker: { version: "0.9.9" } });
+
+/* Time picker manager.
+   Use the singleton instance of this class, $.timepicker, to interact with the time picker.
+   Settings for (groups of) time pickers are maintained in an instance object,
+   allowing multiple different settings on the same page. */
+
+function Timepicker() {
+	this.regional = []; // Available regional settings, indexed by language code
+	this.regional[''] = { // Default regional settings
+		currentText: 'Now',
+		closeText: 'Done',
+		ampm: false,
+		amNames: ['AM', 'A'],
+		pmNames: ['PM', 'P'],
+		timeFormat: 'hh:mm tt',
+		timeSuffix: '',
+		timeOnlyTitle: 'Choose Time',
+		timeText: 'Time',
+		hourText: 'Hour',
+		minuteText: 'Minute',
+		secondText: 'Second',
+		millisecText: 'Millisecond',
+		timezoneText: 'Time Zone'
+	};
+	this._defaults = { // Global defaults for all the datetime picker instances
+		showButtonPanel: true,
+		timeOnly: false,
+		showHour: true,
+		showMinute: true,
+		showSecond: false,
+		showMillisec: false,
+		showTimezone: false,
+		showTime: true,
+		stepHour: 1,
+		stepMinute: 1,
+		stepSecond: 1,
+		stepMillisec: 1,
+		hour: 0,
+		minute: 0,
+		second: 0,
+		millisec: 0,
+		timezone: '+0000',
+		hourMin: 0,
+		minuteMin: 0,
+		secondMin: 0,
+		millisecMin: 0,
+		hourMax: 23,
+		minuteMax: 59,
+		secondMax: 59,
+		millisecMax: 999,
+		minDateTime: null,
+		maxDateTime: null,
+		onSelect: null,
+		hourGrid: 0,
+		minuteGrid: 0,
+		secondGrid: 0,
+		millisecGrid: 0,
+		alwaysSetTime: true,
+		separator: ' ',
+		altFieldTimeOnly: true,
+		showTimepicker: true,
+		timezoneIso8609: false,
+		timezoneList: null,
+		addSliderAccess: false,
+		sliderAccessArgs: null
+	};
+	$.extend(this._defaults, this.regional['']);
+};
+
+$.extend(Timepicker.prototype, {
+	$input: null,
+	$altInput: null,
+	$timeObj: null,
+	inst: null,
+	hour_slider: null,
+	minute_slider: null,
+	second_slider: null,
+	millisec_slider: null,
+	timezone_select: null,
+	hour: 0,
+	minute: 0,
+	second: 0,
+	millisec: 0,
+	timezone: '+0000',
+	hourMinOriginal: null,
+	minuteMinOriginal: null,
+	secondMinOriginal: null,
+	millisecMinOriginal: null,
+	hourMaxOriginal: null,
+	minuteMaxOriginal: null,
+	secondMaxOriginal: null,
+	millisecMaxOriginal: null,
+	ampm: '',
+	formattedDate: '',
+	formattedTime: '',
+	formattedDateTime: '',
+	timezoneList: null,
+
+	/* Override the default settings for all instances of the time picker.
+	   @param  settings  object - the new settings to use as defaults (anonymous object)
+	   @return the manager object */
+	setDefaults: function(settings) {
+		extendRemove(this._defaults, settings || {});
+		return this;
+	},
+
+	//########################################################################
+	// Create a new Timepicker instance
+	//########################################################################
+	_newInst: function($input, o) {
+		var tp_inst = new Timepicker(),
+			inlineSettings = {};
+			
+		for (var attrName in this._defaults) {
+			var attrValue = $input.attr('time:' + attrName);
+			if (attrValue) {
+				try {
+					inlineSettings[attrName] = eval(attrValue);
+				} catch (err) {
+					inlineSettings[attrName] = attrValue;
+				}
+			}
+		}
+		tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, {
+			beforeShow: function(input, dp_inst) {
+				if ($.isFunction(o.beforeShow))
+					return o.beforeShow(input, dp_inst, tp_inst);
+			},
+			onChangeMonthYear: function(year, month, dp_inst) {
+				// Update the time as well : this prevents the time from disappearing from the $input field.
+				tp_inst._updateDateTime(dp_inst);
+				if ($.isFunction(o.onChangeMonthYear))
+					o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
+			},
+			onClose: function(dateText, dp_inst) {
+				if (tp_inst.timeDefined === true && $input.val() != '')
+					tp_inst._updateDateTime(dp_inst);
+				if ($.isFunction(o.onClose))
+					o.onClose.call($input[0], dateText, dp_inst, tp_inst);
+			},
+			timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
+		});
+		tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() });
+		tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() });
+
+		if (tp_inst._defaults.timezoneList === null) {
+			var timezoneList = [];
+			for (var i = -11; i <= 12; i++)
+				timezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00');
+			if (tp_inst._defaults.timezoneIso8609)
+				timezoneList = $.map(timezoneList, function(val) {
+					return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3));
+				});
+			tp_inst._defaults.timezoneList = timezoneList;
+		}
+
+		tp_inst.hour = tp_inst._defaults.hour;
+		tp_inst.minute = tp_inst._defaults.minute;
+		tp_inst.second = tp_inst._defaults.second;
+		tp_inst.millisec = tp_inst._defaults.millisec;
+		tp_inst.ampm = '';
+		tp_inst.$input = $input;
+
+		if (o.altField)
+			tp_inst.$altInput = $(o.altField)
+				.css({ cursor: 'pointer' })
+				.focus(function(){ $input.trigger("focus"); });
+		
+		if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0)
+		{
+			tp_inst._defaults.minDate=new Date();
+		}
+		if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0)
+		{
+			tp_inst._defaults.maxDate=new Date();
+		}
+		
+		// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
+		if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date)
+			tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
+		if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date)
+			tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
+		if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date)
+			tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
+		if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date)
+			tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
+		return tp_inst;
+	},
+
+	//########################################################################
+	// add our sliders to the calendar
+	//########################################################################
+	_addTimePicker: function(dp_inst) {
+		var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ?
+				this.$input.val() + ' ' + this.$altInput.val() : 
+				this.$input.val();
+
+		this.timeDefined = this._parseTime(currDT);
+		this._limitMinMaxDateTime(dp_inst, false);
+		this._injectTimePicker();
+	},
+
+	//########################################################################
+	// parse the time string from input value or _setTime
+	//########################################################################
+	_parseTime: function(timeString, withDate) {
+		var regstr = this._defaults.timeFormat.toString()
+				.replace(/h{1,2}/ig, '(\\d?\\d)')
+				.replace(/m{1,2}/ig, '(\\d?\\d)')
+				.replace(/s{1,2}/ig, '(\\d?\\d)')
+				.replace(/l{1}/ig, '(\\d?\\d?\\d)')
+				.replace(/t{1,2}/ig, this._getPatternAmpm())
+				.replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?')
+				.replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$',
+			order = this._getFormatPositions(),
+			ampm = '',
+			treg;
+
+		if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
+
+		if (withDate || !this._defaults.timeOnly) {
+			// the time should come after x number of characters and a space.
+			// x = at least the length of text specified by the date format
+			var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
+			// escape special regex characters in the seperator
+			var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g");
+			regstr = '^.{' + dp_dateFormat.length + ',}?' + this._defaults.separator.replace(specials, "\\$&") + regstr;
+		}
+		
+		treg = timeString.match(new RegExp(regstr, 'i'));
+
+		if (treg) {
+			if (order.t !== -1) {
+				if (treg[order.t] === undefined || treg[order.t].length === 0) {
+					ampm = '';
+					this.ampm = '';
+				} else {
+					ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM';
+					this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0];
+				}
+			}
+
+			if (order.h !== -1) {
+				if (ampm == 'AM' && treg[order.h] == '12')
+					this.hour = 0; // 12am = 0 hour
+				else if (ampm == 'PM' && treg[order.h] != '12')
+					this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12
+				else this.hour = Number(treg[order.h]);
+			}
+
+			if (order.m !== -1) this.minute = Number(treg[order.m]);
+			if (order.s !== -1) this.second = Number(treg[order.s]);
+			if (order.l !== -1) this.millisec = Number(treg[order.l]);
+			if (order.z !== -1 && treg[order.z] !== undefined) {
+				var tz = treg[order.z].toUpperCase();
+				switch (tz.length) {
+				case 1:	// Z
+					tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000';
+					break;
+				case 5:	// +hhmm
+					if (this._defaults.timezoneIso8609)
+						tz = tz.substring(1) == '0000'
+						   ? 'Z'
+						   : tz.substring(0, 3) + ':' + tz.substring(3);
+					break;
+				case 6:	// +hh:mm
+					if (!this._defaults.timezoneIso8609)
+						tz = tz == 'Z' || tz.substring(1) == '00:00'
+						   ? '+0000'
+						   : tz.replace(/:/, '');
+					else if (tz.substring(1) == '00:00')
+						tz = 'Z';
+					break;
+				}
+				this.timezone = tz;
+			}
+			
+			return true;
+
+		}
+		return false;
+	},
+
+	//########################################################################
+	// pattern for standard and localized AM/PM markers
+	//########################################################################
+	_getPatternAmpm: function() {
+		var markers = [];
+			o = this._defaults;
+		if (o.amNames)
+			$.merge(markers, o.amNames);
+		if (o.pmNames)
+			$.merge(markers, o.pmNames);
+		markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&') });
+		return '(' + markers.join('|') + ')?';
+	},
+
+	//########################################################################
+	// figure out position of time elements.. cause js cant do named captures
+	//########################################################################
+	_getFormatPositions: function() {
+		var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g),
+			orders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 };
+
+		if (finds)
+			for (var i = 0; i < finds.length; i++)
+				if (orders[finds[i].toString().charAt(0)] == -1)
+					orders[finds[i].toString().charAt(0)] = i + 1;
+
+		return orders;
+	},
+
+	//########################################################################
+	// generate and inject html for timepicker into ui datepicker
+	//########################################################################
+	_injectTimePicker: function() {
+		var $dp = this.inst.dpDiv,
+			o = this._defaults,
+			tp_inst = this,
+			// Added by Peter Medeiros:
+			// - Figure out what the hour/minute/second max should be based on the step values.
+			// - Example: if stepMinute is 15, then minMax is 45.
+			hourMax = parseInt((o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)) ,10),
+			minMax  = parseInt((o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)) ,10),
+			secMax  = parseInt((o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)) ,10),
+			millisecMax  = parseInt((o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)) ,10),
+			dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, '');
+
+		// Prevent displaying twice
+		//if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) {
+		if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) {
+			var noDisplay = ' style="display:none;"',
+				html =	'<div class="ui-timepicker-div" id="ui-timepicker-div-' + dp_id + '"><dl>' +
+						'<dt class="ui_tpicker_time_label" id="ui_tpicker_time_label_' + dp_id + '"' +
+						((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +
+						'<dd class="ui_tpicker_time" id="ui_tpicker_time_' + dp_id + '"' +
+						((o.showTime) ? '' : noDisplay) + '></dd>' +
+						'<dt class="ui_tpicker_hour_label" id="ui_tpicker_hour_label_' + dp_id + '"' +
+						((o.showHour) ? '' : noDisplay) + '>' + o.hourText + '</dt>',
+				hourGridSize = 0,
+				minuteGridSize = 0,
+				secondGridSize = 0,
+				millisecGridSize = 0,
+				size;
+
+ 			// Hours
+			html += '<dd class="ui_tpicker_hour"><div id="ui_tpicker_hour_' + dp_id + '"' +
+						((o.showHour) ? '' : noDisplay) + '></div>';
+			if (o.showHour && o.hourGrid > 0) {
+				html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
+
+				for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) {
+					hourGridSize++;
+					var tmph = (o.ampm && h > 12) ? h-12 : h;
+					if (tmph < 10) tmph = '0' + tmph;
+					if (o.ampm) {
+						if (h == 0) tmph = 12 +'a';
+						else if (h < 12) tmph += 'a';
+						else tmph += 'p';
+					}
+					html += '<td>' + tmph + '</td>';
+				}
+
+				html += '</tr></table></div>';
+			}
+			html += '</dd>';
+
+			// Minutes
+			html += '<dt class="ui_tpicker_minute_label" id="ui_tpicker_minute_label_' + dp_id + '"' +
+					((o.showMinute) ? '' : noDisplay) + '>' + o.minuteText + '</dt>'+
+					'<dd class="ui_tpicker_minute"><div id="ui_tpicker_minute_' + dp_id + '"' +
+							((o.showMinute) ? '' : noDisplay) + '></div>';
+
+			if (o.showMinute && o.minuteGrid > 0) {
+				html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
+
+				for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) {
+					minuteGridSize++;
+					html += '<td>' + ((m < 10) ? '0' : '') + m + '</td>';
+				}
+
+				html += '</tr></table></div>';
+			}
+			html += '</dd>';
+
+			// Seconds
+			html += '<dt class="ui_tpicker_second_label" id="ui_tpicker_second_label_' + dp_id + '"' +
+					((o.showSecond) ? '' : noDisplay) + '>' + o.secondText + '</dt>'+
+					'<dd class="ui_tpicker_second"><div id="ui_tpicker_second_' + dp_id + '"'+
+							((o.showSecond) ? '' : noDisplay) + '></div>';
+
+			if (o.showSecond && o.secondGrid > 0) {
+				html += '<div style="padding-left: 1px"><table><tr>';
+
+				for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) {
+					secondGridSize++;
+					html += '<td>' + ((s < 10) ? '0' : '') + s + '</td>';
+				}
+
+				html += '</tr></table></div>';
+			}
+			html += '</dd>';
+
+			// Milliseconds
+			html += '<dt class="ui_tpicker_millisec_label" id="ui_tpicker_millisec_label_' + dp_id + '"' +
+					((o.showMillisec) ? '' : noDisplay) + '>' + o.millisecText + '</dt>'+
+					'<dd class="ui_tpicker_millisec"><div id="ui_tpicker_millisec_' + dp_id + '"'+
+							((o.showMillisec) ? '' : noDisplay) + '></div>';
+
+			if (o.showMillisec && o.millisecGrid > 0) {
+				html += '<div style="padding-left: 1px"><table><tr>';
+
+				for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) {
+					millisecGridSize++;
+					html += '<td>' + ((l < 10) ? '0' : '') + l + '</td>';
+				}
+
+				html += '</tr></table></div>';
+			}
+			html += '</dd>';
+
+			// Timezone
+			html += '<dt class="ui_tpicker_timezone_label" id="ui_tpicker_timezone_label_' + dp_id + '"' +
+					((o.showTimezone) ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';
+			html += '<dd class="ui_tpicker_timezone" id="ui_tpicker_timezone_' + dp_id + '"'	+
+							((o.showTimezone) ? '' : noDisplay) + '></dd>';
+
+			html += '</dl></div>';
+			$tp = $(html);
+
+				// if we only want time picker...
+			if (o.timeOnly === true) {
+				$tp.prepend(
+					'<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' +
+						'<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' +
+					'</div>');
+				$dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
+			}
+
+			this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({
+				orientation: "horizontal",
+				value: this.hour,
+				min: o.hourMin,
+				max: hourMax,
+				step: o.stepHour,
+				slide: function(event, ui) {
+					tp_inst.hour_slider.slider( "option", "value", ui.value);
+					tp_inst._onTimeChange();
+				}
+			});
+
+			
+			// Updated by Peter Medeiros:
+			// - Pass in Event and UI instance into slide function
+			this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({
+				orientation: "horizontal",
+				value: this.minute,
+				min: o.minuteMin,
+				max: minMax,
+				step: o.stepMinute,
+				slide: function(event, ui) {
+					tp_inst.minute_slider.slider( "option", "value", ui.value);
+					tp_inst._onTimeChange();
+				}
+			});
+
+			this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({
+				orientation: "horizontal",
+				value: this.second,
+				min: o.secondMin,
+				max: secMax,
+				step: o.stepSecond,
+				slide: function(event, ui) {
+					tp_inst.second_slider.slider( "option", "value", ui.value);
+					tp_inst._onTimeChange();
+				}
+			});
+
+			this.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({
+				orientation: "horizontal",
+				value: this.millisec,
+				min: o.millisecMin,
+				max: millisecMax,
+				step: o.stepMillisec,
+				slide: function(event, ui) {
+					tp_inst.millisec_slider.slider( "option", "value", ui.value);
+					tp_inst._onTimeChange();
+				}
+			});
+
+			this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('<select></select>').find("select");
+			$.fn.append.apply(this.timezone_select,
+				$.map(o.timezoneList, function(val, idx) {
+					return $("<option />")
+						.val(typeof val == "object" ? val.value : val)
+						.text(typeof val == "object" ? val.label : val);
+				})
+			);
+			this.timezone_select.val((typeof this.timezone != "undefined" && this.timezone != null && this.timezone != "") ? this.timezone : o.timezone);
+			this.timezone_select.change(function() {
+				tp_inst._onTimeChange();
+			});
+
+			// Add grid functionality
+			if (o.showHour && o.hourGrid > 0) {
+				size = 100 * hourGridSize * o.hourGrid / (hourMax - o.hourMin);
+
+				$tp.find(".ui_tpicker_hour table").css({
+					width: size + "%",
+					marginLeft: (size / (-2 * hourGridSize)) + "%",
+					borderCollapse: 'collapse'
+				}).find("td").each( function(index) {
+					$(this).click(function() {
+						var h = $(this).html();
+						if(o.ampm)	{
+							var ap = h.substring(2).toLowerCase(),
+								aph = parseInt(h.substring(0,2), 10);
+							if (ap == 'a') {
+								if (aph == 12) h = 0;
+								else h = aph;
+							} else if (aph == 12) h = 12;
+							else h = aph + 12;
+						}
+						tp_inst.hour_slider.slider("option", "value", h);
+						tp_inst._onTimeChange();
+						tp_inst._onSelectHandler();
+					}).css({
+						cursor: 'pointer',
+						width: (100 / hourGridSize) + '%',
+						textAlign: 'center',
+						overflow: 'hidden'
+					});
+				});
+			}
+
+			if (o.showMinute && o.minuteGrid > 0) {
+				size = 100 * minuteGridSize * o.minuteGrid / (minMax - o.minuteMin);
+				$tp.find(".ui_tpicker_minute table").css({
+					width: size + "%",
+					marginLeft: (size / (-2 * minuteGridSize)) + "%",
+					borderCollapse: 'collapse'
+				}).find("td").each(function(index) {
+					$(this).click(function() {
+						tp_inst.minute_slider.slider("option", "value", $(this).html());
+						tp_inst._onTimeChange();
+						tp_inst._onSelectHandler();
+					}).css({
+						cursor: 'pointer',
+						width: (100 / minuteGridSize) + '%',
+						textAlign: 'center',
+						overflow: 'hidden'
+					});
+				});
+			}
+
+			if (o.showSecond && o.secondGrid > 0) {
+				$tp.find(".ui_tpicker_second table").css({
+					width: size + "%",
+					marginLeft: (size / (-2 * secondGridSize)) + "%",
+					borderCollapse: 'collapse'
+				}).find("td").each(function(index) {
+					$(this).click(function() {
+						tp_inst.second_slider.slider("option", "value", $(this).html());
+						tp_inst._onTimeChange();
+						tp_inst._onSelectHandler();
+					}).css({
+						cursor: 'pointer',
+						width: (100 / secondGridSize) + '%',
+						textAlign: 'center',
+						overflow: 'hidden'
+					});
+				});
+			}
+
+			if (o.showMillisec && o.millisecGrid > 0) {
+				$tp.find(".ui_tpicker_millisec table").css({
+					width: size + "%",
+					marginLeft: (size / (-2 * millisecGridSize)) + "%",
+					borderCollapse: 'collapse'
+				}).find("td").each(function(index) {
+					$(this).click(function() {
+						tp_inst.millisec_slider.slider("option", "value", $(this).html());
+						tp_inst._onTimeChange();
+						tp_inst._onSelectHandler();
+					}).css({
+						cursor: 'pointer',
+						width: (100 / millisecGridSize) + '%',
+						textAlign: 'center',
+						overflow: 'hidden'
+					});
+				});
+			}
+
+			var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
+			if ($buttonPanel.length) $buttonPanel.before($tp);
+			else $dp.append($tp);
+
+			this.$timeObj = $tp.find('#ui_tpicker_time_'+ dp_id);
+
+			if (this.inst !== null) {
+				var timeDefined = this.timeDefined;
+				this._onTimeChange();
+				this.timeDefined = timeDefined;
+			}
+
+			//Emulate datepicker onSelect behavior. Call on slidestop.
+			var onSelectDelegate = function() {
+				tp_inst._onSelectHandler();
+			};
+			this.hour_slider.bind('slidestop',onSelectDelegate);
+			this.minute_slider.bind('slidestop',onSelectDelegate);
+			this.second_slider.bind('slidestop',onSelectDelegate);
+			this.millisec_slider.bind('slidestop',onSelectDelegate);
+			
+			// slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
+			if (this._defaults.addSliderAccess){
+				var sliderAccessArgs = this._defaults.sliderAccessArgs;
+				setTimeout(function(){ // fix for inline mode
+					if($tp.find('.ui-slider-access').length == 0){
+						$tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs);
+
+						// fix any grids since sliders are shorter
+						var sliderAccessWidth = $tp.find('.ui-slider-access:eq(0)').outerWidth(true);
+						if(sliderAccessWidth){
+							$tp.find('table:visible').each(function(){
+								var $g = $(this),
+									oldWidth = $g.outerWidth(),
+									oldMarginLeft = $g.css('marginLeft').toString().replace('%',''),
+									newWidth = oldWidth - sliderAccessWidth,
+									newMarginLeft = ((oldMarginLeft * newWidth)/oldWidth) + '%';
+						
+								$g.css({ width: newWidth, marginLeft: newMarginLeft });
+							});
+						}
+					}
+				},0);
+			}
+			// end slideAccess integration
+			
+		}
+	},
+
+	//########################################################################
+	// This function tries to limit the ability to go outside the
+	// min/max date range
+	//########################################################################
+	_limitMinMaxDateTime: function(dp_inst, adjustSliders){
+		var o = this._defaults,
+			dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
+
+		if(!this._defaults.showTimepicker) return; // No time so nothing to check here
+
+		if($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date){
+			var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),
+				minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
+
+			if(this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null){
+				this.hourMinOriginal = o.hourMin;
+				this.minuteMinOriginal = o.minuteMin;
+				this.secondMinOriginal = o.secondMin;
+				this.millisecMinOriginal = o.millisecMin;
+			}
+
+			if(dp_inst.settings.timeOnly || minDateTimeDate.getTime() == dp_date.getTime()) {
+				this._defaults.hourMin = minDateTime.getHours();
+				if (this.hour <= this._defaults.hourMin) {
+					this.hour = this._defaults.hourMin;
+					this._defaults.minuteMin = minDateTime.getMinutes();
+					if (this.minute <= this._defaults.minuteMin) {
+						this.minute = this._defaults.minuteMin;
+						this._defaults.secondMin = minDateTime.getSeconds();
+					} else if (this.second <= this._defaults.secondMin){
+						this.second = this._defaults.secondMin;
+						this._defaults.millisecMin = minDateTime.getMilliseconds();
+					} else {
+						if(this.millisec < this._defaults.millisecMin)
+							this.millisec = this._defaults.millisecMin;
+						this._defaults.millisecMin = this.millisecMinOriginal;
+					}
+				} else {
+					this._defaults.minuteMin = this.minuteMinOriginal;
+					this._defaults.secondMin = this.secondMinOriginal;
+					this._defaults.millisecMin = this.millisecMinOriginal;
+				}
+			}else{
+				this._defaults.hourMin = this.hourMinOriginal;
+				this._defaults.minuteMin = this.minuteMinOriginal;
+				this._defaults.secondMin = this.secondMinOriginal;
+				this._defaults.millisecMin = this.millisecMinOriginal;
+			}
+		}
+
+		if($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date){
+			var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),
+				maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
+
+			if(this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null){
+				this.hourMaxOriginal = o.hourMax;
+				this.minuteMaxOriginal = o.minuteMax;
+				this.secondMaxOriginal = o.secondMax;
+				this.millisecMaxOriginal = o.millisecMax;
+			}
+
+			if(dp_inst.settings.timeOnly || maxDateTimeDate.getTime() == dp_date.getTime()){
+				this._defaults.hourMax = maxDateTime.getHours();
+				if (this.hour >= this._defaults.hourMax) {
+					this.hour = this._defaults.hourMax;
+					this._defaults.minuteMax = maxDateTime.getMinutes();
+					if (this.minute >= this._defaults.minuteMax) {
+						this.minute = this._defaults.minuteMax;
+						this._defaults.secondMax = maxDateTime.getSeconds();
+					} else if (this.second >= this._defaults.secondMax) {
+						this.second = this._defaults.secondMax;
+						this._defaults.millisecMax = maxDateTime.getMilliseconds();
+					} else {
+						if(this.millisec > this._defaults.millisecMax) this.millisec = this._defaults.millisecMax;
+						this._defaults.millisecMax = this.millisecMaxOriginal;
+					}
+				} else {
+					this._defaults.minuteMax = this.minuteMaxOriginal;
+					this._defaults.secondMax = this.secondMaxOriginal;
+					this._defaults.millisecMax = this.millisecMaxOriginal;
+				}
+			}else{
+				this._defaults.hourMax = this.hourMaxOriginal;
+				this._defaults.minuteMax = this.minuteMaxOriginal;
+				this._defaults.secondMax = this.secondMaxOriginal;
+				this._defaults.millisecMax = this.millisecMaxOriginal;
+			}
+		}
+
+		if(adjustSliders !== undefined && adjustSliders === true){
+			var hourMax = parseInt((this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)) ,10),
+                minMax  = parseInt((this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)) ,10),
+                secMax  = parseInt((this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)) ,10),
+				millisecMax  = parseInt((this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)) ,10);
+
+			if(this.hour_slider)
+				this.hour_slider.slider("option", { min: this._defaults.hourMin, max: hourMax }).slider('value', this.hour);
+			if(this.minute_slider)
+				this.minute_slider.slider("option", { min: this._defaults.minuteMin, max: minMax }).slider('value', this.minute);
+			if(this.second_slider)
+				this.second_slider.slider("option", { min: this._defaults.secondMin, max: secMax }).slider('value', this.second);
+			if(this.millisec_slider)
+				this.millisec_slider.slider("option", { min: this._defaults.millisecMin, max: millisecMax }).slider('value', this.millisec);
+		}
+
+	},
+
+	
+	//########################################################################
+	// when a slider moves, set the internal time...
+	// on time change is also called when the time is updated in the text field
+	//########################################################################
+	_onTimeChange: function() {
+		var hour   = (this.hour_slider) ? this.hour_slider.slider('value') : false,
+			minute = (this.minute_slider) ? this.minute_slider.slider('value') : false,
+			second = (this.second_slider) ? this.second_slider.slider('value') : false,
+			millisec = (this.millisec_slider) ? this.millisec_slider.slider('value') : false,
+			timezone = (this.timezone_select) ? this.timezone_select.val() : false,
+			o = this._defaults;
+
+		if (typeof(hour) == 'object') hour = false;
+		if (typeof(minute) == 'object') minute = false;
+		if (typeof(second) == 'object') second = false;
+		if (typeof(millisec) == 'object') millisec = false;
+		if (typeof(timezone) == 'object') timezone = false;
+
+		if (hour !== false) hour = parseInt(hour,10);
+		if (minute !== false) minute = parseInt(minute,10);
+		if (second !== false) second = parseInt(second,10);
+		if (millisec !== false) millisec = parseInt(millisec,10);
+
+		var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];
+
+		// If the update was done in the input field, the input field should not be updated.
+		// If the update was done using the sliders, update the input field.
+		var hasChanged = (hour != this.hour || minute != this.minute
+				|| second != this.second || millisec != this.millisec
+				|| (this.ampm.length > 0
+				    && (hour < 12) != ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1))
+				|| timezone != this.timezone);
+		
+		if (hasChanged) {
+
+			if (hour !== false)this.hour = hour;
+			if (minute !== false) this.minute = minute;
+			if (second !== false) this.second = second;
+			if (millisec !== false) this.millisec = millisec;
+			if (timezone !== false) this.timezone = timezone;
+			
+			if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
+			
+			this._limitMinMaxDateTime(this.inst, true);
+		}
+		if (o.ampm) this.ampm = ampm;
+		
+		//this._formatTime();
+		this.formattedTime = $.datepicker.formatTime(this._defaults.timeFormat, this, this._defaults);
+		if (this.$timeObj) this.$timeObj.text(this.formattedTime + o.timeSuffix);
+		this.timeDefined = true;
+		if (hasChanged) this._updateDateTime();
+	},
+    
+	//########################################################################
+	// call custom onSelect. 
+	// bind to sliders slidestop, and grid click.
+	//########################################################################
+	_onSelectHandler: function() {
+		var onSelect = this._defaults.onSelect;
+		var inputEl = this.$input ? this.$input[0] : null;
+		if (onSelect && inputEl) {
+			onSelect.apply(inputEl, [this.formattedDateTime, this]);
+		}
+	},
+
+	//########################################################################
+	// left for any backwards compatibility
+	//########################################################################
+	_formatTime: function(time, format) {
+		time = time || { hour: this.hour, minute: this.minute, second: this.second, millisec: this.millisec, ampm: this.ampm, timezone: this.timezone };
+		var tmptime = (format || this._defaults.timeFormat).toString();
+
+		tmptime = $.datepicker.formatTime(tmptime, time, this._defaults);
+		
+		if (arguments.length) return tmptime;
+		else this.formattedTime = tmptime;
+	},
+
+	//########################################################################
+	// update our input with the new date time..
+	//########################################################################
+	_updateDateTime: function(dp_inst) {
+		dp_inst = this.inst || dp_inst;
+		var dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
+			dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
+			formatCfg = $.datepicker._getFormatConfig(dp_inst),
+			timeAvailable = dt !== null && this.timeDefined;
+		this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
+		var formattedDateTime = this.formattedDate;
+		if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0))
+			return;
+
+		if (this._defaults.timeOnly === true) {
+			formattedDateTime = this.formattedTime;
+		} else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {
+			formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
+		}
+
+		this.formattedDateTime = formattedDateTime;
+
+		if(!this._defaults.showTimepicker) {
+			this.$input.val(this.formattedDate);
+		} else if (this.$altInput && this._defaults.altFieldTimeOnly === true) {
+			this.$altInput.val(this.formattedTime);
+			this.$input.val(this.formattedDate);
+		} else if(this.$altInput) {
+			this.$altInput.val(formattedDateTime);
+			this.$input.val(formattedDateTime);
+		} else {
+			this.$input.val(formattedDateTime);
+		}
+		
+		this.$input.trigger("change");
+	}
+
+});
+
+$.fn.extend({
+	//########################################################################
+	// shorthand just to use timepicker..
+	//########################################################################
+	timepicker: function(o) {
+		o = o || {};
+		var tmp_args = arguments;
+
+		if (typeof o == 'object') tmp_args[0] = $.extend(o, { timeOnly: true });
+
+		return $(this).each(function() {
+			$.fn.datetimepicker.apply($(this), tmp_args);
+		});
+	},
+
+	//########################################################################
+	// extend timepicker to datepicker
+	//########################################################################
+	datetimepicker: function(o) {
+		o = o || {};
+		var $input = this,
+		tmp_args = arguments;
+
+		if (typeof(o) == 'string'){
+			if(o == 'getDate') 
+				return $.fn.datepicker.apply($(this[0]), tmp_args);
+			else 
+				return this.each(function() {
+					var $t = $(this);
+					$t.datepicker.apply($t, tmp_args);
+				});
+		}
+		else
+			return this.each(function() {
+				var $t = $(this);
+				$t.datepicker($.timepicker._newInst($t, o)._defaults);
+			});
+	}
+});
+
+//########################################################################
+// format the time all pretty... 
+// format = string format of the time
+// time = a {}, not a Date() for timezones
+// options = essentially the regional[].. amNames, pmNames, ampm
+//########################################################################
+$.datepicker.formatTime = function(format, time, options) {
+	options = options || {};
+	options = $.extend($.timepicker._defaults, options);
+	time = $.extend({hour:0, minute:0, second:0, millisec:0, timezone:'+0000'}, time);
+	
+	var tmptime = format;
+	var ampmName = options['amNames'][0];
+
+	var hour = parseInt(time.hour, 10);
+	if (options.ampm) {
+		if (hour > 11){
+			ampmName = options['pmNames'][0];
+			if(hour > 12)
+				hour = hour % 12;
+		}
+		if (hour === 0)
+			hour = 12;
+	}
+	tmptime = tmptime.replace(/(?:hh?|mm?|ss?|[tT]{1,2}|[lz])/g, function(match) {
+		switch (match.toLowerCase()) {
+			case 'hh': return ('0' + hour).slice(-2);
+			case 'h':  return hour;
+			case 'mm': return ('0' + time.minute).slice(-2);
+			case 'm':  return time.minute;
+			case 'ss': return ('0' + time.second).slice(-2);
+			case 's':  return time.second;
+			case 'l':  return ('00' + time.millisec).slice(-3);
+			case 'z':  return time.timezone;
+			case 't': case 'tt':
+				if (options.ampm) {
+					if (match.length == 1)
+						ampmName = ampmName.charAt(0);
+					return match.charAt(0) == 'T' ? ampmName.toUpperCase() : ampmName.toLowerCase();
+				}
+				return '';
+		}
+	});
+
+	tmptime = $.trim(tmptime);
+	return tmptime;
+}
+
+//########################################################################
+// the bad hack :/ override datepicker so it doesnt close on select
+// inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
+//########################################################################
+$.datepicker._base_selectDate = $.datepicker._selectDate;
+$.datepicker._selectDate = function (id, dateStr) {
+	var inst = this._getInst($(id)[0]),
+		tp_inst = this._get(inst, 'timepicker');
+
+	if (tp_inst) {
+		tp_inst._limitMinMaxDateTime(inst, true);
+		inst.inline = inst.stay_open = true;
+		//This way the onSelect handler called from calendarpicker get the full dateTime
+		this._base_selectDate(id, dateStr);
+		inst.inline = inst.stay_open = false;
+		this._notifyChange(inst);
+		this._updateDatepicker(inst);
+	}
+	else this._base_selectDate(id, dateStr);
+};
+
+//#############################################################################################
+// second bad hack :/ override datepicker so it triggers an event when changing the input field
+// and does not redraw the datepicker on every selectDate event
+//#############################################################################################
+$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
+$.datepicker._updateDatepicker = function(inst) {
+
+	// don't popup the datepicker if there is another instance already opened
+	var input = inst.input[0];
+	if($.datepicker._curInst &&
+	   $.datepicker._curInst != inst &&
+	   $.datepicker._datepickerShowing &&
+	   $.datepicker._lastInput != input) {
+		return;
+	}
+
+	if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
+				
+		this._base_updateDatepicker(inst);
+		
+		// Reload the time control when changing something in the input text field.
+		var tp_inst = this._get(inst, 'timepicker');
+		if(tp_inst) tp_inst._addTimePicker(inst);
+	}
+};
+
+//#######################################################################################
+// third bad hack :/ override datepicker so it allows spaces and colon in the input field
+//#######################################################################################
+$.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
+$.datepicker._doKeyPress = function(event) {
+	var inst = $.datepicker._getInst(event.target),
+		tp_inst = $.datepicker._get(inst, 'timepicker');
+
+	if (tp_inst) {
+		if ($.datepicker._get(inst, 'constrainInput')) {
+			var ampm = tp_inst._defaults.ampm,
+				dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
+				datetimeChars = tp_inst._defaults.timeFormat.toString()
+								.replace(/[hms]/g, '')
+								.replace(/TT/g, ampm ? 'APM' : '')
+								.replace(/Tt/g, ampm ? 'AaPpMm' : '')
+								.replace(/tT/g, ampm ? 'AaPpMm' : '')
+								.replace(/T/g, ampm ? 'AP' : '')
+								.replace(/tt/g, ampm ? 'apm' : '')
+								.replace(/t/g, ampm ? 'ap' : '') +
+								" " +
+								tp_inst._defaults.separator +
+								tp_inst._defaults.timeSuffix +
+								(tp_inst._defaults.showTimezone ? tp_inst._defaults.timezoneList.join('') : '') +
+								(tp_inst._defaults.amNames.join('')) +
+								(tp_inst._defaults.pmNames.join('')) +
+								dateChars,
+				chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
+			return event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);
+		}
+	}
+	
+	return $.datepicker._base_doKeyPress(event);
+};
+
+//#######################################################################################
+// Override key up event to sync manual input changes.
+//#######################################################################################
+$.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
+$.datepicker._doKeyUp = function (event) {
+	var inst = $.datepicker._getInst(event.target),
+		tp_inst = $.datepicker._get(inst, 'timepicker');
+
+	if (tp_inst) {
+		if (tp_inst._defaults.timeOnly && (inst.input.val() != inst.lastVal)) {
+			try {
+				$.datepicker._updateDatepicker(inst);
+			}
+			catch (err) {
+				$.datepicker.log(err);
+			}
+		}
+	}
+
+	return $.datepicker._base_doKeyUp(event);
+};
+
+//#######################################################################################
+// override "Today" button to also grab the time.
+//#######################################################################################
+$.datepicker._base_gotoToday = $.datepicker._gotoToday;
+$.datepicker._gotoToday = function(id) {
+	var inst = this._getInst($(id)[0]),
+		$dp = inst.dpDiv;
+	this._base_gotoToday(id);
+	var now = new Date();
+	var tp_inst = this._get(inst, 'timepicker');
+	if (tp_inst && tp_inst._defaults.showTimezone && tp_inst.timezone_select) {
+		var tzoffset = now.getTimezoneOffset(); // If +0100, returns -60
+		var tzsign = tzoffset > 0 ? '-' : '+';
+		tzoffset = Math.abs(tzoffset);
+		var tzmin = tzoffset % 60;
+		tzoffset = tzsign + ('0' + (tzoffset - tzmin) / 60).slice(-2) + ('0' + tzmin).slice(-2);
+		if (tp_inst._defaults.timezoneIso8609)
+			tzoffset = tzoffset.substring(0, 3) + ':' + tzoffset.substring(3);
+		tp_inst.timezone_select.val(tzoffset);
+	}
+	this._setTime(inst, now);
+	$( '.ui-datepicker-today', $dp).click(); 
+};
+
+//#######################################################################################
+// Disable & enable the Time in the datetimepicker
+//#######################################################################################
+$.datepicker._disableTimepickerDatepicker = function(target, date, withDate) {
+	var inst = this._getInst(target),
+	tp_inst = this._get(inst, 'timepicker');
+	$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
+	if (tp_inst) {
+		tp_inst._defaults.showTimepicker = false;
+		tp_inst._updateDateTime(inst);
+	}
+};
+
+$.datepicker._enableTimepickerDatepicker = function(target, date, withDate) {
+	var inst = this._getInst(target),
+	tp_inst = this._get(inst, 'timepicker');
+	$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
+	if (tp_inst) {
+		tp_inst._defaults.showTimepicker = true;
+		tp_inst._addTimePicker(inst); // Could be disabled on page load
+		tp_inst._updateDateTime(inst);
+	}
+};
+
+//#######################################################################################
+// Create our own set time function
+//#######################################################################################
+$.datepicker._setTime = function(inst, date) {
+	var tp_inst = this._get(inst, 'timepicker');
+	if (tp_inst) {
+		var defaults = tp_inst._defaults,
+			// calling _setTime with no date sets time to defaults
+			hour = date ? date.getHours() : defaults.hour,
+			minute = date ? date.getMinutes() : defaults.minute,
+			second = date ? date.getSeconds() : defaults.second,
+			millisec = date ? date.getMilliseconds() : defaults.millisec;
+
+		//check if within min/max times..
+		if ((hour < defaults.hourMin || hour > defaults.hourMax) || (minute < defaults.minuteMin || minute > defaults.minuteMax) || (second < defaults.secondMin || second > defaults.secondMax) || (millisec < defaults.millisecMin || millisec > defaults.millisecMax)) {
+			hour = defaults.hourMin;
+			minute = defaults.minuteMin;
+			second = defaults.secondMin;
+			millisec = defaults.millisecMin;
+		}
+
+		tp_inst.hour = hour;
+		tp_inst.minute = minute;
+		tp_inst.second = second;
+		tp_inst.millisec = millisec;
+
+		if (tp_inst.hour_slider) tp_inst.hour_slider.slider('value', hour);
+		if (tp_inst.minute_slider) tp_inst.minute_slider.slider('value', minute);
+		if (tp_inst.second_slider) tp_inst.second_slider.slider('value', second);
+		if (tp_inst.millisec_slider) tp_inst.millisec_slider.slider('value', millisec);
+
+		tp_inst._onTimeChange();
+		tp_inst._updateDateTime(inst);
+	}
+};
+
+//#######################################################################################
+// Create new public method to set only time, callable as $().datepicker('setTime', date)
+//#######################################################################################
+$.datepicker._setTimeDatepicker = function(target, date, withDate) {
+	var inst = this._getInst(target),
+		tp_inst = this._get(inst, 'timepicker');
+
+	if (tp_inst) {
+		this._setDateFromField(inst);
+		var tp_date;
+		if (date) {
+			if (typeof date == "string") {
+				tp_inst._parseTime(date, withDate);
+				tp_date = new Date();
+				tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
+			}
+			else tp_date = new Date(date.getTime());
+			if (tp_date.toString() == 'Invalid Date') tp_date = undefined;
+			this._setTime(inst, tp_date);
+		}
+	}
+
+};
+
+//#######################################################################################
+// override setDate() to allow setting time too within Date object
+//#######################################################################################
+$.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
+$.datepicker._setDateDatepicker = function(target, date) {
+	var inst = this._getInst(target),
+	tp_date = (date instanceof Date) ? new Date(date.getTime()) : date;
+
+	this._updateDatepicker(inst);
+	this._base_setDateDatepicker.apply(this, arguments);
+	this._setTimeDatepicker(target, tp_date, true);
+};
+
+//#######################################################################################
+// override getDate() to allow getting time too within Date object
+//#######################################################################################
+$.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
+$.datepicker._getDateDatepicker = function(target, noDefault) {
+	var inst = this._getInst(target),
+		tp_inst = this._get(inst, 'timepicker');
+
+	if (tp_inst) {
+		this._setDateFromField(inst, noDefault);
+		var date = this._getDate(inst);
+		if (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
+		return date;
+	}
+	return this._base_getDateDatepicker(target, noDefault);
+};
+
+//#######################################################################################
+// override parseDate() because UI 1.8.14 throws an error about "Extra characters"
+// An option in datapicker to ignore extra format characters would be nicer.
+//#######################################################################################
+$.datepicker._base_parseDate = $.datepicker.parseDate;
+$.datepicker.parseDate = function(format, value, settings) {
+	var date;
+	try {
+		date = this._base_parseDate(format, value, settings);
+	} catch (err) {
+		if (err.indexOf(":") >= 0) {
+			// Hack!  The error message ends with a colon, a space, and
+			// the "extra" characters.  We rely on that instead of
+			// attempting to perfectly reproduce the parsing algorithm.
+			date = this._base_parseDate(format, value.substring(0,value.length-(err.length-err.indexOf(':')-2)), settings);
+		} else {
+			// The underlying error was not related to the time
+			throw err;
+		}
+	}
+	return date;
+};
+
+//#######################################################################################
+// override formatDate to set date with time to the input
+//#######################################################################################
+$.datepicker._base_formatDate=$.datepicker._formatDate;
+$.datepicker._formatDate = function(inst, day, month, year){
+	var tp_inst = this._get(inst, 'timepicker');
+	if(tp_inst)
+	{
+		if(day)
+			var b = this._base_formatDate(inst, day, month, year);
+		tp_inst._updateDateTime(inst);	
+		return tp_inst.$input.val();
+	}
+	return this._base_formatDate(inst);
+};
+
+//#######################################################################################
+// override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
+//#######################################################################################
+$.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
+$.datepicker._optionDatepicker = function(target, name, value) {
+	var inst = this._getInst(target),
+		tp_inst = this._get(inst, 'timepicker');
+	if (tp_inst) {
+		var min,max,onselect;
+		if (typeof name == 'string') { // if min/max was set with the string
+			if (name==='minDate' || name==='minDateTime' )
+				min = value;
+			else if (name==='maxDate' || name==='maxDateTime')
+				max = value;
+			else if (name==='onSelect')
+				onselect=value;
+		} else if (typeof name == 'object') { //if min/max was set with the JSON
+			if(name.minDate)
+				min = name.minDate;
+			else if (name.minDateTime)
+				min = name.minDateTime;
+			else if (name.maxDate)
+				max = name.maxDate;
+			else if (name.maxDateTime)
+				max = name.maxDateTime;
+		}
+		if(min){ //if min was set
+			if(min==0)
+				min=new Date();
+			else
+				min= new Date(min);
+			
+			tp_inst._defaults.minDate = min;
+			tp_inst._defaults.minDateTime = min;
+		} else if (max){ //if max was set
+			if(max==0)
+				max=new Date();
+			else
+				max= new Date(max);
+			tp_inst._defaults.maxDate = max;
+			tp_inst._defaults.maxDateTime = max;
+		}
+		else if (onselect)
+			tp_inst._defaults.onSelect=onselect;
+	}
+	if (value === undefined)
+		return this._base_optionDatepicker(target, name);
+	return this._base_optionDatepicker(target, name, value);
+};
+
+//#######################################################################################
+// jQuery extend now ignores nulls!
+//#######################################################################################
+function extendRemove(target, props) {
+	$.extend(target, props);
+	for (var name in props)
+		if (props[name] === null || props[name] === undefined)
+			target[name] = props[name];
+	return target;
+};
+
+$.timepicker = new Timepicker(); // singleton instance
+$.timepicker.version = "0.9.9";
+
+})(jQuery);
--- a/fhiiqm/logout.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/logout.php	Fri Jun 08 15:04:22 2012 +0200
@@ -9,6 +9,13 @@
 
     session_start();
     $_SESSION = array();
+/*    // session cookie loeschen, neuer leerer wird auf Server erstellt
+    if (ini_get("session.use_cookies")) {
+    $params = session_get_cookie_params();
+    setcookie(session_name(), '', time() - 42000, $params["path"],
+        $params["domain"], $params["secure"], $params["httponly"]
+    );
+    } */
     session_destroy();
     header("location: /fhiiqm/start.php");
 
--- a/fhiiqm/ma_fkt_ed.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/ma_fkt_ed.php	Fri Jun 08 15:04:22 2012 +0200
@@ -28,7 +28,7 @@
     $fkt = $_POST["fkt"];
     $fkt["fid"] = $fkt["func"]; // kein autocomplete bei Funktion
     if (!$fkt["pid"]) $fkt["pid"] = $_GET["p"];
-    if (!$fkt["fid"]) $fkt["fid"] = $_GET["f"];
+//    if (!$fkt["fid"]) $fkt["fid"] = $_GET["f"];
     $mfid = $_GET[i];
     $sub = $_POST["eintragen"];
 
@@ -51,6 +51,7 @@
         }
         else $duptext = " - Fehler beim Duplizieren von ". $fkt["persknr"] . " und " .$fkt["fkt_ID"];
     }    
+//    print_r($fkt); echo "<br />";
     
 ?>
 
@@ -131,9 +132,9 @@
         
         if ((!isset($fkt) && !$fkt) || !$fkt["pid"] || !$fkt["fid"] || !$sub) 
         {
-            if (($fkt["pid"] && $fkt["fid"] && $mfid) || ($copy && $mfid))
+            if ($mfid)
             {
-                $sql = "SELECT fkt_bereich, fkt_von, fkt_bis, fkt_bem, CONCAT(nachname,', ',vorname) AS vname, fkt_bez, ma.fkt_ID  
+                $sql = "SELECT ma.persknr, fkt_bereich, fkt_von, fkt_bis, fkt_bem, CONCAT(nachname,', ',vorname) AS vname, fkt_bez, ma.fkt_ID  
                         FROM fhiiqm.MA_Funktion ma INNER JOIN 
                         fhiiqm.Mitarbeiter m ON ma.persknr=m.persknr INNER JOIN
                         fhiiqm.Funktion f ON ma.fkt_ID=f.fkt_ID
@@ -142,6 +143,7 @@
                 {
                     foreach ($result as $row)
                     {
+                        $fkt["pid"] = $row->persknr;
                         $fkt["persknr"] = $row->vname;
 //                        $fkt["func"] = $row->fkt_bez;     // nur wenn autocomplete fuer Funktion genutzt wird
                         $fkt["func"] = $row->fkt_ID;
@@ -179,18 +181,20 @@
             {
                 $sql="SELECT COUNT(*) FROM MA_Funktion WHERE persknr=" . $fkt["pid"] . " AND fkt_ID='" . $fkt["fid"] ."'";
                 $result = $dbc ->querySingleItem($sql);
-                if ($result && $fkt["ber"]>"!" && $mfid)
+                if ($result || $mfid)
                 {   // UPDATE
                     $stmt = $dbc -> stmtinit();
                     if (is_object($stmt))
                     {
                         $stmt -> prepare("UPDATE fhiiqm.MA_Funktion SET
+                                    persknr = ?,
+                                    fkt_ID = ?,
                                     fkt_bereich = ?,
                                     fkt_von = ?,
                                     fkt_bis = ?,
                                     fkt_bem = ? 
                                     WHERE mf_ID = $mfid");
-                        $stmt -> bind_param('ssss',$fkt["ber"], $fvon, $fbis, $fkt["bem"]);
+                        $stmt -> bind_param('isssss',$fkt["pid"],$fkt["fid"],$fkt["ber"], $fvon, $fbis, $fkt["bem"]);
                         $res = $stmt -> execute();
 //                            print_r($stmt);
                         if ($stmt->error) echo "error: " . $stmt->errno." -> ".$stmt->error . "<br><br>\n";
--- a/fhiiqm/prozess_flist.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/prozess_flist.php	Fri Jun 08 15:04:22 2012 +0200
@@ -140,14 +140,14 @@
         tab_column(1,"ID",$sort,$dir,0,$fnum,$filter,$start,$zeil);
         tab_column(5,"zu ID",$sort,$dir,5,$fnum,$filter,$start,$zeil);
         tab_column(2,"Bezeichnung",$sort,$dir,2,$fnum,$filter,$start,$zeil);
-/*        tab_column(3,"Beschreibung",$sort,$dir,0,$fnum,$filter,$start,$zeil); */
+        tab_column(3,"Beschreibung",$sort,$dir,0,$fnum,$filter,$start,$zeil); 
         tab_column(4,"Produkt",$sort,$dir,4,$fnum,$filter,$start,$zeil);
         tab_column(6,"Auftragg.",$sort,$dir,6,$fnum,$filter,$start,$zeil);
         tab_column(7,"Verantw.",$sort,$dir,7,$fnum,$filter,$start,$zeil);
         echo "<th>Schritte</th>";
-/*        tab_column(8,"Start Pl.",$sort,$dir,8,$fnum,$filter,$start,$zeil);
-        tab_column(9,"Ende Pl.",$sort,$dir,9,$fnum,$filter,$start,$zeil);
-        tab_column(10,"Kosten Pl.",$sort,$dir,0,$fnum,$filter,$start,$zeil);    */
+        tab_column(8,"Start Plan",$sort,$dir,8,$fnum,$filter,$start,$zeil);
+        tab_column(9,"Ende Plan",$sort,$dir,9,$fnum,$filter,$start,$zeil);
+        tab_column(10,"Kosten Plan",$sort,$dir,0,$fnum,$filter,$start,$zeil);    
         tab_column(11,"Start",$sort,$dir,11,$fnum,$filter,$start,$zeil);
         tab_column(12,"Ende",$sort,$dir,12,$fnum,$filter,$start,$zeil);
         tab_column(13,"Kosten",$sort,$dir,0,$fnum,$filter,$start,$zeil);
@@ -166,7 +166,7 @@
             echo "<tr bgcolor='" . $bg . "'><td>$row->proz_ID</td>";
             if ($row->proz_ref_ID) echo "<td>$row->proz_ref_ID</td>"; else echo "<td>&nbsp;</td>";
             echo "<td>$row->bez</td>";
-/*            echo "<td>" .nl2br($row->proz_bez_l)."</td>"; */
+            echo "<td>" .nl2br($row->bez_l)."</td>"; 
             echo "<td>$row->prod_name</td>";
             echo "<td>$row->ama</td>";
             echo "<td>$row->vma</td>";
@@ -177,7 +177,7 @@
                 foreach ($steps as $step)
                 {
                     list($id,$ste) = explode("|",$step);
-                    echo $ste . "<br />";
+                    echo "- $ste<br />";
                 }    
                 echo "</td>";
             }    
@@ -194,6 +194,19 @@
             }
             else  echo "<td>&nbsp;</td>";
             echo "<td>".number_format($row->kost_pl,2,",","."); */       
+            if ($row->start_pl)
+            {
+                $dat = new DateTime($row->start_pl);    
+                echo "<td class=\"left\">" . $dat->format('d.m.Y')."</td>";
+            }
+            else  echo "<td>&nbsp;</td>";       
+            if ($row->end_pl)
+            {
+                $dat = new DateTime($row->end_pl);    
+                echo "<td class=\"left\">" . $dat->format('d.m.Y')."</td>";
+            }
+            else  echo "<td>&nbsp;</td>";
+            if ($row->kost_pl) echo "<td>".number_format($row->kost_pl,2,",","."); else echo "<td>&nbsp;</td>";        
             if ($row->start)
             {
                 $dat = new DateTime($row->start);    
@@ -206,7 +219,7 @@
                 echo "<td class=\"left\">" . $dat->format('d.m.Y')."</td>";
             }
             else  echo "<td>&nbsp;</td>";
-            echo "<td>".number_format($row->kost,2,",",".");       
+            if ($row->kost) echo "<td>".number_format($row->kost,2,",","."); else echo "<td>&nbsp;</td>";       
             echo "<td>$row->urg_bez</td>";
             echo "<td>$row->stat_bez</td>";
             echo "<td>".nl2br($row->bem)."</td>";
--- a/fhiiqm/raum_aptyp_ed.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/raum_aptyp_ed.php	Fri Jun 08 15:04:22 2012 +0200
@@ -99,9 +99,9 @@
     {
         if ($apid && !$sub && !isset($ap))
         {
-            $sql = "SELECT geb_ID, a.raum_ID,a.arbplatz_typ
-                    FROM Raum_Arbplatz_Typ a INNER JOIN Raum r ON a.raum_ID = r.raum_ID
-                    WHERE a.raum_ID = $apid
+            $sql = "SELECT geb_ID, r.raum_ID,a.arbplatz_typ
+                    FROM Raum_Arbplatz_Typ a RIGHT OUTER JOIN Raum r ON a.raum_ID = r.raum_ID
+                    WHERE r.raum_ID = $apid
                     ORDER BY a.arbplatz_typ";
             if ($res = $dbc -> queryObjectArray($sql))
             {
--- a/fhiiqm/recht_ed.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/recht_ed.php	Fri Jun 08 15:04:22 2012 +0200
@@ -133,6 +133,7 @@
         
         if ($ins == "eingeben")
         {
+            $resu=1;            
             // pruefen, ob userid schon existiert
             $sql = "SELECT persknr, userid FROM fhiiqm.userweb WHERE userid = '" . $rt["userid"] . "'";
             if ($result = $dbc ->queryObjectArray($sql))
@@ -145,7 +146,7 @@
             }
         }
         else
-        {
+        {   //update
             $sql = "SELECT userid FROM fhiiqm.userweb WHERE persknr = $pget";
             if ($userid = $dbc->querySingleItem($sql))
             {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fhiiqm/report/fkt_ma_report.php	Fri Jun 08 15:04:22 2012 +0200
@@ -0,0 +1,293 @@
+<?php
+
+/**
+ * @author Bettina Schwarzer, Fritz-Haber-Institut
+ * @copyright 05/2012
+ * 
+ * Liste Funktionen ohne Berechtigung
+ */
+
+    error_reporting(E_ALL ^ E_NOTICE);
+    
+    if (!isset($_GET["s"]))
+    {
+        session_start();
+        if (! isset($_SESSION["userid"]))
+        { 
+            include_once ("inc/func_lib.inc.php");	
+            login($_SERVER["PHP_SELF"]);
+            exit;
+        }
+        
+        if (is_null($_SESSION["recht"]) || (!is_null($_SESSION["recht"]) && !in_array("fmr",$_SESSION["recht"]) && !in_array("fme",$_SESSION["recht"])))
+        {
+            header("Location: start.php");
+            exit;
+        }
+    }    
+
+	include_once($_SERVER['DOCUMENT_ROOT'] ."/fhiiqm/inc/dbconnect.inc.php");
+
+	if (!isset($dbc) || !$dbc) $dbc = new dbconnection();
+    
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
+   	<link href="/fhiiqm/css/db.css" rel="STYLESHEET" type="TEXT/CSS"  media="screen"/> 
+   	<link href="/fhiiqm/css/db_print.css" rel="STYLESHEET" type="TEXT/CSS"  media="print"/> 
+	<title>Beauftragte</title>
+</head>
+
+<body>
+<?php
+    if (!isset($_GET["s"]))
+    {
+        echo "&nbsp;";  
+        echo "<div class=\"float-br smaller\" valign='top'>";
+        echo "&nbsp;&nbsp;&nbsp;user: " . $_SESSION["userid"];
+        echo "&nbsp;&nbsp;&nbsp;<a class='sc' href='/fhiiqm/logout.php' title='Session beenden'>logout</a></div>\n";
+        echo "<div class=\"float-r\"><img src=\"/fhiiqm/img/reseller_account_template.png\" border=\"0\" alt=\"Mitarbeiter-Funktion\" title=\"Mitarbeiter-Funktion\"/></div>\n";
+    }
+    $rag    = $_POST["rag"];    // Parameter aus Form
+    $search = $_POST["search"];
+    if (!$search) $search =  $_GET["s"];
+
+    if (!$zeil) $zeil = 9999; // Anzahl der gezeigten Zeilen
+    $start = $_GET["st"];   // Start bei DS $start+1
+    if (!$start) $start=0;
+    
+    if (!is_array($rag))
+    {
+        $rag["fktg"]     = $_GET["g"];  // Funktionsgruppe
+        $rag["fkt"]     = $_GET["f"];   // Funktion
+        $rag["nfkt"]     = $_GET["n"];  // nicht ausgewaehlte Funktion
+        $rag["fktb"]    = $_GET["b"];   // Geltungsbereich
+        $rag["bind"]    = $_GET["j"];   // Verknuepfung
+    }
+/*
+    $_GET["f"] = $rag["fkt"];
+    $_GET["b"] = $rag["fktb"];
+    $_GET["j"] = $rag["bind"];
+*/   
+    echo "<div align='center'>\n";
+    echo "<p><b>Bericht Beauftragte</b></p>\n";
+    echo "</div>\n";
+    if (!$search)
+    {
+?>
+        <div align="center">
+        <h3><font face="Verdana, Arial, Helvetica, sans-serif"></font></h3>
+        <p>Bitte Kriterien f&uuml;r die Suche w&auml;hlen</p>
+        </div>
+        <form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" enctype="application/x-www-form-urlencoded" name="form_rag" target="_self">	
+        <div align="center">
+        <table width="50%" border="0" cellspacing="3" cellpadding="3">
+            <tr>
+                <td>Funktionsgruppe</td>
+                <td>
+                    <select name="rag[fktg]" size="1">
+                    <?php 
+                        if ($rag["fktg"] == -1) $select = " selected "; else $select = "";
+                        echo "<option $select value=\"-1\"></option>\n";
+                        $sql = "SELECT fktgr_ID,fktgr_bez 
+                                    FROM Funktion_Gruppe ORDER BY 1";
+                        if ($result = $dbc->queryObjectArray($sql))
+                        {
+                            foreach ($result as $row)
+                            {
+                                if ($row->fktgr_ID == $rag['fktg'])
+            					   echo "<option selected value=\"$row->fktgr_ID\">$row->fktgr_bez</option>\n";
+            				    else
+            					   echo "<option value=\"$row->fktgr_ID\">$row->fktgr_bez</option>\n";
+                            }
+                        }
+                    ?>
+                    </select>
+                </td>
+            </tr>
+            <tr>
+                <td>Funktion</td>
+                <td>
+                    <select name="rag[fkt]" size="1">
+                    <?php 
+                        if ($rag["fkt"] == -1) $select = " selected "; else $select = "";
+                        echo "<option $select value=\"-1\"></option>\n";
+                        $sql = "SELECT DISTINCT mf.fkt_ID,fkt_bez 
+                                    FROM fhiiqm.MA_Funktion mf INNER JOIN Funktion f ON mf.fkt_ID=f.fkt_ID  ORDER BY 2";
+                        if ($result = $dbc->queryObjectArray($sql))
+                        {
+                            foreach ($result as $row)
+                            {
+                                if ($row->fkt_ID == $rag['fkt'])
+            					   echo "<option selected value=\"$row->fkt_ID\">$row->fkt_bez</option>\n";
+            				    else
+            					   echo "<option value=\"$row->fkt_ID\">$row->fkt_bez</option>\n";
+                            }
+                        }
+                    ?>
+                    </select>
+                    &nbsp;&nbsp;&nbsp; diese nicht&nbsp;&nbsp;&nbsp;<input type="checkbox" name="rag[nfkt]" value="1"/> 
+                </td>
+            </tr>
+            <tr>
+                <td>Geltungsbereich</td>
+                <td>
+                    <select name="rag[fktb]" size="1">
+                    <?php 
+                        if ($rag["fktb"] == -1) $select = " selected "; else $select = "";
+                        echo "<option $select value=\"-1\"></option>\n";
+                        $sql = "SELECT DISTINCT fkt_bereich FROM fhiiqm.MA_Funktion ORDER BY 1";
+                        if ($result = $dbc->queryObjectArray($sql))
+                        {
+                            foreach ($result as $row)
+                            {
+                                if ($row->fkt_bereich == $rag['fktb'])
+            					   echo "<option selected value=\"$row->fkt_bereich\">$row->fkt_bereich</option>\n";
+            				    else
+            					   echo "<option value=\"$row->fkt_bereich\">$row->fkt_bereich</option>\n";
+                            }
+                        }
+                    ?>
+                    </select>
+                </td>
+            </tr>
+            <tr> 
+                  <td>Verkn&uuml;pfung</td>
+                  <td>UND&nbsp;&nbsp;&nbsp;
+                    <input type="radio" name="rag[bind]" value="AND" <?php if (isset($rag["bind"]) && $rag["bind"]=="AND") echo "checked"; else  echo "checked";?>>
+                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ODER&nbsp;&nbsp;&nbsp;
+                    <input type="radio" name="rag[bind]" value="OR" <?php if (isset($rag["bind"]) && $rag["bind"]=="OR") echo "checked"; ?>></td>
+            </tr>
+            <tr> 
+                <td>&nbsp;</td>
+                <td><input class="button" type="submit" name="search" value="Bericht erstellen"/></td>
+            </tr> 
+        </table>
+        </div>
+        </form>
+<?php
+    }
+    else
+    {
+        echo "<div align='center'>\n";
+//print_r($rag); echo "<br />";
+        $sql = "SELECT nachname,vorname,titel,abt_name,mf.fkt_ID,fkt_bez,fkt_bereich,fkt_bem,tel,email,geb_ID,raum_nr 
+                    FROM fhiiqm.MA_Funktion mf INNER JOIN Mitarbeiter m ON mf.persknr=m.Persknr
+                    INNER JOIN Funktion f ON mf.fkt_ID=f.fkt_ID
+                    LEFT OUTER JOIN Abteilung a ON m.abt_tel=a.abt_ID
+                    LEFT OUTER JOIN Mitarbeiter_Raum mr ON m.persknr=mr.persknr
+                    LEFT OUTER JOIN Raum r ON mr.raum_ID=r.raum_ID";
+        $lim = " LIMIT $start,$zeil";
+        
+        if (!$rag["bind"]) $bind = " AND "; else $bind = $rag["bind"];
+        
+        if ($rag["fkt"]> -1)
+        { 
+            if ($rag['nfkt'])
+                $where = " mf.fkt_ID <> '$rag[fkt]' ";
+            else
+                $where = " mf.fkt_ID = '$rag[fkt]' ";
+        }
+        if ($rag["fktg"]> -1) 
+            if ($where) $where .= "$bind fktgr_ID = '$rag[fktg]' "; else $where = " fktgr_ID = '$rag[fktg]' ";
+        if ($rag["fktb"]> -1) 
+            if ($where) $where .= "$bind fkt_bereich = '$rag[fktb]' "; else $where = " fkt_bereich = '$rag[fktb]' ";
+        if ($where) $where = " WHERE $where";
+        
+        
+        $sql .= $where . ' ORDER BY 6,7,1,2' . $lim;
+
+        $result = $dbc ->queryObjectArray($sql);
+        
+        if ($rag["fktg"] > -1)
+        {
+            $sql = "SELECT fktgr_bez FROM Funktion_Gruppe WHERE fktgr_ID = '" . $rag["fktg"] ."'";
+            $fktgbez = $dbc -> querySingleItem($sql);
+            $krit = " [Gruppierung = '$fktgbez']";
+        } 
+        if ($rag["fkt"] > -1)
+        {
+            $sql = "SELECT fkt_bez FROM Funktion WHERE fkt_ID = '" . $rag["fkt"] ."'";
+            $fktbez = $dbc -> querySingleItem($sql);
+            if ($krit) $bd = " ".$bind; else $bd = "";
+            if ($rag["nfkt"]) $vgl = "<>"; else $vgl = "=";
+            $krit .=  $bd." [Funktion $vgl '$fktbez']";
+        } 
+        if ($rag["fktb"] > -1)
+        { 
+            if ($krit) $bd = " ".$bind; else $bd = "";
+            $krit .= $bd." [Geltungsbereich = '" . $rag["fktb"] ."']";
+        }   
+        if ($krit )echo "$krit"; else echo "";
+
+        if ($result)
+        {
+    		$bg1 = "#F8F8F8";
+    		$bg2 = "#DEDFE1";
+    		$bg = "#FFFFFF";
+
+            $sqlc = "SELECT COUNT(*)
+                        FROM fhiiqm.MA_Funktion mf INNER JOIN Mitarbeiter m ON mf.persknr=m.Persknr
+                        INNER JOIN Funktion f ON mf.fkt_ID=f.fkt_ID
+                        LEFT OUTER JOIN Abteilung a ON m.abt_tel=a.abt_ID
+                        LEFT OUTER JOIN Mitarbeiter_Raum mr ON m.persknr=mr.persknr
+                        LEFT OUTER JOIN Raum r ON mr.raum_ID=r.raum_ID                    
+                        $where";
+            $ianz = $dbc -> querySingleItem($sqlc);
+
+            //$ianz = $dbc -> numrows($sql); //liefert nur $zeil!
+            printf ("<p>Anzahl: %s</p>", $ianz);
+            
+            echo "<table border='0' cellspacing='0' cellpadding='2'>\n";
+            // Listenkopf
+            echo "<tr bgcolor='#68ACBF'>";
+            if ($rag["fkt"] == -1 || $rag["nfkt"]) echo "<th>Funktion</th>";
+            echo "<th>Name</th>";
+            echo "<th>Abt.</th>";
+            echo "<th>Geltungsbereich</th>";
+            echo "<th>Geb&auml;ude</th>";
+            echo "<th>Raum-Nr.</th>";
+            echo "<th>Tel.</th>";
+            echo "<th>E-Mail</th></tr>\n";
+
+            
+            foreach ($result as $row)
+            {
+    			if ($bg == $bg1) $bg = $bg2; else $bg = $bg1;
+                echo "<tr bgcolor='" . $bg . "'>"; 
+                if ($rag["fkt"] == -1 || $rag["nfkt"]) echo "<td>$row->fkt_bez $row->fkt_bem</td>";
+                echo "<td>$row->titel $row->nachname, $row->vorname</td>";
+                echo "<td>$row->abt_name</td>";
+                echo "<td>$row->fkt_bereich</td>";
+                echo "<td>$row->geb_ID</td>";
+                echo "<td>$row->raum_nr</td>";
+                echo "<td>$row->tel</td>";
+                echo "<td><a href='mailto:$row->email'>$row->email</a></td></tr>\n";
+            }   
+            echo "</table>\n";
+
+            echo "<p></p><table width=60%><tr><td class='right'><a href=\"javascript:window.print()\" class='sc'>
+                <img src=\"/fhiiqm/img/printer.png\" alt=\"Bericht drucken\" border=\"0\" align=\"right\" title=\"Bericht drucken\"></a></td></tr></table>";
+
+            echo "</div>\n";
+            
+            echo "<br />&nbsp;&nbsp;&nbsp;";
+        }
+        else
+        {
+            echo "<p class='red'>&nbsp;&nbsp;&nbsp;Leider gibt es kein Ergebnis für die von Ihnen gewählten Kriterien!</p>";
+            echo "</div>\n";
+        }
+
+        if (!isset($_GET["s"]))
+            echo "<br /><br />&nbsp;&nbsp;&nbsp;<a href=\"" . $_SERVER["PHP_SELF"] . "\" target=\"_self\" title=\"Gefahren\" class=\"sc\">neuer Bericht Beauftragte</a></p>\n";
+    }
+
+?>
+
+</body>
+</html>
+
--- a/fhiiqm/report/vtr_kuend_emaila.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/report/vtr_kuend_emaila.php	Fri Jun 08 15:04:22 2012 +0200
@@ -54,11 +54,12 @@
             if (!is_null($row -> ckdate) && $heute->format("Y-m-d") == $row->ckdate && $row->email) // 28.02.2012
             {
                 $av = $row->cauto? "automatisch" : "&nbsp;";
-                if ($begin = new DateTime($row->cbegin)) $begin=$begin->format("d.m.Y"); else $begin="&nbsp;";
-                if ($end = new DateTime($row->cend)) $end=$end->format("d.m.Y"); else $end="&nbsp;";
-                if ($ckd = new DateTime($row->ckdate)) $ckd=$ckd->format("d.m.Y"); else $ckd="&nbsp;";
+                if ($row->cbegin && $begin = new DateTime($row->cbegin)) $begin=$begin->format("d.m.Y"); else $begin="&nbsp;";
+                if ($row->cend && $end = new DateTime($row->cend)) $end=$end->format("d.m.Y"); else $end="&nbsp;";
+//                if ($ckd = new DateTime($row->ckdate)) $ckd=$ckd->format("d.m.Y"); else $ckd="&nbsp;";
+                $bem = $row->bem ? $row->bem : "&nbsp";
                 $info = "<tr><td><b>$row->cname</b></td><td>$row->vtypk</td><td>$begin</td><td><b>$end</b></td>
-                    <td>&nbsp;$av</td><td>&nbsp;&nbsp;&nbsp;$row->cmon</td><td>$row->bem</td></tr>\n";
+                    <td>&nbsp;$av</td><td>&nbsp;&nbsp;&nbsp;$row->cmon</td><td>$bem</td></tr>\n";
 
                 // Adressat(en)), Attachment? ermitteln
                 $strsql = $sql .$row->cid;
--- a/fhiiqm/test/email_attach.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/test/email_attach.php	Fri Jun 08 15:04:22 2012 +0200
@@ -53,8 +53,9 @@
             if (!is_null($row -> ckdate) && $heute->format("Y-m-d") == $row->ckdate && $row->email) // 28.02.2012
             {
                 $av = $row->cauto? "automatisch" : "&nbsp;";
-                if ($begin = new DateTime($row->cbegin)) $begin=$begin->format("d.m.Y"); else $begin="&nbsp;";
-                if ($end = new DateTime($row->cend)) $end=$end->format("d.m.Y"); else $end="&nbsp;";
+                if ($row->cbegin && $begin = new DateTime($row->cbegin)) $begin=$begin->format("d.m.Y"); else $begin="&nbsp;";
+                if ($row->cend && $end = new DateTime($row->cend)) $end=$end->format("d.m.Y"); else $end="&nbsp;";
+//                echo "VEnde = ".$row->cend. ", formatiert = $end<br />";
                 if ($ckd = new DateTime($row->ckdate)) $ckd=$ckd->format("d.m.Y"); else $ckd="&nbsp;";
                 $info = "<tr><td><b>$row->cname</b></td><td>$row->vtypk</td><td>$begin</td><td><b>$end</b></td>
                     <td>&nbsp;$av</td><td>&nbsp;&nbsp;&nbsp;$row->cmon</td><td>$row->bem</td></tr>\n";
--- a/fhiiqm/test/raum_list.php	Mon May 07 16:21:00 2012 +0200
+++ b/fhiiqm/test/raum_list.php	Fri Jun 08 15:04:22 2012 +0200
@@ -42,8 +42,9 @@
         echo "<p><b>Liste der erfassten R&auml;ume</b></p>\n";
         printf ("<p>Es wurden %s R&auml;ume gefunden.</p>", $dbc->numrows($sql));
         echo "<table>\n";
-        echo "<tr bgcolor='#68ACBF'><th>Raum-Nr.</th><th>Bezeichnung</th><th>Haus</th><th>Typ</th><th>Fl&auml;che (m<sup>2</sup>)</th><th>Raumplan</th><th>&nbsp;</th>
-                </tr>\n";
+        echo "<tr bgcolor='#68ACBF'><th>Raum-Nr.</th><th>Bezeichnung</th><th>Haus</th><th>Typ</th><th>Fl&auml;che (m<sup>2</sup>)</th><th>Raumplan</th>";
+//        <th>&nbsp;</th>
+        echo "</tr>\n";
         foreach ($result as $row)
         {
 			if ($bg == $bg1) $bg = $bg2; else $bg = $bg1;
@@ -52,8 +53,9 @@
             echo "<td>$row->geb_ID</td>";
             echo "<td>$row->raumtyp_bez</td>";
             echo "<td>" . str_replace(".",",",$row->raum_flaeche) . "</td>";
-            echo "<td><a href=\"raeume/$row->raum_file\">$row->raum_file</td>";
-            echo "<td><a href='/fhiiqm/raum_upd.php?uid=$row->raum_ID'><img src=\"/fhiiqm/img/edit.gif\" alt='edit' title='edit' border='0'/></a></td></tr>\n";
+            echo "<td><a href=\"http://achilleus/fhiiqm/raeume/$row->raum_file\">$row->raum_file</td>";
+ //           echo "<td><a href='/fhiiqm/raum_upd.php?uid=$row->raum_ID'><img src=\"/fhiiqm/img/edit.gif\" alt='edit' title='edit' border='0'/></a></td></tr>\n";
+            echo "</tr>\n";
         }
         echo "</table></div>\n";
     }