/**
  * adds a single domain to the database using the given array
  *
  * @param array $domain_data            
  *
  * @return int last-inserted id or false on error
  */
 private function _addSingleDomainToDatabase($domain_data = array())
 {
     // format domain
     $idna_convert = new idna_convert_wrapper();
     $domain_data['domain'] = $idna_convert->encode(preg_replace(array('/\\:(\\d)+$/', '/^https?\\:\\/\\//'), '', $domain_data['domain']));
     // check if it is a valid domain
     if (!validateDomain($domain_data['domain'])) {
         return false;
     }
     // no system-hostname can be added
     if ($domain_data['domain'] == Settings::Get('system.hostname')) {
         return false;
     }
     // no existing domains can be imported
     if (in_array($domain_data['domain'], $this->_knownDomains)) {
         return false;
     }
     // check for alias-domain
     if (!empty($domain_data['aliasdomain'])) {
         // format
         $domain_data['aliasdomain'] = $idna_convert->encode(preg_replace(array('/\\:(\\d)+$/', '/^https?\\:\\/\\//'), '', $domain_data['aliasdomain']));
         // validate alias-domain
         if (!validateDomain($domain_data['aliasdomain'])) {
             // invalid-domain lol - skip to be sure we dont add anything weird
             return false;
         }
         // does the domain we want to be an alias of exists?
         if (!in_array($domain_data['aliasdomain'], $this->_knownDomains)) {
             // it does not - User should respect the order of import so if the domain
             // he wants to alias is also part of the import is ABOVE this one
             // - we'd better skip
             return false;
         }
     }
     // check for use_ssl and ssl_redirect
     if (!isset($domain_data['use_ssl']) || $domain_data['use_ssl'] == 1) {
         // if not set: default is whatever the system says
         // if set to 1: set to 0 if system has no ssl enabled
         $domain_data['use_ssl'] = Settings::get('system.use_ssl') == 1 ? 1 : 0;
     }
     // use_ssl flag
     if ($domain_data['use_ssl'] != 1) {
         $domain_data['use_ssl'] = 0;
     }
     // ssl_redirect flag
     if ($domain_data['ssl_redirect'] != 1) {
         $domain_data['ssl_redirect'] = 0;
     }
     // if use_ssl is 0 ssl_redirect must be too (no ssl-ip => no ssl-redirect)
     if ($domain_data['use_ssl'] == 0 && $domain_data['ssl_redirect'] == 1) {
         $domain_data['ssl_redirect'] = 0;
     }
     // add to known domains
     $this->_knownDomains[] = $domain_data['domain'];
     // docroot (URL allowed, will lead to redirect)
     if (!preg_match('/^https?\\:\\/\\//', $domain_data['documentroot'])) {
         $domain_data['documentroot'] = makeCorrectDir($this->_custData['documentroot'] . "/" . $domain_data['documentroot']);
     }
     // is bind domain?
     if (!isset($domain_data['isbinddomain'])) {
         $domain_data['isbinddomain'] = Settings::Get('system.bind_enable') == '1' ? 1 : 0;
     } elseif ($domain_data['isbinddomain'] != 1) {
         $domain_data['isbinddomain'] = 0;
     }
     // zonefile
     if (!isset($domain_data['zonefile'])) {
         $domain_data['zonefile'] = "";
     } else {
         if (!empty($domain_data['zonefile']) && Settings::Get('system.bind_enable') == '1') {
             $domain_data['zonefile'] = makeCorrectFile($domain_data['zonefile']);
         } else {
             $domain_data['zonefile'] = "";
         }
     }
     // openbasedir flag
     if (!isset($domain_data['openbasedir'])) {
         $domain_data['openbasedir'] = 1;
     } elseif ($domain_data['openbasedir'] != 1) {
         $domain_data['openbasedir'] = 0;
     }
     // speciallogfile flag
     if (!isset($domain_data['speciallogfile'])) {
         $domain_data['speciallogfile'] = 0;
     } elseif ($domain_data['speciallogfile'] != 1) {
         $domain_data['speciallogfile'] = 0;
     }
     /*
      * automatically set values (not from the file)
      */
     // add date
     $domain_data['add_date'] = time();
     // set adminid
     $domain_data['adminid'] = (int) $this->_custData['adminid'];
     // set customerid
     $domain_data['customerid'] = (int) $this->_custId;
     // check for required fields
     foreach ($this->_required_fields as $rfld) {
         if (!isset($domain_data[$rfld])) {
             return false;
         }
     }
     // clean all fields that do not belong to the required fields
     $domain_data_tmp = $domain_data;
     foreach ($domain_data_tmp as $fld => $val) {
         if (!in_array($fld, $this->_required_fields)) {
             unset($domain_data[$fld]);
         }
     }
     // save iplist
     $iplist = $domain_data['ips'];
     $iplist_arr = array_unique(explode(",", $iplist));
     $knownIPsCheck = array_unique($this->_knownIpPortChk);
     // check whether we actually have at least one of the used IP's in our system
     $result_iplist = array_intersect($iplist_arr, $knownIPsCheck);
     // write back iplist
     $iplist = implode(",", $result_iplist);
     // dont need that for the domain-insert-statement
     unset($domain_data['ips']);
     // remember use_ssl value
     $use_ssl = (bool) $domain_data['use_ssl'];
     // dont need that for the domain-insert-statement
     unset($domain_data['use_ssl']);
     // finally ADD the domain to panel_domains
     Database::pexecute($this->_ins_stmt, $domain_data);
     // get the newly inserted domain-id
     $domain_id = Database::lastInsertId();
     // insert domain <-> ip/port reference
     if (empty($iplist)) {
         $iplist = Settings::Get('system.ipaddress');
     }
     // split ip-list and remove duplicates
     $iplist_arr = array_unique(explode(",", $iplist));
     foreach ($iplist_arr as $ip) {
         // if we know the ip, at all variants (different ports, ssl and non-ssl) of it!
         if (isset($this->_knownIpPort[$ip])) {
             foreach ($this->_knownIpPort[$ip] as $ipdata) {
                 // no ssl ip/ports should be used for this domain
                 if ($use_ssl == false && $ipdata['ssl'] == 1) {
                     continue;
                 }
                 // add domain->ip reference
                 Database::pexecute($this->_ipp_ins_stmt, array('domid' => $domain_id, 'ipid' => $ipdata['id']));
             }
         }
     }
     return $domain_id;
 }