/**
  * the constructor
  * 
  * creates instance of Expressomail_Backend_Imap with parameters
  * Supported parameters are
  *   - user username
  *   - host hostname or ip address of IMAP server [optional, default = 'localhost']
  *   - password password for user 'username' [optional, default = '']
  *   - port port for IMAP server [optional, default = 110]
  *   - ssl 'SSL' or 'TLS' for secure sockets
  *   - folder select this folder [optional, default = 'INBOX']
  *
  * @param  array $params mail reader specific parameters
  * @throws Expressomail_Exception_IMAPInvalidCredentials
  * @return void
  */
 public function __construct($params, $_readOnly = FALSE)
 {
     if (is_array($params)) {
         $params = (object) $params;
     }
     if (!isset($params->user)) {
         throw new Expressomail_Exception_IMAPInvalidCredentials('Need at least user in params.');
     }
     $params->host = isset($params->host) ? $params->host : 'localhost';
     $params->password = isset($params->password) ? $params->password : '';
     $params->port = isset($params->port) ? $params->port : null;
     $params->ssl = isset($params->ssl) ? $params->ssl : false;
     $this->_params = $params;
     $expressomailConfig = Expressomail_Config::getInstance();
     $imapBackendConfigDefinition = $expressomailConfig->getDefinition(Expressomail_Config::IMAPBACKEND);
     $backendClassName = self::$_availableBackends[$imapBackendConfigDefinition['default']];
     $expressomailSettings = $expressomailConfig->get(Expressomail_Config::EXPRESSOMAIL_SETTINGS);
     $backendName = isset($expressomailSettings[Expressomail_Config::IMAPBACKEND]) ? $expressomailSettings[Expressomail_Config::IMAPBACKEND] : $imapBackendConfigDefinition['default'];
     if ($backendName != $imapBackendConfigDefinition['default']) {
         if (Tinebase_Helper::checkClassExistence(self::$_availableBackends[$backendName], true) && Tinebase_Helper::checkSubClassOf(self::$_availableBackends[$backendName], 'Expressomail_Backend_Imap_Interface', true)) {
             $backendClassName = self::$_availableBackends[$backendName];
         }
     }
     $this->_backend = new $backendClassName($params, $_readOnly);
 }