Code

group clean up
authorcajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Thu, 17 Jan 2008 14:42:37 +0000 (14:42 +0000)
committercajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Thu, 17 Jan 2008 14:42:37 +0000 (14:42 +0000)
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@8466 594d385d-05f5-0310-b6e9-bd551577e9d8

16 files changed:
gosa-core/plugins/admin/groups/application.tpl [deleted file]
gosa-core/plugins/admin/groups/application_options.tpl [deleted file]
gosa-core/plugins/admin/groups/apps/application.tpl [new file with mode: 0644]
gosa-core/plugins/admin/groups/apps/application_options.tpl [new file with mode: 0644]
gosa-core/plugins/admin/groups/apps/class_groupApplication.inc [new file with mode: 0644]
gosa-core/plugins/admin/groups/class_groupApplication.inc [deleted file]
gosa-core/plugins/admin/groups/class_groupMail.inc [deleted file]
gosa-core/plugins/admin/groups/mail.tpl [deleted file]
gosa-core/plugins/admin/groups/mail/class_groupMail.inc [new file with mode: 0644]
gosa-core/plugins/admin/groups/mail/mail.tpl [new file with mode: 0644]
gosa-core/plugins/admin/groups/mail/mail_admins.tpl [new file with mode: 0644]
gosa-core/plugins/admin/groups/mail/mail_locals.tpl [new file with mode: 0644]
gosa-core/plugins/admin/groups/mail/paste_mail.tpl [new file with mode: 0644]
gosa-core/plugins/admin/groups/mail_admins.tpl [deleted file]
gosa-core/plugins/admin/groups/mail_locals.tpl [deleted file]
gosa-core/plugins/admin/groups/paste_mail.tpl [deleted file]

diff --git a/gosa-core/plugins/admin/groups/application.tpl b/gosa-core/plugins/admin/groups/application.tpl
deleted file mode 100644 (file)
index bc6297a..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-
-{if $multiple_support}
-
-       <h2>Multiple edit</h2>
-
-       {if $use_apps}
-               <input type="checkbox" name="use_apps" value="1" checked class="center"
-                       onClick="toggle('div_use_apps');">
-               {t}Modify application settings.{/t}
-               <br>
-               <div id="div_use_apps" style="visibility: visible;" >
-       {else}
-               <input type="checkbox" name="use_apps" value="1" class="center"
-                       onClick="toggle('div_use_apps');">
-               {t}Modify application settings for groups.{/t}
-               <br>
-               <div style="visibility: hidden;" id="div_use_apps">
-       {/if}   
-{/if}
-
-{if $enableReleaseManagement == true}
-       <br>
-       <b>{t}Release focus{/t}</b>&nbsp;
-       {if $ReleaseSelectAble}
-
-{render acl=$FAIreleaseACL}
-               <select name="FAIrelease" title="{t}Select release name{/t}" onChange="javascript: document.mainform.submit();">
-                       {html_options output=$Releases values=$Releases selected=$FAIrelease}
-               </select>
-{/render}
-       {else}
-               {$Release}
-       {/if}
-       <p class="seperator">&nbsp;</p>
-{
-/if}
-<table summary="" style="width:100%;">
- <tr>
-  <td style="width:48%; vertical-align:top;">
-   <b>
-       <LABEL for="used_apps">{t}Used applications{/t}</LABEL>
-   </b>
-   {$UsedApps}
-{render acl=$gosaMemberApplicationACL} 
-   <input type="text" value="" size="30" name='CatName'>
-{/render}
-{render acl=$gosaMemberApplicationACL} 
-   <input type="submit" value="{t}Add category{/t}" name='AddCat'>
-{/render}
-  </td>
-  <td>&nbsp;
-  </td>
-  <td style="width:48%;vertical-align:top;">
-   <b>
-    <LABEL for="apps">{t}Available applications{/t}</LABEL>
-   </b>
-   <br>
-   {$List}
-{render acl=$gosaMemberApplicationACL} 
-   <input type="submit" value="{t}Add{/t}" name='AddApps'>
-{/render}
-  </td>
- </tr>
-</table>
-{if $multiple_support}
-       </div>
-       <input type="hidden" value="1" name="group_apps_multi">
-{/if}
-
diff --git a/gosa-core/plugins/admin/groups/application_options.tpl b/gosa-core/plugins/admin/groups/application_options.tpl
deleted file mode 100644 (file)
index aa55221..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<br>
-<b>{t}Application options{/t}</b>
-<br>
-<br>
-
-{$table}
-
-<div style="height:20px;"></div>
-
-<p class="plugbottom">
-  <input type=submit name="edit_options_finish" value="{t}Apply{/t}">
-  &nbsp;
-  <input type=submit name="edit_options_cancel" value="{t}Cancel{/t}">
-</p>
-
diff --git a/gosa-core/plugins/admin/groups/apps/application.tpl b/gosa-core/plugins/admin/groups/apps/application.tpl
new file mode 100644 (file)
index 0000000..bc6297a
--- /dev/null
@@ -0,0 +1,69 @@
+
+{if $multiple_support}
+
+       <h2>Multiple edit</h2>
+
+       {if $use_apps}
+               <input type="checkbox" name="use_apps" value="1" checked class="center"
+                       onClick="toggle('div_use_apps');">
+               {t}Modify application settings.{/t}
+               <br>
+               <div id="div_use_apps" style="visibility: visible;" >
+       {else}
+               <input type="checkbox" name="use_apps" value="1" class="center"
+                       onClick="toggle('div_use_apps');">
+               {t}Modify application settings for groups.{/t}
+               <br>
+               <div style="visibility: hidden;" id="div_use_apps">
+       {/if}   
+{/if}
+
+{if $enableReleaseManagement == true}
+       <br>
+       <b>{t}Release focus{/t}</b>&nbsp;
+       {if $ReleaseSelectAble}
+
+{render acl=$FAIreleaseACL}
+               <select name="FAIrelease" title="{t}Select release name{/t}" onChange="javascript: document.mainform.submit();">
+                       {html_options output=$Releases values=$Releases selected=$FAIrelease}
+               </select>
+{/render}
+       {else}
+               {$Release}
+       {/if}
+       <p class="seperator">&nbsp;</p>
+{
+/if}
+<table summary="" style="width:100%;">
+ <tr>
+  <td style="width:48%; vertical-align:top;">
+   <b>
+       <LABEL for="used_apps">{t}Used applications{/t}</LABEL>
+   </b>
+   {$UsedApps}
+{render acl=$gosaMemberApplicationACL} 
+   <input type="text" value="" size="30" name='CatName'>
+{/render}
+{render acl=$gosaMemberApplicationACL} 
+   <input type="submit" value="{t}Add category{/t}" name='AddCat'>
+{/render}
+  </td>
+  <td>&nbsp;
+  </td>
+  <td style="width:48%;vertical-align:top;">
+   <b>
+    <LABEL for="apps">{t}Available applications{/t}</LABEL>
+   </b>
+   <br>
+   {$List}
+{render acl=$gosaMemberApplicationACL} 
+   <input type="submit" value="{t}Add{/t}" name='AddApps'>
+{/render}
+  </td>
+ </tr>
+</table>
+{if $multiple_support}
+       </div>
+       <input type="hidden" value="1" name="group_apps_multi">
+{/if}
+
diff --git a/gosa-core/plugins/admin/groups/apps/application_options.tpl b/gosa-core/plugins/admin/groups/apps/application_options.tpl
new file mode 100644 (file)
index 0000000..aa55221
--- /dev/null
@@ -0,0 +1,15 @@
+<br>
+<b>{t}Application options{/t}</b>
+<br>
+<br>
+
+{$table}
+
+<div style="height:20px;"></div>
+
+<p class="plugbottom">
+  <input type=submit name="edit_options_finish" value="{t}Apply{/t}">
+  &nbsp;
+  <input type=submit name="edit_options_cancel" value="{t}Cancel{/t}">
+</p>
+
diff --git a/gosa-core/plugins/admin/groups/apps/class_groupApplication.inc b/gosa-core/plugins/admin/groups/apps/class_groupApplication.inc
new file mode 100644 (file)
index 0000000..e10e4a6
--- /dev/null
@@ -0,0 +1,1288 @@
+<?php
+class appgroup extends plugin
+{
+  /* CLI vars */
+  var $cli_summary= "Manage application groups";
+  var $cli_description= "Some longer text\nfor help";
+  var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
+
+  /* Appgroup attributes */
+  var $gosaMemberApplication= array();
+
+  /* Helpers */
+  var $departments        = "";       // All departments within $this->curbase;
+  var $apps               = array();  // All available applications
+  var $used_apps          = array();  // Specifies which applications are currently assigned 
+
+  var $option_name          = array();
+  var $option_value         = array();
+  var $appoption            = array();
+
+  var $table                  = "";
+  var $curbase                = "";
+  var $curCatDir                  ;
+  var $curCatDepth              =0;         //
+  var $Categories;
+
+  /* attribute list for save action */
+  var $attributes               = array("gosaMemberApplication","gosaApplicationParameter");
+  var $objectclasses            = array("gosaApplicationGroup");
+
+  var $FAIrelease               = "/";
+  var $InitialFAIrelease           = "/";
+  var $Releases                 = array();
+  var $enableReleaseManagement  = false;
+
+  var $AllAppsForRelease        = array();
+  var $AllAppsForReleaseParameter = array();
+  var $view_logged = FALSE;
+  var $CopyPasteVars            = array("Categories");
+  var $gosaApplicationParameter ;
+  var $ui                       = NULL;
+  var $no_release_acls          = false;
+
+  var $multiple_support         = TRUE;
+
+  function appgroup (&$config, $dn= NULL, $parent= NULL)
+  {
+   
+    /* Check if we have relase mangement enabled and prepare group application for release management */ 
+    $tmp = $config->search("faiManagement", "CLASS",array('menu','tabs'));
+    if(!empty($tmp)){
+      $this->enableReleaseManagement = true;
+      $this->objectclasses  [] = "FAIreleaseTag";
+      $this->attributes     [] = "FAIrelease";
+    }
+
+    plugin::plugin ($config, $dn, $parent);
+
+    /* set userinfo object */
+    $this->ui = get_userinfo();
+
+    /* Compatibility check 
+        In some case of old applikations with old release tag saving, 
+          we must reassign is_account state.
+          (Or if release management wasn't activated before creating this app) */
+    if($this->enableReleaseManagement){
+  
+      /* Release management is activated && this is a valid group app account,
+          but no release class was found, so activate is_account flag  */
+      if(isset($this->attrs['objectClass'])){
+        if($dn != "new" && ( in_array("gosaApplicationGroup",$this->attrs['objectClass'])) && 
+            (!in_array("FAIreleaseTag",$this->attrs['objectClass']))){
+          $this->is_account =true;
+        }
+      }
+    }
+    
+    /* Load member applications */
+    if (isset ($this->attrs["gosaMemberApplication"][0])){
+      $this->gosaMemberApplication = array();
+      for ($i= 0; $i<$this->attrs["gosaMemberApplication"]["count"]; $i++){
+        $this->gosaMemberApplication[]=
+          $this->attrs["gosaMemberApplication"][$i];
+      }
+    }
+
+    /* Load application options */
+    if (isset($this->attrs['gosaApplicationParameter'])){
+      for ($i= 0; $i<$this->attrs['gosaApplicationParameter']['count']; $i++){
+        $option= preg_replace('/^[^:]+:/', '',
+            $this->attrs['gosaApplicationParameter'][$i]);
+        $name= preg_replace('/:.*$/', '',
+            $this->attrs['gosaApplicationParameter'][$i]);
+        $this->appoption[$name]= $option;
+      }
+    }
+
+    /* Parse MemberApplication*/
+    $tmp    = array();
+    $tmp2   = array();
+    $prios  = array();
+    $cats   = array();
+
+    foreach($this->gosaMemberApplication as $memberApp){
+      if(preg_match("/\|/i",$memberApp)){
+    
+        $tmp = split("\|",$memberApp);
+        if(!empty($tmp[0])){
+          $tmp2[$tmp[1]][$tmp[2]] = array("App"=>$tmp[0]);
+        }
+        if(!empty($tmp[1])){
+          $n = split("/",$tmp[1]);
+          $c = count($n);
+          $cats [$tmp[1]] = $n[$c-1];
+        }
+        $prios[$tmp[1]][$tmp[2]] = $tmp[2];
+      }else{
+        $tmp2[]['App'] = $memberApp;
+      }
+    }
+
+    /* Assign collected category and application settings */
+    $this->Categories = $cats;
+    $this->gosaMemberApplication = $tmp2;
+
+    /* Sort application by category */
+    $cats[""]="";
+    foreach($cats as $cat ){
+      if((isset($prios[$cat]))&&(count($prios[$cat]))){
+        $max = max($prios[$cat]);
+        $min = 1;//min($prios[$cat]);  
+        $last = false;
+        for($i = $min ; $i < $max ; $i++){
+          if(!isset($prios[$cat][$i])){
+            if($last == false){
+              $this->gosaMemberApplication[$cat][$i]['App'] = "__SEPARATOR__".$i;
+            
+              $last = true;
+            }
+          }else{
+            $last = false;
+          }
+        }
+      }
+    } 
+
+    /* Sort application by priority */
+    $tmp = array();
+    foreach($this->gosaMemberApplication as $key =>  $entries){
+      ksort ($entries);
+      foreach($entries as $entry){
+        $tmp[$key][]= $entry;
+      }
+    }
+    $this->gosaMemberApplication = $tmp;
+    $this->curbase = $this->config->current['BASE'];
+    
+    /* Get required release informations */
+    if($this->enableReleaseManagement){
+      $this->InitialFAIrelease  = $this->FAIrelease;
+      $this->Releases           = $this->getReleases();
+    }
+
+  }
+
+
+  /* Combine new array */
+  function combineArrays($ar0,$ar1,$ar2)
+  {
+    $ret = array();
+    if(is_array($ar0))
+    foreach($ar0 as $ar => $a){
+        $ret[$ar]=$a;
+    }
+    if(is_array($ar1))
+    foreach($ar1 as $ar => $a){
+        $ret[$ar]=$a;
+    }
+    if(is_array($ar2))
+    foreach($ar2 as $ar => $a){
+        $ret[$ar]=$a;
+    }
+    return($ret);
+  }
+
+  /* Returns element position within given array */
+  function getpos($atr,$attrs)
+  {
+    $i = 0;
+    foreach($attrs as $attr => $name)    {
+      $i++;
+      if($attr == $atr){
+        return($i);
+      }
+    }
+    return(-1);
+  }
+
+
+  /* Check current combination of application && release 
+      Are all application available?, application parameter changed? ... */
+  function diffAppsInReleases()
+  {
+    /* Only diff if it is required  */
+    $ret =array();
+
+    /* If current release has changed */
+    if($this->FAIrelease != $this->InitialFAIrelease){
+
+      /* Walk through all apps which are currently displayed */
+      if(isset($this->gosaMemberApplication[$this->curCatDir])){
+
+        foreach($this->gosaMemberApplication[$this->curCatDir] as $entry){
+
+          /* If application is also available in new release, check if parameter differs */
+          if(in_array($entry['App'],$this->AllAppsForRelease)){ 
+
+            $old = array();   // Old application parameter
+            $new = array();   // New parameters 
+
+            /* There are possibly no parameters specified */
+            if(isset($this->AllAppsForReleaseParameter[$this->InitialFAIrelease][$entry['App']])){
+              $old = $this->AllAppsForReleaseParameter[$this->InitialFAIrelease][$entry['App']];
+            }
+
+            if(isset($this->AllAppsForReleaseParameter[$this->FAIrelease][$entry['App']])){
+              $new = $this->AllAppsForReleaseParameter[$this->FAIrelease][$entry['App']];
+            }
+
+            /*  Both (old & new) have no gosaApplicationParameter
+             */
+            if((!isset($old['gosaApplicationParameter'])) && (!isset($new['gosaApplicationParameter']))){
+              $ret[$entry['App']] = false; 
+
+              /* Both got gosaApplicationParameter */
+            }elseif((isset($old['gosaApplicationParameter'])) && (isset($new['gosaApplicationParameter']))){
+              if(array_differs($old['gosaApplicationParameter'],$new['gosaApplicationParameter'])){
+                $ret[$entry['App']]  = true;
+              }else{
+                $ret[$entry['App']]  = false;
+              }
+            }
+            /* Initially had gosaApplicationParameter bot in new release not */
+          }elseif((isset($old['gosaApplicationParameter'])) && (!isset($new['gosaApplicationParameter']))){
+            $ret[$entry['App']]  = true;
+
+            /* Old release had no gosaApplicationParameter but new got some */
+          }elseif((!isset($old['gosaApplicationParameter'])) && (isset($new['gosaApplicationParameter']))){
+            $ret[$entry['App']]  = true;
+          }
+        }
+      }
+    }
+    return($ret);
+  }
+
+  /* TRansports the geiven Arraykey one position up*/
+  function ArrayUp($atr,$attrs)
+  {
+    $ret = $attrs;
+    $pos = $this->getpos($atr,$attrs) ;
+    $cn = count($attrs);
+    if(!(($pos == -1)||($pos == 1))){
+      $before = array_slice($attrs,0,($pos-2));
+      $mitte  = array_reverse(array_slice($attrs,($pos-2),2));
+      $unten  = array_slice($attrs,$pos);
+      $ret = array();
+      $ret = $this->combineArrays($before,$mitte,$unten);
+    }
+    return($ret);
+  }
+
+
+  /* TRansports the geiven Arraykey one position up*/
+  function ArrayDown($atr,$attrs)
+  {
+    $ret = $attrs;
+    $pos = $this->getpos($atr,$attrs) ;
+    $cn = count($attrs);
+    if(!(($pos == -1)||($pos == $cn))){
+      $before = array_slice($attrs,0,($pos-1));
+      $mitte  = array_reverse(array_slice($attrs,($pos-1),2));
+      $unten  = array_slice($attrs,($pos+1));
+      $ret = array();
+      $ret = $this->combineArrays($before,$mitte,$unten);
+    }
+    return($ret);
+  }
+
+    
+  /* Sort category on position up  */
+  function catUp($id)
+  {
+    /* Get all cats depinding on current dir */
+    $cats = $this->GetSubdirs($this->curCatDir);
+    $newcats =$this->ArrayUp($id,$cats);
+    foreach($newcats as $cat => $name){
+      unset($this->Categories[$cat]);
+    }
+    foreach($newcats as $cat => $name){
+      $this->Categories[$cat]=$name;
+    }
+  }
+
+
+  /* Sort category on position down */
+  function catDown($id)
+  {
+    /* Get all cats depinding on current dir */
+    $cats = $this->GetSubdirs($this->curCatDir);
+    $newcats =$this->ArrayDown($id,$cats);
+    foreach($newcats as $cat => $name){
+      unset($this->Categories[$cat]);
+    }
+    foreach($newcats as $cat => $name){
+      $this->Categories[$cat]=$name;
+    }
+  }
+
+
+  /* Increase application priority */
+  function getOneUp($appl)
+  { 
+    $cat  = $this->curCatDir;
+    $apps = $this->gosaMemberApplication[$cat];
+    $appsA = array();
+    foreach ($apps as $appkey => $name){
+      $appsA[$name['App']] =$name['App'];
+    }
+    $result = $this->ArrayUp($appl,$appsA);
+    $ret = array();
+    foreach($result as $app){
+      $ret[]=array("App"=>$app);
+    }
+    $this->gosaMemberApplication[$cat] = $ret;
+  }
+
+
+  /* Decrease application priority */
+  function getOneDown($appl)
+  {
+    $cat  = $this->curCatDir;
+    $apps = $this->gosaMemberApplication[$cat];
+    $appsA = array();
+    foreach ($apps as $appkey => $name){
+      $appsA[$name['App']] =$name['App'];
+    }
+    $result = $this->ArrayDown($appl,$appsA);
+    $ret = array();
+    foreach($result as $app){
+      $ret[]=array("App"=>$app);
+    }
+    $this->gosaMemberApplication[$cat] = $ret;
+  } 
+
+
+  /* Add seperator to application list */
+  function AddSeperator($id)
+  {
+    $found  = false;
+    $cat    = "";
+    $tmp = array();
+    foreach($this->gosaMemberApplication[$this->curCatDir] as $appID => $app){  
+      $tmp[] = $app;    
+      if(($app['App'] == $id)&&(!$found)){
+        $cnt = count($this->gosaMemberApplication[$this->curCatDir]);
+        $tmp[] = array("App" => "__SEPARATOR__".($cnt+1));
+        $found = true;
+      }
+    }
+    if($found){
+      $this->gosaMemberApplication[$this->curCatDir]=$tmp;
+    }
+  }
+
+
+  /* Check if application acls are readable */
+  function check_acls()
+  {
+    return(count($this->ui->get_module_departments("application")));
+  }
+
+
+  function execute()
+  {
+    /* Call parent execute */
+    plugin::execute();
+    $display = "";
+
+    /* Log view */
+    if($this->is_account && !$this->view_logged){
+      $this->view_logged = TRUE;
+      new log("view","groups/".get_class($this),$this->dn);
+    }
+
+    /* Account state settings - Skip if we are editing multiple entries */
+    if(!$this->multiple_support_active){ 
+
+      /* Do we need to flip is_account state? */
+      if(isset($_POST['modify_state'])){
+        if($this->is_account && $this->acl_is_removeable()){
+          $this->is_account= FALSE;
+        }elseif(!$this->is_account && $this->acl_is_createable()){
+          $this->is_account= TRUE;
+        }
+      }
+
+      /* Do we represent a valid group? */
+      if (!$this->is_account && $this->parent === NULL){
+        $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\">&nbsp;<b>".
+          _("This 'dn' is no appgroup.")."</b>";
+        return ($display);
+      }
+
+      /* Show tab dialog headers */
+      $display= "";
+      if ($this->parent !== NULL){
+        if ($this->is_account){
+          $display= $this->show_disable_header(_("Remove applications"),
+              _("This group has application features enabled. You can disable them by clicking below."));
+        } else {
+          $display.= $this->show_enable_header(_("Create applications"),
+              _("This group has application features disabled. You can enable them by clicking below."));
+          return ($display);
+        }
+      }
+    }
+  
+    /* Check acl, applications must be readable */
+    if(!$this->check_acls()){
+      $display .= "<img src='images/button_cancel.png' alt='"._("ACL")."' class='center'>
+                  <b>"._("Insufficient permissions")."</b>
+                  <p>".
+                  _("You do not have permission to query application entries. All your changes will not be saved.").
+                  "</p><p class='seperator'>&nbsp;</p>";
+      $this->no_release_acls = true;
+    }
+    /* Check if department was selected */ 
+    if((isset($_GET['act']))&&($_GET['act']=="depopen")){
+      $dep = base64_decode($_GET['depid']); 
+      $this->curbase =$dep;
+    }
+
+    /* Check if category was selected */
+    if((isset($_GET['act']))&&($_GET['act']=="open") && (empty($_GET['id']) || isset($this->Categories[base64_decode($_GET['id'])]))){
+      $this->curCatDir = base64_decode($_GET['id']);
+    }
+
+
+    
+
+    /* Add Categorie */ 
+    if((isset($_POST['AddCat']))&&(isset($_POST['CatName']))&&(!empty($_POST['CatName']))){
+
+      /* Only allow adding a category, if it is allowed */  
+      if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
+
+        if(preg_match("/[\\\\\/]/i",$_POST['CatName'])){
+          print_red(_("Invalid character in category name."));
+        }elseif(!in_array($_POST['CatName'],$this->Categories)){ 
+          if(empty($this->curCatDir)){
+            $this->Categories[$_POST['CatName']]=$_POST['CatName'];
+          }else{
+            $this->Categories[$this->curCatDir."/".$_POST['CatName']]=$_POST['CatName'];
+          }
+        }else{
+          print_red(_("The specified category already exists."));
+        }
+      }
+    }
+
+
+    $this->reload();
+    $this->diffAppsInReleases();
+
+    /* Check POST variables for commands 
+        to add/remove some applications */
+    $only_once = false;
+    if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
+
+      /* Walk through posts */
+      foreach($_POST as $name => $value){
+
+        /* Add a seperator to current category */
+        if((preg_match("/AddSep_/",$name))&&(!$only_once)){
+          $only_once = true;
+          $n = preg_replace("/AddSep_/","",$name);
+          $val= preg_replace("/_.*$/","",$n);
+          $this->AddSeperator($val);
+        }
+
+        /* Delete application | seperator entry */
+        if((preg_match("/DelApp_/",$name))&&(!$only_once)){
+          $only_once = true;
+
+          if(preg_match("/DelApp___SEPARATOR__/",$name)) {
+            $n=  preg_replace("/DelApp___SEPARATOR__/","",$name);
+            $val= "__SEPARATOR__".preg_replace("/_.*$/","",$n);
+          }else{
+            $n = preg_replace("/DelApp_/","",$name);
+            $val= preg_replace("/_.*$/","",$n);
+          }
+
+          foreach($this->gosaMemberApplication as $key =>  $cat){
+            foreach($cat as $key2 => $app){
+              if($app['App'] == $val){
+                unset($this->gosaMemberApplication[$key][$key2]);
+                if(isset($this->used_apps[$val])){
+                  foreach($this->getParameters($val) as $para){
+                    if(isset($this->appoption[$para])){
+                      unset($this->appoption[$para]);
+                    }
+                  }
+                  unset($this->used_apps[$val]);
+                }
+              }
+            }
+          }
+        }
+
+        if(preg_match("/DelCat_/",$name) && !$only_once){
+          $only_once =TRUE;
+          $cat = preg_replace("/DelCat_/","",$name);
+          $cat = trim(base64_decode( preg_replace("/_.*$/","",$cat)));
+
+          $free_apps = array();
+
+          if(isset($this->gosaMemberApplication[$cat]) && is_array($this->gosaMemberApplication[$cat])){
+            foreach($this->gosaMemberApplication[$cat] as $app){
+              $free_apps[] = $app['App'];
+            }
+            unset($this->gosaMemberApplication[$cat]);
+            unset($this->Categories[$cat]);
+          }
+          foreach($this->Categories as $key => $name){
+            if(preg_match("/^".normalizePreg($cat)."\/.*/",$key)){
+              foreach($this->gosaMemberApplication[$key] as $app){
+                $free_apps[] = $app['App'];
+              }
+              unset($this->gosaMemberApplication[$key]);
+              unset($this->Categories[$key]);
+            }
+          }
+          foreach($free_apps as $app){
+            if(isset($this->used_apps[$app])){
+              unset($this->used_apps[$app]);
+            }
+          }
+        }
+
+        /* Edit application parameter */
+        if((preg_match("/EdiApp_/",$name))&&(!$only_once)){
+
+          $only_once = true;
+          $appname = $value;
+          $appname = preg_replace("/EdiApp_/","",$name);  
+          $appname = preg_replace("/_.*$/","",$appname);
+
+          /* We've got the appname, get parameters from ldap */
+          $ldap= $this->config->get_ldap_link();
+
+          /* Check if we have release management enabled */
+          $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
+          if(!empty($tmp)){
+    
+            /* Get application parameter from ldap */
+            $tmp = array_flip($this->Releases);
+            $base = $tmp[$this->FAIrelease];
+            $ldap->cd($base);
+            $ldap->search("(&(objectClass=gosaApplication)(cn=$appname))",array("gosaApplicationParameter"));
+            $found = "";
+            while($attrs = $ldap->fetch()) {
+              if(preg_match("/cn=".$appname.",".$base."/",$attrs['dn'])){
+                $found = $attrs['dn'];
+              }
+            }
+            $ldap->cat($found, array("gosaApplicationParameter"));
+          }else{
+
+            /* Get application parameter from ldap */
+            $ldap->cd($this->config->current['BASE']);
+            $ldap->search("(&(objectClass=gosaApplication)(cn=$appname))",array("gosaApplicationParameter"));
+          }
+
+          /* Check if this application is unique */
+          if ($ldap->count() != 1){
+            print_red (_("The selected application name is not uniq. Please check your LDAP."));
+          } else {
+
+            /* Get parameter */
+            $attrs= $ldap->fetch();
+            if(isset($attrs['gosaApplicationParameter'])){
+              $this->dialog= TRUE;
+
+              /* Fill name and value arrays */
+              for ($i= 0; $i<$attrs['gosaApplicationParameter']['count']; $i++){
+                $option= preg_replace('/^[^:]+:/', '',
+                    $attrs['gosaApplicationParameter'][$i]);
+                $name= preg_replace('/:.*$/', '', 
+                    $attrs['gosaApplicationParameter'][$i]);
+                $this->option_name[$i]= $name;
+
+                /* Fill with values from application, default should be
+                   loaded by the external scripts */
+                if (isset($this->appoption[$name])){
+                  $this->option_value[$i]= $this->appoption[$name];
+                }
+              }
+
+              /* Create edit field */
+              $table= "<table summary=\"\">";
+              for ($i= 0; $i < count($this->option_name); $i++){
+                if (isset($this->option_value[$i])){
+                  $value= $this->option_value[$i];
+                } else {
+                  $value= "";
+                }
+                $table.="<tr><td>".$this->option_name[$i]."</td><td>".
+                  "<input name=\"value$i\" size=60 maxlength=250 ".
+                  "value=\"".$value."\"><br></td></tr>";
+              }
+              $table.= "</table>";
+              $this->table= $table;
+            } else {
+              print_red (_("The selected application has no options."));
+            }
+          }
+        }
+      }
+    }
+
+    /* Add multiple */
+    if(isset($_POST['AddApps'])){
+      foreach($_POST as $name => $value){
+        if(preg_match("/AddApp_/",$name)){
+          $app = preg_replace("/AddApp_/","",$name);
+          $this->addApp($app);
+        }
+      }
+    }
+
+    /* Add application with post */
+    if((isset($_GET['act']))&&($_GET['act']=="add")){
+      $this->used_apps[$_GET['id']]= $_GET['id'];
+      asort($this->used_apps);
+      $this->addApp($_GET['id']);
+    }
+
+    /* Cancel edit options? */
+    if (isset($_POST['edit_options_cancel'])){
+      $this->dialog= FALSE;
+    }
+
+    /* Finish edit options? */
+    if (isset($_POST['edit_options_finish'])){
+      $this->dialog= FALSE;
+
+      /* Save informations passed by the user */
+      $this->option_value= array();
+      for ($i= 0; $i<count($this->option_name); $i++){
+        $this->appoption[$this->option_name[$i]]= $_POST["value$i"];
+        $this->is_modified= TRUE;
+      }
+    }
+
+    /* Prepare templating stuff */
+    $smarty= get_smarty();
+    $smarty->assign("used_apps", $this->used_apps);
+    $apps= array();
+    foreach ($this->apps as $key => $value){
+      if (!array_key_exists($key, $this->used_apps)){
+        $apps["$key"]= "$value";
+      }
+    }
+
+
+    /* Create application list */
+    $div = new divSelectBox("appgroup");    
+    $div->SetHeight(300);
+    $departments = array();
+    $res = get_list("(objectClass=gosaDepartment)", "application", $this->curbase,array("description","cn","ou"),GL_SIZELIMIT);
+    foreach($res as $value){
+      $fdn = $value['dn'];
+      $fdn = preg_replace("/".normalizePreg($this->curbase)."/","",$fdn);
+      $fdn= @LDAP::fix($fdn);
+      if($value["description"][0]!=".."){
+        $departments[$value['dn']]= convert_department_dn($fdn)." - [".$value["description"][0]."]";
+      }else{
+        $departments[$value['dn']]=convert_department_dn($fdn)." ["._("Back")."]";
+      }
+    }
+
+    /* Create 'open' and 'add' links */
+    if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
+      $linkadd  = "<a href='?plug=".$_GET['plug']."&amp;act=add&amp;id=%s'>%s</a>";
+    }else{
+      $linkadd = "%s";
+    }
+    $linkopen = "<a href='?plug=".$_GET['plug']."&amp;act=depopen&amp;depid=%s'>%s</a>";
+
+    /* Create base back entry */
+    $base_back = preg_replace("/^[^,]+,/","",$this->curbase);
+    if((strlen($base_back)>= strlen($this->config->current['BASE']))&&($this->curbase!=$this->config->current['BASE'])){
+      $div->AddEntry(array(
+            array("string"=>sprintf($linkopen,base64_encode($base_back),".. ["._("back")."]"),
+              "attach"=>"style='border:0px;'")
+            ));
+    }
+
+    /* Append departments for current base */
+    foreach($departments as $key => $app){
+      $div->AddEntry(array(
+            array("string"=>"<img class='center' src='images/folder.png' alt='"._("department")."'>&nbsp;".sprintf($linkopen,base64_encode($key),$app),
+              "attach"=>"style='border:0px;'")
+            ));
+    }
+
+    /* Add applications found on this base */
+    foreach($apps as $key => $app){
+      $div->AddEntry(array(
+            array("string"=>sprintf("<input class='center' type='checkbox' value='1' name='AddApp_%s'>",$key).
+              "<img class='center' src='images/select_application.png' alt='"._("application")."'>&nbsp;".sprintf($linkadd,$key,$app),
+              "attach"=>"style='border:0px;'")
+            ));
+    }
+
+    /* Create list of used/assigned applications */
+    $div2 = new divSelectBox("appgroup");
+    $div2->SetHeight(300);
+
+    /* Check acls to create "edit/remove" category links */
+    if(!$this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
+      $linkopen       = "<img class='center' src='images/folder.png' alt=\"\">&nbsp;<a href='?plug=".$_GET['plug']."&amp;act=open&amp;id=%s'>%s</a>";
+      $catremove      = "&nbsp;<img src='images/empty.png' alt='&nbsp;'>";
+      $catupdown      = "";
+    }else{
+      $linkopen       = "<img class='center' src='images/folder.png' alt=\"\">&nbsp;<a href='?plug=".$_GET['plug']."&amp;act=open&amp;id=%s'>%s</a>";
+      $catremove      = "&nbsp;<input type='image' src='images/edittrash.png' title='"._("Delete entry")."' name='DelCat_%s' value='%s'>";
+      $catupdown      = "<a href='?plug=".$_GET['plug']."&amp;act=cat_up&amp;id=%s'>".
+        "<img align='top' alt=\"\" src='images/sort_up.png' border=0 title='"._("Move up")."'>".
+        "</a>&nbsp;".
+        "<a href='?plug=".$_GET['plug']."&amp;act=cat_down&amp;id=%s'>".
+        "<img alt=\"\" src='images/sort_down.png' title='"._("Move down")."' border=0>".
+        "</a>";
+    }
+
+    /* Add back category for current category */
+    if(empty($this->curCatDir)){
+      $cnt =0;
+    }else{
+      $cnt = count(split("/",$this->curCatDir));
+      $tmp = split("/",$this->curCatDir);
+      $bbk = "";
+      for($i = 0 ; $i < ($cnt -1 ) ; $i++){
+        $bbk .= $tmp[$i]."/";
+      }
+      $bbk = preg_replace("/\/$/","",$bbk);
+      $div2 ->AddEntry(array(array("string"=>sprintf($linkopen,base64_encode($bbk),".. ["._("Back")."]")),array("string"=>"&nbsp;","attach"=>"style='border-right:0px;'")));
+    }
+
+    /* Add sub categories */ 
+    $this->GetSubdirs($this->curCatDir);
+    foreach($this->GetSubdirs($this->curCatDir) as $path => $name){
+      $div2 ->AddEntry(array( 
+            array("string"=>sprintf($linkopen,base64_encode($path),$name)),
+            array("string"=>preg_replace("/%s/",base64_encode($path),$catupdown.$catremove),
+              "attach"=>"align='right' style='width:80px;border-right:0px;'"))); 
+    }
+
+    /* Create priority & seperator links */
+    $separator ="<hr size=1>"; 
+    if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
+      $sep      = "<input type='image' src='images/back.png' title='"._("Insert seperator")."' value='%s' name='AddSep_%s'>";
+      $upudown  = "<a href='?plug=".$_GET['plug']."&amp;act=one_up&amp;id=%s'>".
+                  " <img alt='{t}sort{/t}' align='top' src='images/sort_up.png' title='"._("Move up")."' border=0>".
+                  "</a>&nbsp;".
+                  "<a href='?plug=".$_GET['plug']."&amp;act=one_down&amp;id=%s'>".
+                  " <img alt='{t}sort{/t}' src='images/sort_down.png' title='"._("Move down")."' border=0>".
+                  "</a>&nbsp;".
+                  "<input type='image' src='images/edittrash.png' title='"._("Delete entry")."' name='DelApp_%s' value='%s' alt='{t}delete{/t}' >";
+    }else{
+      $sep      = "";
+      $upudown  = "";
+    }
+     
+    /* Create edit link */ 
+    if($this->acl_is_writeable("gosaApplicationParameter",$this->no_release_acls)){
+      $edit=      "&nbsp;<input type='image' src='images/edit.png' title='"._("Edit entry")."' name='EdiApp_%s' value='%s' alt='{t}edit{/t}' >";
+    }else{
+      $edit=      "";
+    }
+
+    /* Get differences to mark those entries that have changed from last edit. */
+    $Differences = $this->diffAppsInReleases();
+
+    /* Walk through entries an append them to list */
+    if(isset($this->gosaMemberApplication[$this->curCatDir])){
+      foreach($this->gosaMemberApplication[$this->curCatDir] as $cat => $entry){
+
+        /* Add seperator */ 
+        if(preg_match("/__SEPARATOR__/",$entry['App'])){
+          $div2 ->AddEntry(array(array("string"=>$separator),
+                array("string"=>preg_replace("/\%s/",htmlentities($entry['App']),$upudown),"attach"=>"align='right' style='border-right:0px;'")));
+        }else{
+
+          /* Add application */
+
+          $image = "";
+          /* Check if application was available within selected release
+           *  or application list if release management is not active
+           */
+          if(!in_array($entry['App'],$this->AllAppsForRelease)){
+
+            /*  release managent is active
+             */
+            if(!$this->enableReleaseManagement){
+              $image = "<img class='center' alt='R' src='images/select_invalid_application.png' 
+                          title='"._("This application is no longer available.")."'>&nbsp;";
+            }else{
+              $image = "<img class='center' alt='F' src='images/select_invalid_application.png' 
+                          title=\"".sprintf(_("This application is not available in any release named %s."),$this->FAIrelease)."\">&nbsp;";
+            }
+      
+          }elseif(isset($Differences[$entry['App']]) && ($Differences[$entry['App']] == true)) {
+            $entry['App'].=" <i>["._("Check parameter")."]</i>";
+              $image = "<img class='center' src='images/select_invalid_application.png' 
+                          title='"._("This application has changed parameters.")."'>&nbsp;";
+          }else{
+            $image = "<img class='center' src='images/select_application.png' alt=\"\">&nbsp;"; 
+          }
+          
+          $div2->AddEntry(array(array("string"=>sprintf($image."%s",$entry['App'])),
+                array("string"=>preg_replace("/\%s/",htmlentities($entry['App']),$sep.$edit.$upudown),
+                      "attach"=>"align='right' style='width:100px;border-right:0px;'")));
+        }
+      }
+    }
+
+    /* Assign created div lists to template */
+    $smarty->assign("UsedApps", $div2->DrawList());
+    $smarty->assign("List", $div->DrawList());
+    $smarty->assign("apps", $apps);
+   
+    $smarty->assign("enableReleaseManagement",$this->enableReleaseManagement);
+
+    $smarty->assign("ReleaseSelectAble", false);
+    $smarty->assign("Release", $this->FAIrelease);
+    if($this->enableReleaseManagement){
+      $smarty->assign("FAIrelease",  $this->FAIrelease);
+      $smarty->assign("Releases", $this->Releases);
+
+      if(!$this->no_release_acls && count($this->Releases)){
+        $smarty->assign("ReleaseSelectAble", true);
+      }
+    }
+  
+    /* Set acls to  template */
+    $tmp = $this->plInfo();
+    foreach($tmp['plProvidedAcls'] as $acl => $translation){
+      $smarty->assign($acl."ACL",$this->getacl($acl,$this->no_release_acls));
+    }
+
+    /* Assign multiple edit values */
+    foreach(array("apps") as $attr){
+      if(in_array($attr,$this->multi_boxes)){
+        $smarty->assign("use_".$attr,TRUE);
+      }else{
+        $smarty->assign("use_".$attr,FALSE);
+      }
+    }
+    $smarty->assign("multiple_support",$this->multiple_support_active);
+
+    /* Show main page */
+    if (($this->dialog)){
+      $smarty->assign("table", $this->table);
+      $display.= $smarty->fetch (get_template_path('application_options.tpl', TRUE,dirname(__FILE__)));
+    } else {
+      $display.= $smarty->fetch (get_template_path('application.tpl', TRUE,dirname(__FILE__)));
+    }
+    return ($display);
+  }
+
+
+  function getReleases()
+  {
+    /* Only display those releases that we are able to read */
+    $dn     = $this->config->current['BASE'];
+    $filter = "(&(objectClass=organizationalUnit)(objectClass=FAIbranch))";
+    $res    = get_list($filter,"application", $dn, array("ou"), GL_SUBSEARCH);
+
+    $ret =array();
+    foreach($res as $attrs){
+      if(preg_match("/".get_ou('applicationou')."/",$attrs['dn'])){
+        $bb     = preg_replace("/".get_ou('applicationou').".*/","",$attrs['dn']);
+        $parts  = array_reverse(split("ou=",$bb));
+
+        $str ="";
+        foreach($parts as $part){
+          if(empty($part)) {
+            continue;
+          }
+          $str .= str_replace(",","",$part)."/";
+        }    
+        $name = preg_replace("/\/$/","",$str);
+        if(empty($name)) {
+          $name ="/";
+        }
+        $ret[$attrs['dn']] = $name;
+      }
+    }
+    natcasesort($ret);
+    return($ret);
+  }
+
+  function save_object()
+  {
+
+    /* Move category one position up or down */
+    if((isset($_GET['act']))&&(($_GET['act'] == "cat_up")||($_GET['act']=="cat_down"))){
+      if($_GET['act']=="cat_up"){
+        $this->catUp(base64_decode($_GET['id']));
+      }
+      if($_GET['act']=="cat_down"){
+        $this->catDown(base64_decode($_GET['id']));
+      }
+    }
+
+    /* Move application one position up or down */
+    if((isset($_GET['act']))&&(($_GET['act'] == "one_up")||($_GET['act']=="one_down"))){
+      if(isset($_GET['id'])){
+        $id   = $_GET['id'];
+        $act  = $_GET['act']; 
+
+        if($act == "one_up"){
+          $this->getOneUp($id);
+        }elseif($act == "one_down")   { 
+          $this->getOneDown($id);
+        }
+      }
+    }
+
+
+    plugin::save_object();
+  }
+
+  function remove_from_parent()
+  {
+    if(!$this->initially_was_account){
+      return;
+    }
+
+    plugin::remove_from_parent();
+
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->dn);
+    $this->cleanup();
+    
+    $ldap->modify ($this->attrs); 
+    new log("remove","group/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+    show_ldap_error($ldap->get_error(), sprintf(_("Removing of groups/applications with dn '%s' failed."),$this->dn));
+
+    /* Optionally execute a command after we're done */
+    $this->handle_post_events("remove");
+  }
+
+
+  /* Save to LDAP */
+  function save()
+  {
+    /* Skip saving application settings, if we do not have release acls */
+    if($this->no_release_acls && $this->enableReleaseManagement){
+      new log("security","groups/".get_class($this),$this->dn,array(),"Skip saving group application extension. Caused by insufficient acls");
+      
+      return;
+    }
+
+    plugin::save();
+
+    /* Copy members */
+    $tmp = array("" => "");
+    $tmp = array_merge($tmp,$this->Categories);
+
+    $this->attrs["gosaMemberApplication"]= array();
+    $this->attrs["gosaApplicationParameter"]= array();
+    $cat_id= 0 ;
+    foreach($tmp as $name => $cats){
+      $i =0;
+      if(isset($this->gosaMemberApplication[$name])){
+        foreach($this->gosaMemberApplication[$name] as $entry){
+          if(!preg_match("/__SEPARATOR__/",$entry['App'])){
+            $this->attrs["gosaMemberApplication"][]= $entry['App']."|".$name."|".$i;
+            $i ++;
+          }
+        }
+      }
+      if(($i==0)&&(!empty($name))){
+        $this->attrs["gosaMemberApplication"][]= "|".$name."|".$cat_id;
+      }
+      $cat_id++;
+    }
+
+
+
+    /* Are there application parameters to be saved */
+    $this->attrs['gosaApplicationParameter']= array();
+    foreach($this->appoption as $name => $value){
+      if ($value != ""){
+        $this->attrs['gosaApplicationParameter'][]= "$name:$value";
+      }
+    }
+
+    /* Write back to LDAP */
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->dn);
+    $this->cleanup();
+    $ldap->modify ($this->attrs); 
+
+    if($this->initially_was_account){
+      new log("modify","group/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+    }else{
+      new log("create","group/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); 
+    }   
+
+    show_ldap_error($ldap->get_error(), sprintf(_("Saving of groups/applications with dn '%s' failed."),$this->dn));
+
+    /* Optionally execute a command after we're done */
+    if ($this->initially_was_account == $this->is_account){
+      if ($this->is_modified){
+        $this->handle_post_events("modify");
+      }
+    } else {
+      $this->handle_post_events("add");
+    }
+
+  }
+
+  function check()
+  {
+    /* Call common method to give check the hook */
+    $message= plugin::check();
+
+    return ($message);
+  }
+
+
+  function reload()
+  {
+    /* Generate applist */
+    $this->apps= array();
+
+    /* Special handling for release managed apps */
+    $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
+    if(!empty($tmp) && count($this->Releases)){
+      $this->enableReleaseManagement = true;
+
+      /* Check if release is available */
+      $tmp = array_flip($this->Releases);
+      if(isset($tmp[$this->FAIrelease])){
+        $base =  $tmp[$this->FAIrelease];
+      }else{
+
+        /* Release is not available, check if there is an alternative */
+        $old_r =  $this->FAIrelease;
+        $k = key($tmp);
+
+        if(isset($tmp[$k])){
+      
+          /* We have found an alternative release name */
+          $r = $tmp[$k];
+          $this->FAIrelease = $k;
+          $base = $r; 
+
+          /* Display msg */
+          if(!(!$this->initially_was_account && $old_r =="/")){
+            print_red(sprintf(_("Can't resolve the release name '%s', setting release name to '%s'. Possibly the objects base has changed."),$old_r,$k));   
+          }
+        }else{
+          
+          /* There are no releases available ... */
+          print_red(_("There are no releases available. You will not be able to select another release."));
+          return;
+        }
+      }
+
+      /* Get applications for this release */
+      $base = preg_replace("/".get_ou('applicationou').".*$/",get_ou('applicationou').$this->curbase,$base);
+      $res = get_list("(objectClass=gosaApplication)","application",$base,array("*"));
+    }else{
+    
+      /* Get applications for this base */
+      $res = get_list("(objectClass=gosaApplication)","application",get_ou('applicationou').$this->curbase,array("*"));
+    }
+    
+    /* Append applications */
+    foreach($res as $attrs){
+      if (isset($attrs["description"][0])){    
+        $this->apps[$attrs["cn"][0]]=
+          $attrs["cn"][0]." (".
+          $attrs["description"][0].")";
+      } else {
+        $this->apps[$attrs["cn"][0]]=
+          $attrs["cn"][0];
+      }
+    }
+
+    /* Get all apps ... */
+    $res = get_list("objectClass=gosaApplication","application",$this->config->current['BASE'],array("gosaApplicationParameter","cn"),GL_SUBSEARCH); 
+    $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
+    $this->AllAppsForRelease = array();
+    if(!empty($tmp)){
+      $tmp = array_flip($this->Releases);
+      foreach($res as $attrs){
+        
+        $testdn = preg_replace("/".get_ou('applicationou').".*$/",get_ou('applicationou'),$attrs['dn']);
+        $testdn = preg_replace("/^[^,]+/","",$testdn);
+        $testdn = preg_replace("/^,/","",$testdn);
+
+        if($testdn == preg_replace("/".get_ou('applicationou').".*$/",get_ou('applicationou'),$tmp[$this->FAIrelease])){
+          $this->AllAppsForRelease[$attrs['dn']] = $attrs['cn'][0];
+          $this->AllAppsForReleaseParameter[$this->FAIrelease][$attrs['cn'][0]] = $attrs;
+        }
+      }
+    }else{
+      foreach($res as $attrs){
+        $this->AllAppsForRelease[$attrs['dn']] = $attrs['cn'][0];
+      }
+    }
+
+    natcasesort ($this->apps);
+    reset ($this->apps);
+
+    if(is_array($this->gosaMemberApplication))
+      foreach ($this->gosaMemberApplication as $cat){   
+        if(is_array($cat))
+          foreach($cat as $entry){
+            $this->used_apps[$entry['App']]= $entry['App'];
+          }
+      }
+  }
+
+
+  function addApp($cn)
+  {
+    if((isset($this->gosaMemberApplication[$this->curCatDir]))&&(is_array($this->gosaMemberApplication[$this->curCatDir]))){
+      foreach($this->gosaMemberApplication[$this->curCatDir] as $entry){
+        if($entry['App'] == $cn) return;
+      }
+    }
+    $this->gosaMemberApplication[$this->curCatDir][]= array("App"=>$cn);
+    $this->used_apps[$cn]=$cn;
+    $this->is_modified= TRUE;
+  }
+
+
+  function removeApp($cn)
+  {
+    $temp= array();
+    foreach ($this->gosaMemberApplication as $value){
+      if ($value != $cn){
+        $temp[]= $value;
+      }
+    }
+    $this->gosaMemberApplication= $temp;
+    $this->is_modified= TRUE;
+  }
+
+  function getParameters($app)
+  {
+    $tmp = $this->getReleases();
+    $ret = array();
+    if(in_array($this->FAIrelease,$tmp)){
+      $tmp2 = array_flip($tmp);
+      $base = $tmp2[$this->FAIrelease];
+      $ldap = $this->config->get_ldap_link();
+      $ldap->cd($this->config->current['BASE']);
+      $ldap->search("(&(objectClass=gosaApplication)(cn=".$app.")(gosaApplicationParameter=*))",array("gosaApplicationParameter"));
+      if($ldap->count()){
+        $attrs = $ldap->fetch();
+        for($i = 0 ; $i < $attrs['gosaApplicationParameter']['count'] ; $i ++ ){
+          $name = preg_replace("/:.*$/","",$attrs['gosaApplicationParameter'][$i]);
+          $ret[$name] = $name;
+        } 
+      }
+    }
+    return($ret);
+  }
+
+  function GetSubdirs($dir)
+  {
+    $ret = array();
+    $tmp1 = split("/",$this->curCatDir);
+    foreach($this->Categories as $path=>$cat){
+      $tmp2 = split("/",$path);
+      
+      if((empty($this->curCatDir))&&(!preg_match("/\//",$path))){
+        $abort = false;
+      }elseif(((count($tmp1))+1) == (count($tmp2))){
+        $abort = false;
+        for($i = 0 ; $i < count($tmp1) ; $i++){
+          if($tmp1[$i] != $tmp2[$i]){
+            $abort = true;
+          }
+        }
+      }else{
+        $abort= true;
+      }
+      if(!$abort){
+        $ret[$path]=$cat;
+      } 
+    }
+    return($ret);
+  }
+
+
+  function PrepareForCopyPaste($source)
+  {
+    $s = new appgroup($this->config,$source['dn']);
+    $this->FAIrelease = $this->InitialFAIrelease = $s->FAIrelease;
+    $this->gosaMemberApplication = $s->gosaMemberApplication;
+    $this->appoption = $s->appoption;
+    $this->Categories = $s->Categories;
+  }
+
+
+  /* Return plugin informations for acl handling  */ 
+  static function plInfo()
+  {
+    return (array(
+          "plShortName"   => _("Applications"),
+          "plDescription" => _("Group applications"),
+          "plSelfModify"  => FALSE,
+          "plDepends"     => array(),
+          "plPriority"    => 0,
+          "plSection"     => array("admin"),
+          "plCategory"    => array("groups"),
+          "plProvidedAcls"=> array(
+            "gosaMemberApplication"     => _("Application"),
+            "FAIrelease"                => _("Release"),
+            "gosaApplicationParameter"  => _("Application parameter"))
+          ));
+  }
+
+
+  function multiple_save_object()
+  {
+    if(isset($_POST['group_apps_multi'])){
+      $this->save_object(); 
+      plugin::multiple_save_object();    
+  
+      /* Get posts */
+      foreach(array("apps") as $attr){
+        if(isset($_POST['use_'.$attr])) {
+          $this->multi_boxes[] = $attr;
+        }
+      }
+    }
+  }
+  
+  function multiple_execute()
+  {
+    return($this->execute());
+  }
+
+  function init_multiple_support($attrs,$all)
+  {
+    // Do nothing here
+  }
+
+  function get_multi_edit_values()
+  {
+    $ret = plugin::get_multi_edit_values();
+
+    if(in_array("apps",$this->multi_boxes)){
+      $ret['gosaApplicationParameter'] = $this->gosaApplicationParameter;
+      $ret['Categories']               = $this->Categories;
+      $ret['gosaMemberApplication']    = $this->gosaMemberApplication;
+      $ret['FAIrelease']               = $this->FAIrelease;
+      $ret['appoption']                = $this->appoption;
+    }
+    return($ret);
+  }
+}
+// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
+?>
diff --git a/gosa-core/plugins/admin/groups/class_groupApplication.inc b/gosa-core/plugins/admin/groups/class_groupApplication.inc
deleted file mode 100644 (file)
index e10e4a6..0000000
+++ /dev/null
@@ -1,1288 +0,0 @@
-<?php
-class appgroup extends plugin
-{
-  /* CLI vars */
-  var $cli_summary= "Manage application groups";
-  var $cli_description= "Some longer text\nfor help";
-  var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
-
-  /* Appgroup attributes */
-  var $gosaMemberApplication= array();
-
-  /* Helpers */
-  var $departments        = "";       // All departments within $this->curbase;
-  var $apps               = array();  // All available applications
-  var $used_apps          = array();  // Specifies which applications are currently assigned 
-
-  var $option_name          = array();
-  var $option_value         = array();
-  var $appoption            = array();
-
-  var $table                  = "";
-  var $curbase                = "";
-  var $curCatDir                  ;
-  var $curCatDepth              =0;         //
-  var $Categories;
-
-  /* attribute list for save action */
-  var $attributes               = array("gosaMemberApplication","gosaApplicationParameter");
-  var $objectclasses            = array("gosaApplicationGroup");
-
-  var $FAIrelease               = "/";
-  var $InitialFAIrelease           = "/";
-  var $Releases                 = array();
-  var $enableReleaseManagement  = false;
-
-  var $AllAppsForRelease        = array();
-  var $AllAppsForReleaseParameter = array();
-  var $view_logged = FALSE;
-  var $CopyPasteVars            = array("Categories");
-  var $gosaApplicationParameter ;
-  var $ui                       = NULL;
-  var $no_release_acls          = false;
-
-  var $multiple_support         = TRUE;
-
-  function appgroup (&$config, $dn= NULL, $parent= NULL)
-  {
-   
-    /* Check if we have relase mangement enabled and prepare group application for release management */ 
-    $tmp = $config->search("faiManagement", "CLASS",array('menu','tabs'));
-    if(!empty($tmp)){
-      $this->enableReleaseManagement = true;
-      $this->objectclasses  [] = "FAIreleaseTag";
-      $this->attributes     [] = "FAIrelease";
-    }
-
-    plugin::plugin ($config, $dn, $parent);
-
-    /* set userinfo object */
-    $this->ui = get_userinfo();
-
-    /* Compatibility check 
-        In some case of old applikations with old release tag saving, 
-          we must reassign is_account state.
-          (Or if release management wasn't activated before creating this app) */
-    if($this->enableReleaseManagement){
-  
-      /* Release management is activated && this is a valid group app account,
-          but no release class was found, so activate is_account flag  */
-      if(isset($this->attrs['objectClass'])){
-        if($dn != "new" && ( in_array("gosaApplicationGroup",$this->attrs['objectClass'])) && 
-            (!in_array("FAIreleaseTag",$this->attrs['objectClass']))){
-          $this->is_account =true;
-        }
-      }
-    }
-    
-    /* Load member applications */
-    if (isset ($this->attrs["gosaMemberApplication"][0])){
-      $this->gosaMemberApplication = array();
-      for ($i= 0; $i<$this->attrs["gosaMemberApplication"]["count"]; $i++){
-        $this->gosaMemberApplication[]=
-          $this->attrs["gosaMemberApplication"][$i];
-      }
-    }
-
-    /* Load application options */
-    if (isset($this->attrs['gosaApplicationParameter'])){
-      for ($i= 0; $i<$this->attrs['gosaApplicationParameter']['count']; $i++){
-        $option= preg_replace('/^[^:]+:/', '',
-            $this->attrs['gosaApplicationParameter'][$i]);
-        $name= preg_replace('/:.*$/', '',
-            $this->attrs['gosaApplicationParameter'][$i]);
-        $this->appoption[$name]= $option;
-      }
-    }
-
-    /* Parse MemberApplication*/
-    $tmp    = array();
-    $tmp2   = array();
-    $prios  = array();
-    $cats   = array();
-
-    foreach($this->gosaMemberApplication as $memberApp){
-      if(preg_match("/\|/i",$memberApp)){
-    
-        $tmp = split("\|",$memberApp);
-        if(!empty($tmp[0])){
-          $tmp2[$tmp[1]][$tmp[2]] = array("App"=>$tmp[0]);
-        }
-        if(!empty($tmp[1])){
-          $n = split("/",$tmp[1]);
-          $c = count($n);
-          $cats [$tmp[1]] = $n[$c-1];
-        }
-        $prios[$tmp[1]][$tmp[2]] = $tmp[2];
-      }else{
-        $tmp2[]['App'] = $memberApp;
-      }
-    }
-
-    /* Assign collected category and application settings */
-    $this->Categories = $cats;
-    $this->gosaMemberApplication = $tmp2;
-
-    /* Sort application by category */
-    $cats[""]="";
-    foreach($cats as $cat ){
-      if((isset($prios[$cat]))&&(count($prios[$cat]))){
-        $max = max($prios[$cat]);
-        $min = 1;//min($prios[$cat]);  
-        $last = false;
-        for($i = $min ; $i < $max ; $i++){
-          if(!isset($prios[$cat][$i])){
-            if($last == false){
-              $this->gosaMemberApplication[$cat][$i]['App'] = "__SEPARATOR__".$i;
-            
-              $last = true;
-            }
-          }else{
-            $last = false;
-          }
-        }
-      }
-    } 
-
-    /* Sort application by priority */
-    $tmp = array();
-    foreach($this->gosaMemberApplication as $key =>  $entries){
-      ksort ($entries);
-      foreach($entries as $entry){
-        $tmp[$key][]= $entry;
-      }
-    }
-    $this->gosaMemberApplication = $tmp;
-    $this->curbase = $this->config->current['BASE'];
-    
-    /* Get required release informations */
-    if($this->enableReleaseManagement){
-      $this->InitialFAIrelease  = $this->FAIrelease;
-      $this->Releases           = $this->getReleases();
-    }
-
-  }
-
-
-  /* Combine new array */
-  function combineArrays($ar0,$ar1,$ar2)
-  {
-    $ret = array();
-    if(is_array($ar0))
-    foreach($ar0 as $ar => $a){
-        $ret[$ar]=$a;
-    }
-    if(is_array($ar1))
-    foreach($ar1 as $ar => $a){
-        $ret[$ar]=$a;
-    }
-    if(is_array($ar2))
-    foreach($ar2 as $ar => $a){
-        $ret[$ar]=$a;
-    }
-    return($ret);
-  }
-
-  /* Returns element position within given array */
-  function getpos($atr,$attrs)
-  {
-    $i = 0;
-    foreach($attrs as $attr => $name)    {
-      $i++;
-      if($attr == $atr){
-        return($i);
-      }
-    }
-    return(-1);
-  }
-
-
-  /* Check current combination of application && release 
-      Are all application available?, application parameter changed? ... */
-  function diffAppsInReleases()
-  {
-    /* Only diff if it is required  */
-    $ret =array();
-
-    /* If current release has changed */
-    if($this->FAIrelease != $this->InitialFAIrelease){
-
-      /* Walk through all apps which are currently displayed */
-      if(isset($this->gosaMemberApplication[$this->curCatDir])){
-
-        foreach($this->gosaMemberApplication[$this->curCatDir] as $entry){
-
-          /* If application is also available in new release, check if parameter differs */
-          if(in_array($entry['App'],$this->AllAppsForRelease)){ 
-
-            $old = array();   // Old application parameter
-            $new = array();   // New parameters 
-
-            /* There are possibly no parameters specified */
-            if(isset($this->AllAppsForReleaseParameter[$this->InitialFAIrelease][$entry['App']])){
-              $old = $this->AllAppsForReleaseParameter[$this->InitialFAIrelease][$entry['App']];
-            }
-
-            if(isset($this->AllAppsForReleaseParameter[$this->FAIrelease][$entry['App']])){
-              $new = $this->AllAppsForReleaseParameter[$this->FAIrelease][$entry['App']];
-            }
-
-            /*  Both (old & new) have no gosaApplicationParameter
-             */
-            if((!isset($old['gosaApplicationParameter'])) && (!isset($new['gosaApplicationParameter']))){
-              $ret[$entry['App']] = false; 
-
-              /* Both got gosaApplicationParameter */
-            }elseif((isset($old['gosaApplicationParameter'])) && (isset($new['gosaApplicationParameter']))){
-              if(array_differs($old['gosaApplicationParameter'],$new['gosaApplicationParameter'])){
-                $ret[$entry['App']]  = true;
-              }else{
-                $ret[$entry['App']]  = false;
-              }
-            }
-            /* Initially had gosaApplicationParameter bot in new release not */
-          }elseif((isset($old['gosaApplicationParameter'])) && (!isset($new['gosaApplicationParameter']))){
-            $ret[$entry['App']]  = true;
-
-            /* Old release had no gosaApplicationParameter but new got some */
-          }elseif((!isset($old['gosaApplicationParameter'])) && (isset($new['gosaApplicationParameter']))){
-            $ret[$entry['App']]  = true;
-          }
-        }
-      }
-    }
-    return($ret);
-  }
-
-  /* TRansports the geiven Arraykey one position up*/
-  function ArrayUp($atr,$attrs)
-  {
-    $ret = $attrs;
-    $pos = $this->getpos($atr,$attrs) ;
-    $cn = count($attrs);
-    if(!(($pos == -1)||($pos == 1))){
-      $before = array_slice($attrs,0,($pos-2));
-      $mitte  = array_reverse(array_slice($attrs,($pos-2),2));
-      $unten  = array_slice($attrs,$pos);
-      $ret = array();
-      $ret = $this->combineArrays($before,$mitte,$unten);
-    }
-    return($ret);
-  }
-
-
-  /* TRansports the geiven Arraykey one position up*/
-  function ArrayDown($atr,$attrs)
-  {
-    $ret = $attrs;
-    $pos = $this->getpos($atr,$attrs) ;
-    $cn = count($attrs);
-    if(!(($pos == -1)||($pos == $cn))){
-      $before = array_slice($attrs,0,($pos-1));
-      $mitte  = array_reverse(array_slice($attrs,($pos-1),2));
-      $unten  = array_slice($attrs,($pos+1));
-      $ret = array();
-      $ret = $this->combineArrays($before,$mitte,$unten);
-    }
-    return($ret);
-  }
-
-    
-  /* Sort category on position up  */
-  function catUp($id)
-  {
-    /* Get all cats depinding on current dir */
-    $cats = $this->GetSubdirs($this->curCatDir);
-    $newcats =$this->ArrayUp($id,$cats);
-    foreach($newcats as $cat => $name){
-      unset($this->Categories[$cat]);
-    }
-    foreach($newcats as $cat => $name){
-      $this->Categories[$cat]=$name;
-    }
-  }
-
-
-  /* Sort category on position down */
-  function catDown($id)
-  {
-    /* Get all cats depinding on current dir */
-    $cats = $this->GetSubdirs($this->curCatDir);
-    $newcats =$this->ArrayDown($id,$cats);
-    foreach($newcats as $cat => $name){
-      unset($this->Categories[$cat]);
-    }
-    foreach($newcats as $cat => $name){
-      $this->Categories[$cat]=$name;
-    }
-  }
-
-
-  /* Increase application priority */
-  function getOneUp($appl)
-  { 
-    $cat  = $this->curCatDir;
-    $apps = $this->gosaMemberApplication[$cat];
-    $appsA = array();
-    foreach ($apps as $appkey => $name){
-      $appsA[$name['App']] =$name['App'];
-    }
-    $result = $this->ArrayUp($appl,$appsA);
-    $ret = array();
-    foreach($result as $app){
-      $ret[]=array("App"=>$app);
-    }
-    $this->gosaMemberApplication[$cat] = $ret;
-  }
-
-
-  /* Decrease application priority */
-  function getOneDown($appl)
-  {
-    $cat  = $this->curCatDir;
-    $apps = $this->gosaMemberApplication[$cat];
-    $appsA = array();
-    foreach ($apps as $appkey => $name){
-      $appsA[$name['App']] =$name['App'];
-    }
-    $result = $this->ArrayDown($appl,$appsA);
-    $ret = array();
-    foreach($result as $app){
-      $ret[]=array("App"=>$app);
-    }
-    $this->gosaMemberApplication[$cat] = $ret;
-  } 
-
-
-  /* Add seperator to application list */
-  function AddSeperator($id)
-  {
-    $found  = false;
-    $cat    = "";
-    $tmp = array();
-    foreach($this->gosaMemberApplication[$this->curCatDir] as $appID => $app){  
-      $tmp[] = $app;    
-      if(($app['App'] == $id)&&(!$found)){
-        $cnt = count($this->gosaMemberApplication[$this->curCatDir]);
-        $tmp[] = array("App" => "__SEPARATOR__".($cnt+1));
-        $found = true;
-      }
-    }
-    if($found){
-      $this->gosaMemberApplication[$this->curCatDir]=$tmp;
-    }
-  }
-
-
-  /* Check if application acls are readable */
-  function check_acls()
-  {
-    return(count($this->ui->get_module_departments("application")));
-  }
-
-
-  function execute()
-  {
-    /* Call parent execute */
-    plugin::execute();
-    $display = "";
-
-    /* Log view */
-    if($this->is_account && !$this->view_logged){
-      $this->view_logged = TRUE;
-      new log("view","groups/".get_class($this),$this->dn);
-    }
-
-    /* Account state settings - Skip if we are editing multiple entries */
-    if(!$this->multiple_support_active){ 
-
-      /* Do we need to flip is_account state? */
-      if(isset($_POST['modify_state'])){
-        if($this->is_account && $this->acl_is_removeable()){
-          $this->is_account= FALSE;
-        }elseif(!$this->is_account && $this->acl_is_createable()){
-          $this->is_account= TRUE;
-        }
-      }
-
-      /* Do we represent a valid group? */
-      if (!$this->is_account && $this->parent === NULL){
-        $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\">&nbsp;<b>".
-          _("This 'dn' is no appgroup.")."</b>";
-        return ($display);
-      }
-
-      /* Show tab dialog headers */
-      $display= "";
-      if ($this->parent !== NULL){
-        if ($this->is_account){
-          $display= $this->show_disable_header(_("Remove applications"),
-              _("This group has application features enabled. You can disable them by clicking below."));
-        } else {
-          $display.= $this->show_enable_header(_("Create applications"),
-              _("This group has application features disabled. You can enable them by clicking below."));
-          return ($display);
-        }
-      }
-    }
-  
-    /* Check acl, applications must be readable */
-    if(!$this->check_acls()){
-      $display .= "<img src='images/button_cancel.png' alt='"._("ACL")."' class='center'>
-                  <b>"._("Insufficient permissions")."</b>
-                  <p>".
-                  _("You do not have permission to query application entries. All your changes will not be saved.").
-                  "</p><p class='seperator'>&nbsp;</p>";
-      $this->no_release_acls = true;
-    }
-    /* Check if department was selected */ 
-    if((isset($_GET['act']))&&($_GET['act']=="depopen")){
-      $dep = base64_decode($_GET['depid']); 
-      $this->curbase =$dep;
-    }
-
-    /* Check if category was selected */
-    if((isset($_GET['act']))&&($_GET['act']=="open") && (empty($_GET['id']) || isset($this->Categories[base64_decode($_GET['id'])]))){
-      $this->curCatDir = base64_decode($_GET['id']);
-    }
-
-
-    
-
-    /* Add Categorie */ 
-    if((isset($_POST['AddCat']))&&(isset($_POST['CatName']))&&(!empty($_POST['CatName']))){
-
-      /* Only allow adding a category, if it is allowed */  
-      if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
-
-        if(preg_match("/[\\\\\/]/i",$_POST['CatName'])){
-          print_red(_("Invalid character in category name."));
-        }elseif(!in_array($_POST['CatName'],$this->Categories)){ 
-          if(empty($this->curCatDir)){
-            $this->Categories[$_POST['CatName']]=$_POST['CatName'];
-          }else{
-            $this->Categories[$this->curCatDir."/".$_POST['CatName']]=$_POST['CatName'];
-          }
-        }else{
-          print_red(_("The specified category already exists."));
-        }
-      }
-    }
-
-
-    $this->reload();
-    $this->diffAppsInReleases();
-
-    /* Check POST variables for commands 
-        to add/remove some applications */
-    $only_once = false;
-    if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
-
-      /* Walk through posts */
-      foreach($_POST as $name => $value){
-
-        /* Add a seperator to current category */
-        if((preg_match("/AddSep_/",$name))&&(!$only_once)){
-          $only_once = true;
-          $n = preg_replace("/AddSep_/","",$name);
-          $val= preg_replace("/_.*$/","",$n);
-          $this->AddSeperator($val);
-        }
-
-        /* Delete application | seperator entry */
-        if((preg_match("/DelApp_/",$name))&&(!$only_once)){
-          $only_once = true;
-
-          if(preg_match("/DelApp___SEPARATOR__/",$name)) {
-            $n=  preg_replace("/DelApp___SEPARATOR__/","",$name);
-            $val= "__SEPARATOR__".preg_replace("/_.*$/","",$n);
-          }else{
-            $n = preg_replace("/DelApp_/","",$name);
-            $val= preg_replace("/_.*$/","",$n);
-          }
-
-          foreach($this->gosaMemberApplication as $key =>  $cat){
-            foreach($cat as $key2 => $app){
-              if($app['App'] == $val){
-                unset($this->gosaMemberApplication[$key][$key2]);
-                if(isset($this->used_apps[$val])){
-                  foreach($this->getParameters($val) as $para){
-                    if(isset($this->appoption[$para])){
-                      unset($this->appoption[$para]);
-                    }
-                  }
-                  unset($this->used_apps[$val]);
-                }
-              }
-            }
-          }
-        }
-
-        if(preg_match("/DelCat_/",$name) && !$only_once){
-          $only_once =TRUE;
-          $cat = preg_replace("/DelCat_/","",$name);
-          $cat = trim(base64_decode( preg_replace("/_.*$/","",$cat)));
-
-          $free_apps = array();
-
-          if(isset($this->gosaMemberApplication[$cat]) && is_array($this->gosaMemberApplication[$cat])){
-            foreach($this->gosaMemberApplication[$cat] as $app){
-              $free_apps[] = $app['App'];
-            }
-            unset($this->gosaMemberApplication[$cat]);
-            unset($this->Categories[$cat]);
-          }
-          foreach($this->Categories as $key => $name){
-            if(preg_match("/^".normalizePreg($cat)."\/.*/",$key)){
-              foreach($this->gosaMemberApplication[$key] as $app){
-                $free_apps[] = $app['App'];
-              }
-              unset($this->gosaMemberApplication[$key]);
-              unset($this->Categories[$key]);
-            }
-          }
-          foreach($free_apps as $app){
-            if(isset($this->used_apps[$app])){
-              unset($this->used_apps[$app]);
-            }
-          }
-        }
-
-        /* Edit application parameter */
-        if((preg_match("/EdiApp_/",$name))&&(!$only_once)){
-
-          $only_once = true;
-          $appname = $value;
-          $appname = preg_replace("/EdiApp_/","",$name);  
-          $appname = preg_replace("/_.*$/","",$appname);
-
-          /* We've got the appname, get parameters from ldap */
-          $ldap= $this->config->get_ldap_link();
-
-          /* Check if we have release management enabled */
-          $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
-          if(!empty($tmp)){
-    
-            /* Get application parameter from ldap */
-            $tmp = array_flip($this->Releases);
-            $base = $tmp[$this->FAIrelease];
-            $ldap->cd($base);
-            $ldap->search("(&(objectClass=gosaApplication)(cn=$appname))",array("gosaApplicationParameter"));
-            $found = "";
-            while($attrs = $ldap->fetch()) {
-              if(preg_match("/cn=".$appname.",".$base."/",$attrs['dn'])){
-                $found = $attrs['dn'];
-              }
-            }
-            $ldap->cat($found, array("gosaApplicationParameter"));
-          }else{
-
-            /* Get application parameter from ldap */
-            $ldap->cd($this->config->current['BASE']);
-            $ldap->search("(&(objectClass=gosaApplication)(cn=$appname))",array("gosaApplicationParameter"));
-          }
-
-          /* Check if this application is unique */
-          if ($ldap->count() != 1){
-            print_red (_("The selected application name is not uniq. Please check your LDAP."));
-          } else {
-
-            /* Get parameter */
-            $attrs= $ldap->fetch();
-            if(isset($attrs['gosaApplicationParameter'])){
-              $this->dialog= TRUE;
-
-              /* Fill name and value arrays */
-              for ($i= 0; $i<$attrs['gosaApplicationParameter']['count']; $i++){
-                $option= preg_replace('/^[^:]+:/', '',
-                    $attrs['gosaApplicationParameter'][$i]);
-                $name= preg_replace('/:.*$/', '', 
-                    $attrs['gosaApplicationParameter'][$i]);
-                $this->option_name[$i]= $name;
-
-                /* Fill with values from application, default should be
-                   loaded by the external scripts */
-                if (isset($this->appoption[$name])){
-                  $this->option_value[$i]= $this->appoption[$name];
-                }
-              }
-
-              /* Create edit field */
-              $table= "<table summary=\"\">";
-              for ($i= 0; $i < count($this->option_name); $i++){
-                if (isset($this->option_value[$i])){
-                  $value= $this->option_value[$i];
-                } else {
-                  $value= "";
-                }
-                $table.="<tr><td>".$this->option_name[$i]."</td><td>".
-                  "<input name=\"value$i\" size=60 maxlength=250 ".
-                  "value=\"".$value."\"><br></td></tr>";
-              }
-              $table.= "</table>";
-              $this->table= $table;
-            } else {
-              print_red (_("The selected application has no options."));
-            }
-          }
-        }
-      }
-    }
-
-    /* Add multiple */
-    if(isset($_POST['AddApps'])){
-      foreach($_POST as $name => $value){
-        if(preg_match("/AddApp_/",$name)){
-          $app = preg_replace("/AddApp_/","",$name);
-          $this->addApp($app);
-        }
-      }
-    }
-
-    /* Add application with post */
-    if((isset($_GET['act']))&&($_GET['act']=="add")){
-      $this->used_apps[$_GET['id']]= $_GET['id'];
-      asort($this->used_apps);
-      $this->addApp($_GET['id']);
-    }
-
-    /* Cancel edit options? */
-    if (isset($_POST['edit_options_cancel'])){
-      $this->dialog= FALSE;
-    }
-
-    /* Finish edit options? */
-    if (isset($_POST['edit_options_finish'])){
-      $this->dialog= FALSE;
-
-      /* Save informations passed by the user */
-      $this->option_value= array();
-      for ($i= 0; $i<count($this->option_name); $i++){
-        $this->appoption[$this->option_name[$i]]= $_POST["value$i"];
-        $this->is_modified= TRUE;
-      }
-    }
-
-    /* Prepare templating stuff */
-    $smarty= get_smarty();
-    $smarty->assign("used_apps", $this->used_apps);
-    $apps= array();
-    foreach ($this->apps as $key => $value){
-      if (!array_key_exists($key, $this->used_apps)){
-        $apps["$key"]= "$value";
-      }
-    }
-
-
-    /* Create application list */
-    $div = new divSelectBox("appgroup");    
-    $div->SetHeight(300);
-    $departments = array();
-    $res = get_list("(objectClass=gosaDepartment)", "application", $this->curbase,array("description","cn","ou"),GL_SIZELIMIT);
-    foreach($res as $value){
-      $fdn = $value['dn'];
-      $fdn = preg_replace("/".normalizePreg($this->curbase)."/","",$fdn);
-      $fdn= @LDAP::fix($fdn);
-      if($value["description"][0]!=".."){
-        $departments[$value['dn']]= convert_department_dn($fdn)." - [".$value["description"][0]."]";
-      }else{
-        $departments[$value['dn']]=convert_department_dn($fdn)." ["._("Back")."]";
-      }
-    }
-
-    /* Create 'open' and 'add' links */
-    if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
-      $linkadd  = "<a href='?plug=".$_GET['plug']."&amp;act=add&amp;id=%s'>%s</a>";
-    }else{
-      $linkadd = "%s";
-    }
-    $linkopen = "<a href='?plug=".$_GET['plug']."&amp;act=depopen&amp;depid=%s'>%s</a>";
-
-    /* Create base back entry */
-    $base_back = preg_replace("/^[^,]+,/","",$this->curbase);
-    if((strlen($base_back)>= strlen($this->config->current['BASE']))&&($this->curbase!=$this->config->current['BASE'])){
-      $div->AddEntry(array(
-            array("string"=>sprintf($linkopen,base64_encode($base_back),".. ["._("back")."]"),
-              "attach"=>"style='border:0px;'")
-            ));
-    }
-
-    /* Append departments for current base */
-    foreach($departments as $key => $app){
-      $div->AddEntry(array(
-            array("string"=>"<img class='center' src='images/folder.png' alt='"._("department")."'>&nbsp;".sprintf($linkopen,base64_encode($key),$app),
-              "attach"=>"style='border:0px;'")
-            ));
-    }
-
-    /* Add applications found on this base */
-    foreach($apps as $key => $app){
-      $div->AddEntry(array(
-            array("string"=>sprintf("<input class='center' type='checkbox' value='1' name='AddApp_%s'>",$key).
-              "<img class='center' src='images/select_application.png' alt='"._("application")."'>&nbsp;".sprintf($linkadd,$key,$app),
-              "attach"=>"style='border:0px;'")
-            ));
-    }
-
-    /* Create list of used/assigned applications */
-    $div2 = new divSelectBox("appgroup");
-    $div2->SetHeight(300);
-
-    /* Check acls to create "edit/remove" category links */
-    if(!$this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
-      $linkopen       = "<img class='center' src='images/folder.png' alt=\"\">&nbsp;<a href='?plug=".$_GET['plug']."&amp;act=open&amp;id=%s'>%s</a>";
-      $catremove      = "&nbsp;<img src='images/empty.png' alt='&nbsp;'>";
-      $catupdown      = "";
-    }else{
-      $linkopen       = "<img class='center' src='images/folder.png' alt=\"\">&nbsp;<a href='?plug=".$_GET['plug']."&amp;act=open&amp;id=%s'>%s</a>";
-      $catremove      = "&nbsp;<input type='image' src='images/edittrash.png' title='"._("Delete entry")."' name='DelCat_%s' value='%s'>";
-      $catupdown      = "<a href='?plug=".$_GET['plug']."&amp;act=cat_up&amp;id=%s'>".
-        "<img align='top' alt=\"\" src='images/sort_up.png' border=0 title='"._("Move up")."'>".
-        "</a>&nbsp;".
-        "<a href='?plug=".$_GET['plug']."&amp;act=cat_down&amp;id=%s'>".
-        "<img alt=\"\" src='images/sort_down.png' title='"._("Move down")."' border=0>".
-        "</a>";
-    }
-
-    /* Add back category for current category */
-    if(empty($this->curCatDir)){
-      $cnt =0;
-    }else{
-      $cnt = count(split("/",$this->curCatDir));
-      $tmp = split("/",$this->curCatDir);
-      $bbk = "";
-      for($i = 0 ; $i < ($cnt -1 ) ; $i++){
-        $bbk .= $tmp[$i]."/";
-      }
-      $bbk = preg_replace("/\/$/","",$bbk);
-      $div2 ->AddEntry(array(array("string"=>sprintf($linkopen,base64_encode($bbk),".. ["._("Back")."]")),array("string"=>"&nbsp;","attach"=>"style='border-right:0px;'")));
-    }
-
-    /* Add sub categories */ 
-    $this->GetSubdirs($this->curCatDir);
-    foreach($this->GetSubdirs($this->curCatDir) as $path => $name){
-      $div2 ->AddEntry(array( 
-            array("string"=>sprintf($linkopen,base64_encode($path),$name)),
-            array("string"=>preg_replace("/%s/",base64_encode($path),$catupdown.$catremove),
-              "attach"=>"align='right' style='width:80px;border-right:0px;'"))); 
-    }
-
-    /* Create priority & seperator links */
-    $separator ="<hr size=1>"; 
-    if($this->acl_is_writeable("gosaMemberApplication",$this->no_release_acls)){
-      $sep      = "<input type='image' src='images/back.png' title='"._("Insert seperator")."' value='%s' name='AddSep_%s'>";
-      $upudown  = "<a href='?plug=".$_GET['plug']."&amp;act=one_up&amp;id=%s'>".
-                  " <img alt='{t}sort{/t}' align='top' src='images/sort_up.png' title='"._("Move up")."' border=0>".
-                  "</a>&nbsp;".
-                  "<a href='?plug=".$_GET['plug']."&amp;act=one_down&amp;id=%s'>".
-                  " <img alt='{t}sort{/t}' src='images/sort_down.png' title='"._("Move down")."' border=0>".
-                  "</a>&nbsp;".
-                  "<input type='image' src='images/edittrash.png' title='"._("Delete entry")."' name='DelApp_%s' value='%s' alt='{t}delete{/t}' >";
-    }else{
-      $sep      = "";
-      $upudown  = "";
-    }
-     
-    /* Create edit link */ 
-    if($this->acl_is_writeable("gosaApplicationParameter",$this->no_release_acls)){
-      $edit=      "&nbsp;<input type='image' src='images/edit.png' title='"._("Edit entry")."' name='EdiApp_%s' value='%s' alt='{t}edit{/t}' >";
-    }else{
-      $edit=      "";
-    }
-
-    /* Get differences to mark those entries that have changed from last edit. */
-    $Differences = $this->diffAppsInReleases();
-
-    /* Walk through entries an append them to list */
-    if(isset($this->gosaMemberApplication[$this->curCatDir])){
-      foreach($this->gosaMemberApplication[$this->curCatDir] as $cat => $entry){
-
-        /* Add seperator */ 
-        if(preg_match("/__SEPARATOR__/",$entry['App'])){
-          $div2 ->AddEntry(array(array("string"=>$separator),
-                array("string"=>preg_replace("/\%s/",htmlentities($entry['App']),$upudown),"attach"=>"align='right' style='border-right:0px;'")));
-        }else{
-
-          /* Add application */
-
-          $image = "";
-          /* Check if application was available within selected release
-           *  or application list if release management is not active
-           */
-          if(!in_array($entry['App'],$this->AllAppsForRelease)){
-
-            /*  release managent is active
-             */
-            if(!$this->enableReleaseManagement){
-              $image = "<img class='center' alt='R' src='images/select_invalid_application.png' 
-                          title='"._("This application is no longer available.")."'>&nbsp;";
-            }else{
-              $image = "<img class='center' alt='F' src='images/select_invalid_application.png' 
-                          title=\"".sprintf(_("This application is not available in any release named %s."),$this->FAIrelease)."\">&nbsp;";
-            }
-      
-          }elseif(isset($Differences[$entry['App']]) && ($Differences[$entry['App']] == true)) {
-            $entry['App'].=" <i>["._("Check parameter")."]</i>";
-              $image = "<img class='center' src='images/select_invalid_application.png' 
-                          title='"._("This application has changed parameters.")."'>&nbsp;";
-          }else{
-            $image = "<img class='center' src='images/select_application.png' alt=\"\">&nbsp;"; 
-          }
-          
-          $div2->AddEntry(array(array("string"=>sprintf($image."%s",$entry['App'])),
-                array("string"=>preg_replace("/\%s/",htmlentities($entry['App']),$sep.$edit.$upudown),
-                      "attach"=>"align='right' style='width:100px;border-right:0px;'")));
-        }
-      }
-    }
-
-    /* Assign created div lists to template */
-    $smarty->assign("UsedApps", $div2->DrawList());
-    $smarty->assign("List", $div->DrawList());
-    $smarty->assign("apps", $apps);
-   
-    $smarty->assign("enableReleaseManagement",$this->enableReleaseManagement);
-
-    $smarty->assign("ReleaseSelectAble", false);
-    $smarty->assign("Release", $this->FAIrelease);
-    if($this->enableReleaseManagement){
-      $smarty->assign("FAIrelease",  $this->FAIrelease);
-      $smarty->assign("Releases", $this->Releases);
-
-      if(!$this->no_release_acls && count($this->Releases)){
-        $smarty->assign("ReleaseSelectAble", true);
-      }
-    }
-  
-    /* Set acls to  template */
-    $tmp = $this->plInfo();
-    foreach($tmp['plProvidedAcls'] as $acl => $translation){
-      $smarty->assign($acl."ACL",$this->getacl($acl,$this->no_release_acls));
-    }
-
-    /* Assign multiple edit values */
-    foreach(array("apps") as $attr){
-      if(in_array($attr,$this->multi_boxes)){
-        $smarty->assign("use_".$attr,TRUE);
-      }else{
-        $smarty->assign("use_".$attr,FALSE);
-      }
-    }
-    $smarty->assign("multiple_support",$this->multiple_support_active);
-
-    /* Show main page */
-    if (($this->dialog)){
-      $smarty->assign("table", $this->table);
-      $display.= $smarty->fetch (get_template_path('application_options.tpl', TRUE,dirname(__FILE__)));
-    } else {
-      $display.= $smarty->fetch (get_template_path('application.tpl', TRUE,dirname(__FILE__)));
-    }
-    return ($display);
-  }
-
-
-  function getReleases()
-  {
-    /* Only display those releases that we are able to read */
-    $dn     = $this->config->current['BASE'];
-    $filter = "(&(objectClass=organizationalUnit)(objectClass=FAIbranch))";
-    $res    = get_list($filter,"application", $dn, array("ou"), GL_SUBSEARCH);
-
-    $ret =array();
-    foreach($res as $attrs){
-      if(preg_match("/".get_ou('applicationou')."/",$attrs['dn'])){
-        $bb     = preg_replace("/".get_ou('applicationou').".*/","",$attrs['dn']);
-        $parts  = array_reverse(split("ou=",$bb));
-
-        $str ="";
-        foreach($parts as $part){
-          if(empty($part)) {
-            continue;
-          }
-          $str .= str_replace(",","",$part)."/";
-        }    
-        $name = preg_replace("/\/$/","",$str);
-        if(empty($name)) {
-          $name ="/";
-        }
-        $ret[$attrs['dn']] = $name;
-      }
-    }
-    natcasesort($ret);
-    return($ret);
-  }
-
-  function save_object()
-  {
-
-    /* Move category one position up or down */
-    if((isset($_GET['act']))&&(($_GET['act'] == "cat_up")||($_GET['act']=="cat_down"))){
-      if($_GET['act']=="cat_up"){
-        $this->catUp(base64_decode($_GET['id']));
-      }
-      if($_GET['act']=="cat_down"){
-        $this->catDown(base64_decode($_GET['id']));
-      }
-    }
-
-    /* Move application one position up or down */
-    if((isset($_GET['act']))&&(($_GET['act'] == "one_up")||($_GET['act']=="one_down"))){
-      if(isset($_GET['id'])){
-        $id   = $_GET['id'];
-        $act  = $_GET['act']; 
-
-        if($act == "one_up"){
-          $this->getOneUp($id);
-        }elseif($act == "one_down")   { 
-          $this->getOneDown($id);
-        }
-      }
-    }
-
-
-    plugin::save_object();
-  }
-
-  function remove_from_parent()
-  {
-    if(!$this->initially_was_account){
-      return;
-    }
-
-    plugin::remove_from_parent();
-
-    $ldap= $this->config->get_ldap_link();
-    $ldap->cd($this->dn);
-    $this->cleanup();
-    
-    $ldap->modify ($this->attrs); 
-    new log("remove","group/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
-    show_ldap_error($ldap->get_error(), sprintf(_("Removing of groups/applications with dn '%s' failed."),$this->dn));
-
-    /* Optionally execute a command after we're done */
-    $this->handle_post_events("remove");
-  }
-
-
-  /* Save to LDAP */
-  function save()
-  {
-    /* Skip saving application settings, if we do not have release acls */
-    if($this->no_release_acls && $this->enableReleaseManagement){
-      new log("security","groups/".get_class($this),$this->dn,array(),"Skip saving group application extension. Caused by insufficient acls");
-      
-      return;
-    }
-
-    plugin::save();
-
-    /* Copy members */
-    $tmp = array("" => "");
-    $tmp = array_merge($tmp,$this->Categories);
-
-    $this->attrs["gosaMemberApplication"]= array();
-    $this->attrs["gosaApplicationParameter"]= array();
-    $cat_id= 0 ;
-    foreach($tmp as $name => $cats){
-      $i =0;
-      if(isset($this->gosaMemberApplication[$name])){
-        foreach($this->gosaMemberApplication[$name] as $entry){
-          if(!preg_match("/__SEPARATOR__/",$entry['App'])){
-            $this->attrs["gosaMemberApplication"][]= $entry['App']."|".$name."|".$i;
-            $i ++;
-          }
-        }
-      }
-      if(($i==0)&&(!empty($name))){
-        $this->attrs["gosaMemberApplication"][]= "|".$name."|".$cat_id;
-      }
-      $cat_id++;
-    }
-
-
-
-    /* Are there application parameters to be saved */
-    $this->attrs['gosaApplicationParameter']= array();
-    foreach($this->appoption as $name => $value){
-      if ($value != ""){
-        $this->attrs['gosaApplicationParameter'][]= "$name:$value";
-      }
-    }
-
-    /* Write back to LDAP */
-    $ldap= $this->config->get_ldap_link();
-    $ldap->cd($this->dn);
-    $this->cleanup();
-    $ldap->modify ($this->attrs); 
-
-    if($this->initially_was_account){
-      new log("modify","group/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
-    }else{
-      new log("create","group/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); 
-    }   
-
-    show_ldap_error($ldap->get_error(), sprintf(_("Saving of groups/applications with dn '%s' failed."),$this->dn));
-
-    /* Optionally execute a command after we're done */
-    if ($this->initially_was_account == $this->is_account){
-      if ($this->is_modified){
-        $this->handle_post_events("modify");
-      }
-    } else {
-      $this->handle_post_events("add");
-    }
-
-  }
-
-  function check()
-  {
-    /* Call common method to give check the hook */
-    $message= plugin::check();
-
-    return ($message);
-  }
-
-
-  function reload()
-  {
-    /* Generate applist */
-    $this->apps= array();
-
-    /* Special handling for release managed apps */
-    $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
-    if(!empty($tmp) && count($this->Releases)){
-      $this->enableReleaseManagement = true;
-
-      /* Check if release is available */
-      $tmp = array_flip($this->Releases);
-      if(isset($tmp[$this->FAIrelease])){
-        $base =  $tmp[$this->FAIrelease];
-      }else{
-
-        /* Release is not available, check if there is an alternative */
-        $old_r =  $this->FAIrelease;
-        $k = key($tmp);
-
-        if(isset($tmp[$k])){
-      
-          /* We have found an alternative release name */
-          $r = $tmp[$k];
-          $this->FAIrelease = $k;
-          $base = $r; 
-
-          /* Display msg */
-          if(!(!$this->initially_was_account && $old_r =="/")){
-            print_red(sprintf(_("Can't resolve the release name '%s', setting release name to '%s'. Possibly the objects base has changed."),$old_r,$k));   
-          }
-        }else{
-          
-          /* There are no releases available ... */
-          print_red(_("There are no releases available. You will not be able to select another release."));
-          return;
-        }
-      }
-
-      /* Get applications for this release */
-      $base = preg_replace("/".get_ou('applicationou').".*$/",get_ou('applicationou').$this->curbase,$base);
-      $res = get_list("(objectClass=gosaApplication)","application",$base,array("*"));
-    }else{
-    
-      /* Get applications for this base */
-      $res = get_list("(objectClass=gosaApplication)","application",get_ou('applicationou').$this->curbase,array("*"));
-    }
-    
-    /* Append applications */
-    foreach($res as $attrs){
-      if (isset($attrs["description"][0])){    
-        $this->apps[$attrs["cn"][0]]=
-          $attrs["cn"][0]." (".
-          $attrs["description"][0].")";
-      } else {
-        $this->apps[$attrs["cn"][0]]=
-          $attrs["cn"][0];
-      }
-    }
-
-    /* Get all apps ... */
-    $res = get_list("objectClass=gosaApplication","application",$this->config->current['BASE'],array("gosaApplicationParameter","cn"),GL_SUBSEARCH); 
-    $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
-    $this->AllAppsForRelease = array();
-    if(!empty($tmp)){
-      $tmp = array_flip($this->Releases);
-      foreach($res as $attrs){
-        
-        $testdn = preg_replace("/".get_ou('applicationou').".*$/",get_ou('applicationou'),$attrs['dn']);
-        $testdn = preg_replace("/^[^,]+/","",$testdn);
-        $testdn = preg_replace("/^,/","",$testdn);
-
-        if($testdn == preg_replace("/".get_ou('applicationou').".*$/",get_ou('applicationou'),$tmp[$this->FAIrelease])){
-          $this->AllAppsForRelease[$attrs['dn']] = $attrs['cn'][0];
-          $this->AllAppsForReleaseParameter[$this->FAIrelease][$attrs['cn'][0]] = $attrs;
-        }
-      }
-    }else{
-      foreach($res as $attrs){
-        $this->AllAppsForRelease[$attrs['dn']] = $attrs['cn'][0];
-      }
-    }
-
-    natcasesort ($this->apps);
-    reset ($this->apps);
-
-    if(is_array($this->gosaMemberApplication))
-      foreach ($this->gosaMemberApplication as $cat){   
-        if(is_array($cat))
-          foreach($cat as $entry){
-            $this->used_apps[$entry['App']]= $entry['App'];
-          }
-      }
-  }
-
-
-  function addApp($cn)
-  {
-    if((isset($this->gosaMemberApplication[$this->curCatDir]))&&(is_array($this->gosaMemberApplication[$this->curCatDir]))){
-      foreach($this->gosaMemberApplication[$this->curCatDir] as $entry){
-        if($entry['App'] == $cn) return;
-      }
-    }
-    $this->gosaMemberApplication[$this->curCatDir][]= array("App"=>$cn);
-    $this->used_apps[$cn]=$cn;
-    $this->is_modified= TRUE;
-  }
-
-
-  function removeApp($cn)
-  {
-    $temp= array();
-    foreach ($this->gosaMemberApplication as $value){
-      if ($value != $cn){
-        $temp[]= $value;
-      }
-    }
-    $this->gosaMemberApplication= $temp;
-    $this->is_modified= TRUE;
-  }
-
-  function getParameters($app)
-  {
-    $tmp = $this->getReleases();
-    $ret = array();
-    if(in_array($this->FAIrelease,$tmp)){
-      $tmp2 = array_flip($tmp);
-      $base = $tmp2[$this->FAIrelease];
-      $ldap = $this->config->get_ldap_link();
-      $ldap->cd($this->config->current['BASE']);
-      $ldap->search("(&(objectClass=gosaApplication)(cn=".$app.")(gosaApplicationParameter=*))",array("gosaApplicationParameter"));
-      if($ldap->count()){
-        $attrs = $ldap->fetch();
-        for($i = 0 ; $i < $attrs['gosaApplicationParameter']['count'] ; $i ++ ){
-          $name = preg_replace("/:.*$/","",$attrs['gosaApplicationParameter'][$i]);
-          $ret[$name] = $name;
-        } 
-      }
-    }
-    return($ret);
-  }
-
-  function GetSubdirs($dir)
-  {
-    $ret = array();
-    $tmp1 = split("/",$this->curCatDir);
-    foreach($this->Categories as $path=>$cat){
-      $tmp2 = split("/",$path);
-      
-      if((empty($this->curCatDir))&&(!preg_match("/\//",$path))){
-        $abort = false;
-      }elseif(((count($tmp1))+1) == (count($tmp2))){
-        $abort = false;
-        for($i = 0 ; $i < count($tmp1) ; $i++){
-          if($tmp1[$i] != $tmp2[$i]){
-            $abort = true;
-          }
-        }
-      }else{
-        $abort= true;
-      }
-      if(!$abort){
-        $ret[$path]=$cat;
-      } 
-    }
-    return($ret);
-  }
-
-
-  function PrepareForCopyPaste($source)
-  {
-    $s = new appgroup($this->config,$source['dn']);
-    $this->FAIrelease = $this->InitialFAIrelease = $s->FAIrelease;
-    $this->gosaMemberApplication = $s->gosaMemberApplication;
-    $this->appoption = $s->appoption;
-    $this->Categories = $s->Categories;
-  }
-
-
-  /* Return plugin informations for acl handling  */ 
-  static function plInfo()
-  {
-    return (array(
-          "plShortName"   => _("Applications"),
-          "plDescription" => _("Group applications"),
-          "plSelfModify"  => FALSE,
-          "plDepends"     => array(),
-          "plPriority"    => 0,
-          "plSection"     => array("admin"),
-          "plCategory"    => array("groups"),
-          "plProvidedAcls"=> array(
-            "gosaMemberApplication"     => _("Application"),
-            "FAIrelease"                => _("Release"),
-            "gosaApplicationParameter"  => _("Application parameter"))
-          ));
-  }
-
-
-  function multiple_save_object()
-  {
-    if(isset($_POST['group_apps_multi'])){
-      $this->save_object(); 
-      plugin::multiple_save_object();    
-  
-      /* Get posts */
-      foreach(array("apps") as $attr){
-        if(isset($_POST['use_'.$attr])) {
-          $this->multi_boxes[] = $attr;
-        }
-      }
-    }
-  }
-  
-  function multiple_execute()
-  {
-    return($this->execute());
-  }
-
-  function init_multiple_support($attrs,$all)
-  {
-    // Do nothing here
-  }
-
-  function get_multi_edit_values()
-  {
-    $ret = plugin::get_multi_edit_values();
-
-    if(in_array("apps",$this->multi_boxes)){
-      $ret['gosaApplicationParameter'] = $this->gosaApplicationParameter;
-      $ret['Categories']               = $this->Categories;
-      $ret['gosaMemberApplication']    = $this->gosaMemberApplication;
-      $ret['FAIrelease']               = $this->FAIrelease;
-      $ret['appoption']                = $this->appoption;
-    }
-    return($ret);
-  }
-}
-// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
-?>
diff --git a/gosa-core/plugins/admin/groups/class_groupMail.inc b/gosa-core/plugins/admin/groups/class_groupMail.inc
deleted file mode 100644 (file)
index 6f07583..0000000
+++ /dev/null
@@ -1,1350 +0,0 @@
-<?php
-
-class mailgroup extends plugin
-{
-  /* CLI vars */
-  var $cli_summary        = "Manage mail groups/shared folders";
-  var $cli_description    = "Some longer text\nfor help";
-  var $cli_parameters     = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
-
-  var $uid                        = "";       // User id 
-  var $cn                         = "";       // cn
-  var $orig_cn                    = "";       // cn
-
-  var $method                     = "mailMethod"; // Used Mail method 
-  var $mmethod                    = "";           // Contains the gosa.conf MAILMETHOD
-  var $mail                       = "";           // Default mail address 
-
-  var $gosaMailAlternateAddress   = array();  // Set default Alternate Mail Adresses to empty array
-  var $gosaMailForwardingAddress  = array();  // Forwarding also empty
-
-  var $gosaMailForwardingAddress_Some  = array();  // Used in multiple edit 
-
-  var $gosaMailServer             = "";       // Selected mailserver 
-  var $gosaMailQuota              = "";       // Defined Quota 
-  var $quotaUsage                 = 0;        // Currently used quota
-
-  var $gosaVacationMessage        = "";       // Vocation message 
-
-  var $imapacl                    = array('anyone'    => 'p',     // Set acls for everyone
-      '%members%' => 'lrswp',  // %members% are all group-members
-      ''          => 'p');    // Every user added gets this right
-
-  var $kolabFolderType_SubType = "";
-  var $kolabFolderType_Type = "";
-
-  var $gosaSpamSortLevel          = "";     
-  var $gosaSpamMailbox            = "";
-  var $gosaSharedFolderTarget     ;
-
-  var $forward_dialog             = FALSE;    
-
-  var $members                    = array();  // Group members
-
-  var $mailusers                  = array();
-  var $perms                      = array();
-  var $gosaMailDeliveryMode       = "[L        ]";   // 
-  var $gosaMailMaxSize            = "";       // 
-  
-  var $remove_folder_from_imap    = true;
-
-  /* Helper */
-  var $indexed_acl= array();
-  var $indexed_user= array();
-
-  var $view_logged = FALSE;
-
-  /* attribute list for save action */
-  var $attributes= array( "mail",   "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize",
-      "gosaMailAlternateAddress", "gosaMailForwardingAddress",
-      "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox",
-      "acl","gosaSharedFolderTarget", "gosaVacationMessage");
-
-  var $objectclasses= array("gosaMailAccount");
-  var $CopyPasteVars          = array("quotaUsage","imapacl");
-
-  var $multiple_support = TRUE;
-
-  function mailgroup (&$config, $dn= NULL, $ui= NULL)
-  {
-    /* Initialise all available attributes ... if possible
-     */
-    plugin::plugin($config, $dn);
-    $this->orig_cn = $this->cn;
-
-    /* Set mailMethod to the one defined in gosa.conf 
-     */
-    if (isset($this->config->current['MAILMETHOD'])){
-      $this->mmethod= $this->config->current['MAILMETHOD'];
-    }
-
-    /* Check if selected mail method exists 
-     */
-    $cls = get_correct_class_name("mailMethod$this->mmethod");
-    if ($cls && class_exists($cls)){
-      $this->method= $cls;
-    } else {
-      print_red(sprintf(_("There is no mail method '%s' specified in your gosa.conf available."), $this->mmethod));
-    }
-
-    /* Load Mailserver  
-     */
-    if(isset($this->attrs['gosaMailServer'][0])){
-      $this->gosaMailServer =  $this->attrs['gosaMailServer'][0];
-    }
-
-    /* Convert cn to uid in case of existing entry
-     */
-    if (isset($this->attrs['cn'][0])){
-      $this->uid= $this->attrs['cn'][0];
-    }
-
-    /* Get folder type */
-    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
-      if(isset($this->attrs['kolabFolderType'])){
-        $tmp = split("\.",$this->attrs['kolabFolderType'][0]);
-        $this->kolabFolderType_Type = $tmp[0];
-        $this->kolabFolderType_SubType = $tmp[1];
-      }
-    }
-
-    /* If this isn't a new mailgroup, read all required data from ldap
-     */
-    if (($dn != "new")&&($dn !== NULL)){
-
-      /* Load attributes which represent multiple entries  
-       */
-      foreach (array("gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){
-        $this->$val = array();
-        if (isset($this->attrs["$val"]["count"])){
-          for ($i= 0; $i<$this->attrs["$val"]["count"]; $i++){
-            array_push($this->$val, $this->attrs["$val"][$i]);
-          }
-        }
-      }
-
-      /* Only do IMAP actions if gosaMailServer attribute is set 
-       */
-      if (isset ($this->attrs["gosaMailServer"][0])){
-
-        /* Create new instance of our defined mailclass
-         */
-        $method= new $this->method($this->config);
-        if ($method->connect($this->attrs["gosaMailServer"][0])){
-
-          /* If we do NOT use kolab or equal methods, 
-             read imap the acls from the mail method class.
-             They will be merged later with the ldap specified acls.
-           */
-          if(!preg_match("/olab/i",$this->mmethod) && !empty($this->mmethod)){
-            $this->imapacl=  $method->getSharedFolderPermissions($this->uid);
-
-            /* Need to filter what a member acl could be... */
-            $vote= array();
-            $peak= 0;
-            $leader= "";
-            foreach ($this->imapacl as $user => $acl){
-
-              if ($user != "anyone" ){
-                if (!isset($vote[$acl])){
-                  $vote[$acl]= 1;
-                } else {
-                  $vote[$acl]++;
-                }
-                if ($vote[$acl] > $peak){
-                  $leader= $acl;
-                  $peek= $vote[$acl];
-                }
-              }
-            }
-            /* Highest count wins as %members%, remove all members
-               with the same acl */
-            if(!empty($leader)){
-              $this->imapacl['%members%']= $leader;
-            }
-            foreach ($this->imapacl as $user => $acl){
-              if ($this->acl == $leader && in_array($user, $this->attrs['memberUid'])){
-                unset($this->imapacl[$user]);
-              }
-            }
-          }
-
-          /* Adapt attributes if needed */
-          $method->fixAttributesOnLoad($this);
-
-          /*  get Quota */
-          $quota= $method->getQuota($this->uid);
-
-          /* Update quota values */
-          if(is_array($quota)){
-            if ($quota['gosaMailQuota'] == 2147483647){
-              $this->quotaUsage= "";
-              $this->gosaMailQuota= "";
-            } else {
-              $this->quotaUsage= $quota['quotaUsage'];
-              $this->gosaMailQuota= $quota['gosaMailQuota'];
-            }
-          }else{
-            $this->quotaUsage     = "";
-            $this->gosaMailQuota  = "";
-          }
-          $method->disconnect();
-        }   // ENDE $method->connect($this->attrs["gosaMailServer"][0])){
-      }   // ENDE gosaMailServer
-    }   // ENDE dn != "new"
-
-
-    /* Get global filter config */
-    if (!session::is_set("gmailfilter")){
-      $ui= get_userinfo();
-      $base= get_base_from_people($ui->dn);
-      $gmailfilter= array( "depselect"       => $base,
-          "muser"            => "",
-          "regex"           => "*");
-      session::set("gmailfilter", $gmailfilter);
-    }
-
-    /* Load permissions */
-    $tmp = array();
-    $ldap = $this->config->get_ldap_link();
-
-    /* Read acls  from ldap and merge them with
-     *  acls read from mail method.
-     */
-    if (isset($this->attrs['acl'])){
-
-      for ($i= 0; $i<$this->attrs['acl']['count']; $i++){
-        list($user, $permission)= split(' ', $this->attrs['acl'][$i]);
-
-        /* Add to list */
-        $this->imapacl[$user]= $permission;
-
-        /* Get all user permissions sorted by acl, to detect the most used acl
-           This acl is then used for %members%
-         */
-        if ($user != "anyone" && $user != "%members%"){
-          $tmp[$permission][] = $user;
-        }
-
-        /* There is an entry in $this->imapacl like this this ... 
-           $this->attrs['imapacl']['anyone'] = "p";
-           $this->attrs['imapacl']['%members%'] = "lprs";
-           $this->attrs['imapacl'][''] = ""; <------ This is used to diplay an empty 
-           Field for special acls in our template.
-           If there is at least one special acl in out imapacl,
-           we don't need this entry anymore, because it is already displayed. 
-         */
-        if ($user != "anyone" && $user != "%members%"){
-          unset($this->imapacl['']);
-        }
-      }
-    }
-
-    /**
-     * Detect group members which use the same acl
-     *  as used for %members% and remove them.
-     **/
-
-    /* In this section we detect which acl is the most used.
-       This will be used as %members% acl.
-     */
-    $tmp2 = array(); 
-    foreach($tmp as $acl => $user){
-      $tmp2[count($tmp[$acl])]=$acl;
-    }
-    /* Most used at last 
-     */
-    ksort($tmp2);      
-
-    /* Assign last (most used acl) to %members% acl 
-     */
-    $str = array_pop($tmp2);
-    if(!empty($str)) {
-      $this->imapacl['%members%']=$str;
-    }
-    if(!isset($this->imapacl['%members%'])){
-      $this->imapacl['%members%'] = "lrspw";
-    }
-
-
-    /* Open ldap connection 
-     */
-    $ldap = $this->config->get_ldap_link();
-    $ldap->cd($this->config->current['BASE']);
-
-    /* Remove those users, that use %members% acl && are member of this group. */
-    foreach($this->imapacl as $mail => $permission){
-      $ldap->search("(&(objectClass=person)(|(mail=".$mail.")(uid=".$mail.")))",array("uid"));
-      $atr = $ldap->fetch();
-      if((isset($this->attrs['memberUid'])) && (is_array($this->attrs['memberUid']))){
-        if((isset($atr['uid'][0]))&&(in_array($atr['uid'][0],$this->attrs['memberUid']))&&($permission == $this->imapacl['%members%'])){
-          unset($this->imapacl[$mail]);
-        }
-      }
-    }
-
-    /**
-     * ENDE: Detect group member with same acl and replace them with %members%
-     **/
-    $this->indexed_user = array("%members%","anyone");
-
-    /* Append an empty entry, for special acl handling */
-    if(count($this->imapacl)==2){
-      $this->imapacl[''] ="lrsw";
-      $this->indexed_user[] = '';
-    }
-
-    /* Load Mailserver
-     */
-    if(isset($this->attrs['gosaMailServer'][0])){
-      $this->gosaMailServer =  $this->attrs['gosaMailServer'][0];
-    }
-    /* Fill translations */
-    $this->perms["lrsw"]= _("read");
-    $this->perms["lrswp"]= _("post");
-    $this->perms["p"]= _("external post");
-    $this->perms["lrswip"]= _("append");
-    $this->perms["lrswipcd"]= _("write");
-    $this->perms["lrswipcda"]= _("admin");
-    $this->perms[""]= _("none");
-  }
-
-
-
-  function execute()
-  {
-    /* Call parent execute */
-    //plugin::execute();
-    $display = "";
-
-    /* Log view */
-    if($this->is_account && !$this->view_logged){
-      $this->view_logged = TRUE;
-      new log("view","groups/".get_class($this),$this->dn);
-    }
-
-    /* Load templating engine */
-    $smarty= get_smarty();
-
-    /* Assign acls */
-    $tmp = $this->plInfo();
-    foreach($tmp['plProvidedAcls'] as $name => $translation) {
-      $smarty->assign($name."ACL",$this->getacl($name));
-    }
-
-    if (session::get('js')==FALSE){
-      $smarty->assign("javascript", "false");
-    } else {
-      $smarty->assign("javascript", "true");
-    }
-
-    /* Handle actions should not be done, when 
-     *  editing multiple entries at once. e.g. account state
-     */ 
-    if(!$this->multiple_support_active){
-
-      /* Do we need to flip is_account state? */
-      if(isset($_POST['modify_state'])){
-        if($this->is_account && $this->acl_is_removeable()){
-          $this->is_account= FALSE;
-        }elseif(!$this->is_account && $this->acl_is_createable()){
-          $this->is_account= TRUE;
-        }
-      }
-
-      $display = "";
-
-      /* Do we represent a valid account? */
-      if (!$this->is_account && $this->parent === NULL){
-
-        $display.= "<img alt=\"\" src=\"images/stop.png\" align=middle>&nbsp;<b>".
-          _("This 'dn' has no valid mail extensions.")."</b>";
-        return ($display);
-      }
-
-      /* Show tab dialog headers */
-      $display= "";
-      if ($this->parent !== NULL){
-        if ($this->is_account){
-          $display.= $this->show_disable_header(_("Remove mail account"),
-              _("This account has mail features enabled. You can disable them by clicking below."));
-        } else {
-          $display.= $this->show_enable_header(_("Create mail account"),
-              _("This account has mail features disabled. You can enable them by clicking below."));
-
-          /* Show checkbox that allows us to remove imap entry too*/
-          if($this->initially_was_account){
-            $c = "";
-            if($this->remove_folder_from_imap){
-              $c= " checked ";
-            }
-            $display .= "<h2>Shared folder delete options</h2>
-              <input class='center' type='checkbox' name='remove_folder_from_imap' value='1' ".$c."
-              title='"._("Remove shared folder from mail server database when entry gets removed in LDAP")."'>";
-            $display .= _("Remove the shared folder and all its contents after saving this account");
-          }
-          return ($display);
-        }
-      }
-    }
-
-    /* Add ACL? */
-    if($this->acl_is_writeable("acl")){
-      foreach ($this->indexed_user as $nr => $user){
-        if (isset($_POST["add_$nr"])){
-          $this->imapacl[""]= "l";
-        }
-        if (isset($_POST["del_$nr"])){
-          unset ($this->imapacl[$user]);
-        }
-      }
-    }
-
-    /* Trigger forward add dialog? */
-    if($this->acl_is_writeable("gosaMailForwardingAddress")){
-      if (isset($_POST['add_local_forwarder'])){
-        $this->forward_dialog= TRUE;
-        $this->dialog= TRUE;
-      }
-    }
-
-    /* Cancel forward add dialog? */
-    if($this->acl_is_writeable("gosaMailForwardingAddress")){
-      if (isset($_POST['add_locals_cancel'])){
-        $this->forward_dialog= FALSE;
-        $this->dialog= FALSE;
-      }
-    }
-
-    /* Finished adding of locals? */
-    if ((isset($_POST['add_locals_finish'])) && ($this->acl_is_writeable("gosaMailForwardingAddress"))) {
-      if (count ($_POST['local_list']) && $this->acl_is_writeable("gosaMailForwardingAddress")){
-
-        /* Walk through list of forwarders, ignore own addresses */
-        foreach ($_POST['local_list'] as $val){
-          if (!in_array ($val, $this->gosaMailAlternateAddress) &&
-              $val != $this->mail){
-
-            $this->addForwarder($val);
-          }
-        }
-      }
-      $this->forward_dialog= FALSE;
-      $this->dialog= FALSE;
-    }
-
-    /* Add forward email addresses */
-    if ((isset($_POST['add_forwarder'])) && ($this->acl_is_writeable("gosaMailForwardingAddress"))){
-      if ($_POST['forward_address'] != ""){
-
-        /* Valid email address specified? */
-        $address= $_POST['forward_address'];
-        if (!tests::is_email($address)){
-
-          print_red (_("You're trying to add an invalid email address ".
-                "to the list of forwarders."));
-
-        } elseif ($address == $this->mail
-            || in_array($address, $this->gosaMailAlternateAddress)) {
-
-          print_red (_("Adding your one of your own addresses to the forwarders makes no sense."));
-
-        } else {
-
-          /* Add it */
-          if ($this->acl_is_writeable("gosaMailForwardingAddress")){
-            $this->addForwarder ($address);
-          }
-
-        }
-      }
-    }
-
-    /* Delete forward email addresses */
-    if (isset($_POST['delete_forwarder']) && ($this->acl_is_writeable("gosaMailForwardingAddress"))){
-      if (count($_POST['forwarder_list'])&& $this->acl_is_writeable("gosaMailForwardingAddress")){
-
-        $this->delForwarder ($_POST['forwarder_list']);
-      }
-    }
-
-    /* Add alternate email addresses */
-    if (isset($_POST['add_alternate'])){
-      if ($_POST['alternate_address'] != "" && $this->acl_is_writeable("gosaMailAlternateAddress")){
-
-        if (!tests::is_email($_POST['alternate_address'])){
-          print_red (_("You're trying to add an invalid email address to the list of alternate addresses."));
-
-        } elseif (($user= $this->addAlternate ($_POST['alternate_address'])) != ""){
-          $ui= get_userinfo();
-          if ($user != $ui->username){
-            print_red (_("The address you're trying to add is already used by user")." '$user'.");
-          }
-        }
-      }
-    }
-
-    /* Delete alternate email addresses */
-    if($this->acl_is_writeable("gosaMailAlternateAddress")){
-      if (isset($_POST['delete_alternate']) && isset ($_POST['alternates_list'])){
-        if (count($_POST['alternates_list']) && $this->acl_is_writeable("gosaMailAlternateAddress")){
-          $this->delAlternate ($_POST['alternates_list']);
-        }
-      }
-    }
-
-    /* Show forward add dialog */
-    if ($this->forward_dialog){
-      $ldap= $this->config->get_ldap_link();
-
-      /* Save data */
-      $gmailfilter= session::get("gmailfilter");
-      foreach( array("depselect", "muser", "regex") as $type){
-        if (isset($_POST[$type])){
-          $gmailfilter[$type]= $_POST[$type];
-        }
-      }
-      if (isset($_GET['search'])){
-        $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*";
-        if ($s == "**"){
-          $s= "*";
-        }
-        $gmailfilter['regex']= $s;
-      }
-      session::set("gmailfilter", $gmailfilter);
-
-      /* Get actual list */
-      $mailusers= array ();
-      if ($gmailfilter['regex'] != '*' && $gmailfilter['regex'] != ""){
-        $regex= $gmailfilter['regex'];
-        $filter= "(|(mail=$regex)(gosaMailAlternateAddress=$regex))";
-      } else {
-        $filter= "";
-      }
-      if ($gmailfilter['muser'] != ""){
-        $user= $gmailfilter['muser'];
-        $filter= "$filter(|(uid=$user)(cn=$user)(givenName=$user)(sn=$user))";
-      }
-
-      /* Add already present people to the filter */
-      $exclude= "";
-      foreach ($this->gosaMailForwardingAddress as $mail){
-        $exclude.= "(mail=$mail)";
-      }
-      if ($exclude != ""){
-        $filter.= "(!(|$exclude))";
-      }
-
-      $res= get_list("(&(objectClass=gosaMailAccount)$filter)", "users", $gmailfilter['depselect'],
-                     array("sn", "mail", "givenName"), GL_SUBSEARCH | GL_SIZELIMIT);
-      $ldap->cd($gmailfilter['depselect']);
-      $ldap->search ("(&(objectClass=gosaMailAccount)$filter)", array("sn", "mail", "givenName"));
-      error_reporting (0);
-      while ($attrs= $ldap->fetch()){
-        if(preg_match('/%/', $attrs['mail'][0])){
-          continue;
-        }
-        $name= $this->make_name($attrs);
-        $mailusers[$attrs['mail'][0]]= $name."&lt;".
-          $attrs['mail'][0]."&gt;";
-      }
-      error_reporting (E_ALL | E_STRICT);
-      natcasesort ($mailusers);
-      reset ($mailusers);
-
-      /* Show dialog */
-      $smarty->assign("search_image", get_template_path('images/search.png'));
-      $smarty->assign("usearch_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/small_filter.png'));
-      $smarty->assign("mailusers", $mailusers);
-      $smarty->assign("deplist", $this->config->idepartments);
-      $smarty->assign("apply", apply_filter());
-      $smarty->assign("alphabet", generate_alphabet());
-      $smarty->assign("hint", print_sizelimit_warning());
-      foreach( array("depselect", "muser", "regex") as $type){
-        $smarty->assign("$type", $gmailfilter[$type]);
-      }
-      $smarty->assign("hint", print_sizelimit_warning());
-      $display.= $smarty->fetch (get_template_path('mail_locals.tpl', TRUE));
-      return ($display);
-    }
-
-    /* Assemble normal permissions */
-    if (isset($this->imapacl['anyone'])){
-      $smarty->assign("default_permissions", $this->imapacl['anyone']);
-    }
-    $smarty->assign("member_permissions", "lrsp");
-    if (isset($this->imapacl['%members%'])){
-      $smarty->assign("member_permissions", $this->imapacl['%members%']);
-    }
-
-    /* Assemble extra attributes */
-    $perm= $this->getacl( "permissions");
-    $tmp= "";
-    $nr= 0;
-    $count= count($this->imapacl);
-    $this->indexed_user= array();
-    $this->indexed_acl= array();
-    foreach($this->imapacl as $user => $acl){
-
-      /* Add additional acl settings */
-      if ($user != "anyone" && $user != "%members%"){
-
-        $Dis  = "";
-        if(!preg_match("/w/",$perm)){
-          $Dis = " disabled ";
-        }
-  
-        /* Reset given Acls to ensure that nobody can read username and acls if not allwoed */
-        if(!preg_match("/r/",$perm)){
-          $user = "";
-          $nr   = "none";
-          $key  = "none";  
-        }
-
-        $tmp.= "<tr>  
-                 <td>
-                  <input name=\"user_$nr\" size=20 maxlength=60 value=\"$user\" ".$Dis.">
-                 </td>
-                 <td>
-                 <select size=\"1\" name=\"perm_$nr\" ".$Dis.">";
-
-        /* Add acl options for this additional acl setting */
-        if(preg_match("/r/",$perm)){
-          foreach ($this->perms as $key => $value){
-            if ($acl == $key){
-              $tmp.= "<option value=\"$key\" selected>$value</option>";
-            } else {
-              $tmp.= "<option value=\"$key\">$value</option>";
-            }
-          }
-        }
-        $tmp.= "</select>&nbsp;";
-
-
-        
-        if ($nr == $count - 1){
-          if($this->acl_is_writeable("acl")){
-            $tmp.= "<input type=submit value=\""._("Add")."\" ".
-              "name=\"add_$nr\" >";
-          }
-        }
-        if ($count > 3){
-          if($this->acl_is_writeable("acl")){
-            $tmp.= "<input type=submit value=\""._("Remove")."\" ".
-              "name=\"del_$nr\" ></td></tr>";        
-          }
-        }
-      }
-      $this->indexed_user[$nr]= $user;
-      $this->indexed_acl[$nr++]= $acl;
-    }
-    $smarty->assign("plusattributes", $tmp);
-
-    /* Show main page */
-    $mailserver= array();
-    foreach ($this->config->data['SERVERS']['IMAP'] as $key => $val){
-      $mailserver[]= $key;
-    }
-    $smarty->assign("mailServers", $mailserver);
-    foreach(array("gosaMailServer", "gosaMailQuota", "perms", "mail",
-          "gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){
-      $smarty->assign("$val", $this->$val);
-    }
-    if (is_numeric($this->gosaMailQuota) && $this->gosaMailQuota != 0){
-      if($this->acl_is_readable("gosaMailQuota")){
-        $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota),100,15,true));
-        $smarty->assign("quotadefined", "true");
-      }else{
-        $smarty->assign("quotadefined", "true");
-        $smarty->assign("quotausage", "-");
-      }
-    } else {
-      $smarty->assign("quotadefined", "false");
-    }
-
-    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
-
-      $smarty->assign("kolab", TRUE);
-      $smarty->assign("JS",session::get('js'));
-      $smarty->assign("kolabFolderType_Types",    array (   ''      => _('Unspecified'),  'mail' => _('Mails'),
-                                                            'task'  => _('Tasks') ,       'journal' => _('Journals'),
-                                                            'calendar' => _('Calendar'),       'contact' => _('Contacts'), 
-                                                            'note'  => _('Notes')));
-      if($this->kolabFolderType_Type == "mail"){
-        $smarty->assign("kolabFolderType_SubTypes", array(    
-              ''          => _('Unspecified'),  'inbox'     => _("Inbox")   , 
-              'drafts'    => _("Drafts"),       'sentitems' => _("Sent items"),
-              'junkemail' => _("Junk mail")));
-      }else{
-        $smarty->assign("kolabFolderType_SubTypes", array(  'default' => _("Default")));
-      }
-      $smarty->assign("kolabFolderType_Type",     $this->kolabFolderType_Type);
-      $smarty->assign("kolabFolderType_SubType",  $this->kolabFolderType_SubType);
-    }else{
-      $smarty->assign("kolab", FALSE);
-    }
-
-    /* Multiple support handling */
-    foreach($this->attributes as $attr){
-      if(in_array($attr,$this->multi_boxes)){
-        $smarty->assign("use_".$attr,TRUE);
-      }else{
-        $smarty->assign("use_".$attr,FALSE);
-      }
-    }
-
-    /* Multiple support handling */
-    foreach(array("kolabFolderType") as $attr){
-      if(in_array($attr,$this->multi_boxes)){
-        $smarty->assign("use_".$attr,TRUE);
-      }else{
-        $smarty->assign("use_".$attr,FALSE);
-      }
-    }
-
-    $smarty->assign("Forward_all",$this->gosaMailForwardingAddress);
-    $smarty->assign("Forward_some",$this->gosaMailForwardingAddress_Some);
-
-    $smarty->assign("multiple_support",$this->multiple_support_active);
-    $display.= $smarty->fetch (get_template_path('mail.tpl', TRUE));
-    return ($display);
-  }
-
-
-  /* remove object from parent */
-  function remove_from_parent()
-  {
-    if(!$this->initially_was_account){
-      return;
-    }
-  
-    /* Added these ObjectClass and Attributes, because they were not 
-       removed correctly, only in case of kolab ... 
-     */
-    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
-      $this->attributes[]="acl";
-      $this->objectclasses[] = "kolabSharedFolder";
-    }
-    /* include global link_info */
-    $ldap= $this->config->get_ldap_link();
-
-    /* Remove and write to LDAP */
-    plugin::remove_from_parent();
-
-    /* Zero arrays */
-    $this->attrs['gosaMailAlternateAddress']= array();
-    $this->attrs['gosaMailForwardingAddress']= array();
-    $this->attrs['gosaSharedFolderTarget']= array();
-
-    /* Connect to IMAP server for account deletion */
-    if ($this->initially_was_account){
-      $method= new $this->method($this->config);
-      $method->fixAttributesOnRemove($this);
-      if ($method->connect($this->gosaMailServer) && $this->remove_folder_from_imap){
-
-        /* Remove account from IMAP server */
-        $method->deleteMailbox($this->uid);
-        $method->disconnect();
-      }
-    }
-    /* Keep uid */
-    unset ($this->attrs['uid']);
-
-    $ldap->cd($this->dn);
-    $ldap->modify ($this->attrs); 
-    show_ldap_error($ldap->get_error(), sprintf(_("Removing of groups/mail with dn '%s' failed."),$this->dn));
-
-
-    new log("remove","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
-
-    /* Optionally execute a command after we're done */
-    $this->handle_post_events("remove");
-  }
-
-
-  /* Save data to object */
-  function save_object()
-  {
-
-    /* Add special kolab attributes */    
-    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
-      if(isset($_POST['kolabFolderType_Type'])){
-        $this->kolabFolderType_Type = get_post("kolabFolderType_Type");
-        $this->kolabFolderType_SubType = get_post("kolabFolderType_SubType");
-      }
-    }
-  
-    /* Check if user wants to remove the shared folder from imap too */
-    if($this->initially_was_account && !$this->is_account){
-      if(isset($_POST['remove_folder_from_imap'])){
-        $this->remove_folder_from_imap = true;
-      }else{
-        $this->remove_folder_from_imap = false;
-      }
-    }
-
-    /* Assemble mail delivery mode
-       The mode field in ldap consists of values between braces, this must
-       be called when 'mail' is set, because checkboxes may not be set when
-       we're in some other dialog.
-
-       Example for gosaMailDeliveryMode [LR        ]
-L: Local delivery
-R: Reject when exceeding mailsize limit
-S: Use spam filter
-V: Use vacation message
-C: Use custom sieve script
-I: Only insider delivery */
-    if (isset($_POST['mailedit'])){
-
-      plugin::save_object();
-
-      $tmp= preg_replace("/[^a-z]/i","",$this->gosaMailDeliveryMode);
-
-      /* Handle delivery flags */
-      if($this->acl_is_writeable("gosaMailDeliveryModeL")){
-        if(!preg_match("/L/",$tmp) && !isset($_POST['drop_own_mails'])){
-          $tmp.="L";
-        }elseif(preg_match("/L/",$tmp) && isset($_POST['drop_own_mails'])){
-          $tmp = preg_replace("/L/","",$tmp);
-        }
-      }
-
-      $opts = array(
-          "R"   => "use_mailsize_limit",
-          "S"   => "use_spam_filter",
-          "V"   => "use_vacation",
-          "C"   => "own_script",
-          "I"   => "only_local");
-
-      foreach($opts as $flag => $post){
-        if($this->acl_is_writeable("gosaMailDeliveryMode".$flag)){
-          if(!preg_match("/".$flag."/",$tmp) && isset($_POST[$post])){
-            $tmp.= $flag;
-          }elseif(preg_match("/".$flag."/",$tmp) && !isset($_POST[$post])){
-            $tmp = preg_replace("/".$flag."/","",$tmp);
-          }
-        }
-      }
-
-      $tmp= "[$tmp]";
-      if ($this->gosaMailDeliveryMode != $tmp){
-        $this->is_modified= TRUE;
-      }
-      $this->gosaMailDeliveryMode= $tmp;
-
-      /* Collect data and re-assign it to the imapacl array */
-      if ($this->acl_is_writeable("acl")){
-        $this->imapacl= array();
-        $this->imapacl['%members%']= $_POST['member_permissions'];
-        $this->imapacl['anyone']= $_POST['default_permissions'];
-        foreach ($this->indexed_user as $nr => $user){
-          if (!isset($_POST["user_$nr"])){
-            continue;
-          }
-          if ($_POST["user_$nr"] != $user ||
-              $_POST["perm_$nr"] != $this->indexed_acl[$nr]){
-            $this->is_modified= TRUE;
-          }
-          $this->imapacl[$_POST["user_$nr"]]= $_POST["perm_$nr"];
-        }
-      }
-    }
-
-  }
-
-
-  /* Save data to LDAP, depending on is_account we save or delete */
-  function save()
-  {
-    $ldap= $this->config->get_ldap_link();
-    $ldap->cd($this->config->current['BASE']);
-
-    /* Call parents save to prepare $this->attrs */
-    plugin::save();
-
-    /* Save arrays */
-    $this->attrs['gosaMailAlternateAddress']  = $this->gosaMailAlternateAddress;
-    $this->attrs['gosaMailForwardingAddress'] = $this->gosaMailForwardingAddress;
-    $this->attrs['gosaSharedFolderTarget']    = "share+".$this->uid;
-    $this->attrs['acl']= array();
-
-    /* Prepare Mail server attribute */
-    if(preg_match("/olab/i",$this->mmethod)){
-      if (empty($this->gosaMailServer)||is_array($this->gosaMailServer)){
-        if(isset($this->attrs['gosaMailServer'][0])){
-          $this->gosaMailServer = $this->attrs['gosaMailServer'][0];
-        }
-      }
-    }  
- /* Exchange '%member%' pseudo entry */
-    $memberacl= $this->imapacl['%members%'];
-    foreach ($this->members as $user){
-      if (!isset($this->imapacl[$user])){
-        $this->imapacl[$user]= $memberacl;
-      }
-    }
-
-    /* Prepare kolab attributes to be written  */
-    if(preg_match("/olab/i",$this->mmethod)){
-      if(!empty($this->kolabFolderType_Type)){
-        $this->attrs['kolabFolderType'] = $this->kolabFolderType_Type.".".$this->kolabFolderType_SubType;
-      }else{
-        $this->attrs['kolabFolderType'] = array();
-      }
-    }
-
-    /* Get naming attribute for mail accounts */
-    $tmp = new $this->method($this->config);
-    $uattrib = $tmp->uattrib;
-
-    /* Create ACL array
-       What is done here.
-
-       1.  Do not write acl entries for empty entries.
-       2.  Check if given user is a valid GOsa user.
-       - If he is one, check if he has a valid mail extension
-       -If this is true, add the user to the ACL entry.
-       -If this is NOT true, skip ACL entries for this user.
-       - He is not a GOsa Account, so write the ACL. (Manually entered ACL)
-       3. In case of "olab" mail method, remove the entry from the $this->imapacl array
-       because the kolab deamon will set the acls for us.
-
-     */
-    foreach ($this->imapacl as $user => $acl){
-
-      /* Skip empty entries */
-      if (empty($user) || $user == ""){
-        unset($this->imapacl[$user]);
-      }
-
-      /* Skip placeholder */
-      if (empty($user) || $user == "" || preg_match("/%members%/",$user)){
-        continue;
-      }
-
-      /* Check if your is a real GOsa user
-       * If user is a real GOsa user but do not have an email address - SKIP adding acls
-       * If user is a real GOsa user with an email address - add acls
-       */
-      $ldap->search("(&(objectClass=person)(|(uid=".$user.")(mail=".$user.")))",array("mail","uid"));
-      if($ldap->count()){
-
-        /* Has the user a valid mail account? */
-        $attrs = $ldap->fetch();
-        if(isset($attrs['mail'][0])){
-
-          $name = $attrs[$uattrib][0];
-          $this->attrs['acl'][]= $name." ".$acl;
-
-          /* Do not write imap acl directly i nkolab mode, let the kolab deamon do this. */
-          unset($this->imapacl[$user]);
-          if(!preg_match("/olab/i",$this->mmethod)){
-            $this->imapacl[$name] = $acl;
-          }
-
-        }else{
-
-          /* User is a valid GOsa account, but he has no mail extension. Skip ACLs */
-          unset($this->imapacl[$user]);
-        }
-      }else{
-
-        /* Seems to be a manually a added acl
-         * Write this acl.
-         */
-        $this->attrs['acl'][]= $user." ".$acl;
-
-        /* In case of kolab methods, let the deamon add the imap acls */
-        if(preg_match("/olab/i",$this->mmethod)){
-          unset($this->imapacl[$user]);
-        }
-      }
-    }
-
-    /* Handle mail method actions, set acls, quota ...*/
-    if ((!$this->is_template)&&(!empty($this->gosaMailServer))){
-      $method= new $this->method($this->config);
-      $method->fixAttributesOnStore($this);
-      if (($method->connect($this->gosaMailServer))){
-        $method->updateMailbox($this->uid);
-        $method->setQuota($this->uid, $this->gosaMailQuota);
-
-        /* Only write imap acls directly if we are not
-         *  using a kolab like mail method.
-         */
-        if(!preg_match("/olab/i",$this->mmethod)){
-          $method->setSharedFolderPermissions($this->uid, $this->imapacl);
-        }
-        $method->disconnect();
-      }
-    }
-
-    /* Save data to LDAP */
-    $ldap->cd($this->dn);
-    $this->cleanup();
-    $ldap->modify ($this->attrs); 
-    show_ldap_error($ldap->get_error(), sprintf(_("Saving of groups/mail with dn '%s' failed."),$this->dn));
-    
-    if($this->initially_was_account){
-      new log("modify","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
-    }else{
-      new log("create","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());  
-    }
-    
-
-    /* Optionally execute a command after we're done */
-    if ($this->initially_was_account == $this->is_account){
-      if ($this->is_modified){
-        $this->handle_post_events("modify");
-      }
-    } else {
-      $this->handle_post_events("add");
-    }
-  }
-
-
-
-  /* Check formular input */
-  function check()
-  {
-    $ldap= $this->config->get_ldap_link();
-
-    /* Call common method to give check the hook */
-    $message= plugin::check();
-
-    if(!$this->is_account) return array();
-    
-    //$message[] = $str;      
-
-    /* must: mail */
-    if ($this->mail == ""){
-      $message[]= _("The required field 'Primary address' is not set.");
-    }
-    if (!tests::is_email($this->mail)){
-      $message[]= _("Please enter a valid email addres in 'Primary address' field.");
-    }
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=".$this->mail.")(gosaMailAlternateAddress=".
-        $this->mail."))(!(uid=".$this->orig_cn."))(!(cn=".$this->orig_cn.")))");
-    if ($ldap->count() != 0){
-      $message[]= _("The primary address you've entered is already in use.");
-    }
-  
-    /* Check quota */
-    if ($this->gosaMailQuota != '' && $this->acl_is_writeable("gosaMailQuota")){
-      if (!is_numeric($this->gosaMailQuota)) {
-        $message[]= _("Value in 'Quota size' is not valid.");
-      } else {
-        $this->gosaMailQuota= (int) $this->gosaMailQuota;
-      }
-    }
-
-    /* Check rejectsize for integer */
-    if ($this->gosaMailMaxSize != '' && $this->acl_is_writeable("gosaMailQuota")){
-      if (!is_numeric($this->gosaMailMaxSize)){
-        $message[]= _("Please specify a vaild mail size for mails to be rejected.");
-      } else {
-        $this->gosaMailMaxSize= (int) $this->gosaMailMaxSize;
-      }
-    }
-
-    /* Need gosaMailMaxSize if use_mailsize_limit is checked */
-    if (is_integer(strpos($this->gosaMailDeliveryMode, "reject")) && $this->gosaMailMaxSize == ""){
-      $message[]= _("You need to set the maximum mail size in order to reject anything.");
-    }
-
-    if(ord($this->imapacl['anyone'][0])==194){
-      $message[] = _("Please choose valid permission settings. Default permission can't be emtpy.");
-    }
-
-    if(empty($this->gosaMailServer)){
-      $message[] = _("Please select a valid mail server.");
-    }
-
-    return ($message);
-  }
-
-  /* Adapt from template, using 'dn' */
-  function adapt_from_template($dn)
-  {
-    plugin::adapt_from_template($dn);
-
-    foreach (array("gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){
-      $this->$val= array();
-      if (isset($this->attrs["$val"]["count"])){
-        for ($i= 0; $i<$this->attrs["$val"]["count"]; $i++){
-          $value= $this->attrs["$val"][$i];
-          foreach (array("sn", "givenName", "uid") as $repl){
-            if (preg_match("/%$repl/i", $value)){
-              $value= preg_replace ("/%$repl/i", $this->parent->$repl, $value);
-            }
-          }
-          array_push($this->$val, $value);
-        }
-      }
-    }
-  }
-
-  /* Add entry to forwarder list */
-  function addForwarder($address)
-  {
-    $this->gosaMailForwardingAddress[]= $address;
-    $this->gosaMailForwardingAddress= array_unique($this->gosaMailForwardingAddress);
-
-    /* Update multiple edit values too */
-    if($this->multiple_support_active){
-      $this->gosaMailForwardingAddress_Some= 
-        array_remove_entries (array($address),$this->gosaMailForwardingAddress_Some);
-    }
-
-    sort ($this->gosaMailForwardingAddress);
-    reset ($this->gosaMailForwardingAddress);
-    $this->is_modified= TRUE;
-  }
-
-  /* Remove list of addresses from forwarder list */
-  function delForwarder($addresses)
-  {
-    $this->gosaMailForwardingAddress= array_remove_entries ($addresses,
-        $this->gosaMailForwardingAddress);
-
-    /* Update multiple edit values too */
-    if($this->multiple_support_active){
-      $this->gosaMailForwardingAddress_Some = array_remove_entries ($addresses,
-          $this->gosaMailForwardingAddress_Some);
-    }
-    $this->is_modified= TRUE;
-  }
-
-
-
-  function addAlternate($address)
-  {
-    $ldap= $this->config->get_ldap_link();
-
-    $address= strtolower($address);
-
-    /* Is this address already assigned in LDAP? */
-    $ldap->cd ($this->config->current['BASE']);
-    $ldap->search ("(&(objectClass=gosaMailAccount)(|(mail=$address)".
-        "(gosaMailAlternateAddress=$address)))");
-
-    if ($ldap->count() > 0){
-      $attrs= $ldap->fetch ();
-      return ($attrs["uid"][0]);
-    }
-
-    /* Add to list of alternates */
-    if (!in_array($address, $this->gosaMailAlternateAddress)){
-      $this->gosaMailAlternateAddress[]= $address;
-    }
-
-    sort ($this->gosaMailAlternateAddress);
-    reset ($this->gosaMailAlternateAddress);
-    $this->is_modified= TRUE;
-
-    return ("");
-  }
-
-
-  function delAlternate($addresses)
-  {
-    $this->gosaMailAlternateAddress= array_remove_entries ($addresses,
-        $this->gosaMailAlternateAddress);
-    $this->is_modified= TRUE;
-  }
-
-
-  function make_name($attrs)
-  {
-    $name= "";
-    if (isset($attrs['sn'][0])){
-      $name= $attrs['sn'][0];
-    }
-    if (isset($attrs['givenName'][0])){
-      if ($name != ""){
-        $name.= ", ".$attrs['givenName'][0];
-      } else {
-        $name.= $attrs['givenName'][0];
-      }
-    }
-    if ($name != ""){
-      $name.= " ";
-    }
-
-    return ($name);
-  }
-
-  function getCopyDialog()
-  {
-    if(!$this->is_account) return("");
-
-    $smarty = get_smarty();
-    $smarty->assign("gosaMailAlternateAddress",$this->gosaMailAlternateAddress);
-    $smarty->assign("gosaMailForwardingAddress",$this->gosaMailForwardingAddress);
-    $smarty->assign("mail",$this->mail);
-    $display= $smarty->fetch (get_template_path('paste_mail.tpl', TRUE));
-    $ret = array();
-    $ret['string'] = $display;
-    $ret['status'] = "";
-    return($ret);
-  }
-
-  function saveCopyDialog()
-  {
-    if(!$this->is_account) return;
-
-    /* Perform ADD / REMOVE ... for mail alternate / mail forwarding addresses 
-    */
-    $this->execute();
-    if(isset($_POST['mail'])){
-      $this->mail = $_POST['mail'];
-    }
-  }
-
-
-  function PrepareForCopyPaste($source)
-  {
-    plugin::PrepareForCopyPaste($source);
-    /* Reset alternate mail addresses */
-    $this->gosaMailAlternateAddress = array();
-  }
-
-
-  /* Return plugin informations for acl handling  */
-  static function plInfo()
-  {
-    return (array(
-          "plShortName"   => _("Mail"),
-          "plDescription" => _("Group mail"),
-          "plSelfModify"  => FALSE,
-          "plDepends"     => array(),
-          "plPriority"    => 0,
-          "plSection"     => array("administration"),
-          "plCategory"    => array("groups"), 
-          "plProvidedAcls"=> array(
-            "mail"                      => _("Mail address"),
-            "gosaMailAlternateAddress"  => _("Alternate addresses"),
-            "gosaMailForwardingAddress" => _("Forwarding addresses"),
-            "gosaMailQuota"             => _("Quota size"),
-            "gosaMailServer"            => _("Mail server"),
-            "acl"                       => _("Permissions"))
-          ));
-  }
-
-  
-  /* Remove given ACL for given member (uid,mail) ..
-   */
-  function removeUserAcl($index )
-  {
-    if(isset($this->imapacl[$index])){
-      unset($this->imapacl[$index]);
-    }
-  }
-
-  function multiple_execute()
-  {
-    return($this->execute());
-  }
-
-
-  function init_multiple_support($attrs,$all)
-  {
-    plugin::init_multiple_support($attrs,$all);
-
-    $this->gosaMailForwardingAddress = array();
-    if(isset($attrs['gosaMailForwardingAddress'])){
-      for($i = 0 ; $i < $attrs['gosaMailForwardingAddress']['count'] ; $i++){
-        $this->gosaMailForwardingAddress[] = $attrs['gosaMailForwardingAddress'][$i];
-      }
-    }
-
-    $this->gosaMailForwardingAddress_Some = array();
-    if(isset($all['gosaMailForwardingAddress'])){
-      for($i = 0 ; $i < $all['gosaMailForwardingAddress']['count'] ; $i++){
-        if(!in_array($all['gosaMailForwardingAddress'][$i],$this->gosaMailForwardingAddress)){
-          $this->gosaMailForwardingAddress_Some[] = $all['gosaMailForwardingAddress'][$i];
-        }
-      }
-    }
-  }
-
-  function multiple_save_object()
-  {
-    if(isset($_POST['multiple_mail_group_posted'])){
-      plugin::multiple_save_object();
-      
-      foreach(array("kolabFolderType") as $attr){
-        if(isset($_POST['use_'.$attr])){
-          $this->multi_boxes[] = $attr;
-        }
-      }
-
-      /* Add special kolab attributes */
-      if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
-        if(isset($_POST['kolabFolderType_Type'])){
-          $this->kolabFolderType_Type = get_post("kolabFolderType_Type");
-          $this->kolabFolderType_SubType = get_post("kolabFolderType_SubType");
-        }
-      }
-
-      /* Collect data and re-assign it to the imapacl array */
-      if ($this->acl_is_writeable("acl")){
-        $this->imapacl= array();
-        $this->imapacl['%members%']= $_POST['member_permissions'];
-        $this->imapacl['anyone']= $_POST['default_permissions'];
-        foreach ($this->indexed_user as $nr => $user){
-          if (!isset($_POST["user_$nr"])){
-            continue;
-          }
-          if ($_POST["user_$nr"] != $user ||
-              $_POST["perm_$nr"] != $this->indexed_acl[$nr]){
-            $this->is_modified= TRUE;
-          }
-          $this->imapacl[$_POST["user_$nr"]]= $_POST["perm_$nr"];
-        }
-      }
-    }
-  }
-  
-  
-  /* Return selected values for multiple edit */
-  function get_multi_edit_values()
-  {
-    $ret = plugin::get_multi_edit_values();
-    $ret['Forward_some'] = $this->gosaMailForwardingAddress_Some;    
-    $ret['Forward_all'] = $this->gosaMailForwardingAddress;    
-    if(in_array('kolabFolderType',$this->multi_boxes)){
-      $ret['kolabFolderType_Type'] = $this->kolabFolderType_Type;
-      $ret['kolabFolderType_SubType'] = $this->kolabFolderType_SubType;
-    }
-    if(in_array("acl",$this->multi_boxes)){
-      $ret['imapacl'] = $this->imapacl;
-    }
-    return($ret);
-  }
-
-  function set_multi_edit_values($attrs)
-  {
-    $forward = array();
-    foreach($attrs['Forward_some'] as $addr){
-      if(in_array($addr,$this->gosaMailForwardingAddress)){
-        $forward[] = $addr;
-      }
-    }
-    foreach($attrs['Forward_all'] as $addr){
-      $forward[] = $addr;
-    }
-    plugin::set_multi_edit_values($attrs);
-    $this->gosaMailForwardingAddress = $forward;
-  }
-}
-
-  // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
-?>
diff --git a/gosa-core/plugins/admin/groups/mail.tpl b/gosa-core/plugins/admin/groups/mail.tpl
deleted file mode 100644 (file)
index 6d57a98..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-<input type="hidden" name="mailedit" value="1">
-<table summary="" style="width:100%; vertical-align:top; text-align:left;" cellpadding=0 border=0>
-
- <!-- Headline container -->
- <tr>
-  <td style="width:50%; border-right:1px solid #A0A0A0; vertical-align:top">
-   <h2><img class="center" alt="" align="middle" src="images/rightarrow.png"> {t}Generic{/t}</h2>
-   <table summary="">
-    <tr>
-     <td><LABEL for="mail">{t}Primary address{/t}</LABEL>{$must}</td>
-     <td>
-{if $multiple_support}
-       <input id="dummy1" name="dummy1" size="25" maxlength="65" 
-               value="{t}Multiple edit{/t}" disabled>
-{else}
-       {render acl=$mailACL}
-               <input id="mail" name="mail" size="25" maxlength="65" value="{$mail}" title="{t}Primary mail address for this shared folder{/t}">
-       {/render}
-{/if}
-     </td>
-    </tr>
-    <tr>
-     <td><LABEL for="gosaMailServer">{t}Server{/t}</LABEL></td>
-     <td>
-{render acl=$gosaMailServerACL checkbox=$multiple_support checked=$use_gosaMailServer}
-      <select size="1" name="gosaMailServer" title="{t}Select mail server to place user on{/t}">
-       {html_options values=$mailServers output=$mailServers selected=$gosaMailServer}
-          <option disabled>&nbsp;</option>
-      </select>
-{/render}
-     </td>
-    </tr>
-    <tr>
-     <td>
-      <br>
-       <LABEL for="gosaMailQuota"> {t}Quota usage{/t}</LABEL>
-     </td>
-     <td>
-      <br>
-{if $quotadefined eq "true"}
-       {$quotausage}
-{else}
-       {t}not defined{/t}
-{/if}
-     </td>
-    </tr>
-    <tr>
-     <td>{t}Quota size{/t}</td>
-     <td>
-{render acl=$gosaMailQuotaACL  checkbox=$multiple_support checked=$use_gosaMailQuota}
-       <input id="gosaMailQuota" name="gosaMailQuota" size="6" align=middle maxlength="30" value="{$gosaMailQuota}">
-{/render}
-        {t}MB{/t}
-       </td>
-</tr>
-       {if $kolab}
-       <tr>
-               <td>
-                       {t}Folder type{/t}
-               </td>
-               <td>
-               
-               {if $multiple_support}
-                       <input type='checkbox' name='use_kolabFolderType' id='use_kolabFolderType' class="center"
-                               {if $use_kolabFolderType} checked {/if}
-                               onClick="changeState('kolabFolderType_Type');changeState('kolabFolderType_SubType');"                   
-                       >
-                       <select id="kolabFolderType_Type" name="kolabFolderType_Type" onChange="document.mainform.submit();"
-                               {if !$use_kolabFolderType} disabled {/if}>
-                               {html_options options=$kolabFolderType_Types selected=$kolabFolderType_Type}
-                       </select>
-                       <select id="kolabFolderType_SubType" name="kolabFolderType_SubType" onChange="document.mainform.submit();"
-                               {if !$use_kolabFolderType} disabled {/if}>
-                               {html_options options=$kolabFolderType_SubTypes selected=$kolabFolderType_SubType}
-                       </select>
-               {else}
-                       <select id="kolabFolderType_Type" name="kolabFolderType_Type" onChange="document.mainform.submit();">
-                               {html_options options=$kolabFolderType_Types selected=$kolabFolderType_Type}
-                       </select>
-                       <select id="kolabFolderType_SubType" name="kolabFolderType_SubType" onChange="document.mainform.submit();">
-                               {html_options options=$kolabFolderType_SubTypes selected=$kolabFolderType_SubType}
-                       </select>
-               {/if}
-                       {if !$JS}
-                               <input type='image' src='images/list_reload.png' class='center' alt='{t}Reload{/t}'>
-                       {/if}
-               </td>
-       </tr>
-       {/if}
-   </table>
-     
-  </td>
-
-{if $multiple_support}
-
-{else}
-
-  <td style="vertical-align:top;padding-left:2px;">
-
-       
-
-   <h2><img class="center" alt="" align="middle" src="images/alternatemail.png"> {t}Alternative addresses{/t}</h2>
-
-{render acl=$gosaMailAlternateAddressACL}
-   <select style="width:100%;" name="alternates_list[]" size=10 multiple title="{t}List of alternative mail addresses{/t}">
-    {html_options values=$gosaMailAlternateAddress output=$gosaMailAlternateAddress}
-       <option disabled>&nbsp;</option>
-   </select>
-{/render}
-
-   <br>
-
-{render acl=$gosaMailAlternateAddressACL}
-   <input name="alternate_address" size="30" align=middle maxlength="60" value="">
-{/render}
-
-{render acl=$gosaMailAlternateAddressACL}
-   <input type=submit value="{t}Add{/t}" name="add_alternate">&nbsp;
-{/render}
-
-{render acl=$gosaMailAlternateAddressACL}
-   <input type=submit value="{t}Delete{/t}" name="delete_alternate">
-{/render}
-
-  </td>
-{/if}
- </tr>
-
-</table>
-<p class="seperator">&nbsp;</p>
-
-<table summary="" style="width:100%; vertical-align:top; text-align:left;" cellpadding=4 border=0>
- <tr>
-  <td style="vertical-align:top;width:50%; border-right:1px solid #A0A0A0">
-   <h2><img class="center" alt="" align="middle" src="images/members.png"> {t}IMAP shared folders{/t}</h2>
-{if $multiple_support}
-
-       <input class="center" type='checkbox' name="use_acl" value="1" {if $use_acl} checked {/if} 
-               onClick="toggle('acl_div');">{t}Set shared folder permissions{/t}
-       {if $use_acl}
-               <div style="visibility:visible;" id="acl_div">
-       {else}
-               <div style="visibility:hidden;" id="acl_div">
-       {/if}
-{/if}      
-   <table summary="" cellpadding=0 border=0>
-    <tr>
-     <td><LABEL for="default_permissions">{t}Default permission{/t}</LABEL></td>
-     <td>
-{render acl=$aclACL}
-      <select size="1" id="default_permissions" name="default_permissions">
-       {html_options options=$perms selected=$default_permissions}
-          <option disabled>&nbsp;</option>
-      </select>
-{/render}
-     </td>
-    </tr>
-    <tr>
-     <td><LABEL for="member_permissions">{t}Member permission{/t}</LABEL></td>
-     <td>
-{render acl=$aclACL}
-      <select id="member_permissions" size="1" name="member_permissions">
-       {html_options options=$perms selected=$member_permissions}
-      </select>
-{/render}
-     </td>
-    </tr>
-       {$plusattributes}
-   </table>
-{if $multiple_support}
-       </div>
-{/if}
-
-  </td>
-  <td style="vertical-align:top;width:50%">
-   <h2>
-       <img class="center" alt="" align="middle" src="images/envelope.png">
-       {t}Forward messages to non group members{/t}
-   </h2>
-
-{render acl=$gosaMailForwardingAddressACL}
-   <select style="width:100%;" name="forwarder_list[]" size=10 multiple>
-
-       {if $multiple_support}
-
-               {foreach from=$Forward_all item=item key=key}
-                       <option value="{$item}">{$item}&nbsp;({t}Used in all groups{/t})</option>
-               {/foreach}
-               {foreach from=$Forward_some item=item key=key}
-                       <option value="{$item}" style='color: #888888; background: #DDDDDD;background-color: #DDDDDD;'>{$item}&nbsp;({t}Not used in all groups{/t})</option>
-               {/foreach}
-       {else}
-    {html_options values=$gosaMailForwardingAddress output=$gosaMailForwardingAddress}
-       <option disabled>&nbsp;</option>
-       {/if}
-   </select>
-{/render}
-
-   <br>
-
-{render acl=$gosaMailForwardingAddressACL}
-   <input name="forward_address" size=20 align=middle maxlength=65 value="">
-{/render}
-{render acl=$gosaMailForwardingAddressACL}
-   <input type=submit value="{t}Add{/t}" name="add_forwarder">&nbsp;
-{/render}
-{render acl=$gosaMailForwardingAddressACL}
-   <input type=submit value="{t}Add local{/t}" name="add_local_forwarder">&nbsp;
-{/render}
-{render acl=$gosaMailForwardingAddressACL}
-   <input type=submit value="{t}Delete{/t}" name="delete_forwarder">
-{/render}
-  </td>
- </tr>
-</table>
-
-<!-- Place cursor -->
-<script language="JavaScript" type="text/javascript">
-  <!-- // First input field on page
-       focus_field('mail');
-  -->
-</script>
-{if $multiple_support}
-       <input type="hidden" name="multiple_mail_group_posted" value="1">
-{/if}
diff --git a/gosa-core/plugins/admin/groups/mail/class_groupMail.inc b/gosa-core/plugins/admin/groups/mail/class_groupMail.inc
new file mode 100644 (file)
index 0000000..8b48357
--- /dev/null
@@ -0,0 +1,1350 @@
+<?php
+
+class mailgroup extends plugin
+{
+  /* CLI vars */
+  var $cli_summary        = "Manage mail groups/shared folders";
+  var $cli_description    = "Some longer text\nfor help";
+  var $cli_parameters     = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
+
+  var $uid                        = "";       // User id 
+  var $cn                         = "";       // cn
+  var $orig_cn                    = "";       // cn
+
+  var $method                     = "mailMethod"; // Used Mail method 
+  var $mmethod                    = "";           // Contains the gosa.conf MAILMETHOD
+  var $mail                       = "";           // Default mail address 
+
+  var $gosaMailAlternateAddress   = array();  // Set default Alternate Mail Adresses to empty array
+  var $gosaMailForwardingAddress  = array();  // Forwarding also empty
+
+  var $gosaMailForwardingAddress_Some  = array();  // Used in multiple edit 
+
+  var $gosaMailServer             = "";       // Selected mailserver 
+  var $gosaMailQuota              = "";       // Defined Quota 
+  var $quotaUsage                 = 0;        // Currently used quota
+
+  var $gosaVacationMessage        = "";       // Vocation message 
+
+  var $imapacl                    = array('anyone'    => 'p',     // Set acls for everyone
+      '%members%' => 'lrswp',  // %members% are all group-members
+      ''          => 'p');    // Every user added gets this right
+
+  var $kolabFolderType_SubType = "";
+  var $kolabFolderType_Type = "";
+
+  var $gosaSpamSortLevel          = "";     
+  var $gosaSpamMailbox            = "";
+  var $gosaSharedFolderTarget     ;
+
+  var $forward_dialog             = FALSE;    
+
+  var $members                    = array();  // Group members
+
+  var $mailusers                  = array();
+  var $perms                      = array();
+  var $gosaMailDeliveryMode       = "[L        ]";   // 
+  var $gosaMailMaxSize            = "";       // 
+  
+  var $remove_folder_from_imap    = true;
+
+  /* Helper */
+  var $indexed_acl= array();
+  var $indexed_user= array();
+
+  var $view_logged = FALSE;
+
+  /* attribute list for save action */
+  var $attributes= array( "mail",   "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize",
+      "gosaMailAlternateAddress", "gosaMailForwardingAddress",
+      "gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox",
+      "acl","gosaSharedFolderTarget", "gosaVacationMessage");
+
+  var $objectclasses= array("gosaMailAccount");
+  var $CopyPasteVars          = array("quotaUsage","imapacl");
+
+  var $multiple_support = TRUE;
+
+  function mailgroup (&$config, $dn= NULL, $ui= NULL)
+  {
+    /* Initialise all available attributes ... if possible
+     */
+    plugin::plugin($config, $dn);
+    $this->orig_cn = $this->cn;
+
+    /* Set mailMethod to the one defined in gosa.conf 
+     */
+    if (isset($this->config->current['MAILMETHOD'])){
+      $this->mmethod= $this->config->current['MAILMETHOD'];
+    }
+
+    /* Check if selected mail method exists 
+     */
+    $cls = get_correct_class_name("mailMethod$this->mmethod");
+    if ($cls && class_exists($cls)){
+      $this->method= $cls;
+    } else {
+      print_red(sprintf(_("There is no mail method '%s' specified in your gosa.conf available."), $this->mmethod));
+    }
+
+    /* Load Mailserver  
+     */
+    if(isset($this->attrs['gosaMailServer'][0])){
+      $this->gosaMailServer =  $this->attrs['gosaMailServer'][0];
+    }
+
+    /* Convert cn to uid in case of existing entry
+     */
+    if (isset($this->attrs['cn'][0])){
+      $this->uid= $this->attrs['cn'][0];
+    }
+
+    /* Get folder type */
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+      if(isset($this->attrs['kolabFolderType'])){
+        $tmp = split("\.",$this->attrs['kolabFolderType'][0]);
+        $this->kolabFolderType_Type = $tmp[0];
+        $this->kolabFolderType_SubType = $tmp[1];
+      }
+    }
+
+    /* If this isn't a new mailgroup, read all required data from ldap
+     */
+    if (($dn != "new")&&($dn !== NULL)){
+
+      /* Load attributes which represent multiple entries  
+       */
+      foreach (array("gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){
+        $this->$val = array();
+        if (isset($this->attrs["$val"]["count"])){
+          for ($i= 0; $i<$this->attrs["$val"]["count"]; $i++){
+            array_push($this->$val, $this->attrs["$val"][$i]);
+          }
+        }
+      }
+
+      /* Only do IMAP actions if gosaMailServer attribute is set 
+       */
+      if (isset ($this->attrs["gosaMailServer"][0])){
+
+        /* Create new instance of our defined mailclass
+         */
+        $method= new $this->method($this->config);
+        if ($method->connect($this->attrs["gosaMailServer"][0])){
+
+          /* If we do NOT use kolab or equal methods, 
+             read imap the acls from the mail method class.
+             They will be merged later with the ldap specified acls.
+           */
+          if(!preg_match("/olab/i",$this->mmethod) && !empty($this->mmethod)){
+            $this->imapacl=  $method->getSharedFolderPermissions($this->uid);
+
+            /* Need to filter what a member acl could be... */
+            $vote= array();
+            $peak= 0;
+            $leader= "";
+            foreach ($this->imapacl as $user => $acl){
+
+              if ($user != "anyone" ){
+                if (!isset($vote[$acl])){
+                  $vote[$acl]= 1;
+                } else {
+                  $vote[$acl]++;
+                }
+                if ($vote[$acl] > $peak){
+                  $leader= $acl;
+                  $peek= $vote[$acl];
+                }
+              }
+            }
+            /* Highest count wins as %members%, remove all members
+               with the same acl */
+            if(!empty($leader)){
+              $this->imapacl['%members%']= $leader;
+            }
+            foreach ($this->imapacl as $user => $acl){
+              if ($this->acl == $leader && in_array($user, $this->attrs['memberUid'])){
+                unset($this->imapacl[$user]);
+              }
+            }
+          }
+
+          /* Adapt attributes if needed */
+          $method->fixAttributesOnLoad($this);
+
+          /*  get Quota */
+          $quota= $method->getQuota($this->uid);
+
+          /* Update quota values */
+          if(is_array($quota)){
+            if ($quota['gosaMailQuota'] == 2147483647){
+              $this->quotaUsage= "";
+              $this->gosaMailQuota= "";
+            } else {
+              $this->quotaUsage= $quota['quotaUsage'];
+              $this->gosaMailQuota= $quota['gosaMailQuota'];
+            }
+          }else{
+            $this->quotaUsage     = "";
+            $this->gosaMailQuota  = "";
+          }
+          $method->disconnect();
+        }   // ENDE $method->connect($this->attrs["gosaMailServer"][0])){
+      }   // ENDE gosaMailServer
+    }   // ENDE dn != "new"
+
+
+    /* Get global filter config */
+    if (!session::is_set("gmailfilter")){
+      $ui= get_userinfo();
+      $base= get_base_from_people($ui->dn);
+      $gmailfilter= array( "depselect"       => $base,
+          "muser"            => "",
+          "regex"           => "*");
+      session::set("gmailfilter", $gmailfilter);
+    }
+
+    /* Load permissions */
+    $tmp = array();
+    $ldap = $this->config->get_ldap_link();
+
+    /* Read acls  from ldap and merge them with
+     *  acls read from mail method.
+     */
+    if (isset($this->attrs['acl'])){
+
+      for ($i= 0; $i<$this->attrs['acl']['count']; $i++){
+        list($user, $permission)= split(' ', $this->attrs['acl'][$i]);
+
+        /* Add to list */
+        $this->imapacl[$user]= $permission;
+
+        /* Get all user permissions sorted by acl, to detect the most used acl
+           This acl is then used for %members%
+         */
+        if ($user != "anyone" && $user != "%members%"){
+          $tmp[$permission][] = $user;
+        }
+
+        /* There is an entry in $this->imapacl like this this ... 
+           $this->attrs['imapacl']['anyone'] = "p";
+           $this->attrs['imapacl']['%members%'] = "lprs";
+           $this->attrs['imapacl'][''] = ""; <------ This is used to diplay an empty 
+           Field for special acls in our template.
+           If there is at least one special acl in out imapacl,
+           we don't need this entry anymore, because it is already displayed. 
+         */
+        if ($user != "anyone" && $user != "%members%"){
+          unset($this->imapacl['']);
+        }
+      }
+    }
+
+    /**
+     * Detect group members which use the same acl
+     *  as used for %members% and remove them.
+     **/
+
+    /* In this section we detect which acl is the most used.
+       This will be used as %members% acl.
+     */
+    $tmp2 = array(); 
+    foreach($tmp as $acl => $user){
+      $tmp2[count($tmp[$acl])]=$acl;
+    }
+    /* Most used at last 
+     */
+    ksort($tmp2);      
+
+    /* Assign last (most used acl) to %members% acl 
+     */
+    $str = array_pop($tmp2);
+    if(!empty($str)) {
+      $this->imapacl['%members%']=$str;
+    }
+    if(!isset($this->imapacl['%members%'])){
+      $this->imapacl['%members%'] = "lrspw";
+    }
+
+
+    /* Open ldap connection 
+     */
+    $ldap = $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+
+    /* Remove those users, that use %members% acl && are member of this group. */
+    foreach($this->imapacl as $mail => $permission){
+      $ldap->search("(&(objectClass=person)(|(mail=".$mail.")(uid=".$mail.")))",array("uid"));
+      $atr = $ldap->fetch();
+      if((isset($this->attrs['memberUid'])) && (is_array($this->attrs['memberUid']))){
+        if((isset($atr['uid'][0]))&&(in_array($atr['uid'][0],$this->attrs['memberUid']))&&($permission == $this->imapacl['%members%'])){
+          unset($this->imapacl[$mail]);
+        }
+      }
+    }
+
+    /**
+     * ENDE: Detect group member with same acl and replace them with %members%
+     **/
+    $this->indexed_user = array("%members%","anyone");
+
+    /* Append an empty entry, for special acl handling */
+    if(count($this->imapacl)==2){
+      $this->imapacl[''] ="lrsw";
+      $this->indexed_user[] = '';
+    }
+
+    /* Load Mailserver
+     */
+    if(isset($this->attrs['gosaMailServer'][0])){
+      $this->gosaMailServer =  $this->attrs['gosaMailServer'][0];
+    }
+    /* Fill translations */
+    $this->perms["lrsw"]= _("read");
+    $this->perms["lrswp"]= _("post");
+    $this->perms["p"]= _("external post");
+    $this->perms["lrswip"]= _("append");
+    $this->perms["lrswipcd"]= _("write");
+    $this->perms["lrswipcda"]= _("admin");
+    $this->perms[""]= _("none");
+  }
+
+
+
+  function execute()
+  {
+    /* Call parent execute */
+    //plugin::execute();
+    $display = "";
+
+    /* Log view */
+    if($this->is_account && !$this->view_logged){
+      $this->view_logged = TRUE;
+      new log("view","groups/".get_class($this),$this->dn);
+    }
+
+    /* Load templating engine */
+    $smarty= get_smarty();
+
+    /* Assign acls */
+    $tmp = $this->plInfo();
+    foreach($tmp['plProvidedAcls'] as $name => $translation) {
+      $smarty->assign($name."ACL",$this->getacl($name));
+    }
+
+    if (session::get('js')==FALSE){
+      $smarty->assign("javascript", "false");
+    } else {
+      $smarty->assign("javascript", "true");
+    }
+
+    /* Handle actions should not be done, when 
+     *  editing multiple entries at once. e.g. account state
+     */ 
+    if(!$this->multiple_support_active){
+
+      /* Do we need to flip is_account state? */
+      if(isset($_POST['modify_state'])){
+        if($this->is_account && $this->acl_is_removeable()){
+          $this->is_account= FALSE;
+        }elseif(!$this->is_account && $this->acl_is_createable()){
+          $this->is_account= TRUE;
+        }
+      }
+
+      $display = "";
+
+      /* Do we represent a valid account? */
+      if (!$this->is_account && $this->parent === NULL){
+
+        $display.= "<img alt=\"\" src=\"images/stop.png\" align=middle>&nbsp;<b>".
+          _("This 'dn' has no valid mail extensions.")."</b>";
+        return ($display);
+      }
+
+      /* Show tab dialog headers */
+      $display= "";
+      if ($this->parent !== NULL){
+        if ($this->is_account){
+          $display.= $this->show_disable_header(_("Remove mail account"),
+              _("This account has mail features enabled. You can disable them by clicking below."));
+        } else {
+          $display.= $this->show_enable_header(_("Create mail account"),
+              _("This account has mail features disabled. You can enable them by clicking below."));
+
+          /* Show checkbox that allows us to remove imap entry too*/
+          if($this->initially_was_account){
+            $c = "";
+            if($this->remove_folder_from_imap){
+              $c= " checked ";
+            }
+            $display .= "<h2>Shared folder delete options</h2>
+              <input class='center' type='checkbox' name='remove_folder_from_imap' value='1' ".$c."
+              title='"._("Remove shared folder from mail server database when entry gets removed in LDAP")."'>";
+            $display .= _("Remove the shared folder and all its contents after saving this account");
+          }
+          return ($display);
+        }
+      }
+    }
+
+    /* Add ACL? */
+    if($this->acl_is_writeable("acl")){
+      foreach ($this->indexed_user as $nr => $user){
+        if (isset($_POST["add_$nr"])){
+          $this->imapacl[""]= "l";
+        }
+        if (isset($_POST["del_$nr"])){
+          unset ($this->imapacl[$user]);
+        }
+      }
+    }
+
+    /* Trigger forward add dialog? */
+    if($this->acl_is_writeable("gosaMailForwardingAddress")){
+      if (isset($_POST['add_local_forwarder'])){
+        $this->forward_dialog= TRUE;
+        $this->dialog= TRUE;
+      }
+    }
+
+    /* Cancel forward add dialog? */
+    if($this->acl_is_writeable("gosaMailForwardingAddress")){
+      if (isset($_POST['add_locals_cancel'])){
+        $this->forward_dialog= FALSE;
+        $this->dialog= FALSE;
+      }
+    }
+
+    /* Finished adding of locals? */
+    if ((isset($_POST['add_locals_finish'])) && ($this->acl_is_writeable("gosaMailForwardingAddress"))) {
+      if (count ($_POST['local_list']) && $this->acl_is_writeable("gosaMailForwardingAddress")){
+
+        /* Walk through list of forwarders, ignore own addresses */
+        foreach ($_POST['local_list'] as $val){
+          if (!in_array ($val, $this->gosaMailAlternateAddress) &&
+              $val != $this->mail){
+
+            $this->addForwarder($val);
+          }
+        }
+      }
+      $this->forward_dialog= FALSE;
+      $this->dialog= FALSE;
+    }
+
+    /* Add forward email addresses */
+    if ((isset($_POST['add_forwarder'])) && ($this->acl_is_writeable("gosaMailForwardingAddress"))){
+      if ($_POST['forward_address'] != ""){
+
+        /* Valid email address specified? */
+        $address= $_POST['forward_address'];
+        if (!tests::is_email($address)){
+
+          print_red (_("You're trying to add an invalid email address ".
+                "to the list of forwarders."));
+
+        } elseif ($address == $this->mail
+            || in_array($address, $this->gosaMailAlternateAddress)) {
+
+          print_red (_("Adding your one of your own addresses to the forwarders makes no sense."));
+
+        } else {
+
+          /* Add it */
+          if ($this->acl_is_writeable("gosaMailForwardingAddress")){
+            $this->addForwarder ($address);
+          }
+
+        }
+      }
+    }
+
+    /* Delete forward email addresses */
+    if (isset($_POST['delete_forwarder']) && ($this->acl_is_writeable("gosaMailForwardingAddress"))){
+      if (count($_POST['forwarder_list'])&& $this->acl_is_writeable("gosaMailForwardingAddress")){
+
+        $this->delForwarder ($_POST['forwarder_list']);
+      }
+    }
+
+    /* Add alternate email addresses */
+    if (isset($_POST['add_alternate'])){
+      if ($_POST['alternate_address'] != "" && $this->acl_is_writeable("gosaMailAlternateAddress")){
+
+        if (!tests::is_email($_POST['alternate_address'])){
+          print_red (_("You're trying to add an invalid email address to the list of alternate addresses."));
+
+        } elseif (($user= $this->addAlternate ($_POST['alternate_address'])) != ""){
+          $ui= get_userinfo();
+          if ($user != $ui->username){
+            print_red (_("The address you're trying to add is already used by user")." '$user'.");
+          }
+        }
+      }
+    }
+
+    /* Delete alternate email addresses */
+    if($this->acl_is_writeable("gosaMailAlternateAddress")){
+      if (isset($_POST['delete_alternate']) && isset ($_POST['alternates_list'])){
+        if (count($_POST['alternates_list']) && $this->acl_is_writeable("gosaMailAlternateAddress")){
+          $this->delAlternate ($_POST['alternates_list']);
+        }
+      }
+    }
+
+    /* Show forward add dialog */
+    if ($this->forward_dialog){
+      $ldap= $this->config->get_ldap_link();
+
+      /* Save data */
+      $gmailfilter= session::get("gmailfilter");
+      foreach( array("depselect", "muser", "regex") as $type){
+        if (isset($_POST[$type])){
+          $gmailfilter[$type]= $_POST[$type];
+        }
+      }
+      if (isset($_GET['search'])){
+        $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*";
+        if ($s == "**"){
+          $s= "*";
+        }
+        $gmailfilter['regex']= $s;
+      }
+      session::set("gmailfilter", $gmailfilter);
+
+      /* Get actual list */
+      $mailusers= array ();
+      if ($gmailfilter['regex'] != '*' && $gmailfilter['regex'] != ""){
+        $regex= $gmailfilter['regex'];
+        $filter= "(|(mail=$regex)(gosaMailAlternateAddress=$regex))";
+      } else {
+        $filter= "";
+      }
+      if ($gmailfilter['muser'] != ""){
+        $user= $gmailfilter['muser'];
+        $filter= "$filter(|(uid=$user)(cn=$user)(givenName=$user)(sn=$user))";
+      }
+
+      /* Add already present people to the filter */
+      $exclude= "";
+      foreach ($this->gosaMailForwardingAddress as $mail){
+        $exclude.= "(mail=$mail)";
+      }
+      if ($exclude != ""){
+        $filter.= "(!(|$exclude))";
+      }
+
+      $res= get_list("(&(objectClass=gosaMailAccount)$filter)", "users", $gmailfilter['depselect'],
+                     array("sn", "mail", "givenName"), GL_SUBSEARCH | GL_SIZELIMIT);
+      $ldap->cd($gmailfilter['depselect']);
+      $ldap->search ("(&(objectClass=gosaMailAccount)$filter)", array("sn", "mail", "givenName"));
+      error_reporting (0);
+      while ($attrs= $ldap->fetch()){
+        if(preg_match('/%/', $attrs['mail'][0])){
+          continue;
+        }
+        $name= $this->make_name($attrs);
+        $mailusers[$attrs['mail'][0]]= $name."&lt;".
+          $attrs['mail'][0]."&gt;";
+      }
+      error_reporting (E_ALL | E_STRICT);
+      natcasesort ($mailusers);
+      reset ($mailusers);
+
+      /* Show dialog */
+      $smarty->assign("search_image", get_template_path('images/search.png'));
+      $smarty->assign("usearch_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/small_filter.png'));
+      $smarty->assign("mailusers", $mailusers);
+      $smarty->assign("deplist", $this->config->idepartments);
+      $smarty->assign("apply", apply_filter());
+      $smarty->assign("alphabet", generate_alphabet());
+      $smarty->assign("hint", print_sizelimit_warning());
+      foreach( array("depselect", "muser", "regex") as $type){
+        $smarty->assign("$type", $gmailfilter[$type]);
+      }
+      $smarty->assign("hint", print_sizelimit_warning());
+      $display.= $smarty->fetch (get_template_path('mail_locals.tpl', TRUE, dirname(__FILE__)));
+      return ($display);
+    }
+
+    /* Assemble normal permissions */
+    if (isset($this->imapacl['anyone'])){
+      $smarty->assign("default_permissions", $this->imapacl['anyone']);
+    }
+    $smarty->assign("member_permissions", "lrsp");
+    if (isset($this->imapacl['%members%'])){
+      $smarty->assign("member_permissions", $this->imapacl['%members%']);
+    }
+
+    /* Assemble extra attributes */
+    $perm= $this->getacl( "permissions");
+    $tmp= "";
+    $nr= 0;
+    $count= count($this->imapacl);
+    $this->indexed_user= array();
+    $this->indexed_acl= array();
+    foreach($this->imapacl as $user => $acl){
+
+      /* Add additional acl settings */
+      if ($user != "anyone" && $user != "%members%"){
+
+        $Dis  = "";
+        if(!preg_match("/w/",$perm)){
+          $Dis = " disabled ";
+        }
+  
+        /* Reset given Acls to ensure that nobody can read username and acls if not allwoed */
+        if(!preg_match("/r/",$perm)){
+          $user = "";
+          $nr   = "none";
+          $key  = "none";  
+        }
+
+        $tmp.= "<tr>  
+                 <td>
+                  <input name=\"user_$nr\" size=20 maxlength=60 value=\"$user\" ".$Dis.">
+                 </td>
+                 <td>
+                 <select size=\"1\" name=\"perm_$nr\" ".$Dis.">";
+
+        /* Add acl options for this additional acl setting */
+        if(preg_match("/r/",$perm)){
+          foreach ($this->perms as $key => $value){
+            if ($acl == $key){
+              $tmp.= "<option value=\"$key\" selected>$value</option>";
+            } else {
+              $tmp.= "<option value=\"$key\">$value</option>";
+            }
+          }
+        }
+        $tmp.= "</select>&nbsp;";
+
+
+        
+        if ($nr == $count - 1){
+          if($this->acl_is_writeable("acl")){
+            $tmp.= "<input type=submit value=\""._("Add")."\" ".
+              "name=\"add_$nr\" >";
+          }
+        }
+        if ($count > 3){
+          if($this->acl_is_writeable("acl")){
+            $tmp.= "<input type=submit value=\""._("Remove")."\" ".
+              "name=\"del_$nr\" ></td></tr>";        
+          }
+        }
+      }
+      $this->indexed_user[$nr]= $user;
+      $this->indexed_acl[$nr++]= $acl;
+    }
+    $smarty->assign("plusattributes", $tmp);
+
+    /* Show main page */
+    $mailserver= array();
+    foreach ($this->config->data['SERVERS']['IMAP'] as $key => $val){
+      $mailserver[]= $key;
+    }
+    $smarty->assign("mailServers", $mailserver);
+    foreach(array("gosaMailServer", "gosaMailQuota", "perms", "mail",
+          "gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){
+      $smarty->assign("$val", $this->$val);
+    }
+    if (is_numeric($this->gosaMailQuota) && $this->gosaMailQuota != 0){
+      if($this->acl_is_readable("gosaMailQuota")){
+        $smarty->assign("quotausage", progressbar(round(($this->quotaUsage * 100)/ $this->gosaMailQuota),100,15,true));
+        $smarty->assign("quotadefined", "true");
+      }else{
+        $smarty->assign("quotadefined", "true");
+        $smarty->assign("quotausage", "-");
+      }
+    } else {
+      $smarty->assign("quotadefined", "false");
+    }
+
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+
+      $smarty->assign("kolab", TRUE);
+      $smarty->assign("JS",session::get('js'));
+      $smarty->assign("kolabFolderType_Types",    array (   ''      => _('Unspecified'),  'mail' => _('Mails'),
+                                                            'task'  => _('Tasks') ,       'journal' => _('Journals'),
+                                                            'calendar' => _('Calendar'),       'contact' => _('Contacts'), 
+                                                            'note'  => _('Notes')));
+      if($this->kolabFolderType_Type == "mail"){
+        $smarty->assign("kolabFolderType_SubTypes", array(    
+              ''          => _('Unspecified'),  'inbox'     => _("Inbox")   , 
+              'drafts'    => _("Drafts"),       'sentitems' => _("Sent items"),
+              'junkemail' => _("Junk mail")));
+      }else{
+        $smarty->assign("kolabFolderType_SubTypes", array(  'default' => _("Default")));
+      }
+      $smarty->assign("kolabFolderType_Type",     $this->kolabFolderType_Type);
+      $smarty->assign("kolabFolderType_SubType",  $this->kolabFolderType_SubType);
+    }else{
+      $smarty->assign("kolab", FALSE);
+    }
+
+    /* Multiple support handling */
+    foreach($this->attributes as $attr){
+      if(in_array($attr,$this->multi_boxes)){
+        $smarty->assign("use_".$attr,TRUE);
+      }else{
+        $smarty->assign("use_".$attr,FALSE);
+      }
+    }
+
+    /* Multiple support handling */
+    foreach(array("kolabFolderType") as $attr){
+      if(in_array($attr,$this->multi_boxes)){
+        $smarty->assign("use_".$attr,TRUE);
+      }else{
+        $smarty->assign("use_".$attr,FALSE);
+      }
+    }
+
+    $smarty->assign("Forward_all",$this->gosaMailForwardingAddress);
+    $smarty->assign("Forward_some",$this->gosaMailForwardingAddress_Some);
+
+    $smarty->assign("multiple_support",$this->multiple_support_active);
+    $display.= $smarty->fetch (get_template_path('mail.tpl', TRUE, dirname(__FILE__)));
+    return ($display);
+  }
+
+
+  /* remove object from parent */
+  function remove_from_parent()
+  {
+    if(!$this->initially_was_account){
+      return;
+    }
+  
+    /* Added these ObjectClass and Attributes, because they were not 
+       removed correctly, only in case of kolab ... 
+     */
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+      $this->attributes[]="acl";
+      $this->objectclasses[] = "kolabSharedFolder";
+    }
+    /* include global link_info */
+    $ldap= $this->config->get_ldap_link();
+
+    /* Remove and write to LDAP */
+    plugin::remove_from_parent();
+
+    /* Zero arrays */
+    $this->attrs['gosaMailAlternateAddress']= array();
+    $this->attrs['gosaMailForwardingAddress']= array();
+    $this->attrs['gosaSharedFolderTarget']= array();
+
+    /* Connect to IMAP server for account deletion */
+    if ($this->initially_was_account){
+      $method= new $this->method($this->config);
+      $method->fixAttributesOnRemove($this);
+      if ($method->connect($this->gosaMailServer) && $this->remove_folder_from_imap){
+
+        /* Remove account from IMAP server */
+        $method->deleteMailbox($this->uid);
+        $method->disconnect();
+      }
+    }
+    /* Keep uid */
+    unset ($this->attrs['uid']);
+
+    $ldap->cd($this->dn);
+    $ldap->modify ($this->attrs); 
+    show_ldap_error($ldap->get_error(), sprintf(_("Removing of groups/mail with dn '%s' failed."),$this->dn));
+
+
+    new log("remove","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+
+    /* Optionally execute a command after we're done */
+    $this->handle_post_events("remove");
+  }
+
+
+  /* Save data to object */
+  function save_object()
+  {
+
+    /* Add special kolab attributes */    
+    if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+      if(isset($_POST['kolabFolderType_Type'])){
+        $this->kolabFolderType_Type = get_post("kolabFolderType_Type");
+        $this->kolabFolderType_SubType = get_post("kolabFolderType_SubType");
+      }
+    }
+  
+    /* Check if user wants to remove the shared folder from imap too */
+    if($this->initially_was_account && !$this->is_account){
+      if(isset($_POST['remove_folder_from_imap'])){
+        $this->remove_folder_from_imap = true;
+      }else{
+        $this->remove_folder_from_imap = false;
+      }
+    }
+
+    /* Assemble mail delivery mode
+       The mode field in ldap consists of values between braces, this must
+       be called when 'mail' is set, because checkboxes may not be set when
+       we're in some other dialog.
+
+       Example for gosaMailDeliveryMode [LR        ]
+L: Local delivery
+R: Reject when exceeding mailsize limit
+S: Use spam filter
+V: Use vacation message
+C: Use custom sieve script
+I: Only insider delivery */
+    if (isset($_POST['mailedit'])){
+
+      plugin::save_object();
+
+      $tmp= preg_replace("/[^a-z]/i","",$this->gosaMailDeliveryMode);
+
+      /* Handle delivery flags */
+      if($this->acl_is_writeable("gosaMailDeliveryModeL")){
+        if(!preg_match("/L/",$tmp) && !isset($_POST['drop_own_mails'])){
+          $tmp.="L";
+        }elseif(preg_match("/L/",$tmp) && isset($_POST['drop_own_mails'])){
+          $tmp = preg_replace("/L/","",$tmp);
+        }
+      }
+
+      $opts = array(
+          "R"   => "use_mailsize_limit",
+          "S"   => "use_spam_filter",
+          "V"   => "use_vacation",
+          "C"   => "own_script",
+          "I"   => "only_local");
+
+      foreach($opts as $flag => $post){
+        if($this->acl_is_writeable("gosaMailDeliveryMode".$flag)){
+          if(!preg_match("/".$flag."/",$tmp) && isset($_POST[$post])){
+            $tmp.= $flag;
+          }elseif(preg_match("/".$flag."/",$tmp) && !isset($_POST[$post])){
+            $tmp = preg_replace("/".$flag."/","",$tmp);
+          }
+        }
+      }
+
+      $tmp= "[$tmp]";
+      if ($this->gosaMailDeliveryMode != $tmp){
+        $this->is_modified= TRUE;
+      }
+      $this->gosaMailDeliveryMode= $tmp;
+
+      /* Collect data and re-assign it to the imapacl array */
+      if ($this->acl_is_writeable("acl")){
+        $this->imapacl= array();
+        $this->imapacl['%members%']= $_POST['member_permissions'];
+        $this->imapacl['anyone']= $_POST['default_permissions'];
+        foreach ($this->indexed_user as $nr => $user){
+          if (!isset($_POST["user_$nr"])){
+            continue;
+          }
+          if ($_POST["user_$nr"] != $user ||
+              $_POST["perm_$nr"] != $this->indexed_acl[$nr]){
+            $this->is_modified= TRUE;
+          }
+          $this->imapacl[$_POST["user_$nr"]]= $_POST["perm_$nr"];
+        }
+      }
+    }
+
+  }
+
+
+  /* Save data to LDAP, depending on is_account we save or delete */
+  function save()
+  {
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+
+    /* Call parents save to prepare $this->attrs */
+    plugin::save();
+
+    /* Save arrays */
+    $this->attrs['gosaMailAlternateAddress']  = $this->gosaMailAlternateAddress;
+    $this->attrs['gosaMailForwardingAddress'] = $this->gosaMailForwardingAddress;
+    $this->attrs['gosaSharedFolderTarget']    = "share+".$this->uid;
+    $this->attrs['acl']= array();
+
+    /* Prepare Mail server attribute */
+    if(preg_match("/olab/i",$this->mmethod)){
+      if (empty($this->gosaMailServer)||is_array($this->gosaMailServer)){
+        if(isset($this->attrs['gosaMailServer'][0])){
+          $this->gosaMailServer = $this->attrs['gosaMailServer'][0];
+        }
+      }
+    }  
+ /* Exchange '%member%' pseudo entry */
+    $memberacl= $this->imapacl['%members%'];
+    foreach ($this->members as $user){
+      if (!isset($this->imapacl[$user])){
+        $this->imapacl[$user]= $memberacl;
+      }
+    }
+
+    /* Prepare kolab attributes to be written  */
+    if(preg_match("/olab/i",$this->mmethod)){
+      if(!empty($this->kolabFolderType_Type)){
+        $this->attrs['kolabFolderType'] = $this->kolabFolderType_Type.".".$this->kolabFolderType_SubType;
+      }else{
+        $this->attrs['kolabFolderType'] = array();
+      }
+    }
+
+    /* Get naming attribute for mail accounts */
+    $tmp = new $this->method($this->config);
+    $uattrib = $tmp->uattrib;
+
+    /* Create ACL array
+       What is done here.
+
+       1.  Do not write acl entries for empty entries.
+       2.  Check if given user is a valid GOsa user.
+       - If he is one, check if he has a valid mail extension
+       -If this is true, add the user to the ACL entry.
+       -If this is NOT true, skip ACL entries for this user.
+       - He is not a GOsa Account, so write the ACL. (Manually entered ACL)
+       3. In case of "olab" mail method, remove the entry from the $this->imapacl array
+       because the kolab deamon will set the acls for us.
+
+     */
+    foreach ($this->imapacl as $user => $acl){
+
+      /* Skip empty entries */
+      if (empty($user) || $user == ""){
+        unset($this->imapacl[$user]);
+      }
+
+      /* Skip placeholder */
+      if (empty($user) || $user == "" || preg_match("/%members%/",$user)){
+        continue;
+      }
+
+      /* Check if your is a real GOsa user
+       * If user is a real GOsa user but do not have an email address - SKIP adding acls
+       * If user is a real GOsa user with an email address - add acls
+       */
+      $ldap->search("(&(objectClass=person)(|(uid=".$user.")(mail=".$user.")))",array("mail","uid"));
+      if($ldap->count()){
+
+        /* Has the user a valid mail account? */
+        $attrs = $ldap->fetch();
+        if(isset($attrs['mail'][0])){
+
+          $name = $attrs[$uattrib][0];
+          $this->attrs['acl'][]= $name." ".$acl;
+
+          /* Do not write imap acl directly i nkolab mode, let the kolab deamon do this. */
+          unset($this->imapacl[$user]);
+          if(!preg_match("/olab/i",$this->mmethod)){
+            $this->imapacl[$name] = $acl;
+          }
+
+        }else{
+
+          /* User is a valid GOsa account, but he has no mail extension. Skip ACLs */
+          unset($this->imapacl[$user]);
+        }
+      }else{
+
+        /* Seems to be a manually a added acl
+         * Write this acl.
+         */
+        $this->attrs['acl'][]= $user." ".$acl;
+
+        /* In case of kolab methods, let the deamon add the imap acls */
+        if(preg_match("/olab/i",$this->mmethod)){
+          unset($this->imapacl[$user]);
+        }
+      }
+    }
+
+    /* Handle mail method actions, set acls, quota ...*/
+    if ((!$this->is_template)&&(!empty($this->gosaMailServer))){
+      $method= new $this->method($this->config);
+      $method->fixAttributesOnStore($this);
+      if (($method->connect($this->gosaMailServer))){
+        $method->updateMailbox($this->uid);
+        $method->setQuota($this->uid, $this->gosaMailQuota);
+
+        /* Only write imap acls directly if we are not
+         *  using a kolab like mail method.
+         */
+        if(!preg_match("/olab/i",$this->mmethod)){
+          $method->setSharedFolderPermissions($this->uid, $this->imapacl);
+        }
+        $method->disconnect();
+      }
+    }
+
+    /* Save data to LDAP */
+    $ldap->cd($this->dn);
+    $this->cleanup();
+    $ldap->modify ($this->attrs); 
+    show_ldap_error($ldap->get_error(), sprintf(_("Saving of groups/mail with dn '%s' failed."),$this->dn));
+    
+    if($this->initially_was_account){
+      new log("modify","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+    }else{
+      new log("create","groups/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());  
+    }
+    
+
+    /* Optionally execute a command after we're done */
+    if ($this->initially_was_account == $this->is_account){
+      if ($this->is_modified){
+        $this->handle_post_events("modify");
+      }
+    } else {
+      $this->handle_post_events("add");
+    }
+  }
+
+
+
+  /* Check formular input */
+  function check()
+  {
+    $ldap= $this->config->get_ldap_link();
+
+    /* Call common method to give check the hook */
+    $message= plugin::check();
+
+    if(!$this->is_account) return array();
+    
+    //$message[] = $str;      
+
+    /* must: mail */
+    if ($this->mail == ""){
+      $message[]= _("The required field 'Primary address' is not set.");
+    }
+    if (!tests::is_email($this->mail)){
+      $message[]= _("Please enter a valid email addres in 'Primary address' field.");
+    }
+    $ldap->cd($this->config->current['BASE']);
+    $ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=".$this->mail.")(gosaMailAlternateAddress=".
+        $this->mail."))(!(uid=".$this->orig_cn."))(!(cn=".$this->orig_cn.")))");
+    if ($ldap->count() != 0){
+      $message[]= _("The primary address you've entered is already in use.");
+    }
+  
+    /* Check quota */
+    if ($this->gosaMailQuota != '' && $this->acl_is_writeable("gosaMailQuota")){
+      if (!is_numeric($this->gosaMailQuota)) {
+        $message[]= _("Value in 'Quota size' is not valid.");
+      } else {
+        $this->gosaMailQuota= (int) $this->gosaMailQuota;
+      }
+    }
+
+    /* Check rejectsize for integer */
+    if ($this->gosaMailMaxSize != '' && $this->acl_is_writeable("gosaMailQuota")){
+      if (!is_numeric($this->gosaMailMaxSize)){
+        $message[]= _("Please specify a vaild mail size for mails to be rejected.");
+      } else {
+        $this->gosaMailMaxSize= (int) $this->gosaMailMaxSize;
+      }
+    }
+
+    /* Need gosaMailMaxSize if use_mailsize_limit is checked */
+    if (is_integer(strpos($this->gosaMailDeliveryMode, "reject")) && $this->gosaMailMaxSize == ""){
+      $message[]= _("You need to set the maximum mail size in order to reject anything.");
+    }
+
+    if(ord($this->imapacl['anyone'][0])==194){
+      $message[] = _("Please choose valid permission settings. Default permission can't be emtpy.");
+    }
+
+    if(empty($this->gosaMailServer)){
+      $message[] = _("Please select a valid mail server.");
+    }
+
+    return ($message);
+  }
+
+  /* Adapt from template, using 'dn' */
+  function adapt_from_template($dn)
+  {
+    plugin::adapt_from_template($dn);
+
+    foreach (array("gosaMailAlternateAddress", "gosaMailForwardingAddress") as $val){
+      $this->$val= array();
+      if (isset($this->attrs["$val"]["count"])){
+        for ($i= 0; $i<$this->attrs["$val"]["count"]; $i++){
+          $value= $this->attrs["$val"][$i];
+          foreach (array("sn", "givenName", "uid") as $repl){
+            if (preg_match("/%$repl/i", $value)){
+              $value= preg_replace ("/%$repl/i", $this->parent->$repl, $value);
+            }
+          }
+          array_push($this->$val, $value);
+        }
+      }
+    }
+  }
+
+  /* Add entry to forwarder list */
+  function addForwarder($address)
+  {
+    $this->gosaMailForwardingAddress[]= $address;
+    $this->gosaMailForwardingAddress= array_unique($this->gosaMailForwardingAddress);
+
+    /* Update multiple edit values too */
+    if($this->multiple_support_active){
+      $this->gosaMailForwardingAddress_Some= 
+        array_remove_entries (array($address),$this->gosaMailForwardingAddress_Some);
+    }
+
+    sort ($this->gosaMailForwardingAddress);
+    reset ($this->gosaMailForwardingAddress);
+    $this->is_modified= TRUE;
+  }
+
+  /* Remove list of addresses from forwarder list */
+  function delForwarder($addresses)
+  {
+    $this->gosaMailForwardingAddress= array_remove_entries ($addresses,
+        $this->gosaMailForwardingAddress);
+
+    /* Update multiple edit values too */
+    if($this->multiple_support_active){
+      $this->gosaMailForwardingAddress_Some = array_remove_entries ($addresses,
+          $this->gosaMailForwardingAddress_Some);
+    }
+    $this->is_modified= TRUE;
+  }
+
+
+
+  function addAlternate($address)
+  {
+    $ldap= $this->config->get_ldap_link();
+
+    $address= strtolower($address);
+
+    /* Is this address already assigned in LDAP? */
+    $ldap->cd ($this->config->current['BASE']);
+    $ldap->search ("(&(objectClass=gosaMailAccount)(|(mail=$address)".
+        "(gosaMailAlternateAddress=$address)))");
+
+    if ($ldap->count() > 0){
+      $attrs= $ldap->fetch ();
+      return ($attrs["uid"][0]);
+    }
+
+    /* Add to list of alternates */
+    if (!in_array($address, $this->gosaMailAlternateAddress)){
+      $this->gosaMailAlternateAddress[]= $address;
+    }
+
+    sort ($this->gosaMailAlternateAddress);
+    reset ($this->gosaMailAlternateAddress);
+    $this->is_modified= TRUE;
+
+    return ("");
+  }
+
+
+  function delAlternate($addresses)
+  {
+    $this->gosaMailAlternateAddress= array_remove_entries ($addresses,
+        $this->gosaMailAlternateAddress);
+    $this->is_modified= TRUE;
+  }
+
+
+  function make_name($attrs)
+  {
+    $name= "";
+    if (isset($attrs['sn'][0])){
+      $name= $attrs['sn'][0];
+    }
+    if (isset($attrs['givenName'][0])){
+      if ($name != ""){
+        $name.= ", ".$attrs['givenName'][0];
+      } else {
+        $name.= $attrs['givenName'][0];
+      }
+    }
+    if ($name != ""){
+      $name.= " ";
+    }
+
+    return ($name);
+  }
+
+  function getCopyDialog()
+  {
+    if(!$this->is_account) return("");
+
+    $smarty = get_smarty();
+    $smarty->assign("gosaMailAlternateAddress",$this->gosaMailAlternateAddress);
+    $smarty->assign("gosaMailForwardingAddress",$this->gosaMailForwardingAddress);
+    $smarty->assign("mail",$this->mail);
+    $display= $smarty->fetch (get_template_path('paste_mail.tpl', TRUE, dirname(__FILE__)));
+    $ret = array();
+    $ret['string'] = $display;
+    $ret['status'] = "";
+    return($ret);
+  }
+
+  function saveCopyDialog()
+  {
+    if(!$this->is_account) return;
+
+    /* Perform ADD / REMOVE ... for mail alternate / mail forwarding addresses 
+    */
+    $this->execute();
+    if(isset($_POST['mail'])){
+      $this->mail = $_POST['mail'];
+    }
+  }
+
+
+  function PrepareForCopyPaste($source)
+  {
+    plugin::PrepareForCopyPaste($source);
+    /* Reset alternate mail addresses */
+    $this->gosaMailAlternateAddress = array();
+  }
+
+
+  /* Return plugin informations for acl handling  */
+  static function plInfo()
+  {
+    return (array(
+          "plShortName"   => _("Mail"),
+          "plDescription" => _("Group mail"),
+          "plSelfModify"  => FALSE,
+          "plDepends"     => array(),
+          "plPriority"    => 0,
+          "plSection"     => array("administration"),
+          "plCategory"    => array("groups"), 
+          "plProvidedAcls"=> array(
+            "mail"                      => _("Mail address"),
+            "gosaMailAlternateAddress"  => _("Alternate addresses"),
+            "gosaMailForwardingAddress" => _("Forwarding addresses"),
+            "gosaMailQuota"             => _("Quota size"),
+            "gosaMailServer"            => _("Mail server"),
+            "acl"                       => _("Permissions"))
+          ));
+  }
+
+  
+  /* Remove given ACL for given member (uid,mail) ..
+   */
+  function removeUserAcl($index )
+  {
+    if(isset($this->imapacl[$index])){
+      unset($this->imapacl[$index]);
+    }
+  }
+
+  function multiple_execute()
+  {
+    return($this->execute());
+  }
+
+
+  function init_multiple_support($attrs,$all)
+  {
+    plugin::init_multiple_support($attrs,$all);
+
+    $this->gosaMailForwardingAddress = array();
+    if(isset($attrs['gosaMailForwardingAddress'])){
+      for($i = 0 ; $i < $attrs['gosaMailForwardingAddress']['count'] ; $i++){
+        $this->gosaMailForwardingAddress[] = $attrs['gosaMailForwardingAddress'][$i];
+      }
+    }
+
+    $this->gosaMailForwardingAddress_Some = array();
+    if(isset($all['gosaMailForwardingAddress'])){
+      for($i = 0 ; $i < $all['gosaMailForwardingAddress']['count'] ; $i++){
+        if(!in_array($all['gosaMailForwardingAddress'][$i],$this->gosaMailForwardingAddress)){
+          $this->gosaMailForwardingAddress_Some[] = $all['gosaMailForwardingAddress'][$i];
+        }
+      }
+    }
+  }
+
+  function multiple_save_object()
+  {
+    if(isset($_POST['multiple_mail_group_posted'])){
+      plugin::multiple_save_object();
+      
+      foreach(array("kolabFolderType") as $attr){
+        if(isset($_POST['use_'.$attr])){
+          $this->multi_boxes[] = $attr;
+        }
+      }
+
+      /* Add special kolab attributes */
+      if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+        if(isset($_POST['kolabFolderType_Type'])){
+          $this->kolabFolderType_Type = get_post("kolabFolderType_Type");
+          $this->kolabFolderType_SubType = get_post("kolabFolderType_SubType");
+        }
+      }
+
+      /* Collect data and re-assign it to the imapacl array */
+      if ($this->acl_is_writeable("acl")){
+        $this->imapacl= array();
+        $this->imapacl['%members%']= $_POST['member_permissions'];
+        $this->imapacl['anyone']= $_POST['default_permissions'];
+        foreach ($this->indexed_user as $nr => $user){
+          if (!isset($_POST["user_$nr"])){
+            continue;
+          }
+          if ($_POST["user_$nr"] != $user ||
+              $_POST["perm_$nr"] != $this->indexed_acl[$nr]){
+            $this->is_modified= TRUE;
+          }
+          $this->imapacl[$_POST["user_$nr"]]= $_POST["perm_$nr"];
+        }
+      }
+    }
+  }
+  
+  
+  /* Return selected values for multiple edit */
+  function get_multi_edit_values()
+  {
+    $ret = plugin::get_multi_edit_values();
+    $ret['Forward_some'] = $this->gosaMailForwardingAddress_Some;    
+    $ret['Forward_all'] = $this->gosaMailForwardingAddress;    
+    if(in_array('kolabFolderType',$this->multi_boxes)){
+      $ret['kolabFolderType_Type'] = $this->kolabFolderType_Type;
+      $ret['kolabFolderType_SubType'] = $this->kolabFolderType_SubType;
+    }
+    if(in_array("acl",$this->multi_boxes)){
+      $ret['imapacl'] = $this->imapacl;
+    }
+    return($ret);
+  }
+
+  function set_multi_edit_values($attrs)
+  {
+    $forward = array();
+    foreach($attrs['Forward_some'] as $addr){
+      if(in_array($addr,$this->gosaMailForwardingAddress)){
+        $forward[] = $addr;
+      }
+    }
+    foreach($attrs['Forward_all'] as $addr){
+      $forward[] = $addr;
+    }
+    plugin::set_multi_edit_values($attrs);
+    $this->gosaMailForwardingAddress = $forward;
+  }
+}
+
+  // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
+?>
diff --git a/gosa-core/plugins/admin/groups/mail/mail.tpl b/gosa-core/plugins/admin/groups/mail/mail.tpl
new file mode 100644 (file)
index 0000000..6d57a98
--- /dev/null
@@ -0,0 +1,225 @@
+<input type="hidden" name="mailedit" value="1">
+<table summary="" style="width:100%; vertical-align:top; text-align:left;" cellpadding=0 border=0>
+
+ <!-- Headline container -->
+ <tr>
+  <td style="width:50%; border-right:1px solid #A0A0A0; vertical-align:top">
+   <h2><img class="center" alt="" align="middle" src="images/rightarrow.png"> {t}Generic{/t}</h2>
+   <table summary="">
+    <tr>
+     <td><LABEL for="mail">{t}Primary address{/t}</LABEL>{$must}</td>
+     <td>
+{if $multiple_support}
+       <input id="dummy1" name="dummy1" size="25" maxlength="65" 
+               value="{t}Multiple edit{/t}" disabled>
+{else}
+       {render acl=$mailACL}
+               <input id="mail" name="mail" size="25" maxlength="65" value="{$mail}" title="{t}Primary mail address for this shared folder{/t}">
+       {/render}
+{/if}
+     </td>
+    </tr>
+    <tr>
+     <td><LABEL for="gosaMailServer">{t}Server{/t}</LABEL></td>
+     <td>
+{render acl=$gosaMailServerACL checkbox=$multiple_support checked=$use_gosaMailServer}
+      <select size="1" name="gosaMailServer" title="{t}Select mail server to place user on{/t}">
+       {html_options values=$mailServers output=$mailServers selected=$gosaMailServer}
+          <option disabled>&nbsp;</option>
+      </select>
+{/render}
+     </td>
+    </tr>
+    <tr>
+     <td>
+      <br>
+       <LABEL for="gosaMailQuota"> {t}Quota usage{/t}</LABEL>
+     </td>
+     <td>
+      <br>
+{if $quotadefined eq "true"}
+       {$quotausage}
+{else}
+       {t}not defined{/t}
+{/if}
+     </td>
+    </tr>
+    <tr>
+     <td>{t}Quota size{/t}</td>
+     <td>
+{render acl=$gosaMailQuotaACL  checkbox=$multiple_support checked=$use_gosaMailQuota}
+       <input id="gosaMailQuota" name="gosaMailQuota" size="6" align=middle maxlength="30" value="{$gosaMailQuota}">
+{/render}
+        {t}MB{/t}
+       </td>
+</tr>
+       {if $kolab}
+       <tr>
+               <td>
+                       {t}Folder type{/t}
+               </td>
+               <td>
+               
+               {if $multiple_support}
+                       <input type='checkbox' name='use_kolabFolderType' id='use_kolabFolderType' class="center"
+                               {if $use_kolabFolderType} checked {/if}
+                               onClick="changeState('kolabFolderType_Type');changeState('kolabFolderType_SubType');"                   
+                       >
+                       <select id="kolabFolderType_Type" name="kolabFolderType_Type" onChange="document.mainform.submit();"
+                               {if !$use_kolabFolderType} disabled {/if}>
+                               {html_options options=$kolabFolderType_Types selected=$kolabFolderType_Type}
+                       </select>
+                       <select id="kolabFolderType_SubType" name="kolabFolderType_SubType" onChange="document.mainform.submit();"
+                               {if !$use_kolabFolderType} disabled {/if}>
+                               {html_options options=$kolabFolderType_SubTypes selected=$kolabFolderType_SubType}
+                       </select>
+               {else}
+                       <select id="kolabFolderType_Type" name="kolabFolderType_Type" onChange="document.mainform.submit();">
+                               {html_options options=$kolabFolderType_Types selected=$kolabFolderType_Type}
+                       </select>
+                       <select id="kolabFolderType_SubType" name="kolabFolderType_SubType" onChange="document.mainform.submit();">
+                               {html_options options=$kolabFolderType_SubTypes selected=$kolabFolderType_SubType}
+                       </select>
+               {/if}
+                       {if !$JS}
+                               <input type='image' src='images/list_reload.png' class='center' alt='{t}Reload{/t}'>
+                       {/if}
+               </td>
+       </tr>
+       {/if}
+   </table>
+     
+  </td>
+
+{if $multiple_support}
+
+{else}
+
+  <td style="vertical-align:top;padding-left:2px;">
+
+       
+
+   <h2><img class="center" alt="" align="middle" src="images/alternatemail.png"> {t}Alternative addresses{/t}</h2>
+
+{render acl=$gosaMailAlternateAddressACL}
+   <select style="width:100%;" name="alternates_list[]" size=10 multiple title="{t}List of alternative mail addresses{/t}">
+    {html_options values=$gosaMailAlternateAddress output=$gosaMailAlternateAddress}
+       <option disabled>&nbsp;</option>
+   </select>
+{/render}
+
+   <br>
+
+{render acl=$gosaMailAlternateAddressACL}
+   <input name="alternate_address" size="30" align=middle maxlength="60" value="">
+{/render}
+
+{render acl=$gosaMailAlternateAddressACL}
+   <input type=submit value="{t}Add{/t}" name="add_alternate">&nbsp;
+{/render}
+
+{render acl=$gosaMailAlternateAddressACL}
+   <input type=submit value="{t}Delete{/t}" name="delete_alternate">
+{/render}
+
+  </td>
+{/if}
+ </tr>
+
+</table>
+<p class="seperator">&nbsp;</p>
+
+<table summary="" style="width:100%; vertical-align:top; text-align:left;" cellpadding=4 border=0>
+ <tr>
+  <td style="vertical-align:top;width:50%; border-right:1px solid #A0A0A0">
+   <h2><img class="center" alt="" align="middle" src="images/members.png"> {t}IMAP shared folders{/t}</h2>
+{if $multiple_support}
+
+       <input class="center" type='checkbox' name="use_acl" value="1" {if $use_acl} checked {/if} 
+               onClick="toggle('acl_div');">{t}Set shared folder permissions{/t}
+       {if $use_acl}
+               <div style="visibility:visible;" id="acl_div">
+       {else}
+               <div style="visibility:hidden;" id="acl_div">
+       {/if}
+{/if}      
+   <table summary="" cellpadding=0 border=0>
+    <tr>
+     <td><LABEL for="default_permissions">{t}Default permission{/t}</LABEL></td>
+     <td>
+{render acl=$aclACL}
+      <select size="1" id="default_permissions" name="default_permissions">
+       {html_options options=$perms selected=$default_permissions}
+          <option disabled>&nbsp;</option>
+      </select>
+{/render}
+     </td>
+    </tr>
+    <tr>
+     <td><LABEL for="member_permissions">{t}Member permission{/t}</LABEL></td>
+     <td>
+{render acl=$aclACL}
+      <select id="member_permissions" size="1" name="member_permissions">
+       {html_options options=$perms selected=$member_permissions}
+      </select>
+{/render}
+     </td>
+    </tr>
+       {$plusattributes}
+   </table>
+{if $multiple_support}
+       </div>
+{/if}
+
+  </td>
+  <td style="vertical-align:top;width:50%">
+   <h2>
+       <img class="center" alt="" align="middle" src="images/envelope.png">
+       {t}Forward messages to non group members{/t}
+   </h2>
+
+{render acl=$gosaMailForwardingAddressACL}
+   <select style="width:100%;" name="forwarder_list[]" size=10 multiple>
+
+       {if $multiple_support}
+
+               {foreach from=$Forward_all item=item key=key}
+                       <option value="{$item}">{$item}&nbsp;({t}Used in all groups{/t})</option>
+               {/foreach}
+               {foreach from=$Forward_some item=item key=key}
+                       <option value="{$item}" style='color: #888888; background: #DDDDDD;background-color: #DDDDDD;'>{$item}&nbsp;({t}Not used in all groups{/t})</option>
+               {/foreach}
+       {else}
+    {html_options values=$gosaMailForwardingAddress output=$gosaMailForwardingAddress}
+       <option disabled>&nbsp;</option>
+       {/if}
+   </select>
+{/render}
+
+   <br>
+
+{render acl=$gosaMailForwardingAddressACL}
+   <input name="forward_address" size=20 align=middle maxlength=65 value="">
+{/render}
+{render acl=$gosaMailForwardingAddressACL}
+   <input type=submit value="{t}Add{/t}" name="add_forwarder">&nbsp;
+{/render}
+{render acl=$gosaMailForwardingAddressACL}
+   <input type=submit value="{t}Add local{/t}" name="add_local_forwarder">&nbsp;
+{/render}
+{render acl=$gosaMailForwardingAddressACL}
+   <input type=submit value="{t}Delete{/t}" name="delete_forwarder">
+{/render}
+  </td>
+ </tr>
+</table>
+
+<!-- Place cursor -->
+<script language="JavaScript" type="text/javascript">
+  <!-- // First input field on page
+       focus_field('mail');
+  -->
+</script>
+{if $multiple_support}
+       <input type="hidden" name="multiple_mail_group_posted" value="1">
+{/if}
diff --git a/gosa-core/plugins/admin/groups/mail/mail_admins.tpl b/gosa-core/plugins/admin/groups/mail/mail_admins.tpl
new file mode 100644 (file)
index 0000000..8c95cb0
--- /dev/null
@@ -0,0 +1,40 @@
+<table summary="" style="width:100%;">
+ <tr>
+  <td style="width:45%; vertical-align:top;">
+  <LABEL for="admins"> {t}Folder administrators{/t}</LABEL>
+   <br>
+   <select id="admins" style="width:380px; height:300px;" name="admins[]" size=15 multiple>
+    {html_options options=$admins}
+   </select>
+  </td>
+
+  <td style="width:10%; vertical-align:middle; text-align:center;">
+   <input type=submit name="add_users" value="&larr;" style="width:50px;">
+   <br>
+   <br>
+   <input type=submit name="del_users" value="&rarr;" style="width:50px;">
+  </td>
+
+  <td style="width:45%; vertical-align:top;">
+   <br>
+   <select style="width:380px; height:275px;" name="users[]" size=15 multiple>
+    {html_options options=$mailusers}
+   </select>
+   <br>
+       <LABEL for="department">{t}Select a specific department{/t}</LABEL>:
+   <select id="department" name="department" size=1 onChange="mainform.submit()">
+    {html_options options=$departments selected=$department}
+   </select>
+
+   {if $javascript ne "true"}
+   <input type=submit name="goButton" value="{t}Choose{/t}">
+   {/if}
+  </td>
+ </tr>
+</table>
+
+<p class="plugbottom">
+ <input type=submit name="edit_admins_finish" value="{t}Apply{/t}">
+ &nbsp;
+ <input type=submit name="edit_admins_cancel" value="{t}Cancel{/t}">
+</p>
diff --git a/gosa-core/plugins/admin/groups/mail/mail_locals.tpl b/gosa-core/plugins/admin/groups/mail/mail_locals.tpl
new file mode 100644 (file)
index 0000000..09d734a
--- /dev/null
@@ -0,0 +1,69 @@
+<table summary="" style="width:100%; vertical-align:top; text-align:left;" cellpadding=4>
+<tr>
+  <td style="vertical-align:top; width:600px">
+   <div class="contentboxh" style="height:20px;">
+    <p class="contentboxh" style="font-size:12px">
+     <b><LABEL for="local_list">{t}Select addresses to add{/t} {$hint}</LABEL ></b><br>
+    </p>
+   </div>
+   <div class="contentboxb">
+    <p class="contentboxb" style="border-top:1px solid #B0B0B0;background-color:#F8F8F8">
+     <select style="width:600px; margin-top:4px; height:450px;" id="local_list" name="local_list[]" size="15" multiple>
+               {html_options options=$mailusers}
+               <option disabled>&nbsp;</option>
+     </select>
+    </p>
+   </div>
+  </td>
+  <td style="vertical-align:top;">
+   <div class="contentboxh" style="height:20px;">
+    <p class="contentboxh" style="font-size:12px">
+               <img src="{$launchimage}" align="right" alt="[F]">
+                       <b>{t}Filters{/t}</b>
+       </p>
+   </div>
+   <div class="contentboxb">
+     <table summary="" style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
+      {$alphabet}
+     </table>
+    <table summary="" width="100%" style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
+               <tr>
+                       <td>
+                               <img alt="" src="{$tree_image}" align=middle title="{t}Display addresses of department{/t}">&nbsp;
+                               <select name="depselect" size=1 onChange="mainform.submit()" title="{t}Choose the department the search will be based on{/t}">
+                       {html_options options=$deplist selected=$depselect}
+                               </select>
+                       </td>
+               </tr>
+       </table>
+    <table summary="" width="100%" style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
+               <tr>
+                       <td width="18">
+                               <img alt="" src="{$search_image}" align=middle title="{t}Display addresses matching{/t}">
+                       </td>
+               <td>
+                               <input type='text' name='regex' maxlength='20' style="width:99%"value='{$regex}' title='{t}Regular expression for matching addresses{/t}' onChange="mainform.submit()">
+                       </td>
+               </tr>
+       </table>
+    <table summary="" width="100%"  style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
+               <tr>
+                       <td width="18">
+                               <img alt="" src="{$usearch_image}" align=middle title="{t}Display addresses of user{/t}">
+                       </td>
+               <td>
+                               <input type='text' name='muser' maxlength='20' value='{$muser}' style="width:99%" title='{t}User name of which addresses are shown{/t}' onChange="mainform.submit()">
+                       </td>
+               </tr>
+       </table>
+   {$apply}
+   </div>
+  </td>
+</tr>
+</table>
+
+<p class="plugbottom">
+  <input type=submit name="add_locals_finish" value="{t}Add{/t}">
+  &nbsp;
+  <input type=submit name="add_locals_cancel" value="{t}Cancel{/t}">
+</p>
diff --git a/gosa-core/plugins/admin/groups/mail/paste_mail.tpl b/gosa-core/plugins/admin/groups/mail/paste_mail.tpl
new file mode 100644 (file)
index 0000000..e30ba9a
--- /dev/null
@@ -0,0 +1,56 @@
+<h2>{t}Mail settings{/t}</h2>
+<table summary="" style="width:100%; vertical-align:top; text-align:left;">
+       <tr>
+               <td colspan=2>   
+                       <table summary="">
+                       <tr>
+                               <td>
+                                               <LABEL for="mail">{t}Primary address{/t}</LABEL>{$must}
+                                       </td>
+                               <td>
+                                               <input id="mail" name="mail" size="25" maxlength="65" 
+                                                       value="{$mail}" title="{t}Primary mail address for this shared folder{/t}">
+                                       </td>
+                       </tr>
+                       </table>
+               </td>
+       </tr>
+       <tr>
+               <td>
+                       <table style="width:100%; vertical-align:top; text-align:left;">
+                               <tr>
+                                       <td style="width:50%; border-right:1px solid #A0A0A0; vertical-align:top">
+                                                       {t}Alternative addresses{/t}
+                                               <select style="width:100%;" name="alternates_list[]" size=10 multiple title="{t}List of alternative mail addresses{/t}">
+                                                       {html_options values=$gosaMailAlternateAddress output=$gosaMailAlternateAddress}
+                                                       <option disabled>&nbsp;</option>
+                                               </select>
+                                               <br>
+                                               <input name="alternate_address" size="30" align=middle maxlength="60" value="">
+                                               <input type=submit value="{t}Add{/t}" name="add_alternate">&nbsp;
+                                               <input type=submit value="{t}Delete{/t}" name="delete_alternate">
+                                       </td>
+                                       <td style="vertical-align:top;width:50%">
+                                                       {t}Forward messages to non group members{/t}
+                                               <select style="width:100%;" name="forwarder_list[]" size=10 multiple>
+                                                       {html_options values=$gosaMailForwardingAddress output=$gosaMailForwardingAddress}
+                                                       <option disabled>&nbsp;</option>
+                                               </select>
+                                               <br>
+                                               <input name="forward_address" size=20 align=middle maxlength=65 value="">
+                                               <input type=submit value="{t}Add{/t}" name="add_forwarder">&nbsp;
+                                               <input type=submit value="{t}Add local{/t}" name="add_local_forwarder">&nbsp;
+                                               <input type=submit value="{t}Delete{/t}" name="delete_forwarder">
+                                       </td>
+                               </tr>
+                       </table>
+               <td>
+       </tr>
+</table>
+
+<!-- Place cursor -->
+<script language="JavaScript" type="text/javascript">
+  <!-- // First input field on page
+       focus_field('mail');
+  -->
+</script>
diff --git a/gosa-core/plugins/admin/groups/mail_admins.tpl b/gosa-core/plugins/admin/groups/mail_admins.tpl
deleted file mode 100644 (file)
index 8c95cb0..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<table summary="" style="width:100%;">
- <tr>
-  <td style="width:45%; vertical-align:top;">
-  <LABEL for="admins"> {t}Folder administrators{/t}</LABEL>
-   <br>
-   <select id="admins" style="width:380px; height:300px;" name="admins[]" size=15 multiple>
-    {html_options options=$admins}
-   </select>
-  </td>
-
-  <td style="width:10%; vertical-align:middle; text-align:center;">
-   <input type=submit name="add_users" value="&larr;" style="width:50px;">
-   <br>
-   <br>
-   <input type=submit name="del_users" value="&rarr;" style="width:50px;">
-  </td>
-
-  <td style="width:45%; vertical-align:top;">
-   <br>
-   <select style="width:380px; height:275px;" name="users[]" size=15 multiple>
-    {html_options options=$mailusers}
-   </select>
-   <br>
-       <LABEL for="department">{t}Select a specific department{/t}</LABEL>:
-   <select id="department" name="department" size=1 onChange="mainform.submit()">
-    {html_options options=$departments selected=$department}
-   </select>
-
-   {if $javascript ne "true"}
-   <input type=submit name="goButton" value="{t}Choose{/t}">
-   {/if}
-  </td>
- </tr>
-</table>
-
-<p class="plugbottom">
- <input type=submit name="edit_admins_finish" value="{t}Apply{/t}">
- &nbsp;
- <input type=submit name="edit_admins_cancel" value="{t}Cancel{/t}">
-</p>
diff --git a/gosa-core/plugins/admin/groups/mail_locals.tpl b/gosa-core/plugins/admin/groups/mail_locals.tpl
deleted file mode 100644 (file)
index 09d734a..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<table summary="" style="width:100%; vertical-align:top; text-align:left;" cellpadding=4>
-<tr>
-  <td style="vertical-align:top; width:600px">
-   <div class="contentboxh" style="height:20px;">
-    <p class="contentboxh" style="font-size:12px">
-     <b><LABEL for="local_list">{t}Select addresses to add{/t} {$hint}</LABEL ></b><br>
-    </p>
-   </div>
-   <div class="contentboxb">
-    <p class="contentboxb" style="border-top:1px solid #B0B0B0;background-color:#F8F8F8">
-     <select style="width:600px; margin-top:4px; height:450px;" id="local_list" name="local_list[]" size="15" multiple>
-               {html_options options=$mailusers}
-               <option disabled>&nbsp;</option>
-     </select>
-    </p>
-   </div>
-  </td>
-  <td style="vertical-align:top;">
-   <div class="contentboxh" style="height:20px;">
-    <p class="contentboxh" style="font-size:12px">
-               <img src="{$launchimage}" align="right" alt="[F]">
-                       <b>{t}Filters{/t}</b>
-       </p>
-   </div>
-   <div class="contentboxb">
-     <table summary="" style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
-      {$alphabet}
-     </table>
-    <table summary="" width="100%" style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
-               <tr>
-                       <td>
-                               <img alt="" src="{$tree_image}" align=middle title="{t}Display addresses of department{/t}">&nbsp;
-                               <select name="depselect" size=1 onChange="mainform.submit()" title="{t}Choose the department the search will be based on{/t}">
-                       {html_options options=$deplist selected=$depselect}
-                               </select>
-                       </td>
-               </tr>
-       </table>
-    <table summary="" width="100%" style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
-               <tr>
-                       <td width="18">
-                               <img alt="" src="{$search_image}" align=middle title="{t}Display addresses matching{/t}">
-                       </td>
-               <td>
-                               <input type='text' name='regex' maxlength='20' style="width:99%"value='{$regex}' title='{t}Regular expression for matching addresses{/t}' onChange="mainform.submit()">
-                       </td>
-               </tr>
-       </table>
-    <table summary="" width="100%"  style="width:100%;border-top:1px solid #B0B0B0; background-color:#F8F8F8">
-               <tr>
-                       <td width="18">
-                               <img alt="" src="{$usearch_image}" align=middle title="{t}Display addresses of user{/t}">
-                       </td>
-               <td>
-                               <input type='text' name='muser' maxlength='20' value='{$muser}' style="width:99%" title='{t}User name of which addresses are shown{/t}' onChange="mainform.submit()">
-                       </td>
-               </tr>
-       </table>
-   {$apply}
-   </div>
-  </td>
-</tr>
-</table>
-
-<p class="plugbottom">
-  <input type=submit name="add_locals_finish" value="{t}Add{/t}">
-  &nbsp;
-  <input type=submit name="add_locals_cancel" value="{t}Cancel{/t}">
-</p>
diff --git a/gosa-core/plugins/admin/groups/paste_mail.tpl b/gosa-core/plugins/admin/groups/paste_mail.tpl
deleted file mode 100644 (file)
index e30ba9a..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<h2>{t}Mail settings{/t}</h2>
-<table summary="" style="width:100%; vertical-align:top; text-align:left;">
-       <tr>
-               <td colspan=2>   
-                       <table summary="">
-                       <tr>
-                               <td>
-                                               <LABEL for="mail">{t}Primary address{/t}</LABEL>{$must}
-                                       </td>
-                               <td>
-                                               <input id="mail" name="mail" size="25" maxlength="65" 
-                                                       value="{$mail}" title="{t}Primary mail address for this shared folder{/t}">
-                                       </td>
-                       </tr>
-                       </table>
-               </td>
-       </tr>
-       <tr>
-               <td>
-                       <table style="width:100%; vertical-align:top; text-align:left;">
-                               <tr>
-                                       <td style="width:50%; border-right:1px solid #A0A0A0; vertical-align:top">
-                                                       {t}Alternative addresses{/t}
-                                               <select style="width:100%;" name="alternates_list[]" size=10 multiple title="{t}List of alternative mail addresses{/t}">
-                                                       {html_options values=$gosaMailAlternateAddress output=$gosaMailAlternateAddress}
-                                                       <option disabled>&nbsp;</option>
-                                               </select>
-                                               <br>
-                                               <input name="alternate_address" size="30" align=middle maxlength="60" value="">
-                                               <input type=submit value="{t}Add{/t}" name="add_alternate">&nbsp;
-                                               <input type=submit value="{t}Delete{/t}" name="delete_alternate">
-                                       </td>
-                                       <td style="vertical-align:top;width:50%">
-                                                       {t}Forward messages to non group members{/t}
-                                               <select style="width:100%;" name="forwarder_list[]" size=10 multiple>
-                                                       {html_options values=$gosaMailForwardingAddress output=$gosaMailForwardingAddress}
-                                                       <option disabled>&nbsp;</option>
-                                               </select>
-                                               <br>
-                                               <input name="forward_address" size=20 align=middle maxlength=65 value="">
-                                               <input type=submit value="{t}Add{/t}" name="add_forwarder">&nbsp;
-                                               <input type=submit value="{t}Add local{/t}" name="add_local_forwarder">&nbsp;
-                                               <input type=submit value="{t}Delete{/t}" name="delete_forwarder">
-                                       </td>
-                               </tr>
-                       </table>
-               <td>
-       </tr>
-</table>
-
-<!-- Place cursor -->
-<script language="JavaScript" type="text/javascript">
-  <!-- // First input field on page
-       focus_field('mail');
-  -->
-</script>