/home/ivoiecob/email.hirewise-va.com/vendor/afterlogic/mailso/lib/MailSo/Mime/EmailCollection.php
<?php
/**
 * This code is licensed under AGPLv3 license or Afterlogic Software License
 * if commercial version of the product was purchased.
 * For full statements of the licenses see LICENSE-AFTERLOGIC and LICENSE-AGPL3 files.
 */

namespace MailSo\Mime;

/**
 * @license https://www.gnu.org/licenses/agpl-3.0.html AGPL-3.0
 * @license https://afterlogic.com/products/common-licensing Afterlogic Software License
 * @copyright Copyright (c) 2019, Afterlogic Corp.
 *
 * @category MailSo
 * @package Mime
 */
class EmailCollection extends \MailSo\Base\Collection
{
    /**
     * @access protected
     *
     * @param string $sEmailAddresses = ''
     */
    protected function __construct($sEmailAddresses = '')
    {
        parent::__construct();

        if (0 < \strlen($sEmailAddresses)) {
            $this->parseEmailAddresses($sEmailAddresses);
        }
    }

    /**
     * @param string $sEmailAddresses = ''
     *
     * @return \MailSo\Mime\EmailCollection
     */
    public static function NewInstance($sEmailAddresses = '')
    {
        return new self($sEmailAddresses);
    }

    /**
     * @param string $sEmailAddresses
     *
     * @return \MailSo\Mime\EmailCollection
     */
    public static function Parse($sEmailAddresses)
    {
        return self::NewInstance($sEmailAddresses);
    }

    /**
     * @return array
     */
    public function toArray()
    {
        $aReturn = $aEmails = array();
        $aEmails =& $this->GetAsArray();
        foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) {
            $aReturn[] = $oEmail->toArray();
        }

        return $aReturn;
    }

    /**
     * @param \MailSo\Mime\EmailCollection $oEmails
     *
     * @return \MailSo\Mime\EmailCollection
     */
    public function MergeWithOtherCollection(\MailSo\Mime\EmailCollection $oEmails)
    {
        $aEmails =& $oEmails->GetAsArray();
        foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) {
            $this->Add($oEmail);
        }

        return $this;
    }

    /**
     * @return \MailSo\Mime\EmailCollection
     */
    public function Unique()
    {
        $aCache = array();
        $aReturn = array();

        $aEmails =& $this->GetAsArray();
        foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) {
            $sEmail = $oEmail->GetEmail();
            if (!isset($aCache[$sEmail])) {
                $aCache[$sEmail] = true;
                $aReturn[] = $oEmail;
            }
        }

        $this->SetAsArray($aReturn);

        return $this;
    }

    /**
     * @param bool $bConvertSpecialsName = false
     * @param bool $bIdn = false
     *
     * @return string
     */
    public function ToString($bConvertSpecialsName = false, $bIdn = false)
    {
        $aReturn = $aEmails = array();
        $aEmails =& $this->GetAsArray();
        foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) {
            $aReturn[] = $oEmail->ToString($bConvertSpecialsName, $bIdn);
        }

        return \implode(', ', $aReturn);
    }

    /**
     * @param string $sRawEmails
     *
     * @return \MailSo\Mime\EmailCollection
     */
    private function parseEmailAddresses($sRawEmails)
    {
        $this->clear();

        $sWorkingRecipients = \trim($sRawEmails);

        if (0 === \strlen($sWorkingRecipients)) {
            return $this;
        }

        $iEmailStartPos = 0;
        $iEmailEndPos = 0;

        $bIsInQuotes = false;
        $sChQuote = '"';
        $bIsInAngleBrackets = false;
        $bIsInBrackets = false;

        $iCurrentPos = 0;

        $sWorkingRecipientsLen = \strlen($sWorkingRecipients);

        while ($iCurrentPos < $sWorkingRecipientsLen) {
            switch ($sWorkingRecipients[$iCurrentPos]) {
                case '\'':
                case '"':
                    if (!$bIsInQuotes) {
                        $sChQuote = $sWorkingRecipients[$iCurrentPos];
                        $bIsInQuotes = true;
                    } elseif ($sChQuote == $sWorkingRecipients[$iCurrentPos]) {
                        $bIsInQuotes = false;
                    }
                    break;

                case '<':
                    if (!$bIsInAngleBrackets) {
                        $bIsInAngleBrackets = true;
                        if ($bIsInQuotes) {
                            $bIsInQuotes = false;
                        }
                    }
                    break;

                case '>':
                    if ($bIsInAngleBrackets) {
                        $bIsInAngleBrackets = false;
                    }
                    break;

                case '(':
                    if (!$bIsInBrackets) {
                        $bIsInBrackets = true;
                    }
                    break;

                case ')':
                    if ($bIsInBrackets) {
                        $bIsInBrackets = false;
                    }
                    break;

                case ',':
                case ';':
                    if (!$bIsInAngleBrackets && !$bIsInBrackets && !$bIsInQuotes) {
                        $iEmailEndPos = $iCurrentPos;

                        try {
                            $this->Add(
                                \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iEmailEndPos - $iEmailStartPos))
                            );

                            $iEmailStartPos = $iCurrentPos + 1;
                        } catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) {
                        }
                    }
                    break;
            }

            $iCurrentPos++;
        }

        if ($iEmailStartPos < $iCurrentPos) {
            try {
                $this->Add(
                    \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iCurrentPos - $iEmailStartPos))
                );
            } catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) {
            }
        }

        return $this;
    }
}