Code

Added schema updated - homeServer for conferences
[gosa.git] / plugins / gofon / phoneaccount / class_phoneAccount.inc
index db1c304c2ff7a753dd94e03d75991e91e5cfb469..56347c7032c1533f3b9b7ec08f93b2cda2585ab3 100644 (file)
@@ -8,9 +8,9 @@ class phoneAccount extends plugin
   var $has_mailAccount= FALSE;
 
   /* Attributes */
-  var $telephoneNumber        = "";
-  var $goFonHardware          = "";
-  var $goFonFormat            = "";
+  var $telephoneNumber        = array();
+  var $goFonHardware          = "automatic";
+  var $goFonFormat            = "wav";
   var $goFonPIN               = "";
   var $goFonVoicemailPIN      = "";
   var $goFonDeliveryMode      = "";
@@ -27,6 +27,10 @@ class phoneAccount extends plugin
   var $generate_error         = "";
   var $a_old_telenums         = array();
   var $goFonPINVoice          = "";
+  var $goFonHomeServer        = "0";            // Contains the dn of the server that manage this account 
+  var $init_HomeServer        = "0";            // Contains the dn of the server that manage this account 
+  var $goFonHomeServers       = array();        // Contains all available server configurations 
+    
 
   /* CLI vars */
   var $cli_summary            = "Manage users phone account";
@@ -34,23 +38,18 @@ class phoneAccount extends plugin
   var $cli_parameters         = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
 
   /* attribute list for save action */
-  var $attributes             = array("goFonDeliveryMode", "goFonFormat","uid","cn","mail",
+  var $CopyPasteVars          = array("phoneNumbers","macroarray","macrostillavailable"/*"phoneNumbers" -Reset- */,
+                                      "hardware_list","used_hardware");
+
+  var $attributes             = array("goFonDeliveryMode", "goFonFormat","uid","cn","goFonHomeServer",
       "goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
   var $objectclasses= array("goFonAccount");
 
-  function phoneAccount ($config, $dn= NULL)
-  {
-    plugin::plugin ($config, $dn);
+  var $uid;
 
-    /* Set phone hardware */
-    if (!isset($this->attrs['goFonHardware'])){
-      $this->goFonHardware= "automatic";
-    }
-
-    /* Preset voice format */
-    if (!isset($this->attrs['goFonFormat'])){
-      $this->goFonFormat= "wav";
-    }
+  function phoneAccount ($config, $dn= NULL, $parent= NULL)
+  {
+    plugin::plugin ($config, $dn, $parent);
 
     /* Assemble phone numbers */
     if (isset($this->attrs['telephoneNumber'])){
@@ -67,36 +66,66 @@ class phoneAccount extends plugin
       }
     }
 
+
+    /* Check server configurations 
+     * Load all server configuration in $this->goFonHomeServers if available
+     *  and first server as default if necessary.
+     * Check if connection is successfull for the selected server $this->goFonHomeServer
+     */
     $a_SETUP= array();
     if(array_key_exists('config',$_SESSION) &&
        array_key_exists('SERVERS',$_SESSION['config']->data) &&
        array_key_exists('FON',$_SESSION['config']->data['SERVERS']) &&
        is_callable("mysql_connect")
        ) {
-      $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
-      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
-      if(!$r_con){
-        $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-          $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
-        gosa_log(mysql_error());
-        return false;
-      }
-      $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-      if(!$db){
-        $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
-        gosa_log(mysql_error());
-        return false;
-      }
-      $first = false; 
-      foreach($this->phoneNumbers as $key => $val){
-        if(!$first){
-          $first = $key;
+
+      /* Set available server */
+      $this->goFonHomeServers = $_SESSION['config']->data['SERVERS']['FON'];
+
+      /* Servers defined? Watch here... */
+      if (count($this->goFonHomeServers)){
+
+        /* Set default server */
+        if(empty($this->goFonHomeServer) || $this->goFonHomeServer == "0"){
+          $this->goFonHomeServer= $this->goFonHomeServers[0]['DN'];
+        }
+
+        /* Remember inital home server, to be able to remove old entries */
+        $this->init_HomeServer = $this->goFonHomeServer;
+
+        /* Get config */
+        if(!isset($this->goFonHomeServers[$this->goFonHomeServer])){
+          print_red(sprintf(_("The specified goFonHomeServer '%s' is not available in GOsa server configuration. Saving this account will create a new entry on the server '%s'. Use cancel if you do not want to create a new entry ignoring old accounts."),$this->goFonHomeServer, $this->goFonHomeServers[0]['DN']));
+
+          $this->goFonHomeServer = $this->goFonHomeServers[0]['DN'];
+          $this->init_HomeServer = $this->goFonHomeServers[0]['DN'];
+        }    
+        $cur_cfg = $this->goFonHomeServers[$this->goFonHomeServer];
+
+        $r_con =  @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
+        if(!$r_con){
+          print_red( sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+                $cur_cfg['SERVER'],$cur_cfg['LOGIN']));
+          gosa_log(mysql_error());
+        }
+        $db  =  @mysql_select_db($cur_cfg['DB'],$r_con);
+        if(!$db){
+          print_red(sprintf(_("Can't select database %s on %s."),$cur_cfg['DB'],$cur_cfg['SERVER']));
+          gosa_log(mysql_error());
+        }
+
+        $first = false; 
+        foreach($this->phoneNumbers as $key => $val){
+          if(!$first){
+            $first = $key;
+          }
         }
       }
     }
 
-    /* Load hardware list */
+    /* Get available phone hardware  
+     * Search for all available phone hardware  
+     */
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
     $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
@@ -108,65 +137,65 @@ class phoneAccount extends plugin
         $description= "";
       }
       $this->hardware_list[$cn]= "$cn$description";
-
     }
 
-    /* Perform search, to get Macro Parameters,Name,Dn,Displayname etc*/
-    $ldap->search("(objectClass=goFonMacro)", array("*"));
+
+    /* Get available Macros  
+     * Search for all Marcos that are visible and create 
+     *  an array with name and parameters 
+     */
+    $ldap->search("(&(objectClass=goFonMacro)(goFonMacroVisible=1))", array("*"));
 
     /* Add none for no macro*/
     $this->macros['none']=_("no macro");    
     $this->macro ="none";
 
-
     /* Fetch all Macros*/
     while ($attrs= $ldap->fetch()){
 
-      /* Only visisble */
-      if((isset($attrs['goFonMacroVisible'][0]))&&($attrs['goFonMacroVisible'][0] ==1)){
+      /* unset Count, we don't need that here */
+      unset($attrs['displayName']['count']);
 
-        /* unset Count, we don't need that here */
-        unset($attrs['displayName']['count']);
-
-        /* fill Selectfield variable with Macros */
-        if(isset($attrs['displayName'][0])){
-          $this->macros[$attrs['dn']] = $attrs['displayName'][0]." (".$attrs['cn'][0].")";
-        }else{
-          $this->macros[$attrs['dn']] = _("undefined");
-        }
+      /* Parse macro data, unset count for parameterarrays  */
+      if (isset($attrs['goFonMacroParameter']['count'])){
+        unset($attrs['goFonMacroParameter']['count']);
+      }
 
-        /* Parse macro data, unset count for parameterarrays  */
-        if (isset($attrs['goFonMacroParameter']['count'])){
-          unset($attrs['goFonMacroParameter']['count']);
-        }
+      /* fill Selectfield variable with Macros */
+      if(isset($attrs['displayName'][0])){
+        $this->macros[$attrs['dn']] = $attrs['displayName'][0]." (".$attrs['cn'][0].")";
+      }else{
+        $this->macros[$attrs['dn']] = _("undefined");
+      }
 
-        /* Go through available parameters and parse all attributes, like parametername, type, default ...*/
-        if((isset($attrs['goFonMacroParameter']))&&(is_array($attrs['goFonMacroParameter']))){
-
-          foreach($attrs['goFonMacroParameter'] as $pkey=>$pval){
-            /* Split Data in readable values, by delimiter !  */
-            $data = split("!",$attrs['goFonMacroParameter'][$pkey]);
-
-            /* Set all attrs */
-            $id = $data[0];
-            $this->macroarray[$attrs['dn']][$id]['var']    ="var".$id;
-            $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3]; 
-            $this->macroarray[$attrs['dn']][$id]['id']     =$id;
-            $this->macroarray[$attrs['dn']][$id]['name']   =$data[1];
-            $this->macroarray[$attrs['dn']][$id]['type']   =$data[2];
-            $this->macroarray[$attrs['dn']][$id]['default']=$data[3];
-            if($data[2] == "bool"){
-              $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3];
-            }
-          }//foreach
-        }//is_array
-      }//visible = 1
+      /* Go through available parameters and parse all attributes, like parametername, type, default ...*/
+      if((isset($attrs['goFonMacroParameter']))&&(is_array($attrs['goFonMacroParameter']))){
+
+        foreach($attrs['goFonMacroParameter'] as $pkey=>$pval){
+          /* Split Data in readable values, by delimiter !  */
+          $data = split("!",$attrs['goFonMacroParameter'][$pkey]);
+
+          /* Set all attrs */
+          $id = $data[0];
+          $this->macroarray[$attrs['dn']][$id]['var']    ="var".$id;
+          $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3]; 
+          $this->macroarray[$attrs['dn']][$id]['id']     =$id;
+          $this->macroarray[$attrs['dn']][$id]['name']   =$data[1];
+          $this->macroarray[$attrs['dn']][$id]['type']   =$data[2];
+          $this->macroarray[$attrs['dn']][$id]['default']=$data[3];
+          if($data[2] == "bool"){
+            $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3];
+          }
+        }//foreach
+      }//is_array
     }//while
 
-    /* Go through already saved values, for a parameter */
-    $tmp = split("!",$this->goFonMacro);
 
-    /* it is possible that nothing has been saved yet */
+    /* Parse used Macro  
+     * If we have a macro selected, parse it and set values 
+     *  in $this->macroarray[$this->macro]. 
+     */
+    $tmp = split("!",$this->goFonMacro);
     if(is_array($tmp)){
 
       /* First value is the macroname */
@@ -176,7 +205,7 @@ class phoneAccount extends plugin
       unset($tmp[0]);
 
       /* Check if makro has been removed */
-      if(!isset($this->macroarray[$this->macro])){
+      if(!isset($this->macros[$this->macro])){
         $this->macrostillavailable = false;
       }else{
         $this->macrostillavailable = true;
@@ -197,7 +226,10 @@ class phoneAccount extends plugin
     }
 
 
-    /* Eventually colorize phones */
+    /* Colorize phones 
+     * Used phones will be colored in grey, 
+     *  so we must detect which phones are currently in use.
+     */
     $ldap->cd($this->config->current['BASE']);
     foreach ($this->hardware_list as $cn => $desc){
       $ldap->search("(goFonHardware=$cn)", array('cn'));
@@ -223,11 +255,11 @@ class phoneAccount extends plugin
      * This means, the PIN in the DB is up to date
      */
     // Connect to DB server
-    if((is_callable("mysql_pconnect"))&&(isset($a_SETUP))&&(isset($a_SETUP['SERVER']))&&(isset($a_SETUP['LOGIN']))&&(isset($a_SETUP['PASSWORD']))){
-      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+    if((is_callable("mysql_pconnect"))&&(isset($cur_cfg))&&(isset($cur_cfg['SERVER']))&&(isset($cur_cfg['LOGIN']))&&(isset($cur_cfg['PASSWORD']))){
+      $r_con =  @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
       if($r_con){
-        $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-        $vp = mysql_fetch_row(mysql_query("SELECT ".$a_SETUP['VOICE_TABLE'].".password FROM  ".$a_SETUP['VOICE_TABLE'].", ".$a_SETUP['SIP_TABLE']."  WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'"));
+        $r_db  =  @mysql_select_db($cur_cfg['DB'],$r_con);
+        $vp = mysql_fetch_row(mysql_query("SELECT ".$cur_cfg['VOICE_TABLE'].".password FROM  ".$cur_cfg['VOICE_TABLE'].", ".$cur_cfg['SIP_TABLE']."  WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'"));
 
         if((isset($vp[0]))&&(!empty($vp[0]))){
           $this->goFonPINVoice = $vp[0];
@@ -242,23 +274,42 @@ class phoneAccount extends plugin
   }
 
 
-  // Generate MySQL Syntax
-  function generate_mysql_entension_entries($save = false){
-
-    if(!isset($_SESSION['config']->data['SERVERS']['FON'])){
-      if($save)
-      print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
+  /* This function generates the Database entries. 
+   * The Parameter 'save' could be true or false.
+   *  false - means only testing no database transactions.
+   *  true  - write database entries.
+   *
+   * 'sip_users','voice_mail' and 'extensions' table entries will be created.
+   * 
+   * If the phone hardware is 'automatic' the table entries will only be removed
+   *  and not added. 
+   */
+  function generate_mysql_entension_entries($save = false)
+  {
+    /* Check if there is at least one server available 
+     * If not, return and tell the user that saving failed 
+     */
+    if(!count($this->goFonHomeServers)){
+      if($save){
+        print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
+      }
       return(true);
     }
 
+    /* Check if Mysql extension is available */
     if(!is_callable("mysql_pconnect")){
       if($save)
       print_red(_("Can't save any changes to asterisk database, there is no mysql extension available."));
       return(true);
     }
-  
+    /********************** 
+     * Attribute Initialisation
+     **********************/
+
+    $old_connection = false;
+
     // Get Configuration for Mysql database Server
-    $a_SETUP        = $_SESSION['config']->data['SERVERS']['FON'];  // DB Configuration
     $s_parameter    = "";                                           // Contains paramter for selected Macro 
     $r_con          = false;                                        // DB connection
     $r_db           = false;                                        // Selected DB
@@ -267,7 +318,7 @@ class phoneAccount extends plugin
 
     $s_ip           = NULL;                   // Contains ip for Sip entry
     $s_host         = NULL;                   // Contains host for Sip entry
-    $s_qualify      = NULL;                   // Qualify entry
+    $s_qualify      = "yes";                  // Qualify entry
     $s_pin          = NULL;                   // Entry for secret
     $s_type         = NULL;                   // Entry for phone type (friend , peer ..)
 
@@ -284,224 +335,371 @@ class phoneAccount extends plugin
     $b_first_deleted= false;  // Only delete first entry, 
     $s_telenums     = "";     // for each value variable
 
-    $i_is_accounted =false;   // Ensure that extension entry, for name to number is only once in table
+    $i_is_accounted = false;  // Ensure that extension entry, for name to number is only once in table
 
+    restore_error_handler();
 
-    // Connect to DB server
-    $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
-
-    // Check if we are  connected correctly
-    if(!$r_con){
-      $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-          $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
-      gosa_log(mysql_error());
-      return false;
+    /* Prepare some basic attributes */
+    foreach($this->a_old_telenums as $tele){
+      $oldnums[]= preg_replace("/[^0-9]/","",$tele);
+    }
+    foreach($this->phoneNumbers as $tele){
+      $newnums[]= preg_replace("/[^0-9]/","",$tele);
     }
 
-    // Select database for Extensions
-    $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-
-    // Test if we have the database selected correctly
-    if(!$r_db){
-      $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
-      gosa_log(mysql_error());
-      return false;
+    /* If deletion starts from userslist, cn uid are not set */
+    if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
+      $this->uid = $this->parent->by_object['user']->uid;
+    }
+    if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
+      $this->cn  = $this->parent->by_object['user']->cn;
+    }
+    /* Create voicemail entry 
+     */
+    if((!isset($this->cn))||(empty($this->cn))){
+      $CNname= $this->uid;
+    }else{
+      $CNname= $this->cn;
     }
 
-    // Get phonehardware to setup sip entry
+    if((isset($this->parent))&&(isset($this->parent->by_object['mailAccount']))&&($this->parent->by_object['mailAccount']->is_account==true)){
+      $s_mail = $this->parent->by_object['mailAccount']->mail;
+    }else{
+      $s_mail = "";
+    }
+    /* Get phonehardware to setup sip entry  */
     $ldap         = $this->config->get_ldap_link();
     $r_res        = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
     $a_ldap_attrs = $ldap->fetch();
 
+    /* Check selected phone hardware, is a default IP set? */
+    if(((isset($a_ldap_attrs['goFonDefaultIP'][0]))&&($a_ldap_attrs['goFonDefaultIP'][0] != "dynamic"))){
+      $s_ip       = $a_ldap_attrs['goFonDefaultIP'][0];
+      $s_host     = $s_ip;
+    }else{
+      $s_ip       = NULL;
+      $s_host     = "dynamic";
+    }
+
+    // Attribute GoFonQualify set ?
+    if(isset($a_ldap_attrs['goFonQualify'])){
+      $s_qualify = $a_ldap_attrs['goFonQualify'][0];
+    }
+
+    // Attribute GoFonPIN set ?
+    if(isset($this->goFonPIN)){
+      $s_pin      = $this->goFonPIN;
+    }
+
+    // Attribute GoFonType set ?
+    if(isset($a_ldap_attrs['goFonType'])){
+      $s_type = $a_ldap_attrs['goFonType'][0];
+    }
+
+    if(isset($a_ldap_attrs['goFonDmtfMode'][0])){
+      $sip_data_array['dtmfmode']     = $a_ldap_attrs['goFonDmtfMode'][0];
+    }else{
+      $sip_data_array['dtmfmode']     ="rfc2833";
+    }
+
+    /* Check if phone number is used */
     if($this->is_number_used()){
       $this->generate_error = $this->is_number_used(); 
       return false;
     }
 
-    /* If Save == true, we should save something.
-     * Generate SQL, for drop of old entries
-     * Generate SQL, for insert new entries
-     */ 
-    if($save == true){
-      
-      foreach($this->a_old_telenums as $tele){
-        $oldnums[]= preg_replace("/[^0-9]/","",$tele);
-      }
 
-      foreach($this->phoneNumbers as $tele){
-        $newnums[]= preg_replace("/[^0-9]/","",$tele);
-      }
 
-      // Attribute GoFonDefaultIP set ?
-      if(((isset($a_ldap_attrs['goFonDefaultIP'][0]))&&($a_ldap_attrs['goFonDefaultIP'][0] != "dynamic"))){
-        $s_ip       = $a_ldap_attrs['goFonDefaultIP'][0];
-        $s_host     = $s_ip;
-      }else{
-        $s_ip       = NULL;
-        $s_host     = "dynamic";
-      }
+    /********************** 
+     * Check Server Connection Information
+     **********************/
+    /* Create Mysql handle for the current goFonHomeServer, if possible  
+     * Get configuration to old asterisk home server 
+     */ 
+    $a_New = $this->goFonHomeServers[$this->goFonHomeServer];  // DB Configuration
+    $new_connection =  @mysql_pconnect($a_New['SERVER'],$a_New['LOGIN'],$a_New['PASSWORD']);
+    if(!$new_connection){
+      $this->generate_error = sprintf(
+          _("The MySQL Server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+          $a_New['SERVER'],$a_New['LOGIN']);
+      gosa_log(@mysql_error($new_connection));
+      return false;
+    }
+    $new_database  =  @mysql_select_db($a_New['DB'],$new_connection);
+    if(!$new_database){
+      $this->generate_error = sprintf(
+          _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+          $a_New['DB'],$a_New['SERVER']);
+      gosa_log( @mysql_error($new_connection));
+      return false;
+    }
 
-      // Attribute GoFonQualify set ?
-      if(isset($a_ldap_attrs['goFonQualify'])){
-        $s_qualify = $a_ldap_attrs['goFonQualify'][0];
+    /* If the home server has changed, we must remove entries from old 
+     *  server and add new entries in new server.  
+     */
+    if($this->init_HomeServer != $this->goFonHomeServer){
+    
+      /* Get configuration to old asterisk home server */ 
+      $a_Remove = $this->goFonHomeServers[$this->init_HomeServer];  // DB Configuration
+      /* Create connection to the database that contains the old entry. 
+       */
+      $old_connection =  @mysql_pconnect($a_Remove['SERVER'],$a_Remove['LOGIN'],$a_Remove['PASSWORD']);
+      if(!$old_connection){
+        $this->generate_error = sprintf(
+            _("The old MySQL home server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+            $a_Remove['SERVER'],$a_Remove['LOGIN']);
+        gosa_log(@mysql_error($old_connection));
+        return false;
       }
-
-      // Attribute GoFonPIN set ?
-      if(isset($this->goFonPIN)){
-        $s_pin      = $this->goFonPIN;
+      $old_database  =  @mysql_select_db($a_Remove['DB'],$old_connection);
+      if(!$old_database){
+        $this->generate_error = sprintf(
+            _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
+            $a_Remove['DB'],$a_Remove['SERVER']);
+        gosa_log(@mysql_error($old_connection));
+        return false;
       }
+    }
 
-      // Attribute GoFonType set ?
-      if(isset($a_ldap_attrs['goFonType'])){
-        $s_type = $a_ldap_attrs['goFonType'][0];
-      }
+    /* Save means that we must save changes, not only test  */
+    if($save == true){
+    
+      /********************** 
+       * Remove entries from old home server 
+       **********************/
+
+      /* Check if there is an old entry 
+       * If there is en old entry, get callerid and remove voicemail and extensions too 
+       */
+      if($old_connection){
+        $query  = "SELECT id,name,callerid FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
+        $rid    = mysql_query($query,$old_connection);
+
+        /* Old entry found, remove it */
+        $query_a = array();
+        if(mysql_affected_rows($old_connection)){
+          $result = mysql_fetch_assoc($rid);
+          $query_a[]= "DELETE FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
+          $query_a[]= "DELETE FROM ".$a_Remove['VOICE_TABLE']." WHERE customer_id='".$result['callerid']."';";
+          $query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$this->uid."';";
+          foreach($oldnums as $s_telenums) {
+            $query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$s_telenums."';";
+          }
 
-      if(isset($a_ldap_attrs['goFonDmtfMode'][0])){
-        $sip_data_array['dtmfmode']     = $a_ldap_attrs['goFonDmtfMode'][0];
-      }else{
-        $sip_data_array['dtmfmode']     ="rfc2833";
+          foreach($query_a as $qry){
+            if(!mysql_query($qry,$old_connection)){
+              echo $qry;
+              echo mysql_error($old_connection);
+            } 
+          }
+        }
       }
 
-      // generate SIP entry
-      $sip_data_array['id']           = "";
-      $sip_data_array['name']         = $this->uid;
-      $sip_data_array['accountcode']  = NULL;          
-      $sip_data_array['amaflags']     = NULL;
-      $sip_data_array['callgroup']    = NULL;
-      $sip_data_array['callerid']     = "";
-      $sip_data_array['canreinvite']  = "no";
-      $sip_data_array['context']      = "default";
-      $sip_data_array['defaultip']    = NULL;
-      $sip_data_array['fromuser']     = NULL;
-      $sip_data_array['fromdomain']   = NULL;
-      $sip_data_array['host']         = $s_host;
-      $sip_data_array['insecure']     = NULL;
-      $sip_data_array['language']     = NULL;
-      $sip_data_array['mailbox']      = "asterisk";
-      $sip_data_array['md5secret']    = NULL;
-      $sip_data_array['nat']          = "no";
-      $sip_data_array['permit']       = NULL;
-      $sip_data_array['deny']         = NULL;
-      $sip_data_array['mask']         = NULL;
-      $sip_data_array['pickupgroup']  = NULL;
-      $sip_data_array['port']         = NULL;
-      $sip_data_array['qualify']      = $s_qualify;
-      $sip_data_array['restrictcid']  = "n";
-      $sip_data_array['rtptimeout']   = NULL;
-      $sip_data_array['rtpholdtimeout']=NULL;
-      $sip_data_array['secret']       = $this->goFonPIN;
-      $sip_data_array['type']         = $s_type ;
-      $sip_data_array['username']     = $this->uid;
-      $sip_data_array['disallow']     = NULL;
-      $sip_data_array['allow']        = NULL;
-      $sip_data_array['musiconhold']  = NULL;
-      $sip_data_array['regseconds']   = NULL;
-      $sip_data_array['ipaddr']       = $s_ip;
-      $sip_data_array['regexten']     = NULL;
-      $sip_data_array['cancallforward']=NULL;
+      /********************** 
+       * Update / Insert sip_users entry  
+       **********************/
 
-      // Get selected Macro Parameter and create parameter entry 
-      if(isset($this->macroarray[$this->macro])){
-        foreach($this->macroarray[$this->macro] as $key => $val ){
-          $s_parameter .= $val['choosen']."|";
+      /* Set the first given phone number as callerid */
+      reset($newnums);        
+      $i_new_key = key($newnums);
+      $sip_data_array['callerid']  =$newnums[$i_new_key];
+      $sip_data_array['mailbox']   =$newnums[$i_new_key];
+
+      /* Check if there is already an entry in sip_users for this uid */
+      $SQL_query_array = array();
+      $rid = mysql_query("SELECT * FROM ".$a_New['SIP_TABLE']." WHERE name='".$this->uid."';\n",$new_connection);
+      if(mysql_affected_rows($new_connection)){
+
+        /********************** 
+         * Update sip_users entry 
+         **********************/
+        $result                     = mysql_fetch_assoc($rid);
+        $sip_data_array['host']         = $s_host;
+        $sip_data_array['qualify']      = $s_qualify;
+        $sip_data_array['secret']       = $this->goFonPIN;
+        $sip_data_array['type']         = $s_type ;
+        $sip_data_array['username']     = $this->uid;
+        $sip_data_array['ipaddr']       = $s_ip;
+
+        /* Remove not changed attributes, to avoid updating table with same values */
+        foreach($sip_data_array as $name => $value){
+          if($result[$name] == $value){
+            unset($sip_data_array[$name]);
+          }
         }
-        $s_parameter = preg_replace("/\|$/","",$s_parameter);
-      }
+        /* Only update entry if there is something to uopdate */
+        if(count($sip_data_array)){
+          $query = "UPDATE ".$a_New['SIP_TABLE']." SET ";
+          foreach($sip_data_array as $key => $val){
+            $query.= "".$key."='".$val."',"; 
+          } 
+          $query = preg_replace("/,$/","",$query);
+          $query.= " WHERE name='".$this->uid."';";
+          $SQL_query_array[] = $query;
+        }
+      } else {
+        /********************** 
+         * Insert sip_users entry 
+         **********************/
+        //generate SIP entry
+        $sip_data_array['id']           = "";
+        $sip_data_array['name']         = $this->uid;
+        $sip_data_array['accountcode']  = NULL;          
+        $sip_data_array['amaflags']     = NULL;
+        $sip_data_array['callgroup']    = NULL;
+        $sip_data_array['canreinvite']  = "no";
+        $sip_data_array['context']      = "default";
+        $sip_data_array['defaultip']    = NULL;
+        $sip_data_array['fromuser']     = NULL;
+        $sip_data_array['fromdomain']   = NULL;
+        $sip_data_array['host']         = $s_host;
+        $sip_data_array['insecure']     = NULL;
+        $sip_data_array['language']     = NULL;
+        $sip_data_array['mailbox']      = $newnums[$i_new_key];
+        $sip_data_array['md5secret']    = NULL;
+        $sip_data_array['nat']          = "no";
+        $sip_data_array['permit']       = NULL;
+        $sip_data_array['deny']         = NULL;
+        $sip_data_array['mask']         = NULL;
+        $sip_data_array['pickupgroup']  = NULL;
+        $sip_data_array['port']         = NULL;
+        $sip_data_array['qualify']      = $s_qualify;
+        $sip_data_array['restrictcid']  = "n";
+        $sip_data_array['rtptimeout']   = NULL;
+        $sip_data_array['rtpholdtimeout']=NULL;
+        $sip_data_array['secret']       = $this->goFonPIN;
+        $sip_data_array['type']         = $s_type ;
+        $sip_data_array['username']     = $this->uid;
+        $sip_data_array['disallow']     = NULL;
+        $sip_data_array['allow']        = NULL;
+        $sip_data_array['musiconhold']  = NULL;
+        $sip_data_array['regseconds']   = NULL;
+        $sip_data_array['ipaddr']       = $s_ip;
+        $sip_data_array['regexten']     = NULL;
+        $sip_data_array['cancallforward']=NULL;
+
+        /* There is currently no entry for this user in the sip_users table. 
+         * We should create one i
+         */
+        foreach($sip_data_array as $s_sip_key=>$s_sip_val){
+          if($s_sip_val == NULL) continue;
+          $s_sip_values.="'".$s_sip_val."',";
+          $s_sip_keys  .="`".$s_sip_key."`,";
+        }
+        $s_sip_values =  preg_replace("/,$/","",$s_sip_values);
+        $s_sip_keys   =  preg_replace("/,$/","",$s_sip_keys);
 
-      if($this->is_number_used()){
-        $this->generate_error = $this->is_number_used(); 
-        return false;
+        /* Add sip entries to mysql queries */
+        $SQL_query_array[] ="INSERT INTO ".$a_New['SIP_TABLE']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
       }
 
-      // Create new SIP entry ...
-      $sip_entry = $sip_data_array;
-      reset($newnums);
-      $i_new_key = key($newnums);
-      $sip_entry['callerid']  =$newnums[$i_new_key];
-      $sip_entry['mailbox']   =$newnums[$i_new_key];
 
-      if((isset($this->parent))&&(isset($this->parent->by_object['mailAccount']))&&($this->parent->by_object['mailAccount']->is_account==true)){
-        $s_mail = $this->parent->by_object['mailAccount']->mail;
-      }else{
-        $s_mail = "";
-      }
+      /********************** 
+       * Update / Insert Voice mail entry  
+       **********************/
 
-      // $SQL contains all queries
-      $SQL   = array();
-      $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
-      $SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
-      $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$newnums[$i_new_key].";"; 
-      // Delete old entries
-      $b_first_deleted  =false;
-      foreach($oldnums as $s_telenums){
-        $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
-        if(!$b_first_deleted){
-          $b_first_deleted=true;
-          $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$s_telenums.";";
-        }
-      }
+      $customer_id = $newnums[$i_new_key];
+
+      $voice_data_array = array(
+          "customer_id" => $customer_id,
+          "mailbox"     => $customer_id,
+          "password"    => $this->goFonVoicemailPIN,
+          "fullname"    => $CNname,
+          "email"       => $s_mail);
 
-      if($this->goFonHardware=="automatic"){
-        foreach($SQL as $query ){
-          mysql_query($query) ;
+      /* Check if there is already an entry in sip_users for this uid */
+      $rid = mysql_query("SELECT * FROM ".$a_New['VOICE_TABLE']." WHERE customer_id='".$customer_id."';\n",$new_connection);
+      if(mysql_affected_rows($new_connection)){
+
+        /********************** 
+         * Update Voice mail entry  
+         **********************/
+        $result = mysql_fetch_assoc($rid)  ;
+
+        foreach($voice_data_array as $name => $value){
+          if($result[$name] == $value){
+            unset($voice_data_array[$name]);
+          }
         }
-        return;
-      }
 
-      // Generate Strings with keys and values 
-      foreach($sip_entry as $s_sip_key=>$s_sip_val){
-        if($s_sip_val == NULL) continue;
-        $s_sip_values.="'".$s_sip_val."',";
-        $s_sip_keys  .="`".$s_sip_key."`,";
-      }
-      // Remove last ,
-      $s_sip_values =  preg_replace("/,$/","",$s_sip_values);
-      $s_sip_keys   =  preg_replace("/,$/","",$s_sip_keys);
+        /* Only update entry if there is something to uopdate */
+        if(count($voice_data_array)){
+          $query = "UPDATE ".$a_New['VOICE_TABLE']." SET ";
+          foreach($voice_data_array as $key => $val){
+            $query.= "".$key."='".$val."',"; 
+          } 
+          $query = preg_replace("/,$/","",$query);
+          $query.= " WHERE customer_id='".$customer_id."';";
+          $SQL_query_array[] = $query;
+        }
+      }else{
 
-      // Append SIP Entry 
-      $SQL[] ="INSERT INTO ".$a_SETUP['SIP_TABLE']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
+        /********************** 
+         * Insert Voice mail entry  
+         **********************/
+        $voice_data_array['context'] = "default";
+        $voice_data_array['pager']   = "";
+  
+        /* There is currently no voice mail entry for this user. 
+         * We should create one 
+         */
+        $s_voi_values = $s_voi_keys = "";
+        foreach($voice_data_array as $s_voi_key=>$s_voi_val){
+          if($s_voi_val == NULL) continue;
+          $s_voi_values.="'".$s_voi_val."',";
+          $s_voi_keys  .="`".$s_voi_key."`,";
+        }
+        $s_voi_values =  preg_replace("/,$/","",$s_voi_values);
+        $s_voi_keys   =  preg_replace("/,$/","",$s_voi_keys);
 
-      /* If deletion starts from userslist, cn uid are not set */
-      if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
-        $this->uid = $this->parent->by_object['user']->uid;
+        /* Add sip entries to mysql queries */
+        $SQL_query_array[] ="INSERT INTO ".$a_New['VOICE_TABLE']." (".$s_voi_keys.") VALUES (".$s_voi_values.");";
       }
 
-      if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
-        $this->cn  = $this->parent->by_object['user']->cn;
+     
+      /********************** 
+       * Remove/Insert extension entries
+       **********************/
+      
+      /* Remove old entries */
+      $query = array();
+      $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$this->uid."\";";
+      foreach($newnums as $s_telenums){
+        $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
       }
-
-      if((!isset($this->cn))||(empty($this->cn))){
-        $CNname= $this->uid;
-      }else{
-        $CNname= $this->cn;
+      foreach($query as $qry){
+        if(!mysql_query($qry,$new_connection)){
+          echo mysql_error($new_connection);
+        } 
       }
-
-      $SQL[]= "INSERT INTO ".$a_SETUP['VOICE_TABLE']." (`customer_id`,`context`,`mailbox`,`password`,`fullname`,`email`,`pager`)
-          VALUES   ('".$newnums[$i_new_key]."',
-                    'default',
-                    '".$newnums[$i_new_key]."',
-                    '".$this->goFonVoicemailPIN."',
-                    '".$CNname."',
-                    '".$s_mail."',
-                    '');";
-      $i_is_accounted=false;
-    
-      $i = 0; 
  
-      $is_inserted_once = false;
+      /********************** 
+       * Insert extension entries
+       **********************/
  
+      // Get selected Macro Parameter and create parameter entry 
+      if(isset($this->macroarray[$this->macro])){
+        foreach($this->macroarray[$this->macro] as $key => $val ){
+          $s_parameter .= $val['choosen']."|";
+        }
+        $s_parameter = preg_replace("/\|$/","",$s_parameter);
+      }
+     
+      $i = 0; 
+      $EXT = array();
+      $EXT[$i]['context'] = 'GOsa';
+      $EXT[$i]['exten']   = $this->uid;
+      $EXT[$i]['priority']= 1;
+      $EXT[$i]['app']     = "Goto";
+      $EXT[$i]['appdata'] = $newnums[$i_new_key]."|1";
+      $i ++;
+
       // Entension entries  Hint / Dial / Goto
       foreach($newnums as $s_telenums){
 
-        if(!$is_inserted_once){
-          $is_inserted_once = true;
-          $EXT[$i]['context'] = 'GOsa';
-          $EXT[$i]['exten']   = $this->uid;
-          $EXT[$i]['priority']= 1;
-          $EXT[$i]['app']     = "Goto";
-          $EXT[$i]['appdata'] = $s_telenums."|1";
-          $i ++;
-        }
         /* Hint Entry */
         $EXT[$i]['context'] = 'GOsa';
         $EXT[$i]['exten']   = $s_telenums;
@@ -533,12 +731,11 @@ class phoneAccount extends plugin
         $EXT[$i]['app']     = $s_app;
         $EXT[$i]['appdata'] = $s_par;
         $i ++;
-
       }
 
       // Append all these Entries 
       foreach($EXT as $entr){
-        $SQL_syn = "INSERT INTO ".$a_SETUP['EXT_TABLE']." (";
+        $SQL_syn = "INSERT INTO ".$a_New['EXT_TABLE']." (";
         foreach($entr as $key2 => $val2){
           $SQL_syn.= "`".$key2."`,";
         }
@@ -549,27 +746,30 @@ class phoneAccount extends plugin
         }
         $SQL_syn = preg_replace("/,$/","",$SQL_syn);
         $SQL_syn .=");\n";
-        $SQL[] =$SQL_syn;
+
+        $SQL_query_array[] =$SQL_syn;
         $SQL_syn ="";
       }
 
       // Perform queries ...
-      foreach($SQL as $query){
-        if(!@mysql_query($query,$r_con)){
-          print_red(_("Error while performing query:")." ".mysql_error());
-          return false;
+      if($this->goFonHardware != "automatic"){
+        foreach($SQL_query_array as $query){
+          if(!@mysql_query($query,$new_connection)){
+            print_red(_("Error while performing query:")." ".mysql_error());
+            return false;
+          }
         }
       }
     }
-    @mysql_close($r_con);
+    @mysql_close($new_connection);
     return true;
   }
 
 
   function execute()
   {
-       /* Call parent execute */
-       plugin::execute();
+    /* Call parent execute */
+    plugin::execute();
 
     $display = "";
 
@@ -587,7 +787,7 @@ class phoneAccount extends plugin
         /* Macroname saved, delete that index */
         unset($tmp[0]);
 
-        /* Check if makro has been removed */
+        /* Check if macro has been removed */
         if(!isset($this->macroarray[$this->macro])){
           $this->macrostillavailable = false;
         }else{
@@ -630,7 +830,7 @@ class phoneAccount extends plugin
     /* Prepare templating */
     $smarty= get_smarty();
 
-    /* tell user that the pluging selected is no longer available*/
+    /* tell user that the selected plugin is no longer available */
     if((!$this->macrostillavailable)&&($this->macro!="none")){
       print_red(_("The macro you selected, is no longer available for you, please choose another one."));
     }
@@ -640,11 +840,13 @@ class phoneAccount extends plugin
     $smarty->assign("macro", $this->macro);   
 
     /* check if there is a FON server created */
-    if(!isset($_SESSION['config']->data['SERVERS']['FON'])){
+    if(!count($this->goFonHomeServer)){
       print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
     }
 
-    /* Create parameter table, skip if no parameters given */
+    /* Create html parameter table for selected macro parameters 
+     *  skip if no parameters given 
+     */
     if(!isset($this->macroarray[$this->macro])){
       $macrotab="";
     }else{
@@ -655,8 +857,6 @@ class phoneAccount extends plugin
       foreach($this->phoneNumbers as $phonenum){
         $tmp[] = $phonenum;
       }
-
-      
     
       if($this->macro != $this->lastmacro){
         /* Go through all params */
@@ -733,6 +933,7 @@ class phoneAccount extends plugin
     /* Give smarty the table */
     $smarty->assign("macrotab",$macrotab);
 
+
     /* Do we represent a valid account? */
     if (!$this->is_account && $this->parent == NULL){
       $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\">&nbsp;<b>".
@@ -789,10 +990,19 @@ class phoneAccount extends plugin
       }
     }
 
+    /* Create home server array */
+    $tmp = array();
+    foreach($this->goFonHomeServers as $dn => $attrs){
+      if(!is_numeric($dn)){
+        $tmp[$dn] = $attrs['SERVER'];
+      }
+    }
+    $smarty->assign("goFonHomeServers",$tmp);
+
     /* Fill arrays */
     $smarty->assign ("goFonHardware", $this->goFonHardware);
     if (!count($this->phoneNumbers)){
-      $smarty->assign ("phoneNumbers", array(""));
+      $smarty->assign ("phoneNumbers", array());
     } else {
       $smarty->assign ("phoneNumbers", $this->phoneNumbers);
     }
@@ -879,8 +1089,16 @@ class phoneAccount extends plugin
 
   function check()
   {
-    /* Reset message array */
-    $message= array();
+    /* Call common method to give check the hook */
+    $message= plugin::check();
+
+    if(!count($this->goFonHomeServers)){
+      $message[] = _("There must be at least one server with an asterisk database to create a phone account.");
+    }
+
+    if(empty($this->goFonHomeServer)){
+      $message[] = _("Please select a valid goFonHomeServer.");
+    }
 
     if((strlen($this->goFonVoicemailPIN)==0)||(strlen($this->goFonVoicemailPIN)>4)){
       $message[]=(_("Voicemail PIN must be between 1-4 characters."));
@@ -924,10 +1142,20 @@ class phoneAccount extends plugin
   {
     plugin::save();
 
+    /* Force saving macro again 
+     * This ensures that 
+     *  - the macro is available on the destiantion server.
+     *  - the macro saved is up to date on the destination server.
+     */
+    if(!empty($this->macro) && $this->macro != "none")  {
+      $macro_tab = new macrotabs($this->config,$this->config->data['TABS']['MACROTABS'], $this->macro);
+      $macro_tab -> save();
+    }
+
     /* Save arrays */
-    $this->attrs['telephoneNumber']= array();
+    $tmp_numbers = array();
     foreach ($this->phoneNumbers as $number){
-      $this->attrs['telephoneNumber'][]= $number;
+      $tmp_numbers[] = $number;
     }
 
     /* Save settings, or remove goFonMacro attribute*/
@@ -945,7 +1173,10 @@ class phoneAccount extends plugin
 
     $this->attrs['goFonForwarding']=array();
 
-    $this->generate_mysql_entension_entries(true);
+    $str = $this->generate_mysql_entension_entries(true);
+    if(empty($str)){
+      print_red($str);
+    }
 
     if($this->attrs['goFonMacro']==""){
       $this->attrs['goFonMacro']=array();
@@ -956,44 +1187,27 @@ class phoneAccount extends plugin
     /* Write back to ldap */
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
-    show_ldap_error($ldap->get_error());
+    $this->cleanup();
+    
+    /* Force saving numbers, else it will be overwriten by user account. */
+    $this->attrs['telephoneNumber'] =$tmp_numbers;
+    $ldap->modify ($this->attrs); 
+
+    show_ldap_error($ldap->get_error(), _("Saving phone account failed"));
 
     /* 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");
+        $this->handle_post_events("modify",array("uid" => $this->uid));
       }
     } else {
-      $this->handle_post_events("add");
+      $this->handle_post_events("add",array("uid" => $this->uid));
     }
 
   }
 
 
-  function insert_after($entry, $nr, $list)
-  {
-    /* Is the entry free? No? Make it free... */
-    if (isset($list[$nr])) {
-      $dest= array();
-      $newidx= 0;
-
-      foreach ($list as $idx => $contents){
-        $dest[$newidx++]= $contents;
-        if ($idx == $nr){
-          $dest[$newidx++]= $entry;
-        }
-      }
-    } else {
-      $dest= $list;
-      $dest[$nr]= $entry;
-    }
-
-    return ($dest);
-  }
-
-
   function adapt_from_template($dn)
   {
     plugin::adapt_from_template($dn);
@@ -1010,18 +1224,18 @@ class phoneAccount extends plugin
 
   function remove_from_parent()
   {
+    if(!$this->initially_was_account) return;
+
     foreach($this->attributes as $key=>$val){
-      if(in_array($val,array("uid","cn","mail"))){
+      if(in_array($val,array("uid","cn"))){
         unset($this->attributes[$key]);
         unset($this->$val);
       }
     }
+    if(count($this->goFonHomeServers) && !empty($this->init_HomeServer) && is_callable("mysql_pconnect")){
 
-    if(array_key_exists('config', $_SESSION) &&
-       array_key_exists('SERVERS', $_SESSION['config']->data) &&
-       array_key_exists('FON', $_SESSION['config']->data['SERVERS'])) {
-      // Get Configuration for Mysql database Server
-      $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
+      // Get Configuration for initial Mysql database Server
+      $a_SETUP = $this->goFonHomeServers[$this->init_HomeServer];
       $s_parameter  ="";
 
       // Connect to DB server
@@ -1029,8 +1243,8 @@ class phoneAccount extends plugin
 
       // Check if we are  connected correctly
       if(!$r_con){
-        $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-            $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
+        print_red(sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+                    $a_SETUP['SERVER'],$a_SETUP['LOGIN']));
         gosa_log(@mysql_error());
         return false;
       }
@@ -1040,7 +1254,7 @@ class phoneAccount extends plugin
 
       // Test if we have the database selected correctly
       if(!$db){
-        $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
+        print_red(sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']));
         gosa_log(@mysql_error());
         return false;
       }
@@ -1075,6 +1289,9 @@ class phoneAccount extends plugin
           return false;
         }
       }
+    }else{
+      print_red(_("Can't remove phone account, the mysql extension is not present in php configuration."));
+      return false;
     }
 
     /* unset macro attr, it will cause an error */
@@ -1096,6 +1313,7 @@ class phoneAccount extends plugin
       $this->attrs['telephoneNumber']= array();
     }
 
+
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
     $ldap->search("(objectClass=goFonQueue)", array("member"));
@@ -1109,12 +1327,14 @@ class phoneAccount extends plugin
       }
     }
     $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
-    show_ldap_error($ldap->get_error());
+    $this->cleanup();
+    $ldap->modify ($this->attrs); 
+
+    show_ldap_error($ldap->get_error(), _("Removing phone account failed"));
 
     /* Optionally execute a command after we're done */
     @mysql_close($r_con);
-    $this->handle_post_events('remove');
+    $this->handle_post_events('remove',array("uid"=> $this->uid));
   }
 
 
@@ -1146,6 +1366,50 @@ class phoneAccount extends plugin
       }
     }
   }
+
+
+  /* Create phoneAccount part of copy & paste dialog */
+  function getCopyDialog()
+  { 
+    if(!$this->is_account) return("");
+    $smarty = get_smarty();
+    if (!count($this->phoneNumbers)){
+      $smarty->assign ("phoneNumbers", array(""));
+    } else {
+      $smarty->assign ("phoneNumbers", $this->phoneNumbers);
+    }
+
+    $smarty->assign("goFonVoicemailPIN",$this->goFonVoicemailPIN);
+    $smarty->assign("goFonPIN",$this->goFonPIN);
+
+    $display= $smarty->fetch(get_template_path('paste_generic.tpl', TRUE, dirname(__FILE__)));
+    $ret =array();
+    $ret['string'] = $display;
+    $ret['status'] = "";
+    return($ret);
+  }
+
+  /* Save posts from copy & paste dialog dialog  */
+  function saveCopyDialog()
+  {
+    if(!$this->is_account) return;
+    $this->execute();
+    if(isset($_POST['goFonVoicemailPIN'])) {
+      $this->goFonVoicemailPIN = $_POST['goFonVoicemailPIN'];
+    }
+    if(isset($_POST['goFonPIN'])){
+      $this->goFonPIN = $_POST['goFonPIN'];
+    }
+  }
+
+
+  function allow_remove()
+  {
+    /* Check if previously selected server is still available */
+    if($this->initially_was_account && !isset($this->goFonHomeServers[$this->goFonHomeServer])){
+      return sprintf(_("The previously selected asterisk home server (%s) is no longer available. Remove aborted."),preg_replace("/,/",", ",$this->goFonHomeServer));
+    }
+  }
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: