/**
     * @return Pap_Db_VisitorAffiliate
     */
    private function getLatestVisitorAffiliate(Pap_Tracking_Common_VisitorAffiliateCollection $visitorAffiliates) {
        if ($visitorAffiliates->getSize() == 0) {
            return null;
        }

        $latest = null;
        foreach ($visitorAffiliates as $visitorAffiliate) {
            if (($latest == null || $latest->getDateVisit() < $visitorAffiliate->getDateVisit()) && $visitorAffiliate->isValid()) { 
                $latest = $visitorAffiliate;
            }
        }

        return $latest;
    }
    private function setFirstAndLastClick(Pap_Common_Transaction $transaction, $contextUserId) {
        $firstAffiliate = $this->visitorAffiliateCollection->getValid(0);
        $lastAffiliate = $this->visitorAffiliateCollection->getValid($this->visitorAffiliateCollection->getValidSize()-1);

        try{
            $visitorAffiliate = $this->visitorAffiliateCollection->getVisitorAffiliateByUserId($contextUserId);
            $transaction->setRefererUrl($visitorAffiliate->getReferrerUrl());
        } catch(Gpf_Exception $e){
            $context->debug($e->getMessage());
            $transaction->setRefererUrl($this->_('Unknown'));
        }

        $this->setFirstClickData($transaction,$firstAffiliate);

        if ($firstAffiliate->getUserId() == $contextUserId){
            $transaction->setAllowFirstClickData(Gpf::YES);
        } else{
            $transaction->setAllowFirstClickData(Gpf::NO);
        }

        $this->setLastClickData($transaction,$lastAffiliate);
        if ($lastAffiliate->getUserId() == $contextUserId){
            $transaction->setAllowLastClickData(Gpf::YES);
        } else{
            $transaction->setAllowLastClickData(Gpf::NO);
        }
    }
	/**
	 * @return Pap_Tracking_Common_VisitorAffiliateCollection
	 */
	public static function sortVisitorAffiliatesByDateVisit(Pap_Tracking_Common_VisitorAffiliateCollection $visitorAffiliates) {
		$visitorAffiliates->sort(array("Pap_Tracking_Visit_VisitorAffiliateCache", "compareTwoVisitorAffiliateByDateVisit"));
	}
 private function checkActualSelected(Pap_Tracking_Common_VisitorAffiliateCollection $rows) {
     $actual = false;
     foreach ($rows as $row) {
         $actual = $actual || $row->isActual();
     }
     if (!$actual) {
         $rows->get($rows->getSize()-1)->setActual();
     }
 }
    protected function setFirstAndLastClick(Pap_Common_Transaction $transaction, Pap_Tracking_Common_VisitorAffiliateCollection $collection) {
        if ($collection->getSize() == 0) {
            throw new Gpf_Exception('VisitorAffiliates for this visitor are empty');
        }
        
        $firstVisitorAffiliate = $collection->get(0);
        $transaction->setFirstClickTime($firstVisitorAffiliate->getDateVisit());
        $transaction->setFirstClickReferer($firstVisitorAffiliate->getReferrerUrl());
        $transaction->setFirstClickIp($firstVisitorAffiliate->getIp());
        $transaction->setFirstClickData1($firstVisitorAffiliate->getData1());
        $transaction->setFirstClickData2($firstVisitorAffiliate->getData2());

        $lastVisitorAffiliate = $collection->get($collection->getSize()-1);
        $transaction->setLastClickTime($lastVisitorAffiliate->getDateVisit());
        $transaction->setLastClickReferer($lastVisitorAffiliate->getReferrerUrl());
        $transaction->setLastClickIp($lastVisitorAffiliate->getIp());
        $transaction->setLastClickData1($lastVisitorAffiliate->getData1());
        $transaction->setLastClickData2($lastVisitorAffiliate->getData2());
    }
    private function isVisitorAffiliatesCollectionValid(Pap_Tracking_Common_VisitorAffiliateCollection $rows) {
        if ($rows->getSize() == 0) {
            return true;
        }

        if ($rows->getSize() > 3) {
            return false;
        }

        foreach ($rows as $row) {
            if ($row->isActual()) {
                return true;
            }
        }

        return false;
    }
    private function cloneVisitorAffiliate(Pap_Db_VisitorAffiliate $visitorAffiliate, Pap_Tracking_Common_VisitorAffiliateCollection $rows) {
        $newVisitorAffiliate = clone $visitorAffiliate;
        $newVisitorAffiliate->setId('');
        $newVisitorAffiliate->setPersistent(false);

        $rows->add($newVisitorAffiliate);
    }