Code

Updated filter automatic indent
[gosa.git] / gosa-core / include / class_baseSelector.inc
index 28d0025c24aed26dae580ac3c6337d68506a6c36..2833ce5e36a00fd6df54c821e55528b139cb9da1 100644 (file)
@@ -24,17 +24,13 @@ class baseSelector {
 
   private $base;
   private $pid;
+  private $action;
+  private $height= 500;
+  private $submitButton= true;
   protected $tree;
   protected $pathMapping;
+  protected $lastState;
 
-  // It would be better to get a dn -> [name, description, type] array
-  // to avoid these tasks be done several times. Skipping for the moment.
-  #'dc' => 'plugins/departments/images/domain.png',
-  #'dc' => 'plugins/departments/images/dc.png',
-  #'l' => 'plugins/departments/images/locality.png',
-  #'c' => 'plugins/departments/images/country.png',
-  #'o' => 'plugins/departments/images/organization.png',
-  #'ou' => 'plugins/departments/images/folder.png',
 
   function __construct($bases, $base= "")
   {
@@ -44,7 +40,18 @@ class baseSelector {
     // Transfer data
     $this->setBases($bases);
     $this->setBase($base);
-    $this->update();
+  }
+
+
+  function setSubmitButton($flag)
+  {
+    $this->submitButton= $flag;
+  }
+
+
+  function setHeight($value)
+  {
+    $this->height= $value;
   }
 
 
@@ -52,12 +59,23 @@ class baseSelector {
   {
     if (isset($this->pathMapping[$base])) {
       $this->base= $base;
-    } else {
-      die("Invalid base selected");
+      $this->update(true);
     }
   }
 
 
+  function checkBase($base)
+  {
+    return isset($this->pathMapping[$base]);
+  }
+
+
+  function checkLastBaseUpdate()
+  {
+    return $this->lastState;
+  }
+
+
   function setBases($bases)
   {
     global $config;
@@ -81,13 +99,64 @@ class baseSelector {
   }
 
 
-  function update()
+  function update($force= false)
   {
     global $config;
-    $this->tree= "<input type='text' size='30' name='bs_input_".$this->pid."' id='bs_input_".$this->pid."' onfocus=\"\$('bs_".$this->pid."').hide()\" onmouseover=\"\$('bs_".$this->pid."').show();pos = Element.positionedOffset('bs_input_".$this->pid."');\$('bs_".$this->pid."').setStyle({left: (pos[0]), top: (pos[1]+ Element.getHeight('bs_input_".$this->pid."'))});\" onmouseout=\"rtimer= Element.hide.delay(0.25, 'bs_".$this->pid."')\" value='".$this->pathMapping[$this->base]."'>";
+
+    // Analyze for base changes if needed
+    $this->action= null;
+    $last_base= $this->base;
+    if(isset($_REQUEST['BPID']) && $_REQUEST['BPID'] == $this->pid) {
+      if (isset($_POST['bs_rebase_'.$this->pid]) && !empty($_POST['bs_rebase_'.$this->pid])) {
+        $new_base= base64_decode($_POST['bs_rebase_'.$this->pid]);
+        if (isset($this->pathMapping[$new_base])) {
+          $this->base= $new_base;
+          $this->action= 'rebase';
+        } else {
+          $this->lastState= false;
+          return false;
+        }
+      }else{
+        // Input field set?
+        if (isset($_POST['bs_input_'.$this->pid])) {
+
+          // Take over input field base
+          if ($this->submitButton && isset($_POST['submit_base_'.$this->pid.'_x']) || !$this->submitButton) {
+
+            // Check if base is available
+            $this->lastState= false;
+            foreach ($this->pathMapping as $key => $path) {
+              if (mb_strtolower($path) == mb_strtolower($_POST['bs_input_'.$this->pid])) {
+                $this->base= $key;
+                $this->lastState= true;
+                break;
+              }
+            }
+          }
+        }
+      } 
+
+    }
+
+    /* Skip if there's no change */
+    if (($this->tree && $this->base == $last_base) && !$force) {
+      return true;
+    }
+
+    $link= "onclick=\"\$('bs_rebase_".$this->pid."').value='".base64_encode($config->current['BASE'])."';  $('submit_tree_base_".$this->pid."').click();\"";
+    $this->tree= "<input type='text' size='35' name='bs_input_".$this->pid."' id='bs_input_".$this->pid."' onkeydown=\"\$('bs_".$this->pid."').hide()\" onfocus=\"\$('bs_".$this->pid."').hide()\" onmouseover=\"Element.clonePosition(\$('bs_".$this->pid."'), 'bs_input_".$this->pid."', {setHeight: false, setWidth: false, offsetTop:(Element.getHeight('bs_input_".$this->pid."'))});\$('bs_".$this->pid."').show();\" onmouseout=\"rtimer= Element.hide.delay(0.25, 'bs_".$this->pid."')\" value=\"".preg_replace('/"/', '&quot;',$this->pathMapping[$this->base])."\">";
+
+    // Autocompleter
+    $this->tree.= "<div id='autocomplete_".$this->pid."' class='autocomplete'></div>".
+                  "<script type='text/javascript'>".
+                  "new Ajax.Autocompleter('bs_input_".$this->pid."', 'autocomplete_".$this->pid."', 'autocomplete.php?type=base', { minChars: 3, frequency: 0.5 });";
+    if ($this->submitButton) {
+      $this->tree.= "$('bs_input_".$this->pid."').observe('keypress', function(event) { if(event.keyCode == Event.KEY_RETURN) { $('submit_base_".$this->pid."').click(); } });";
+    }
+    $this->tree.= "</script>";
 
     $selected= $this->base == $config->current['BASE']?"Selected":"";
-    $this->tree.= "<div class='treeList' style='display:none' id='bs_".$this->pid."' onmouseover=\"window.clearTimeout(rtimer);\" onmouseout=\"rtimer= Element.hide.delay(0.25, 'bs_".$this->pid."')\"><a class='treeList$selected' href='#'>/ ["._("Root")."]</a><ul class='treeList'>\n";
+    $this->tree.= "<div class='treeList' style='display:none;max-height:".$this->height."px' id='bs_".$this->pid."' onmouseover=\"window.clearTimeout(rtimer);\" onmouseout=\"rtimer= Element.hide.delay(0.25, 'bs_".$this->pid."')\"><a class='treeList$selected' $link>/&nbsp;["._("Root")."]</a><ul class='treeList'>\n";
     $first= true;
     $last_indent= 2;
 
@@ -115,22 +184,44 @@ class baseSelector {
         $this->tree.= "</li>\n";
       }
       $selected= $this->base == $base?" class='treeListSelected'":"";
-      $this->tree.= "<li><a$selected href='#'>".str_replace(' ', '&nbsp;', ldap::fix(preg_replace('/^[a-z0-9]+=([^,]+),.*$/i', '$1', $base)))."</a>";
+      $link= "onclick=\"\$('bs_rebase_".$this->pid."').value='".base64_encode($base)."';$('submit_tree_base_".$this->pid."').click();\"";
+      $this->tree.= "<li>".
+                    image($config->department_info[$base]['img'])."&nbsp;<a$selected $link>".
+                    $this->gennonbreaks($config->department_info[$base]['name']).
+                    ($config->department_info[$base]['description']==''?'':'&nbsp;<span class="informal">['.$this->gennonbreaks($config->department_info[$base]['description']).']</span>').
+                    "</a>";
 
       $last_indent= $indent;
       $first= false;
     }
 
     // Close tree
-    for ($i= 0; $i<$last_indent; $i++) {
+    for ($i= 1; $i<$last_indent; $i++) {
       $this->tree.= "</li></ul>\n";
     }
     $this->tree.= "</div>\n";
+
+    // Draw submitter if required
+    if ($this->submitButton) {
+      $this->tree.= image('images/lists/submit.png', "submit_base_".$this->pid, _("Submit"));
+    }
+    $this->tree.= "<input type='submit' style='display:none' name='submit_tree_base_".$this->pid."' id='submit_tree_base_".$this->pid."'>";
+    $this->tree.= "<input type='hidden' name='bs_rebase_".$this->pid."' id='bs_rebase_".$this->pid."'>";
+    $this->tree.= "<input type='hidden' name='BPID' id='BPID' value='".$this->pid."'>";
+
+    $this->lastState= true;
+    return true;
   }
 
+
+  function gennonbreaks($string)
+  {
+    return str_replace('-', '&#8209;', str_replace(' ', '&nbsp;', $string));
+  }
+
+
   function render()
   {
-    $result= "";
     return $this->tree;
   }
 
@@ -143,10 +234,16 @@ class baseSelector {
 
   function getAction()
   {
-    // Do not do anything if this is not our PID, or there's even no PID available...
-    #if(!isset($_REQUEST['PID']) || $_REQUEST['PID'] != $this->pid) {
-    #  return;
-    #}
+    // Do not do anything if this is not our BPID, or there's even no BPID available...
+    if(!isset($_REQUEST['BPID']) || $_REQUEST['BPID'] != $this->pid) {
+      return;
+    }
+
+    if ($this->action) {
+      return array("targets" => array($this->base), "action" => $this->action);
+    }
+
+    return null;
   }
 
 }