Code

Several changes for incoming objects
[gosa.git] / plugins / admin / systems / class_systemManagement.inc
index e34d4802bf07d8f15cc59d0c79cd7d8bc22e73b6..7471c95d70ddd2d437154ac01cbf249ec43d9e91 100644 (file)
@@ -47,8 +47,8 @@ class systems extends plugin
 
     /* Get global filter config */
     if (!is_global("terminalfilter")){
-      $ui= get_userinfo();
-      $base= get_base_from_people($ui->dn);
+      $ui   = get_userinfo();
+      $base = get_base_from_people($ui->dn);
       $terminalfilter= array("workstations" => "checked",
           "thins" => "checked",
           "winstations" => "checked",
@@ -65,16 +65,24 @@ class systems extends plugin
 
   function execute()
   {
-    /* Save data */
+    /* Call parent execute */
+    plugin::execute();
+
+    /********************
+      Filter handling, check posted filter options and store them in our Session obejct
+     ********************/
+  
+    /* Save posted filter data */
     $terminalfilter= get_global("terminalfilter");
     foreach( array("depselect", "user", "regex") as $type){
       if (isset($_POST[$type])){
         $terminalfilter[$type]= $_POST[$type];
       }
     }
+
+    /* Check if filter checkboxes are selected */
     if (isset($_POST['depselect'])){
       foreach( array("workstations", "thins", "winstations", "printers", "phones", "servers", "netdev") as $type){
-
         if (isset($_POST[$type])) {
           $terminalfilter[$type]= "checked";
         } else {
@@ -82,6 +90,8 @@ class systems extends plugin
         }
       }
     }
+
+    /* Check for search post */
     if (isset($_GET['search'])){
       $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*";
       if ($s == "**"){
@@ -90,13 +100,16 @@ class systems extends plugin
       $terminalfilter['regex']= $s;
     }
 
-    $terminalfilter   = get_global("terminalfilter"); // contains Filter Settings
+
+    /********************
+      Check for functional posts, edit|delete|add|... system devices 
+     ********************/
     $s_action     = "";                       // Contains the action to proceed
     $s_entry      = "";                       // The value for s_action
     $base_back    = "";                       // The Link for Backbutton
     $smarty       = get_smarty();
 
-    /* Start for New List Managment */
+    /* check if base was changed */
     if(isset($_GET['act'])&&($_GET['act']=="dep_open")){
             $s_action="open";
             $s_entry = base64_decode($_GET['dep_id']);
@@ -128,16 +141,31 @@ class systems extends plugin
         $s_entry  = preg_replace("/user_setpwd_/i","",$key);
       }elseif(preg_match("/dep_root.*/i",$key)){
         $s_action="root";
+      }elseif(preg_match("/newsystem_.*/i",$key)){
+        $s_action="newsystem";
+        $s_entry  = preg_replace("/newsystem_/i","",$key);
       }
     }
 
-     if((isset($_GET['act']))&&($_GET['act']=="edit_entry")){
-      $s_action ="edit";
-      $s_entry  = $_GET['id'];
+    /* 09.02.2006 : New incoming handling ; hickert
+     * If someone made a systemtype and ogroup selection 
+     * Display the new requested entry type ... servtab  in case of server and so on.
+     */
+    if(isset($_POST['SystemTypeChoosen'])){
+      $s_action = "SelectedSystemType";
+      $s_entry  = $_POST['SystemType'];
+      $this->systab = NULL;
     }
 
+    /* remove image tags from posted entry  (posts looks like this 'name_x')*/
     $s_entry  = preg_replace("/_.$/","",$s_entry);
 
+    /* Edit was requested by pressing the name(link) of an item */
+    if((isset($_GET['act']))&&($_GET['act']=="edit_entry")){
+      $s_action ="edit";
+      $s_entry  = $_GET['id'];
+    }
+
     /* Department changed? */
     if(isset($_POST['depselect']) && $_POST['depselect']){
       $terminalfilter['depselect']= $_POST['depselect'];
@@ -149,11 +177,11 @@ class systems extends plugin
       $terminalfilter['depselect']=(preg_replace("/^[^,]+,/","",$terminalfilter['depselect']));
     }
 
+    /* back to the roots ^^ */
     if($s_action=="root"){
       $terminalfilter['depselect']=($this->config->current['BASE']);
     }
 
-
     /* If Backbutton is Posted */
     if($s_action=="back"){
       $base_back          = preg_replace("/^[^,]+,/","",$terminalfilter['depselect']);
@@ -166,9 +194,10 @@ class systems extends plugin
       }
     }
 
+    /* Save Termfilter .... */
     register_global("terminalfilter", $terminalfilter);
     $this->reload();
-
+    
     /* Check for exeeded sizelimit */
     if (($message= check_sizelimit()) != ""){
       return($message);
@@ -179,18 +208,41 @@ class systems extends plugin
       return ($smarty->fetch(get_template_path('chooser.tpl', TRUE)));
     }
 
-    /* Create new default terminal */
-    if (isset($_POST['create_system'])) {
+    /********************
+     Create new system ...   
+     ********************/
+    /* Create new default terminal 
+     *
+     * 09.02.2006 ; New incoming handling ; hickert
+     * Or create specified object of selected system type, from given incoming object  
+     */
+    if (isset($_POST['create_system'])||$s_action=="newsystem"||$s_action == "SelectedSystemType") {
+
+      /* If the current entry is an incoming object 
+       * $sw = System type as posted in new incoming handling dialog 
+       */ 
+      if($s_action == "SelectedSystemType") {
+        $sw         = $s_entry;
+        $dn_backup  = $this->dn;
+      }else{
+        if(isset($_POST['system'])){
+          $sw = $_POST['system'];
+        }else{
+          $sw = $s_entry;
+        }
+      }
+
       $this->dn= "new";
       $this->acl= array(":all");
 
-      switch ($_POST['system']){
+      switch ($sw){
         case 'terminal':
           $this->systab= new termtabs($this->config,
               $this->config->data['TABS']['TERMTABS'], $this->dn);
           $this->systab->set_acl ($this->acl);
           $this->systab->by_object['termgeneric']->cn= "default";
           $this->systab->by_object['termservice']->cn= "default";
+          $this->systab->by_object['termgeneric']->base = $_SESSION['terminalfilter']['depselect'];  
           break;
 
         case 'workstation':
@@ -198,39 +250,88 @@ class systems extends plugin
               $this->config->data['TABS']['WORKTABS'], $this->dn);
           $this->systab->set_acl ($this->acl);
           $this->systab->by_object['workgeneric']->cn= "wdefault";
-          $this->systab->by_object['termservice']->cn= "default";
+          $this->systab->by_object['workservice']->cn= "default";
+          $this->systab->by_object['workgeneric']->base = $_SESSION['terminalfilter']['depselect'];  
           break;
 
         case 'server':
           $this->systab= new servtabs($this->config,
               $this->config->data['TABS']['SERVTABS'], $this->dn);
           $this->systab->set_acl ($this->acl);
+          $this->systab->by_object['servgeneric']->base = $_SESSION['terminalfilter']['depselect'];  
           break;
 
         case 'printer':
           $this->systab= new printtabs($this->config,
               $this->config->data['TABS']['PRINTTABS'], $this->dn);
           $this->systab->set_acl ($this->acl);
+          $this->systab->by_object['printgeneric']->base = $_SESSION['terminalfilter']['depselect'];  
           break;
 
         case 'phone':
           $this->systab= new phonetabs($this->config,
               $this->config->data['TABS']['PHONETABS'], $this->dn);
           $this->systab->set_acl ($this->acl);
+          $this->systab->by_object['phonegeneric']->base = $_SESSION['terminalfilter']['depselect'];  
           break;
 
         case 'component':
           $this->systab= new componenttabs($this->config,
               $this->config->data['TABS']['COMPONENTTABS'], $this->dn);
           $this->systab->set_acl ($this->acl);
+          $this->systab->by_object['componentgeneric']->base = $_SESSION['terminalfilter']['depselect'];  
           break;
       }
+     
+      /* 09.02.2006 ; New incoming handling ; hickert.
+       * We must create a NEW object of given system type (Posted from SelectDeviceType).
+       * But we have to use the same attributes as used in incoming object, thats
+       * what we do here. 
+       */ 
+      if($s_action == "SelectedSystemType"){
+    
+        /* Store some informations, to be able to add this object to 
+         * To specified objectgroup and delete incoming object
+         */
+        $_SESSION['SelectedSystemType']['dn']     = $this->dn;
+        $_SESSION['SelectedSystemType']['server'] = $s_entry;
+        $_SESSION['SelectedSystemType']['ogroup'] = $_POST['ObjectGroup'];
+        
+        /* restore dn */
+        $this->dn = $dn_backup;
+
+        /* Get properties from incoming object */
+        $ldap = $this->config->get_ldap_link();
+        $ldap->cd($this->dn);
+        $ldap->cat($this->dn);
+        $res = $ldap->fetch();
+      
+        /* Unset not needed attributes */
+        unset($res['dn']);
+        unset($res['objectClass']);
+    
+        /* Walk through all tabs and set attributes if available */
+        foreach($this->systab->by_object as $name => $value){
+          foreach($this->systab->by_object[$name]->attributes as $atr){
+            if((isset($value))&&(isset($res[$atr]))){
+              $this->systab->by_object[$name]->$atr = $res[$atr][0];
+            }
+          }
+        }
+      }
+  
+      /* set base ... of current divlist position */
+      $this->systab->base = $_SESSION['terminalfilter']['depselect'];  
     }
 
+
+    /********************
+     Edit system ...   
+     ********************/
+
     /* User wants to edit data? */
     if ($s_action == "edit"){
 
-      /* Get 'dn' from posted 'cn', must be unique */
       $this->dn= $this->terminals[$s_entry]['dn'];
 
       /* Check locking, save current plugin in 'back_plugin', so
@@ -250,72 +351,86 @@ class systems extends plugin
 
       /* Lock the current entry, so everyone will get the
          above dialog */
-      add_lock ($this->dn, $this->ui->dn);
 
       switch ($type){
+        case "NewDevice" :
+          $this->systab = new SelectDeviceType($this->config,$this->dn) ;
+        break;
         case "terminal":
           /* Register systab to trigger edit dialog */
           $this->systab= new termtabs($this->config,
               $this->config->data['TABS']['TERMTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
+        $this->systab->set_acl($acl);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+        break;
 
         case "server":
+
           /* Register systab to trigger edit dialog */
-          $this->systab= new servtabs($this->config,
-              $this->config->data['TABS']['SERVTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
+          $this->systab= new servtabs($this->config,$this->config->data['TABS']['SERVTABS'], $this->dn);
+        $this->systab->set_acl($acl);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+        break;
 
         case "workstation":
           /* Register systab to trigger edit dialog */
           $this->systab= new worktabs($this->config,
               $this->config->data['TABS']['WORKTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
+        $this->systab->set_acl($acl);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+        break;
 
         case "printer":
           /* Register systab to trigger edit dialog */
           $this->systab= new printtabs($this->config,
               $this->config->data['TABS']['PRINTTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
+        $this->systab->set_acl($acl);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+        break;
 
         case "phone":
           /* Register systab to trigger edit dialog */
           $this->systab= new phonetabs($this->config,
               $this->config->data['TABS']['PHONETABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
+        $this->systab->set_acl($acl);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+        break;
 
         case "component":
           /* Register systab to trigger edit dialog */
           $this->systab= new componenttabs($this->config,
               $this->config->data['TABS']['COMPONENTTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
-       
+        $this->systab->set_acl($acl);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+        break;
+
         case "winstation":
           /* Register systab to trigger edit dialog */
           $this->systab= new wintabs($this->config,
               $this->config->data['TABS']['WINTABS'], $this->dn);
-          $this->systab->set_acl($acl);
-          $_SESSION['objectinfo']= $this->dn;
-          break;
+        $this->systab->set_acl($acl);
+        $_SESSION['objectinfo']= $this->dn;
+        add_lock ($this->dn, $this->ui->dn);
+        break;
 
 
         default:
-          print_red (_("You can't edit this object type yet!"));
-          del_lock($this->dn);
-          break;
+        print_red (_("You can't edit this object type yet!"));
+        del_lock($this->dn);
+        break;
       }
     }
+    
+
+    /********************
+     Change password ...   
+     ********************/
 
     /* Set terminals root password */
     if ($s_action=="change_pw"){
@@ -324,6 +439,11 @@ class systems extends plugin
       return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
     }
 
+
+    /********************
+      Password cahnge finish, but check if entered data is ok 
+     ********************/
+
     /* Correctly specified? */
     if (isset($_POST['password_finish'])){
       if ($_POST['new_password'] != $_POST['repeated_password']){
@@ -332,6 +452,10 @@ class systems extends plugin
       }
     }
 
+    /********************
+      Password change finish
+     ********************/
+
     /* Change terminal password */
     if (isset($_POST['password_finish']) && 
         $_POST['new_password'] == $_POST['repeated_password']){
@@ -358,12 +482,22 @@ class systems extends plugin
       unset($_SESSION['objectinfo']);
     }
 
+
+    /********************
+      Delete system cancel
+     ********************/
+
     /* Delete terminal canceled? */
     if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){
       del_lock ($this->dn);
       unset($_SESSION['objectinfo']);
     }
 
+
+    /********************
+      Delete system, confirm dialog
+     ********************/
+
     /* Remove terminal was requested */
     if ($s_action=="del"){
 
@@ -384,7 +518,7 @@ class systems extends plugin
 
         /* Lock the current entry, so nobody will edit it during deletion */
         add_lock ($this->dn, $this->ui->dn);
-        $smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), $this->dn));
+        $smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), LDAP::fix($this->dn)));
         return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
       } else {
 
@@ -394,6 +528,10 @@ class systems extends plugin
       }
     }
 
+  
+    /********************
+      Delete system, confirmed
+     ********************/
     /* Confirmation for deletion has been passed. Terminal should be deleted. */
     if (isset($_POST['delete_terminal_confirm'])){
 
@@ -409,30 +547,44 @@ class systems extends plugin
 
         switch ($type){
           case "terminal":
-            $tabtype= "termtabs";
+            $tabtype  = "termtabs";
+            $tabobj   = "TERMTABS";
           break;
 
           case "workstation":
-            $tabtype= "worktabs";
+            $tabtype  = "worktabs";
+            $tabobj   = "WORKTABS";
+          break;
+
+          case "phone":
+            $tabtype  = "phonetabs";
+            $tabobj   = "PHONETABS";
           break;
 
           case "server":
-            $tabtype= "servtabs";
+            $tabtype  = "servtabs";
+            $tabobj   = "SERVTABS";
           break;
 
           default:
-#print_red (_("You can't remove this object type yet!"));
-#del_lock($this->dn);
-#return;
-          $tabtype= "termtabs";
+            $tabtype  = "termtabs";
+            $tabobj   = "TERMTABS";
           break;
         }
 
         /* Delete request is permitted, perform LDAP action */
-        $this->systab= new $tabtype($this->config,
-            $this->config->data['TABS']['TERMTABS'], $this->dn);
-        $this->systab->set_acl(array($this->acl));
-        $this->systab->by_object['termgeneric']->remove_from_parent ();
+        if($tabtype=="phonetabs"){
+          $this->systab= new $tabtype($this->config,
+             $this->config->data['TABS'][$tabobj], $this->dn);
+          $this->systab->set_acl(array($this->acl));
+          $this->systab->by_object['phonegeneric']->remove_from_parent ();
+        }else{  
+          $this->systab= new $tabtype($this->config,
+             $this->config->data['TABS'][$tabobj], $this->dn);
+          $this->systab->set_acl(array($this->acl));
+          $this->systab->delete();
+          #$this->systab->by_object['termgeneric']->remove_from_parent ();
+        }
         unset ($this->systab);
         gosa_log ("System object'".$this->dn."' has been removed");
         $this->systab= NULL;
@@ -452,6 +604,10 @@ class systems extends plugin
       del_lock ($this->dn);
     }
 
+
+    /********************
+      Edit system type finished, check if everything went ok 
+     ********************/
     /* Finish user edit is triggered by the tabulator dialog, so
        the user wants to save edited data. Check and save at this
        point. */
@@ -469,6 +625,39 @@ class systems extends plugin
 
         /* Terminal has been saved successfully, remove lock from
            LDAP. */
+
+        /* 09.02.2006 Hickert 
+         * New System incoming behavior; you can select a system type and an ogroup membership. 
+         * If this object is an Incoming object, $_SESSION['SelectedSystemType'] isset.
+         * Check if we must add the new object to an object group.
+         * !! Don't forget to unset the $_SESSION['SelectedSystemType']... else all edited objects 
+         * !! will be added to  the object group.
+         * 
+         * If this is done, delete the old incoming entry... it is still there, because this is a new 
+         * entry and not an edited one.
+         */
+        if(isset($_SESSION['SelectedSystemType'])){
+          $SelectedSystemType= $_SESSION['SelectedSystemType'];
+          unset($_SESSION['SelectedSystemType']);
+          if($SelectedSystemType['ogroup'] != "none"){
+            $og = new ogroup($this->config,$SelectedSystemType['ogroup']);
+            if($og){
+              $og->AddDelMembership($this->systab->dn);
+            }
+            $og->save();
+          }
+          if(!isset($ldap)){
+            $ldap = $this->config->get_ldap_link();
+          }
+          $ldap->cd ($this->dn);
+          $ldap->cat($this->dn);  
+          if(count($ldap->fetch())){
+            $ldap->cd($this->dn);
+            $ldap->rmDir($this->dn);
+          }
+          $ldap->cd($this->config->current['BASE']);
+        }
+
         if ($this->dn != "new"){
           del_lock ($this->dn);
         }
@@ -488,119 +677,184 @@ class systems extends plugin
 
     }
 
+
+    /********************
+      Edit system was canceled 
+     ********************/
     /* Cancel dialogs */
-    if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel'])){
+    if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel']) || isset($_POST['SystemTypeAborted'])){
       if (isset($this->systab)){
         del_lock ($this->systab->dn);
         unset ($this->systab);
       }
       $this->systab= NULL;
       unset($_SESSION['objectinfo']);
+
+      /* 09.02.2006 ; New incoming handling ; hickert 
+       * remove session object which stores our ogroup selection 
+       * for the new incoming handling
+       */
+      if(isset($_SESSION['SelectedSystemType'])){
+        unset($_SESSION['SelectedSystemType']);
+      }
     }
 
+
+    /********************
+      Display edit dialog, or some other  
+     ********************/
+
     /* Show tab dialog if object is present */
     if ($this->systab){
       $display= $this->systab->execute();
 
+      
       /* Don't show buttons if tab dialog requests this */
-      if (!$this->systab->by_object[$this->systab->current]->dialog){
+      if ((isset($this->systab->by_object))&&(!$this->systab->by_object[$this->systab->current]->dialog)){
         $display.= "<p style=\"text-align:right\">\n";
-        $display.= "<input type=submit name=\"edit_finish\" value=\""._("Finish")."\">\n";
+        $display.= "<input type=\"submit\" name=\"edit_finish\" value=\""._("Finish")."\">\n";
         $display.= "&nbsp;\n";
-        $display.= "<input type=submit name=\"edit_cancel\" value=\""._("Cancel")."\">\n";
+        $display.= "<input type=\"submit\" name=\"edit_cancel\" value=\""._("Cancel")."\">\n";
         $display.= "</p>";
       }
       return ($display);
     }
 
 
-
-
-
-
-    /* Prepare departments */
+    /********************
+      Entry handling finished (edit delete ... )
+      Now the list generation is the next part of this script.
+     ********************/
+    
+    /* Prepare departments, 
+       which are shown in the listbox on top of the listbox 
+     */
     $options= "";
     foreach ($this->config->idepartments as $key => $value){
-            if ($terminalfilter['depselect'] == $key){
-                    $options.= "<option selected value='$key'>$value</option>";
-            } else {
-                    $options.= "<option value='$key'>$value</option>";
-            }
+      if ($terminalfilter['depselect'] == $key){
+        $options.= "<option selected='selected' value='$key'>$value</option>";
+      } else {
+        $options.= "<option value='$key'>$value</option>";
+      }
     }
 
 
-  /* NEW LIST MANAGMENT */
+    /* NEW LIST MANAGMENT */
+
+    /* Create list header
+     */
     $listhead = "<div style='background:#F0F0F9;padding:5px;'>".
-    " <input type='image' align='middle' src='images/list_back.png' title='"._("Go up one department")."' alt='"._("Up")."' name='dep_back'>&nbsp;".
-    " <input type='image' src='images/list_root.png' align='middle' title='"._("Go to root department")."' name='dep_root' alt='"._("Root")."'>&nbsp;".
-    " <input type='image' align='middle' src='images/list_home.png' title='"._("Go to users department")."' alt='"._("Home")."'                     name='dep_home'>&nbsp;".
-    " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-    " <input type='image' align='middle' src='images/list_new_user.png' title='"._("Create new system")."' alt='"._("New user")."'                    name='user_new'>&nbsp;".
-    " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-    _("Current base")."&nbsp;<select name='depselect' onChange='mainform.submit()'>$options</select>".
-    " <input type='image' src='images/list_submit.png' align='middle' title='"._("Submit department")."' name='submit_department' alt='".           _("Submit")."'>&nbsp;".
+    " <input class='center' type='image' align='middle' src='images/list_back.png' 
+        title='"._("Go up one department")."' alt='"._("Up")."' name='dep_back'>&nbsp;".
+    " <input class='center' type='image' src='images/list_root.png' align='middle' 
+        title='"._("Go to root department")."' name='dep_root' alt='"._("Root")."'>&nbsp;".
+    " <input class='center' type='image' align='middle' src='images/list_home.png' 
+        title='"._("Go to users department")."' alt='"._("Home")."'                     name='dep_home'>&nbsp;".
+    " <img class='center' src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
+    " <input class='center' type='image' align='middle' src='images/select_new_terminal.png'   
+        name='newsystem_terminal'    alt='"._("New Terminal template")."' title='"._("New Terminal")."'>".
+    " <input class='center' type='image' align='middle' src='images/select_new_workstation.png' 
+        name='newsystem_workstation' alt='"._("New Workstation template")."' title='"._("New Workstation")."'>".
+    " <input class='center' type='image' align='middle' src='images/select_new_server.png'     name='newsystem_server'      alt='"._("New Server")."' 
+        title='"._("New Server")."'>".
+    " <input class='center' type='image' align='middle' src='images/select_new_printer.png'    name='newsystem_printer'     alt='"._("New Printer")."' 
+        title='"._("New Printer")."'>".
+    " <input class='center' type='image' align='middle' src='images/select_new_phone.png'      name='newsystem_phone'       alt='"._("New Phone")."' 
+        title='"._("New Phone")."'>".
+    " <input class='center' type='image' align='middle' src='images/select_new_component.png'  name='newsystem_component'   alt='"._("New Component")."' 
+        title='"._("New Component")."'>".
+    " <img class='center' src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;"._("Base")."&nbsp;".
+    " <select name='depselect' onChange='mainform.submit()' class='center'>$options</select>".
+    " <input class='center' type='image' src='images/list_submit.png' align='middle' 
+        title='"._("Submit department")."' name='submit_department' alt='".           _("Submit")."'>&nbsp;".
     "</div>";
 
 
+    /* Edit delete link for system types 
+     */
+    $action= "<input class='center' type='image' src='images/edit.png' alt='"._("edit")."'     name='user_edit_%KEY%' title='"._("Edit system")."'>";
+    $action.= "<input class='center' type='image' src='images/edittrash.png' alt='"._("delete")."'   name='user_del_%KEY%' title='"._("Delete system")."'>";
+    $linkopen = "<a href='?plug=".$_GET['plug']."&amp;act=dep_open&amp;dep_id=%s'>%s</a>";
 
-    $action= "<input type='image' src='images/edit.png' alt='"._("edit")."'     name='user_edit_%KEY%' title='"._("Edit system")."'>";
-    $action.= "<input type='image' src='images/editdelete.png' alt='"._("delete")."'   name='user_del_%KEY%' title='"._("Delete system")."'>";
-
-
-    $divlist = new divlist();
+    /* Create new divlist, and add the header elements 
+     */
+    $divlist = new divlist("systemstab");
+    $divlist->SetSummary(_("This table displays all systems, in the selected tree."));
+    $divlist->SetEntriesPerPage(0);
     $divlist->SetHeader(array(
-          array("string" => "&nbsp;"),
-          array("string" => _("System")." / "._("Department")),
-          array("string" => _("Actions"), "attach" => "style='border:none'" )));
+          array("string" => "&nbsp;", "attach" => "style='text-align:center;width:20px;'"),
+          array("string" => _("System")." / "._("Department"), "attach" => "style=''"),
+          array("string" => _("Actions"), "attach" => "style='width:60px;border-right:0px;text-align:right;'" )));
 
 
-    $divlist->SetSummary(_("This table displays all systems, in the selected tree."));
-    $divlist->SetEntriesPerPage(20);
+    /* Add departments, to be able to switch into them
+     */
+    foreach($this->departments as $key=> $val){
+      
+      /* Add missing entries ... */
+      if(!isset($this->config->departments[trim($key)])){
+        $this->config->departments[trim($key)]="";
+      }
 
-    // Defining Links
-    $linkopen = "<a href='?plug=".$_GET['plug']."&amp;act=dep_open&amp;dep_id=%s'>%s</a>";
+      /* check if this department contains sub-departments 
+         Display different image in this case 
+       */ 
+      $non_empty="";
+      $keys= str_replace("/","\/",$key);
+      foreach($this->config->departments as $keyd=>$vald ){
+        if(preg_match("/".$keys."\/.*/",$keyd)){
+          $non_empty="full";
+        }
+      }
 
-    foreach($this->departments as $key=> $val){
-      $field1 = array("string" => "<img src='images/folder.png' alt='department'>");
-      $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val));
-      $field3 = array("string" => "&nbsp;", "attach" => "style='border:none'");
+      /* Add to divlist */
+      $field1 = array("string" => "<img src='images/".$non_empty."folder.png' alt='department'>", "attach" => "style='text-align:center;width:20px;'");
+      $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val), "attach" => "style=''");
+      $field3 = array("string" => "&nbsp;", "attach" => "style='width:60px;border-right:0px;text-align:right;'");
       $divlist->AddEntry(array($field1,$field2,$field3));
     }
 
-    // Space
+    // Iamge spacer 
     $empty    ="&nbsp;";
 
     // User and Template  Images
     $editlink = "<a href='?plug=".$_GET['plug']."&amp;id=%s&amp;act=edit_entry'>%s</a>";
 
     // Pictures for Extensions
-    $img1  = "<img src='images/printer.png'            alt='C' title='"._("Cups Server")  ."'>";
-    $img2  = "<img src='images/scanner.png'            alt='L' title='"._("Log Db") ."'>";
-    $img3  = "<img src='images/select_terminal.png'    alt='L' title='"._("Syslog Server") ."'>";
-    $img4  = "<img src='images/mailto.png'             alt='M' title='"._("Mail Server")  ."'>";
-    $img5  = "<img src='images/select_phone.png'       alt='I' title='"._("Imap Server") ."'>";
-    $img6  = "<img src='images/fax_small.png'          alt='F' title='"._("Nfs Server")   ."'>";
-    $img7  = "<img src='images/select_winstation.png'  alt='K' title='"._("Kerberos Server") ."'>";
-    $img8  = "<img src='images/select_phone.png'       alt='A' title='"._("Asterisk Server") ."'>";
-    $img9  = "<img src='images/fax_small.png'          alt='F' title='"._("Fax Server") ."'>";
-    $img10 = "<img src='images/save.png'               alt='L' title='"._("Ldap Server") ."'>";
+    $img1  = "<img class='center' src='images/printer.png'            alt='C' title='"._("Cups Server")  ."'>";
+    $img2  = "<img class='center' src='images/scanner.png'            alt='L' title='"._("Log Db") ."'>";
+    $img3  = "<img class='center' src='images/select_terminal.png'    alt='L' title='"._("Syslog Server") ."'>";
+    $img4  = "<img class='center' src='images/mailto.png'             alt='M' title='"._("Mail Server")  ."'>";
+    $img5  = "<img class='center' src='images/select_phone.png'       alt='I' title='"._("Imap Server") ."'>";
+    $img6  = "<img class='center' src='images/fax_small.png'          alt='F' title='"._("Nfs Server")   ."'>";
+    $img7  = "<img class='center' src='images/select_winstation.png'  alt='K' title='"._("Kerberos Server") ."'>";
+    $img8  = "<img class='center' src='images/select_phone.png'       alt='A' title='"._("Asterisk Server") ."'>";
+    $img9  = "<img class='center' src='images/fax_small.png'          alt='F' title='"._("Fax Server") ."'>";
+    $img10 = "<img class='center' src='images/save.png'               alt='L' title='"._("Ldap Server") ."'>";
 
     // Test Every Entry and generate divlist Array
     foreach($this->terminals as $key => $val){
       // Specify Pics for Extensions
+      if(in_array("goLdapServer"    ,$val['objectClass'])){
+        
+      }
+
+      /* Generate picture list, which is currently disabled */     
       if(in_array("goCupsServer"    ,$val['objectClass'])) $cups    = $img1;   else $cups  =$empty;
       if(in_array("goLogDBServer"   ,$val['objectClass'])) $logdb   = $img2;   else $logdb =$empty;
       if(in_array("goSyslogServer"  ,$val['objectClass'])) $syslog  = $img3;   else $syslog=$empty;
       if(in_array("goImapServer"    ,$val['objectClass'])) $imap    = $img4;   else $imap  =$empty;
       if(in_array("sambaSamAccount" ,$val['objectClass'])) $samba   = $img5;   else $samba =$empty;
-      if(in_array("goNfsServer"     ,$val['objectClass'])) $nfs     = $img6;   else $nfs   =$empty;
+      if(in_array("goShareServer"   ,$val['objectClass'])) $nfs     = $img6;   else $nfs   =$empty;
       if(in_array("goKrbServer"     ,$val['objectClass'])) $krb     = $img7;   else $krb   =$empty;
       if(in_array("goFonServer"     ,$val['objectClass'])) $fon     = $img8;   else $fon   =$empty;
       if(in_array("goFaxServer"     ,$val['objectClass'])) $fax     = $img9;   else $fax   =$empty;
       if(in_array("goLdapServer"    ,$val['objectClass'])) $ldap     = $img10;   else $ldap   =$empty;
-  
       $pics = $cups.$logdb.$syslog.$imap.$samba.$nfs.$krb.$fon.$fax.$ldap;
       $pics = "";
+    
+      $val['cn'][0]= preg_replace('/\$$/', '', $val['cn'][0]);
+
       // Generate Array to Add
       if((isset($val['is_new']))&&(!empty($val['is_new']))){
         $display= "".$val["cn"][0]." ".$val['is_new'];
@@ -608,33 +862,29 @@ class systems extends plugin
         $display= "".$val["cn"][0]."";
       }
 
-      if(in_array("gotoTerminal",$val['objectClass'])){
-        $action2 = "<input type='image' src='images/certs.png' alt='"._("Password")."'   name='user_setpwd_%KEY%' title='"._("Set root password")."'>";
+      if((in_array("gotoTerminal",$val['objectClass']))||(in_array("gotoWorkstation",$val['objectClass']))){
+        $action2 = "<input class='center' type='image' src='images/certs.png' alt='"._("Password")."'   name='user_setpwd_%KEY%' title='"._("Set root password")."'>";
       }else{
         $action2 = "";
       }
 
-
       if(isset($val['message'])){
         $display.= "  (".$val['message']." '".$this->config->idepartments[$terminalfilter['depselect']]."'  )";
       }
 
       $img=$this->convert_list($val);
 
-      $field1 = array("string" => sprintf($img['img'],$val['dn']),"attach"=>"style='width:20px;align:middle;'");
-      $field2 = array("string" => sprintf($editlink,$key,$display),"attach"=>"title='".$val['dn']."'");
-      $field3 = array("string" => preg_replace("/%KEY%/", "$key", $action2.$action),"attach" => "style='border:none; text-align:right;width:48px'");
+      $field1 = array("string" => sprintf($img['img'],$val['dn']), "attach" => "style='text-align:center;width:20px;'");
+      $field2 = array("string" => sprintf($editlink,$key,$display), "attach" => "style='' title='".$val['dn']."'");
+      $field3 = array("string" => preg_replace("/%KEY%/", "$key", $action2.$action), "attach" => "style='width:60px;border-right:0px;text-align:right;'");
       $divlist->AddEntry( array($field1,$field2,$field3));
     }
 
-
-
-
-
     /* Show main page */
     $smarty->assign("terminalshead", $listhead);
     $smarty->assign("terminals", $divlist->DrawList());
     $smarty->assign("search_image", get_template_path('images/search.png'));
+    $smarty->assign("searchu_image", get_template_path('images/search_user.png'));
     $smarty->assign("tree_image", get_template_path('images/tree.png'));
     $smarty->assign("infoimage", get_template_path('images/info.png'));
     $smarty->assign("launchimage", get_template_path('images/launch.png'));
@@ -658,13 +908,12 @@ class systems extends plugin
   {
     $temp= "";
     $conv= array(      
+        "NQ" => array("select_newsystem.png",_("New System from incoming")),
         "D" => array("select_default.png",_("Template")),
         "T" => array("select_terminal.png",_("Terminal")),
         "L" => array("select_workstation.png",_("Workstation")),
         "F" => array("select_phone.png",_("Phone")),
         "S" => array("select_server.png",_("Server")),
-        "NT"=> array("select_new_terminal.png",_("New Terminal")),
-        "NL"=> array("select_new_workstation.png",_("New Workstation")),
         "W" => array("select_winstation.png",_("Winstation")),
         "C" => array("select_component.png",_("Network Device")),
         "P" => array("select_printer.png",_("Printer")));
@@ -674,7 +923,7 @@ class systems extends plugin
    }
    foreach ($conv  as $key => $value){
       if($input['type']==$key){
-        $tmp['img'] ="<img src='images/".$value[0]."' alt='".$key."' title='".$value['1']."'>";
+        $tmp['img'] ="<img class='center' src='images/".$value[0]."' alt='".$key."' title='".$value['1']."'>";
         $tmp['class']=$key;
         return $tmp;
       }
@@ -744,7 +993,7 @@ class systems extends plugin
 
     /* Get list of terminals to be shown */
     if ($terminalfilter['thins'] == "checked"){
-      $termfilter= "(&(objectClass=gotoTerminal)(cn=$regex))";
+      $termfilter= "(&(objectClass=goHard)(cn=$regex))";
     } else {
       $termfilter= "";
     }
@@ -792,14 +1041,49 @@ class systems extends plugin
     /* Get all gotoTerminal's */
     $this->terminals= array();
 
-    $res= get_list($this->ui->subtreeACL, "(|$termfilter$workfilter$winfilter$printfilter$phonefilter$serverfilter$netfilter)", TRUE, $base, array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), TRUE);
+    $res= get_list($this->ui->subtreeACL, "(|$termfilter)", FALSE, "ou=terminals,ou=systems,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE);
 
-      
-    /* NEW LIST MANAGMENT
+    $res= array_merge($res,get_list($this->ui->subtreeACL, "(|$termfilter)", FALSE, "ou=incoming,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE));
+
+    $res= array_merge($res,
+          get_list($this->ui->subtreeACL, "(|$serverfilter)", FALSE, "ou=servers,ou=systems,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE));
+
+    $res= array_merge($res,
+          get_list($this->ui->subtreeACL, "(|$phonefilter)", FALSE, "ou=phones,ou=systems,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE));
+
+    $res= array_merge($res,
+          get_list($this->ui->subtreeACL, "(|$netfilter)", FALSE, "ou=netdevices,ou=systems,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE));
+
+    $res= array_merge($res,
+          get_list($this->ui->subtreeACL, "(|$printfilter)", FALSE, "ou=printers,ou=systems,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE));
+
+    $res= array_merge($res,
+          get_list($this->ui->subtreeACL, "(|$workfilter)", FALSE, "ou=workstations,ou=systems,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE));
+
+    $res= array_merge($res,
+          get_list($this->ui->subtreeACL, "(|$winfilter)", FALSE, "ou=winstations,ou=systems,".$base, 
+        array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), FALSE));
+
+/* NEW LIST MANAGMENT
      * We also need to search for the departments
      * So we are able to navigate like in konquerer
      */
-    $base2 = preg_replace("/ou=people,/i","",$base);
+
+    $peopleOU = get_people_ou();
+
+    if(empty($peopleOU)){
+      $base2 = $base;
+    }else{
+      $base2 = preg_replace("/".$peopleOU."/i","",$base);
+    }
+
 
     $res3 =  get_list2($this->ui->subtreeACL, "(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))",
                               TRUE, $base2, array("ou", "description"), TRUE);
@@ -811,10 +1095,10 @@ class systems extends plugin
     }
     ksort($tmp);
     foreach($tmp as $value){
-      if($value["description"][0]!=".."){
+      if(isset($value["description"][0])){
         $this->departments[$value['dn']]=convert_department_dn2($value['dn'])." - [".$value["description"][0]."]";
       }else{
-        $this->departments[$value['dn']]=$value["description"][0];
+        $this->departments[$value['dn']]=convert_department_dn2($value['dn']);//$value["description"][0];
       }
     }
 
@@ -851,11 +1135,8 @@ class systems extends plugin
         $tmp= $value["dn"];
       }
       if (preg_match ("/,ou=incoming,/i", $tmp)){
-        if (in_array('gotoTerminal', $value['objectClass'])){
-          $add= "+ "._("New terminal");
-        }
-        if (in_array('gotoWorkstation', $value['objectClass'])){
-          $add= "+ "._("New workstation");
+        if (in_array('GOhard', $value['objectClass'])){
+          $add= "- "._("New Device");
         }
       } else {
         $add= "";
@@ -879,12 +1160,17 @@ class systems extends plugin
           if (isset($value["macAddress"][0]) &&  $value["macAddress"][0] != "-"){
             $terminal             = $value;
             $terminal['type']     = "L";
+            $terminal['is_new']   = $add;
           } else {
             $terminal             = $value;
             $terminal['type']     = "D";
             $terminal['location'] = array_search($tmp, $this->config->departments);
             $terminal['message']  = _("Workstation template for");
           }
+        }elseif (in_array("GOhard",$value['objectClass'])){
+          $terminal = $value;
+          $terminal['type']   = "Q";
+          $terminal['is_new'] = $add;
         } elseif (in_array('gotoPrinter', $value["objectClass"])){
             $terminal             = $value;
             $terminal['type']     = "P";
@@ -904,17 +1190,17 @@ class systems extends plugin
           } else {
             $domain= "";
           }
-            $terminal=$value;
-            $terminal['type']     ="W";
-            $terminal['domain']   = $name.$domain;
+          $terminal=$value;
+          $terminal['type']     ="W";
+          $terminal['domain']   = $name.$domain;
         }
-      $this->terminals[]=$terminal;
+        $this->terminals[]=$terminal;
       }
     }
 
     $tmp=array();
     foreach($this->terminals as $tkey => $val ){
-      $tmp[strtolower($val['cn'][0]).$val['cn'][0]]=$val;
+      $tmp[strtolower($val['cn'][0]).$val['dn']]=$val;
     }
     ksort($tmp);
     $this->terminals=array();
@@ -938,22 +1224,25 @@ class systems extends plugin
 
     if (in_array('ieee802Device', $classes)){
       $type= "component";
-    }
+    }else
     if (in_array('gotoTerminal', $classes)){
       $type= "terminal";
-    }
+    }else
     if (in_array('gotoWorkstation', $classes)){
       $type= "workstation";
-    }
+    }else
     if (in_array('gotoPrinter', $classes)){
       $type= "printer";
-    }
+    }else
     if (in_array('goFonHardware', $classes)){
       $type= "phone";
-    }
+    }else
     if (in_array('goServer', $classes)){
       $type= "server";
-    }
+    }else
+    if (in_array('GOhard', $classes)){
+      $type= "NewDevice";
+    }else
     if (in_array('sambaAccount', $classes) ||
         in_array('sambaSamAccount', $classes)){
       $type= "winstation";