<?php namespace angelleye\PayPal;
/**
 *    An open source PHP library written to easily work with PayPal's Adaptive Payments API
 *
 *    Email:  service@angelleye.com
 *  Facebook: angelleyeconsulting
 *  Twitter: angelleye
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 * @author             Andrew Angell <service@angelleye.com>
 * @package            paypal-php-library
 * @link               https://github.com/angelleye/paypal-php-library/
 * @website            http://www.angelleye.com
 * @support         http://www.angelleye.com/product/premium-support/
 * @filesource
 */

/**
 * PayPal Adaptive Payments Class
 *
 * This class houses all of the Adaptive Payments specific API's.
 *
 * @author            Andrew Angell <service@angelleye.com>
 * @package           paypal-php-library
 */

use DOMDocument;

class Adaptive extends PayPal {
	var $DeveloperAccountEmail = '';
	var $XMLNamespace = '';
	var $ApplicationID = '';
	var $DeviceID = '';
	var $IPAddress = '';
	var $DetailLevel = '';
	var $ErrorLanguage = '';

	/**
	 * Constructor
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure providing config data
	 * @return    void
	 */
	function __construct( $DataArray ) {
		parent::__construct( $DataArray );

		$this->XMLNamespace          = 'http://svcs.paypal.com/types/ap';
		$this->DeviceID              = isset( $DataArray['DeviceID'] ) ? $DataArray['DeviceID'] : '';
		$this->IPAddress             = isset( $DataArray['IPAddress'] ) ? $DataArray['IPAddress'] : $_SERVER['REMOTE_ADDR'];
		$this->DetailLevel           = isset( $DataArray['DetailLevel'] ) ? $DataArray['DetailLevel'] : 'ReturnAll';
		$this->ErrorLanguage         = isset( $DataArray['ErrorLanguage'] ) ? $DataArray['ErrorLanguage'] : 'en_US';
		$this->APISubject            = isset( $DataArray['APISubject'] ) ? $DataArray['APISubject'] : '';
		$this->DeveloperAccountEmail = isset( $DataArray['DeveloperAccountEmail'] ) ? $DataArray['DeveloperAccountEmail'] : '';

		if ( $this->Sandbox ) {
			// Sandbox Credentials
			$this->ApplicationID = isset( $DataArray['ApplicationID'] ) ? $DataArray['ApplicationID'] : '';
			$this->APIUsername   = isset( $DataArray['APIUsername'] ) && $DataArray['APIUsername'] != '' ? $DataArray['APIUsername'] : '';
			$this->APIPassword   = isset( $DataArray['APIPassword'] ) && $DataArray['APIPassword'] != '' ? $DataArray['APIPassword'] : '';
			$this->APISignature  = isset( $DataArray['APISignature'] ) && $DataArray['APISignature'] != '' ? $DataArray['APISignature'] : '';
			$this->EndPointURL   = isset( $DataArray['EndPointURL'] ) && $DataArray['EndPointURL'] != '' ? $DataArray['EndPointURL'] : 'https://svcs.sandbox.paypal.com/';
		} else {
			// Live Credentials
			$this->ApplicationID = isset( $DataArray['ApplicationID'] ) ? $DataArray['ApplicationID'] : '';
			$this->APIUsername   = isset( $DataArray['APIUsername'] ) && $DataArray['APIUsername'] != '' ? $DataArray['APIUsername'] : '';
			$this->APIPassword   = isset( $DataArray['APIPassword'] ) && $DataArray['APIPassword'] != '' ? $DataArray['APIPassword'] : '';
			$this->APISignature  = isset( $DataArray['APISignature'] ) && $DataArray['APISignature'] != '' ? $DataArray['APISignature'] : '';
			$this->EndPointURL   = isset( $DataArray['EndPointURL'] ) && $DataArray['EndPointURL'] != '' ? $DataArray['EndPointURL'] : 'https://svcs.paypal.com/';
		}
	}

	/**
	 * Build all HTTP headers required for the API call.
	 *
	 * @access    public
	 * @param boolean $PrintHeaders - Whether to print headers on screen or not (true/false)
	 * @return    array $headers
	 */

	/**
	 * Builds HTTP headers for an API request.
	 *
	 * @access    public
	 * @param boolean $PrintHeaders Option to output headers to the screen (true/false).
	 * @return    string    $headers        String of HTTP headers.
	 */
	function BuildHeaders( $PrintHeaders ) {
		$headers = array(
			'X-PAYPAL-SECURITY-USERID: ' . $this->APIUsername,
			'X-PAYPAL-SECURITY-PASSWORD: ' . $this->APIPassword,
			'X-PAYPAL-SECURITY-SIGNATURE: ' . $this->APISignature,
			'X-PAYPAL-SECURITY-SUBJECT: ' . $this->APISubject,
			'X-PAYPAL-SECURITY-VERSION: ' . $this->APIVersion,
			'X-PAYPAL-REQUEST-DATA-FORMAT: XML',
			'X-PAYPAL-RESPONSE-DATA-FORMAT: XML',
			'X-PAYPAL-APPLICATION-ID: ' . $this->ApplicationID,
			'X-PAYPAL-DEVICE-ID: ' . $this->DeviceID,
			'X-PAYPAL-DEVICE-IPADDRESS: ' . $this->IPAddress,
		);

		if ( $this->Sandbox ) {
			array_push( $headers, 'X-PAYPAL-SANDBOX-EMAIL-ADDRESS: ' . $this->DeveloperAccountEmail );
		}

		if ( $PrintHeaders ) {
			echo '<pre />';
			print_r( $headers );
		}

		return $headers;
	}

	/**
	 * Send the API request to PayPal using CURL.
	 *
	 * @access    public
	 * @param string $Request      Raw API request string.
	 * @param string $APIName      The name of the API which you are calling.
	 * @param string $APIOperation The method in the API you're calling.
	 * @param string $PrintHeaders The option to print header output or not.
	 * @return    string    $Response        Returns the raw HTTP response from PayPal.
	 */
	function CURLRequest( $Request = "", $APIName = "", $APIOperation = "", $PrintHeaders = false ) {
		$curl = curl_init();
		curl_setopt( $curl, CURLOPT_VERBOSE, 1 );
		curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
		curl_setopt( $curl, CURLOPT_TIMEOUT, 30 );
		curl_setopt( $curl, CURLOPT_URL, $this->EndPointURL . $APIName . '/' . $APIOperation );
		curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
		curl_setopt( $curl, CURLOPT_POSTFIELDS, $Request );
		curl_setopt( $curl, CURLOPT_HTTPHEADER, $this->BuildHeaders( $this->PrintHeaders ) );

		if ( $this->APIMode == 'Certificate' ) {
			curl_setopt( $curl, CURLOPT_SSLCERT, $this->PathToCertKeyPEM );
		}

		$Response = curl_exec( $curl );
		curl_close( $curl );
		return $Response;
	}

	/**
	 * Get all errors returned from PayPal
	 *
	 * @access    public
	 * @param string $XML XML response from PayPal
	 * @return    mixed[]    $ErrorsArray    Returns a parsed array of PayPal errors/warnings.
	 */
	function GetErrors( $XML ) {
		$DOM = new DOMDocument();
		$DOM->loadXML( $XML );

		$Errors      = $DOM->getElementsByTagName( 'error' )->length > 0 ? $DOM->getElementsByTagName( 'error' ) : array();
		$ErrorsArray = array();
		foreach ( $Errors as $Error ) {
			$Receiver    = $Error->getElementsByTagName( 'receiver' )->length > 0 ? $Error->getElementsByTagName( 'receiver' )->item( 0 )->nodeValue : '';
			$Category    = $Error->getElementsByTagName( 'category' )->length > 0 ? $Error->getElementsByTagName( 'category' )->item( 0 )->nodeValue : '';
			$Domain      = $Error->getElementsByTagName( 'domain' )->length > 0 ? $Error->getElementsByTagName( 'domain' )->item( 0 )->nodeValue : '';
			$ErrorID     = $Error->getElementsByTagName( 'errorId' )->length > 0 ? $Error->getElementsByTagName( 'errorId' )->item( 0 )->nodeValue : '';
			$ExceptionID = $Error->getElementsByTagName( 'exceptionId' )->length > 0 ? $Error->getElementsByTagName( 'exceptionId' )->item( 0 )->nodeValue : '';
			$Message     = $Error->getElementsByTagName( 'message' )->length > 0 ? $Error->getElementsByTagName( 'message' )->item( 0 )->nodeValue : '';
			$Parameter   = $Error->getElementsByTagName( 'parameter' )->length > 0 ? $Error->getElementsByTagName( 'parameter' )->item( 0 )->nodeValue : '';
			$Severity    = $Error->getElementsByTagName( 'severity' )->length > 0 ? $Error->getElementsByTagName( 'severity' )->item( 0 )->nodeValue : '';
			$Subdomain   = $Error->getElementsByTagName( 'subdomain' )->length > 0 ? $Error->getElementsByTagName( 'subdomain' )->item( 0 )->nodeValue : '';

			$CurrentError = array(
				'Receiver'    => $Receiver,
				'Category'    => $Category,
				'Domain'      => $Domain,
				'ErrorID'     => $ErrorID,
				'ExceptionID' => $ExceptionID,
				'Message'     => $Message,
				'Parameter'   => $Parameter,
				'Severity'    => $Severity,
				'Subdomain'   => $Subdomain,
			);
			array_push( $ErrorsArray, $CurrentError );
		}
		return $ErrorsArray;
	}

	/**
	 * Get the request envelope from the XML string
	 *
	 * @access    public
	 * @return    string    $XML    Returns raw XML request envelope
	 */
	function GetXMLRequestEnvelope() {
		$XML = '<requestEnvelope xmlns="">';
		$XML .= '<detailLevel>' . $this->DetailLevel . '</detailLevel>';
		$XML .= '<errorLanguage>' . $this->ErrorLanguage . '</errorLanguage>';
		$XML .= '</requestEnvelope>';

		return $XML;
	}

	/**
	 * Log result to a location on the disk.
	 *
	 * @param $log_path
	 * @param $filename
	 * @param $string_data
	 * @return bool
	 */
	function Logger( $log_path, $filename, $string_data ) {

		if ( $this->LogResults ) {
			$timestamp = strtotime( 'now' );
			$timestamp = date( 'mdY_gi_s_A_', $timestamp );

			$file = $log_path . $timestamp . $filename . '.xml';
			$fh   = fopen( $file, 'w' );
			fwrite( $fh, $string_data );
			fclose( $fh );
		}

		return true;
	}


	/**
	 * Submits Pay API request to PayPal
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function Pay( $DataArray ) {
		// PayRequest Fields
		$PayRequestFields                  = isset( $DataArray['PayRequestFields'] ) ? $DataArray['PayRequestFields'] : array();
		$ActionType                        = isset( $PayRequestFields['ActionType'] ) ? $PayRequestFields['ActionType'] : '';
		$CancelURL                         = isset( $PayRequestFields['CancelURL'] ) ? $PayRequestFields['CancelURL'] : '';
		$CurrencyCode                      = isset( $PayRequestFields['CurrencyCode'] ) ? $PayRequestFields['CurrencyCode'] : '';
		$FeesPayer                         = isset( $PayRequestFields['FeesPayer'] ) ? $PayRequestFields['FeesPayer'] : '';
		$IPNNotificationURL                = isset( $PayRequestFields['IPNNotificationURL'] ) ? $PayRequestFields['IPNNotificationURL'] : '';
		$Memo                              = isset( $PayRequestFields['Memo'] ) ? $PayRequestFields['Memo'] : '';
		$Pin                               = isset( $PayRequestFields['Pin'] ) ? $PayRequestFields['Pin'] : '';
		$PreapprovalKey                    = isset( $PayRequestFields['PreapprovalKey'] ) ? $PayRequestFields['PreapprovalKey'] : '';
		$ReturnURL                         = isset( $PayRequestFields['ReturnURL'] ) ? $PayRequestFields['ReturnURL'] : '';
		$ReverseAllParallelPaymentsOnError = isset( $PayRequestFields['ReverseAllParallelPaymentsOnError'] ) ? $PayRequestFields['ReverseAllParallelPaymentsOnError'] : '';
		$SenderEmail                       = isset( $PayRequestFields['SenderEmail'] ) ? $PayRequestFields['SenderEmail'] : '';
		$TrackingID                        = isset( $PayRequestFields['TrackingID'] ) ? $PayRequestFields['TrackingID'] : '';

		// ClientDetails Fields
		$ClientDetailsFields = isset( $DataArray['ClientDetailsFields'] ) ? $DataArray['ClientDetailsFields'] : array();
		$CustomerID          = isset( $ClientDetailsFields['CustomerID'] ) ? $ClientDetailsFields['CustomerID'] : '';
		$CustomerType        = isset( $ClientDetailsFields['CustomerType'] ) ? $ClientDetailsFields['CustomerType'] : '';
		$GeoLocation         = isset( $ClientDetailsFields['GeoLocation'] ) ? $ClientDetailsFields['GeoLocation'] : '';
		$Model               = isset( $ClientDetailsFields['Model'] ) ? $ClientDetailsFields['Model'] : '';
		$PartnerName         = isset( $ClientDetailsFields['PartnerName'] ) ? $ClientDetailsFields['PartnerName'] : '';

		// FundingConstraint Fields
		$FundingTypes = isset( $DataArray['FundingTypes'] ) ? $DataArray['FundingTypes'] : array();

		// Receivers Fields
		$Receivers = isset( $DataArray['Receivers'] ) ? $DataArray['Receivers'] : array();

		// SenderIdentifier Fields
		$SenderIdentifierFields = isset( $DataArray['SenderIdentifierFields'] ) ? $DataArray['SenderIdentifierFields'] : array();

		// AccountIdentifierFields Fields
		$AccountIdentifierFields = isset( $DataArray['AccountIdentifierFields'] ) ? $DataArray['AccountIdentifierFields'] : array();
		$AccountEmail            = isset( $AccountIdentifierFields['Email'] ) ? $AccountIdentifierFields['Email'] : '';
		$AccountPhone            = isset( $AccountIdentifierFields['Phone'] ) ? $AccountIdentifierFields['Phone'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<PayRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $ActionType != '' ? '<actionType xmlns="">' . $ActionType . '</actionType>' : '';
		$XMLRequest .= $CancelURL != '' ? '<cancelUrl xmlns="">' . $CancelURL . '</cancelUrl>' : '';

		if ( count( $ClientDetailsFields ) > 0 ) {
			$XMLRequest .= '<clientDetails xmlns="">';
			$XMLRequest .= $this->ApplicationID != '' ? '<applicationId xmlns="">' . $this->ApplicationID . '</applicationId>' : '';
			$XMLRequest .= $CustomerID != '' ? '<customerId xmlns="">' . $CustomerID . '</customerId>' : '';
			$XMLRequest .= $CustomerType != '' ? '<customerType xmlns="">' . $CustomerType . '</customerType>' : '';
			$XMLRequest .= $this->DeviceID != '' ? '<deviceId xmlns="">' . $this->DeviceID . '</deviceId>' : '';
			$XMLRequest .= $GeoLocation != '' ? '<geoLocation xmlns="">' . $GeoLocation . '</geoLocation>' : '';
			$XMLRequest .= $this->IPAddress != '' ? '<ipAddress xmlns="">' . $this->IPAddress . '</ipAddress>' : '';
			$XMLRequest .= $Model != '' ? '<model xmlns="">' . $Model . '</model>' : '';
			$XMLRequest .= $PartnerName != '' ? '<partnerName xmlns="">' . $PartnerName . '</partnerName>' : '';
			$XMLRequest .= '</clientDetails>';
		}

		$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
		$XMLRequest .= $FeesPayer != '' ? '<feesPayer xmlns="">' . $FeesPayer . '</feesPayer>' : '';

		if ( count( $FundingTypes ) > 0 ) {
			$XMLRequest .= '<fundingConstraint xmlns="">';
			$XMLRequest .= '<allowedFundingType xmlns="">';

			foreach ( $FundingTypes as $FundingType ) {
				$XMLRequest .= '<fundingTypeInfo xmlns="">';
				$XMLRequest .= '<fundingType xmlns="">' . $FundingType . '</fundingType>';
				$XMLRequest .= '</fundingTypeInfo>';
			}

			$XMLRequest .= '</allowedFundingType>';
			$XMLRequest .= '</fundingConstraint>';
		}

		$XMLRequest .= $IPNNotificationURL != '' ? '<ipnNotificationUrl xmlns="">' . $IPNNotificationURL . '</ipnNotificationUrl>' : '';
		$XMLRequest .= $Memo != '' ? '<memo xmlns="">' . $Memo . '</memo>' : '';
		$XMLRequest .= $Pin != '' ? '<pin xmlns="">' . $Pin . '</pin>' : '';
		$XMLRequest .= $PreapprovalKey != '' ? '<preapprovalKey xmlns="">' . $PreapprovalKey . '</preapprovalKey>' : '';

		$XMLRequest .= '<receiverList xmlns="">';

		$IsDigitalGoods = false;
		foreach ( $Receivers as $Receiver ) {
			$IsDigitalGoods = strtoupper( $Receiver['PaymentType'] ) == 'DIGITALGOODS' ? true : false;

			$XMLRequest .= '<receiver xmlns="">';
			$XMLRequest .= $Receiver['Amount'] != '' ? '<amount xmlns="">' . $Receiver['Amount'] . '</amount>' : '';
			$XMLRequest .= $Receiver['Email'] != '' ? '<email xmlns="">' . $Receiver['Email'] . '</email>' : '';
			$XMLRequest .= $Receiver['AccountID'] != '' ? '<accountId xmlns="">' . $Receiver['AccountID'] . '</accountId>' : '';
			$XMLRequest .= $Receiver['InvoiceID'] != '' ? '<invoiceId xmlns="">' . $Receiver['InvoiceID'] . '</invoiceId>' : '';
			$XMLRequest .= $Receiver['PaymentType'] != '' ? '<paymentType xmlns="">' . $Receiver['PaymentType'] . '</paymentType>' : '';
			$XMLRequest .= $Receiver['PaymentSubType'] != '' ? '<paymentSubType xmlns="">' . $Receiver['PaymentSubType'] . '</paymentSubType>' : '';

			if ( $Receiver['Phone']['CountryCode'] != '' ) {
				$XMLRequest .= '<phone xmlns="">';
				$XMLRequest .= $Receiver['Phone']['CountryCode'] != '' ? '<countryCode xmlns="">' . $Receiver['Phone']['CountryCode'] . '</countryCode>' : '';
				$XMLRequest .= $Receiver['Phone']['PhoneNumber'] != '' ? '<phoneNumber xmlns="">' . $Receiver['Phone']['PhoneNumber'] . '</phoneNumber>' : '';
				$XMLRequest .= $Receiver['Phone']['Extension'] != '' ? '<extension xmlns="">' . $Receiver['Phone']['Extension'] . '</extension>' : '';
				$XMLRequest .= '</phone>';
			}

			$XMLRequest .= $Receiver['Primary'] != '' ? '<primary xmlns="">' . strtolower( $Receiver['Primary'] ) . '</primary>' : '';
			$XMLRequest .= '</receiver>';
		}
		$XMLRequest .= '</receiverList>';

		if ( count( $SenderIdentifierFields ) > 0 ) {
			$XMLRequest .= '<sender>';
			$XMLRequest .= '<useCredentials xmlns="">' . $SenderIdentifierFields['UseCredentials'] . '</useCredentials>';
			$XMLRequest .= '</sender>';
		}

		if ( count( $AccountIdentifierFields ) > 0 ) {
			$XMLRequest .= '<account xmlns="">';
			$XMLRequest .= $AccountEmail != '' ? '<email xmlns="">' . $AccountEmail . '</email>' : '';

			if ( $AccountPhone != '' ) {
				$XMLRequest .= '<phone xmlns="">';
				$XMLRequest .= $AccountPhone['CountryCode'] != '' ? '<countryCode xmlns="">' . $AccountPhone['CountryCode'] . '</countryCode>' : '';
				$XMLRequest .= $AccountPhone['PhoneNumber'] != '' ? '<phoneNumber xmlns="">' . $AccountPhone['PhoneNumber'] . '</phoneNumber>' : '';
				$XMLRequest .= $AccountPhone['Extension'] != '' ? '<extension xmlns="">' . $AccountPhone['Extension'] . '</extension>' : '';
				$XMLRequest .= '</phone>';
			}

			$XMLRequest .= '</account>';
		}

		$XMLRequest .= $ReturnURL != '' ? '<returnUrl xmlns="">' . $ReturnURL . '</returnUrl>' : '';
		$XMLRequest .= $ReverseAllParallelPaymentsOnError != '' ? '<reverseAllParallelPaymentsOnError xmlns="">' . $ReverseAllParallelPaymentsOnError . '</reverseAllParallelPaymentsOnError>' : '';
		$XMLRequest .= $SenderEmail != '' ? '<senderEmail xmlns="">' . $SenderEmail . '</senderEmail>' : '';
		$XMLRequest .= $TrackingID != '' ? '<trackingId xmlns="">' . $TrackingID . '</trackingId>' : '';
		$XMLRequest .= '</PayRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'Pay' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$PayKey            = $DOM->getElementsByTagName( 'payKey' )->length > 0 ? $DOM->getElementsByTagName( 'payKey' )->item( 0 )->nodeValue : '';
		$PaymentExecStatus = $DOM->getElementsByTagName( 'paymentExecStatus' )->length > 0 ? $DOM->getElementsByTagName( 'paymentExecStatus' )->item( 0 )->nodeValue : '';

		if ( $this->Sandbox ) {
			if ( $IsDigitalGoods ) {
				$RedirectURL = 'https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay?paykey=' . $PayKey;
			} else {
				$RedirectURL = 'https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=' . $PayKey;
			}
		} else {
			if ( $IsDigitalGoods ) {
				$RedirectURL = 'https://www.paypal.com/webapps/adaptivepayment/flow/pay?paykey=' . $PayKey;
			} else {
				$RedirectURL = 'https://www.paypal.com/webscr?cmd=_ap-payment&paykey=' . $PayKey;
			}
		}

		$ResponseDataArray = array(
			'Errors'            => $Errors,
			'Ack'               => $Ack,
			'Build'             => $Build,
			'CorrelationID'     => $CorrelationID,
			'Timestamp'         => $Timestamp,
			'PayKey'            => $PayKey,
			'PaymentExecStatus' => $PaymentExecStatus,
			'RedirectURL'       => $PayKey != '' ? $RedirectURL : '',
			'XMLRequest'        => $XMLRequest,
			'XMLResponse'       => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submits PayWithOptions API request to PayPal
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function PayWithOptions( $DataArray ) {
		// PayRequest Fields
		$PayRequestFields                  = isset( $DataArray['PayRequestFields'] ) ? $DataArray['PayRequestFields'] : array();
		$ActionType                        = 'CREATE';
		$CancelURL                         = isset( $PayRequestFields['CancelURL'] ) ? $PayRequestFields['CancelURL'] : '';
		$CurrencyCode                      = isset( $PayRequestFields['CurrencyCode'] ) ? $PayRequestFields['CurrencyCode'] : '';
		$FeesPayer                         = isset( $PayRequestFields['FeesPayer'] ) ? $PayRequestFields['FeesPayer'] : '';
		$IPNNotificationURL                = isset( $PayRequestFields['IPNNotificationURL'] ) ? $PayRequestFields['IPNNotificationURL'] : '';
		$Memo                              = isset( $PayRequestFields['Memo'] ) ? $PayRequestFields['Memo'] : '';
		$Pin                               = isset( $PayRequestFields['Pin'] ) ? $PayRequestFields['Pin'] : '';
		$PreapprovalKey                    = isset( $PayRequestFields['PreapprovalKey'] ) ? $PayRequestFields['PreapprovalKey'] : '';
		$ReturnURL                         = isset( $PayRequestFields['ReturnURL'] ) ? $PayRequestFields['ReturnURL'] : '';
		$ReverseAllParallelPaymentsOnError = isset( $PayRequestFields['ReverseAllParallelPaymentsOnError'] ) ? $PayRequestFields['ReverseAllParallelPaymentsOnError'] : '';
		$SenderEmail                       = isset( $PayRequestFields['SenderEmail'] ) ? $PayRequestFields['SenderEmail'] : '';
		$TrackingID                        = isset( $PayRequestFields['TrackingID'] ) ? $PayRequestFields['TrackingID'] : '';

		// ClientDetails Fields
		$ClientDetailsFields = isset( $DataArray['ClientDetailsFields'] ) ? $DataArray['ClientDetailsFields'] : array();
		$CustomerID          = isset( $ClientDetailsFields['CustomerID'] ) ? $ClientDetailsFields['CustomerID'] : '';
		$CustomerType        = isset( $ClientDetailsFields['CustomerType'] ) ? $ClientDetailsFields['CustomerType'] : '';
		$GeoLocation         = isset( $ClientDetailsFields['GeoLocation'] ) ? $ClientDetailsFields['GeoLocation'] : '';
		$Model               = isset( $ClientDetailsFields['Model'] ) ? $ClientDetailsFields['Model'] : '';
		$PartnerName         = isset( $ClientDetailsFields['PartnerName'] ) ? $ClientDetailsFields['PartnerName'] : '';

		// FundingConstraint Fields
		$FundingTypes = isset( $DataArray['FundingTypes'] ) ? $DataArray['FundingTypes'] : array();

		// Receivers Fields
		$Receivers      = isset( $DataArray['Receivers'] ) ? $DataArray['Receivers'] : array();
		$Amount         = isset( $Receivers['Amount'] ) ? $Receivers['Amount'] : '';
		$Email          = isset( $Receivers['Email'] ) ? $Receivers['Email'] : '';
		$InvoiceID      = isset( $Receivers['InvoiceID'] ) ? $Receivers['InvoiceID'] : '';
		$PaymentType    = isset( $Receivers['PaymentType'] ) ? $Receivers['PaymentType'] : '';
		$PaymentSubType = isset( $Receivers['PaymentSubType'] ) ? $Receivers['PaymentSubType'] : '';
		$Phone          = isset( $Receivers['Phone'] ) ? $Receivers['Phone'] : '';
		$Primary        = isset( $Receivers['Primary'] ) ? strtolower( $Receivers['Primary'] ) : '';

		// SenderIdentifier Fields
		$SenderIdentifierFields = isset( $DataArray['SenderIdentifierFields'] ) ? $DataArray['SenderIdentifierFields'] : array();
		$UseCredentials         = isset( $SenderIdentifierFields['UseCredentials'] ) ? $SenderIdentifierFields['UseCredentials'] : '';

		// AccountIdentifierFields Fields
		$AccountIdentifierFields = isset( $DataArray['AccountIdentifierFields'] ) ? $DataArray['AccountIdentifierFields'] : array();
		$AccountEmail            = isset( $AccountIdentifierFields['Email'] ) ? $AccountIdentifierFields['Email'] : '';
		$AccountPhone            = isset( $AccountIdentifierFields['Phone'] ) ? $AccountIdentifierFields['Phone'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<PayRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $ActionType != '' ? '<actionType xmlns="">' . $ActionType . '</actionType>' : '';
		$XMLRequest .= $CancelURL != '' ? '<cancelUrl xmlns="">' . $CancelURL . '</cancelUrl>' : '';

		if ( count( $ClientDetailsFields ) > 0 ) {
			$XMLRequest .= '<clientDetails xmlns="">';
			$XMLRequest .= $this->ApplicationID != '' ? '<applicationId xmlns="">' . $this->ApplicationID . '</applicationId>' : '';
			$XMLRequest .= $CustomerID != '' ? '<customerId xmlns="">' . $CustomerID . '</customerId>' : '';
			$XMLRequest .= $CustomerType != '' ? '<customerType xmlns="">' . $CustomerType . '</customerType>' : '';
			$XMLRequest .= $this->DeviceID != '' ? '<deviceId xmlns="">' . $this->DeviceID . '</deviceId>' : '';
			$XMLRequest .= $GeoLocation != '' ? '<geoLocation xmlns="">' . $GeoLocation . '</geoLocation>' : '';
			$XMLRequest .= $this->IPAddress != '' ? '<ipAddress xmlns="">' . $this->IPAddress . '</ipAddress>' : '';
			$XMLRequest .= $Model != '' ? '<model xmlns="">' . $Model . '</model>' : '';
			$XMLRequest .= $PartnerName != '' ? '<partnerName xmlns="">' . $PartnerName . '</partnerName>' : '';
			$XMLRequest .= '</clientDetails>';
		}

		$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
		$XMLRequest .= $FeesPayer != '' ? '<feesPayer xmlns="">' . $FeesPayer . '</feesPayer>' : '';

		if ( count( $FundingTypes ) > 0 ) {
			$XMLRequest .= '<fundingConstraint xmlns="">';
			$XMLRequest .= '<allowedFundingType xmlns="">';

			foreach ( $FundingTypes as $FundingType ) {
				$XMLRequest .= '<fundingTypeInfo xmlns="">';
				$XMLRequest .= '<fundingType xmlns="">' . $FundingType . '</fundingType>';
				$XMLRequest .= '</fundingTypeInfo>';
			}

			$XMLRequest .= '</allowedFundingType>';
			$XMLRequest .= '</fundingConstraint>';
		}

		$XMLRequest .= $IPNNotificationURL != '' ? '<ipnNotificationUrl xmlns="">' . $IPNNotificationURL . '</ipnNotificationUrl>' : '';
		$XMLRequest .= $Memo != '' ? '<memo xmlns="">' . $Memo . '</memo>' : '';
		$XMLRequest .= $Pin != '' ? '<pin xmlns="">' . $Pin . '</pin>' : '';
		$XMLRequest .= $PreapprovalKey != '' ? '<preapprovalKey xmlns="">' . $PreapprovalKey . '</preapprovalKey>' : '';

		$XMLRequest .= '<receiverList xmlns="">';

		$IsDigitalGoods = false;
		foreach ( $Receivers as $Receiver ) {
			$IsDigitalGoods = strtoupper( $Receiver['PaymentType'] ) == 'DIGITALGOODS' ? true : false;

			$XMLRequest .= '<receiver xmlns="">';
			$XMLRequest .= $Receiver['Amount'] != '' ? '<amount xmlns="">' . $Receiver['Amount'] . '</amount>' : '';
			$XMLRequest .= $Receiver['Email'] != '' ? '<email xmlns="">' . $Receiver['Email'] . '</email>' : '';
			$XMLRequest .= $Receiver['InvoiceID'] != '' ? '<invoiceId xmlns="">' . $Receiver['InvoiceID'] . '</invoiceId>' : '';
			$XMLRequest .= $Receiver['PaymentType'] != '' ? '<paymentType xmlns="">' . $Receiver['PaymentType'] . '</paymentType>' : '';
			$XMLRequest .= $Receiver['PaymentSubType'] != '' ? '<paymentSubType xmlns="">' . $Receiver['PaymentSubType'] . '</paymentSubType>' : '';

			if ( $Receiver['Phone']['CountryCode'] != '' ) {
				$XMLRequest .= '<phone xmlns="">';
				$XMLRequest .= $Receiver['Phone']['CountryCode'] != '' ? '<countryCode xmlns="">' . $Receiver['Phone']['CountryCode'] . '</countryCode>' : '';
				$XMLRequest .= $Receiver['Phone']['PhoneNumber'] != '' ? '<phoneNumber xmlns="">' . $Receiver['Phone']['PhoneNumber'] . '</phoneNumber>' : '';
				$XMLRequest .= $Receiver['Phone']['Extension'] != '' ? '<extension xmlns="">' . $Receiver['Phone']['Extension'] . '</extension>' : '';
				$XMLRequest .= '</phone>';
			}

			$XMLRequest .= $Receiver['Primary'] != '' ? '<primary xmlns="">' . strtolower( $Receiver['Primary'] ) . '</primary>' : '';
			$XMLRequest .= '</receiver>';
		}
		$XMLRequest .= '</receiverList>';

		if ( count( $SenderIdentifierFields ) > 0 ) {
			$XMLRequest .= '<sender>';
			$XMLRequest .= '<useCredentials xmlns="">' . $SenderIdentifierFields['UseCredentials'] . '</useCredentials>';
			$XMLRequest .= '</sender>';
		}

		if ( count( $AccountIdentifierFields ) > 0 ) {
			$XMLRequest .= '<account xmlns="">';
			$XMLRequest .= $AccountEmail != '' ? '<email xmlns="">' . $AccountEmail . '</email>' : '';

			if ( $AccountPhone != '' ) {
				$XMLRequest .= '<phone xmlns="">';
				$XMLRequest .= $AccountPhone['CountryCode'] != '' ? '<countryCode xmlns="">' . $AccountPhone['CountryCode'] . '</countryCode>' : '';
				$XMLRequest .= $AccountPhone['PhoneNumber'] != '' ? '<phoneNumber xmlns="">' . $AccountPhone['PhoneNumber'] . '</phoneNumber>' : '';
				$XMLRequest .= $AccountPhone['Extension'] != '' ? '<extension xmlns="">' . $AccountPhone['Extension'] . '</extension>' : '';
				$XMLRequest .= '</phone>';
			}

			$XMLRequest .= '</account>';
		}

		$XMLRequest .= $ReturnURL != '' ? '<returnUrl xmlns="">' . $ReturnURL . '</returnUrl>' : '';
		$XMLRequest .= $ReverseAllParallelPaymentsOnError != '' ? '<reverseAllParallelPaymentsOnError xmlns="">' . $ReverseAllParallelPaymentsOnError . '</reverseAllParallelPaymentsOnError>' : '';
		$XMLRequest .= $SenderEmail != '' ? '<senderEmail xmlns="">' . $SenderEmail . '</senderEmail>' : '';
		$XMLRequest .= $TrackingID != '' ? '<trackingId xmlns="">' . $TrackingID . '</trackingId>' : '';
		$XMLRequest .= '</PayRequest>';

		$PayXMLRequest = $XMLRequest;

		// Call the API and load XML response into DOM
		$XMLResponse    = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'Pay' );
		$PayXMLResponse = $XMLResponse;

		$DOM = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, 'PayRequest', $PayXMLRequest );
		$this->Logger( $this->LogPath, 'PayResponse', $PayXMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$PayKey            = $DOM->getElementsByTagName( 'payKey' )->length > 0 ? $DOM->getElementsByTagName( 'payKey' )->item( 0 )->nodeValue : '';
		$PaymentExecStatus = $DOM->getElementsByTagName( 'paymentExecStatus' )->length > 0 ? $DOM->getElementsByTagName( 'paymentExecStatus' )->item( 0 )->nodeValue : '';

		if ( $this->Sandbox ) {
			if ( $IsDigitalGoods ) {
				$RedirectURL = 'https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay?paykey=' . $PayKey;
			} else {
				$RedirectURL = 'https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=' . $PayKey;
			}
		} else {
			if ( $IsDigitalGoods ) {
				$RedirectURL = 'https://www.paypal.com/webapps/adaptivepayment/flow/pay?paykey=' . $PayKey;
			} else {
				$RedirectURL = 'https://www.paypal.com/webscr?cmd=_ap-payment&paykey=' . $PayKey;
			}
		}

		if ( ! $this->APICallSuccessful( $Ack ) ) {
			$ResponseDataArray = array(
				'Errors'            => $Errors,
				'Ack'               => $Ack,
				'Build'             => $Build,
				'CorrelationID'     => $CorrelationID,
				'Timestamp'         => $Timestamp,
				'PayKey'            => $PayKey,
				'PaymentExecStatus' => $PaymentExecStatus,
				'PayXMLRequest'     => $PayXMLRequest,
				'PayXMLResponse'    => $PayXMLResponse,
			);

			return $ResponseDataArray;
			exit();
		}

		// SetPaymentOptions Basic Fields
		$SPOFields         = isset( $DataArray['SPOFields'] ) ? $DataArray['SPOFields'] : array();
		$ShippingAddressID = isset( $SPOFields['ShippingAddressID'] ) ? $SPOFields['ShippingAddressID'] : '';

		// DisplayOptions Fields
		$DisplayOptions         = isset( $DataArray['DisplayOptions'] ) ? $DataArray['DisplayOptions'] : array();
		$EmailHeaderImageURL    = isset( $DisplayOptions['EmailHeaderImageURL'] ) ? $DisplayOptions['EmailHeaderImageURL'] : '';
		$EmailMarketingImageURL = isset( $DisplayOptions['EmailMarketingImageURL'] ) ? $DisplayOptions['EmailMarketingImageURL'] : '';
		$HeaderImageURL         = isset( $DisplayOptions['HeaderImageURL'] ) ? $DisplayOptions['HeaderImageURL'] : '';
		$BusinessName           = isset( $DisplayOptions['BusinessName'] ) ? $DisplayOptions['BusinessName'] : '';

		// InstitutionCustomer Fields
		$InstitutionCustomer      = isset( $DataArray['InstitutionCustomer'] ) ? $DataArray['InstitutionCustomer'] : array();
		$CountryCode              = isset( $InstitutionCustomer['CountryCode'] ) ? $InstitutionCustomer['CountryCode'] : '';
		$DisplayName              = isset( $InstitutionCustomer['DisplayName'] ) ? $InstitutionCustomer['DisplayName'] : '';
		$InstitutionCustomerEmail = isset( $InstitutionCustomer['Email'] ) ? $InstitutionCustomer['Email'] : '';
		$FirstName                = isset( $InstitutionCustomer['FirstName'] ) ? $InstitutionCustomer['FirstName'] : '';
		$LastName                 = isset( $InstitutionCustomer['LastName'] ) ? $InstitutionCustomer['LastName'] : '';
		$InstitutionCustomerID    = isset( $InstitutionCustomer['InstitutionCustomerID'] ) ? $InstitutionCustomer['InstitutionCustomerID'] : '';
		$InstitutionID            = isset( $InstitutionCustomer['InstitutionID'] ) ? $InstitutionCustomer['InstitutionID'] : '';

		// SenderOptions Fields
		$SenderOptions                   = isset( $DataArray['SenderOptions'] ) ? $DataArray['SenderOptions'] : array();
		$RequireShippingAddressSelection = isset( $SenderOptions['RequireShippingAddressSelection'] ) ? $SenderOptions['RequireShippingAddressSelection'] : '';
		$ReferrerCode                    = $this->APIButtonSource;

		// ReceiverOptions Fields
		$ReceiverOptionsXML = '';
		$ReceiverOptions    = isset( $DataArray['ReceiverOptions'] ) ? $DataArray['ReceiverOptions'] : array();
		foreach ( $ReceiverOptions as $ReceiverOption ) {
			$Description = isset( $ReceiverOption['Description'] ) ? $ReceiverOption['Description'] : '';
			$CustomID    = isset( $ReceiverOption['CustomID'] ) ? $ReceiverOption['CustomID'] : '';

			// Invoice Data
			$InvoiceData   = isset( $ReceiverOption['InvoiceData'] ) ? $ReceiverOption['InvoiceData'] : array();
			$TotalTax      = isset( $InvoiceData['TotalTax'] ) ? $InvoiceData['TotalTax'] : '';
			$TotalShipping = isset( $InvoiceData['TotalShipping'] ) ? $InvoiceData['TotalShipping'] : '';

			// InvoiceItem Fields
			$InvoiceItems = isset( $ReceiverOption['InvoiceItems'] ) ? $ReceiverOption['InvoiceItems'] : array();

			// ReceiverIdentifer Fields
			$ReceiverIdentifier      = isset( $ReceiverOption['ReceiverIdentifier'] ) ? $ReceiverOption['ReceiverIdentifier'] : array();
			$ReceiverIdentifierEmail = isset( $ReceiverIdentifier['Email'] ) ? $ReceiverIdentifier['Email'] : '';
			$PhoneCountryCode        = isset( $ReceiverIdentifier['PhoneCountryCode'] ) ? $ReceiverIdentifier['PhoneCountryCode'] : '';
			$PhoneNumber             = isset( $ReceiverIdentifier['PhoneNumber'] ) ? $ReceiverIdentifier['PhoneNumber'] : '';
			$PhoneExtension          = isset( $ReceiverIdentifier['PhoneExtension'] ) ? $ReceiverIdentifier['PhoneExtension'] : '';


			$ReceiverOptionsXML .= '<receiverOptions xmlns="">';
			$ReceiverOptionsXML .= $Description != '' ? '<description xmlns="">' . $Description . '</description>' : '';
			$ReceiverOptionsXML .= $CustomID != '' ? '<customId xmlns="">' . $CustomID . '</customId>' : '';

			if ( ! empty( $InvoiceData ) ) {
				$ReceiverOptionsXML .= '<invoiceData xmlns="">';
				$ReceiverOptionsXML .= $TotalTax != '' ? '<totalTax xmlns="">' . $TotalTax . '</totalTax>' : '';
				$ReceiverOptionsXML .= $TotalShipping != '' ? '<totalShipping xmlns="">' . $TotalShipping . '</totalShipping>' : '';


				foreach ( $InvoiceItems as $InvoiceItem ) {
					$ReceiverOptionsXML .= '<item xmlns="">';
					$ReceiverOptionsXML .= $InvoiceItem['Name'] != '' ? '<name xmlns="">' . $InvoiceItem['Name'] . '</name>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['Identifier'] != '' ? '<identifier xmlns="">' . $InvoiceItem['Identifier'] . '</identifier>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['Price'] != '' ? '<price xmlns="">' . $InvoiceItem['Price'] . '</price>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['ItemPrice'] != '' ? '<itemPrice xmlns="">' . $InvoiceItem['ItemPrice'] . '</itemPrice>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['ItemCount'] != '' ? '<itemCount xmlns="">' . $InvoiceItem['ItemCount'] . '</itemCount>' : '';
					$ReceiverOptionsXML .= '</item>';
				}

				$ReceiverOptionsXML .= '</invoiceData>';
			}

			if ( count( $ReceiverIdentifier ) > 0 ) {
				$ReceiverOptionsXML .= '<receiver xmlns="">';
				$ReceiverOptionsXML .= $ReceiverIdentifierEmail != '' ? '<email xmlns="">' . $ReceiverIdentifierEmail . '</email>' : '';

				if ( $PhoneNumber != '' ) {
					$ReceiverOptionsXML .= '<phone xmlns="">';
					$ReceiverOptionsXML .= $PhoneCountryCode != '' ? '<countryCode xmlns="">' . $PhoneCountryCode . '</countryCode>' : '';
					$ReceiverOptionsXML .= $PhoneNumber != '' ? '<phoneNumber xmlns="">' . $PhoneNumber . '</phoneNumber>' : '';
					$ReceiverOptionsXML .= $PhoneExtension != '' ? '<extension xmlns="">' . $PhoneExtension . '</extension>' : '';
					$ReceiverOptionsXML .= '</phone>';
				}

				$ReceiverOptionsXML .= '</receiver>';
			}

			$ReceiverOptionsXML .= '</receiverOptions>';
		}

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<SetPaymentOptionsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $PayKey != '' ? '<payKey xmlns="">' . $PayKey . '</payKey>' : '';
		$XMLRequest .= $ShippingAddressID != '' ? '<shippingAddressId xmlns="">' . $ShippingAddressID . '</shippingAddressId>' : '';

		if ( count( $InstitutionCustomer ) > 0 ) {
			$XMLRequest .= '<initiatingEntity xmlns="">';
			$XMLRequest .= '<institutionCustomer xmlns="">';
			$XMLRequest .= $InstitutionID != '' ? '<institutionId xmlns="">' . $InstitutionID . '</institutionId>' : '';
			$XMLRequest .= $FirstName != '' ? '<firstName xmlns="">' . $FirstName . '</firstName>' : '';
			$XMLRequest .= $LastName != '' ? '<lastName xmlns="">' . $LastName . '</lastName>' : '';
			$XMLRequest .= $DisplayName != '' ? '<displayName xmlns="">' . $DisplayName . '</displayName>' : '';
			$XMLRequest .= $InstitutionCustomerID != '' ? '<institutionCustomerId xmlns="">' . $InstitutionCustomerID . '</institutionCustomerId>' : '';
			$XMLRequest .= $CountryCode != '' ? '<countryCode xmlns="">' . $CountryCode . '</countryCode>' : '';
			$XMLRequest .= $InstitutionCustomerEmail != '' ? '<email xmlns="">' . $InstitutionCustomerEmail . '</email>' : '';
			$XMLRequest .= '</institutionCustomer>';
			$XMLRequest .= '</initiatingEntity>';
		}

		if ( count( $DisplayOptions ) > 0 ) {
			$XMLRequest .= '<displayOptions xmlns="">';
			$XMLRequest .= $EmailHeaderImageURL != '' ? '<emailHeaderImageUrl xmlns="">' . $EmailHeaderImageURL . '</emailHeaderImageUrl>' : '';
			$XMLRequest .= $EmailMarketingImageURL != '' ? '<emailMarketingImageUrl xmlns="">' . $EmailMarketingImageURL . '</emailMarketingImageUrl>' : '';
			$XMLRequest .= $HeaderImageURL != '' ? '<headerImageUrl xmlns="">' . $HeaderImageURL . '</headerImageUrl>' : '';
			$XMLRequest .= $BusinessName != '' ? '<businessName xmlns="">' . $BusinessName . '</businessName>' : '';
			$XMLRequest .= '</displayOptions>';
		}

		if ( count( $SenderOptions ) > 0 ) {
			$XMLRequest .= '<senderOptions xmlns="">';
			$XMLRequest .= $RequireShippingAddressSelection != '' ? '<requireShippingAddressSelection xmlns="">' . $RequireShippingAddressSelection . '</requireShippingAddressSelection>' : '';
			$XMLRequest .= $ReferrerCode != '' ? '<referrerCode xmlns="">' . $ReferrerCode . '</referrerCode>' : '';
			$XMLRequest .= '</senderOptions>';
		}

		$XMLRequest                  .= $ReceiverOptionsXML;
		$XMLRequest                  .= '</SetPaymentOptionsRequest>';
		$SetPaymentOptionsXMLRequest = $XMLRequest;

		// Call the API and load XML response into DOM
		$XMLResponse                  = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'SetPaymentOptions' );
		$SetPaymentOptionsXMLResponse = $XMLResponse;

		$DOM = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, 'SetPaymentOptionsRequest', $SetPaymentOptionsXMLRequest );
		$this->Logger( $this->LogPath, 'SetPaymentOptionsResponse', $SetPaymentOptionsXMLResponse );

		// Parse XML values
		$Fault  = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors = $this->GetErrors( $XMLResponse );
		$Ack    = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'                       => $Errors,
			'Ack'                          => $Ack,
			'Build'                        => $Build,
			'CorrelationID'                => $CorrelationID,
			'Timestamp'                    => $Timestamp,
			'PayKey'                       => $PayKey,
			'PaymentExecStatus'            => $PaymentExecStatus,
			'RedirectURL'                  => $PayKey != '' ? $RedirectURL : '',
			'PayXMLRequest'                => $PayXMLRequest,
			'PayXMLResponse'               => $PayXMLResponse,
			'SetPaymentOptionsXMLRequest'  => $SetPaymentOptionsXMLRequest,
			'SetPaymentOptionsXMLResponse' => $SetPaymentOptionsXMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submits PaymentDetails API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function PaymentDetails( $DataArray ) {
		// PaymentDetails Fields
		$PaymentDetailsFields = isset( $DataArray['PaymentDetailsFields'] ) ? $DataArray['PaymentDetailsFields'] : array();
		$PayKey               = isset( $PaymentDetailsFields['PayKey'] ) ? $PaymentDetailsFields['PayKey'] : '';
		$TransactionID        = isset( $PaymentDetailsFields['TransactionID'] ) ? $PaymentDetailsFields['TransactionID'] : '';
		$TrackingID           = isset( $PaymentDetailsFields['TrackingID'] ) ? $PaymentDetailsFields['TrackingID'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<PaymentDetailsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $PayKey != '' ? '<payKey xmlns="">' . $PayKey . '</payKey>' : '';
		$XMLRequest .= $TransactionID != '' ? '<transactionId xmlns="">' . $TransactionID . '</transactionId>' : '';
		$XMLRequest .= $TrackingID != '' ? '<trackingId xmlns="">' . $TrackingID . '</trackingId>' : '';
		$XMLRequest .= '</PaymentDetailsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'PaymentDetails' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ActionType   = $DOM->getElementsByTagName( 'actionType' )->length > 0 ? $DOM->getElementsByTagName( 'actionType' )->item( 0 )->nodeValue : '';
		$CancelURL    = $DOM->getElementsByTagName( 'cancelUrl' )->length > 0 ? $DOM->getElementsByTagName( 'cancelUrl' )->item( 0 )->nodeValue : '';
		$CurrencyCode = $DOM->getElementsByTagName( 'currencyCode' )->length > 0 ? $DOM->getElementsByTagName( 'currencyCode' )->item( 0 )->nodeValue : '';
		$FeesPayer    = $DOM->getElementsByTagName( 'feesPayer' )->length > 0 ? $DOM->getElementsByTagName( 'feesPayer' )->item( 0 )->nodeValue : '';

		$FundingTypesDOM = $DOM->getElementsByTagName( 'fundingType' )->length > 0 ? $DOM->getElementsByTagName( 'fundingType' ) : array();
		$FundingTypes    = array();
		foreach ( $FundingTypesDOM as $FundingType ) {
			array_push( $FundingTypes, $FundingType );
		}

		$IPNNotificationURL = $DOM->getElementsByTagName( 'ipnNotificationUrl' )->length > 0 ? $DOM->getElementsByTagName( 'ipnNotificationUrl' )->item( 0 )->nodeValue : '';
		$Memo               = $DOM->getElementsByTagName( 'memo' )->length > 0 ? $DOM->getElementsByTagName( 'memo' )->item( 0 )->nodeValue : '';
		$PayKey             = $DOM->getElementsByTagName( 'payKey' )->length > 0 ? $DOM->getElementsByTagName( 'payKey' )->item( 0 )->nodeValue : '';

		$PendingRefund       = $DOM->getElementsByTagName( 'pendingRefund' )->length > 0 ? $DOM->getElementsByTagName( 'pendingRefund' )->item( 0 )->nodeValue : 'false';
		$RefundedAmount      = $DOM->getElementsByTagName( 'refundedAmount' )->length > 0 ? $DOM->getElementsByTagName( 'refundedAmount' )->item( 0 )->nodeValue : '';
		$SenderTransactionID = $DOM->getElementsByTagName( 'senderTransactionID' )->length > 0 ? $DOM->getElementsByTagName( 'senderTransactionID' )->item( 0 )->nodeValue : '';

		$SenderTransactionStatus = $DOM->getElementsByTagName( 'senderTransactionStatus' )->length > 0 ? $DOM->getElementsByTagName( 'senderTransactionStatus' )->item( 0 )->nodeValue : '';
		$TransactionID           = $DOM->getElementsByTagName( 'transactionId' )->length > 0 ? $DOM->getElementsByTagName( 'transactionId' )->item( 0 )->nodeValue : '';
		$TransactionStatus       = $DOM->getElementsByTagName( 'transactionStatus' )->length > 0 ? $DOM->getElementsByTagName( 'transactionStatus' )->item( 0 )->nodeValue : '';
		$PaymentInfo             = array(
			'PendingRefund'           => $PendingRefund,
			'RefundAmount'            => $RefundedAmount,
			'SenderTransactionID'     => $SenderTransactionID,
			'SenderTransactionStatus' => $SenderTransactionStatus,
			'TransactionID'           => $TransactionID,
			'TransactionStatus'       => $TransactionStatus,
		);

		$PreapprovalKey                    = $DOM->getElementsByTagName( 'preapprovalKey' )->length > 0 ? $DOM->getElementsByTagName( 'preapprovalKey' )->item( 0 )->nodeValue : '';
		$ReturnURL                         = $DOM->getElementsByTagName( 'returnUrl' )->length > 0 ? $DOM->getElementsByTagName( 'returnUrl' )->item( 0 )->nodeValue : '';
		$ReverseAllParallelPaymentsOnError = $DOM->getElementsByTagName( 'reverseAllParallelPaymentsOnError' )->length > 0 ? $DOM->getElementsByTagName( 'reverseAllParallelPaymentsOnError' )->item( 0 )->nodeValue : '';
		$SenderEmail                       = $DOM->getElementsByTagName( 'senderEmail' )->length > 0 ? $DOM->getElementsByTagName( 'senderEmail' )->item( 0 )->nodeValue : '';
		$Status                            = $DOM->getElementsByTagName( 'status' )->length > 0 ? $DOM->getElementsByTagName( 'status' )->item( 0 )->nodeValue : '';
		$TrackingID                        = $DOM->getElementsByTagName( 'trackingId' )->length > 0 ? $DOM->getElementsByTagName( 'trackingId' )->item( 0 )->nodeValue : '';

		$Amount      = $DOM->getElementsByTagName( 'amount' )->length > 0 ? $DOM->getElementsByTagName( 'amount' )->item( 0 )->nodeValue : '';
		$Email       = $DOM->getElementsByTagName( 'email' )->length > 0 ? $DOM->getElementsByTagName( 'email' )->item( 0 )->nodeValue : '';
		$InvoiceID   = $DOM->getElementsByTagName( 'invoiceId' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceId' )->item( 0 )->nodeValue : '';
		$PaymentType = $DOM->getElementsByTagName( 'paymentType' )->length > 0 ? $DOM->getElementsByTagName( 'paymentType' )->item( 0 )->nodeValue : '';
		$Primary     = $DOM->getElementsByTagName( 'primary' )->length > 0 ? $DOM->getElementsByTagName( 'primary' )->item( 0 )->nodeValue : 'false';
		$Receiver    = array(
			'Amount'      => $Amount,
			'Email'       => $Email,
			'InvoiceID'   => $InvoiceID,
			'PaymentType' => $PaymentType,
			'Primary'     => $Primary,
		);

		$ResponseDataArray = array(
			'Errors'                            => $Errors,
			'Ack'                               => $Ack,
			'Build'                             => $Build,
			'CorrelationID'                     => $CorrelationID,
			'Timestamp'                         => $Timestamp,
			'ActionType'                        => $ActionType,
			'CancelURL'                         => $CancelURL,
			'CurrencyCode'                      => $CurrencyCode,
			'FeesPayer'                         => $FeesPayer,
			'FundingTypes'                      => $FundingTypes,
			'IPNNotificationURL'                => $IPNNotificationURL,
			'Memo'                              => $Memo,
			'PayKey'                            => $PayKey,
			'PaymentInfo'                       => $PaymentInfo,
			'PreapprovalKey'                    => $PreapprovalKey,
			'ReturnURL'                         => $ReturnURL,
			'ReverseAllParallelPaymentsOnError' => $ReverseAllParallelPaymentsOnError,
			'SenderEmail'                       => $SenderEmail,
			'Status'                            => $Status,
			'TrackingID'                        => $TrackingID,
			'Receiver'                          => $Receiver,
			'XMLRequest'                        => $XMLRequest,
			'XMLResponse'                       => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submits ExecutePayment API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function ExecutePayment( $DataArray ) {
		// ExecutePaymentFields Fields
		$ExecutePaymentFields = isset( $DataArray['ExecutePaymentFields'] ) ? $DataArray['ExecutePaymentFields'] : array();

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<ExecutePaymentRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= isset( $ExecutePaymentFields['PayKey'] ) && $ExecutePaymentFields['PayKey'] != '' ? '<payKey xmlns="">' . $ExecutePaymentFields['PayKey'] . '</payKey>' : '';
		$XMLRequest .= isset( $ExecutePaymentFields['FundingPlanID'] ) && $ExecutePaymentFields['FundingPlanID'] != '' ? '<fundingPlanId xmlns="">' . $ExecutePaymentFields['FundingPlanID'] . '</fundingPlanId>' : '';
		$XMLRequest .= '</ExecutePaymentRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'ExecutePayment' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault             = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors            = $this->GetErrors( $XMLResponse );
		$Ack               = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build             = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID     = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp         = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';
		$PaymentExecStatus = $DOM->getElementsByTagName( 'paymentExecStatus' )->length > 0 ? $DOM->getElementsByTagName( 'paymentExecStatus' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'            => $Errors,
			'Ack'               => $Ack,
			'Build'             => $Build,
			'CorrelationID'     => $CorrelationID,
			'Timestamp'         => $Timestamp,
			'PaymentExecStatus' => $PaymentExecStatus,
			'XMLRequest'        => $XMLRequest,
			'XMLResponse'       => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submits GetPaymentOptions API request to PayPal.
	 *
	 * @access    public
	 * @param string $Paykey PayKey returned from a previous Pay request.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetPaymentOptions( $PayKey ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetPaymentOptionsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $PayKey != '' ? '<payKey xmlns="">' . $PayKey . '</payKey>' : '';
		$XMLRequest .= '</GetPaymentOptionsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'GetPaymentOptions' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		// GetPaymentOptionsResponse Fields
		$PayKey            = $DOM->getElementsByTagName( 'payKey' )->length > 0 ? $DOM->getElementsByTagName( 'payKey' )->item( 0 )->nodeValue : '';
		$ShippingAddressID = $DOM->getElementsByTagName( 'shippingAddressId' )->length > 0 ? $DOM->getElementsByTagName( 'shippingAddressId' )->item( 0 )->nodeValue : '';

		// InitiatingEntity Fields
		$InstitutionCustomer   = $DOM->getElementsByTagName( 'institutionCustomer' )->length > 0 ? $DOM->getElementsByTagName( 'institutionCustomer' )->item( 0 )->nodeValue : '';
		$CountryCode           = $InstitutionCustomer != '' && $InstitutionCustomer->getElementsByTagName( 'countryCode' )->length > 0 ? $InstitutionCustomer->getElementsByTagName( 'countryCode' )->item( 0 )->nodeValue : '';
		$DisplayName           = $InstitutionCustomer != '' && $InstitutionCustomer->getElementsByTagName( 'displayName' )->length > 0 ? $InstitutionCustomer->getElementsByTagName( 'displayName' )->item( 0 )->nodeValue : '';
		$Email                 = $InstitutionCustomer != '' && $InstitutionCustomer->getElementsByTagName( 'email' )->length > 0 ? $InstitutionCustomer->getElementsByTagName( 'email' )->item( 0 )->nodeValue : '';
		$FirstName             = $InstitutionCustomer != '' && $InstitutionCustomer->getElementsByTagName( 'firstName' )->length > 0 ? $InstitutionCustomer->getElementsByTagName( 'firstName' )->item( 0 )->nodeValue : '';
		$InstitutionCustomerID = $InstitutionCustomer != '' && $InstitutionCustomer->getElementsByTagName( 'institutionCustomerId' )->length > 0 ? $InstitutionCustomer->getElementsByTagName( 'institutionCustomerId' )->item( 0 )->nodeValue : '';
		$InstitutionID         = $InstitutionCustomer != '' && $InstitutionCustomer->getElementsByTagName( 'institutionId' )->length > 0 ? $InstitutionCustomer->getElementsByTagName( 'institutionId' )->item( 0 )->nodeValue : '';
		$LastName              = $InstitutionCustomer != '' && $InstitutionCustomer->getElementsByTagName( 'lastName' )->length > 0 ? $InstitutionCustomer->getElementsByTagName( 'lastName' )->item( 0 )->nodeValue : '';
		$InitiatingEntity      = array(
			'CountryCode'           => $CountryCode,
			'DisplayName'           => $DisplayName,
			'Email'                 => $Email,
			'FirstName'             => $FirstName,
			'InstitutionCustomerID' => $InstitutionCustomerID,
			'InstitutionID'         => $InstitutionID,
			'LastName'              => $LastName,
		);


		// DisplayOptions Fields
		$EmailHeaderImageURL    = $DOM->getElementsByTagName( 'emailHeaderImageUrl' )->length > 0 ? $DOM->getElementsByTagName( 'emailHeaderImageUrl' )->item( 0 )->nodeValue : '';
		$EmailMarketingImageURL = $DOM->getElementsByTagName( 'emailMarketingImageUrl' )->length > 0 ? $DOM->getElementsByTagName( 'emailMarketingImageUrl' )->item( 0 )->nodeValue : '';
		$BusinessName           = $DOM->getElementsByTagName( 'businessName' )->length > 0 ? $DOM->getElementsByTagName( 'businessName' )->item( 0 )->nodeValue : '';
		$DisplayOptions         = array(
			'EmailHeaderImageURL'    => $EmailHeaderImageURL,
			'EmailMarketingImageURL' => $EmailMarketingImageURL,
			'BusinessName'           => $BusinessName,
		);

		// Sender Options
		$RequireShippingAddressSelection = $DOM->getElementsByTagName( 'requireShippingAddressSelection' )->length > 0 ? $DOM->getElementsByTagName( 'requireShippingAddressSelection' )->item( 0 )->nodeValue : '';

		// ReceiverOptions Fields
		$ReceiverOptions  = $DOM->getElementsByTagName( 'receiverOptions' )->length > 0 ? $DOM->getElementsByTagName( 'receiverOptions' )->item( 0 )->nodeValue : '';
		$Description      = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'description' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'description' )->item( 0 )->nodeValue : '';
		$CustomID         = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'customId' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'customId' )->item( 0 )->nodeValue : '';
		$Email            = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'email' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'email' )->item( 0 )->nodeValue : '';
		$PhoneCountryCode = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'countryCode' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'countryCode' )->item( 0 )->nodeValue : '';
		$PhoneNumber      = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'phoneNumber' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'phoneNumber' )->item( 0 )->nodeValue : '';
		$PhoneExtension   = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'extension' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'extension' )->item( 0 )->nodeValue : '';

		// InvoiceDataFields
		$InvoiceItems  = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'item' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'item' ) : array();
		$TotalTax      = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'totalTax' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'totalTax' )->item( 0 )->nodeValue : '';
		$TotalShipping = $ReceiverOptions != '' && $ReceiverOptions->getElementsByTagName( 'totalShipping' )->length > 0 ? $ReceiverOptions->getElementsByTagName( 'totalShipping' )->item( 0 )->nodeValue : '';

		$InvoiceItemsArray = array();
		foreach ( $InvoiceItems as $InvoiceItem ) {
			$ItemName       = $InvoiceItem->getElementsByTagName( 'name' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'name' )->item( 0 )->nodeValue : '';
			$ItemIdentifier = $InvoiceItem->getElementsByTagName( 'identifier' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'identifier' )->item( 0 )->nodeValue : '';
			$ItemSubtotal   = $InvoiceItem->getElementsByTagName( 'price' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'price' )->item( 0 )->nodeValue : '';
			$ItemPrice      = $InvoiceItem->getElementsByTagName( 'itemPrice' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'itemPrice' )->item( 0 )->nodeValue : '';
			$ItemCount      = $InvoiceItem->getElementsByTagName( 'itemCount' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'itemCount' )->item( 0 )->nodeValue : '';

			$CurrentItem = array(
				'Name'       => $ItemName,
				'Identifier' => $ItemIdentifier,
				'Subtotal'   => $ItemSubtotal,
				'Price'      => $ItemPrice,
				'ItemCount'  => $ItemCount,
			);
			array_push( $InvoiceItemsArray, $CurrentItem );
		}

		$InvoiceData = array( 'TotalTax' => $TotalTax, 'TotalShipping' => $TotalShipping, 'InvoiceItems' => $InvoiceItemsArray );

		$ReceiverOptionsFields = array(
			'Description'      => $Description,
			'CustomID'         => $CustomID,
			'Email'            => $Email,
			'PhoneCountryCode' => $PhoneCountryCode,
			'PhoneNumber'      => $PhoneNumber,
			'PhoneExtension'   => $PhoneExtension,
			'InvoiceData'      => $InvoiceData,
		);

		$ResponseDataArray = array(
			'Errors'                          => $Errors,
			'Ack'                             => $Ack,
			'Build'                           => $Build,
			'CorrelationID'                   => $CorrelationID,
			'Timestamp'                       => $Timestamp,
			'PayKey'                          => $PayKey,
			'ShippingAddressID'               => $ShippingAddressID,
			'InitiatingEntity'                => $InitiatingEntity,
			'DisplayOptions'                  => $DisplayOptions,
			'RequireShippingAddressSelection' => $RequireShippingAddressSelection,
			'ReceiverOptions'                 => $ReceiverOptionsFields,
			'XMLRequest'                      => $XMLRequest,
			'XMLResponse'                     => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submits SetPaymentOptions API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function SetPaymentOptions( $DataArray ) {
		// SetPaymentOptions Basic Fields
		$SPOFields         = isset( $DataArray['SPOFields'] ) ? $DataArray['SPOFields'] : array();
		$PayKey            = isset( $SPOFields['PayKey'] ) ? $SPOFields['PayKey'] : '';
		$ShippingAddressID = isset( $SPOFields['ShippingAddressID'] ) ? $SPOFields['ShippingAddressID'] : '';

		// DisplayOptions Fields
		$DisplayOptions         = isset( $DataArray['DisplayOptions'] ) ? $DataArray['DisplayOptions'] : array();
		$EmailHeaderImageURL    = isset( $DisplayOptions['EmailHeaderImageURL'] ) ? $DisplayOptions['EmailHeaderImageURL'] : '';
		$EmailMarketingImageURL = isset( $DisplayOptions['EmailMarketingImageURL'] ) ? $DisplayOptions['EmailMarketingImageURL'] : '';
		$HeaderImageURL         = isset( $DisplayOptions['HeaderImageURL'] ) ? $DisplayOptions['HeaderImageURL'] : '';
		$BusinessName           = isset( $DisplayOptions['BusinessName'] ) ? $DisplayOptions['BusinessName'] : '';

		// InstitutionCustomer Fields
		$InstitutionCustomer      = isset( $DataArray['InstitutionCustomer'] ) ? $DataArray['InstitutionCustomer'] : array();
		$CountryCode              = isset( $InstitutionCustomer['CountryCode'] ) ? $InstitutionCustomer['CountryCode'] : '';
		$DisplayName              = isset( $InstitutionCustomer['DisplayName'] ) ? $InstitutionCustomer['DisplayName'] : '';
		$InstitutionCustomerEmail = isset( $InstitutionCustomer['Email'] ) ? $InstitutionCustomer['Email'] : '';
		$FirstName                = isset( $InstitutionCustomer['FirstName'] ) ? $InstitutionCustomer['FirstName'] : '';
		$LastName                 = isset( $InstitutionCustomer['LastName'] ) ? $InstitutionCustomer['LastName'] : '';
		$InstitutionCustomerID    = isset( $InstitutionCustomer['InstitutionCustomerID'] ) ? $InstitutionCustomer['InstitutionCustomerID'] : '';
		$InstitutionID            = isset( $InstitutionCustomer['InstitutionID'] ) ? $InstitutionCustomer['InstitutionID'] : '';

		// SenderOptions Fields
		$SenderOptions                   = isset( $DataArray['SenderOptions'] ) ? $DataArray['SenderOptions'] : array();
		$RequireShippingAddressSelection = isset( $SenderOptions['RequireShippingAddressSelection'] ) ? $SenderOptions['RequireShippingAddressSelection'] : '';
		$ReferrerCode                    = $this->APIButtonSource;

		// ReceiverOptions Fields
		$ReceiverOptionsXML = '';
		$ReceiverOptions    = isset( $DataArray['ReceiverOptions'] ) ? $DataArray['ReceiverOptions'] : array();
		foreach ( $ReceiverOptions as $ReceiverOption ) {
			$Description = isset( $ReceiverOption['Description'] ) ? $ReceiverOption['Description'] : '';
			$CustomID    = isset( $ReceiverOption['CustomID'] ) ? $ReceiverOption['CustomID'] : '';

			// Invoice Data
			$InvoiceData   = isset( $ReceiverOption['InvoiceData'] ) ? $ReceiverOption['InvoiceData'] : array();
			$TotalTax      = isset( $InvoiceData['TotalTax'] ) ? $InvoiceData['TotalTax'] : '';
			$TotalShipping = isset( $InvoiceData['TotalShipping'] ) ? $InvoiceData['TotalShipping'] : '';

			// InvoiceItem Fields
			$InvoiceItems = isset( $ReceiverOption['InvoiceItems'] ) ? $ReceiverOption['InvoiceItems'] : array();

			// ReceiverIdentifer Fields
			$ReceiverIdentifier          = isset( $ReceiverOption['ReceiverIdentifier'] ) ? $ReceiverOption['ReceiverIdentifier'] : array();
			$ReceiverIdentifierEmail     = isset( $ReceiverIdentifier['Email'] ) ? $ReceiverIdentifier['Email'] : '';
			$ReceiverIdentifierAccountID = isset( $ReceiverIdentifier['AccountID'] ) ? $ReceiverIdentifier['AccountID'] : '';
			$PhoneCountryCode            = isset( $ReceiverIdentifier['PhoneCountryCode'] ) ? $ReceiverIdentifier['PhoneCountryCode'] : '';
			$PhoneNumber                 = isset( $ReceiverIdentifier['PhoneNumber'] ) ? $ReceiverIdentifier['PhoneNumber'] : '';
			$PhoneExtension              = isset( $ReceiverIdentifier['PhoneExtension'] ) ? $ReceiverIdentifier['PhoneExtension'] : '';


			$ReceiverOptionsXML .= '<receiverOptions xmlns="">';
			$ReceiverOptionsXML .= $Description != '' ? '<description xmlns="">' . $Description . '</description>' : '';
			$ReceiverOptionsXML .= $CustomID != '' ? '<customId xmlns="">' . $CustomID . '</customId>' : '';

			if ( ! empty( $InvoiceData ) ) {
				$ReceiverOptionsXML .= '<invoiceData xmlns="">';
				$ReceiverOptionsXML .= $TotalTax != '' ? '<totalTax xmlns="">' . $TotalTax . '</totalTax>' : '';
				$ReceiverOptionsXML .= $TotalShipping != '' ? '<totalShipping xmlns="">' . $TotalShipping . '</totalShipping>' : '';


				foreach ( $InvoiceItems as $InvoiceItem ) {
					$ReceiverOptionsXML .= '<item xmlns="">';
					$ReceiverOptionsXML .= $InvoiceItem['Name'] != '' ? '<name xmlns="">' . $InvoiceItem['Name'] . '</name>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['Identifier'] != '' ? '<identifier xmlns="">' . $InvoiceItem['Identifier'] . '</identifier>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['Price'] != '' ? '<price xmlns="">' . $InvoiceItem['Price'] . '</price>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['ItemPrice'] != '' ? '<itemPrice xmlns="">' . $InvoiceItem['ItemPrice'] . '</itemPrice>' : '';
					$ReceiverOptionsXML .= $InvoiceItem['ItemCount'] != '' ? '<itemCount xmlns="">' . $InvoiceItem['ItemCount'] . '</itemCount>' : '';
					$ReceiverOptionsXML .= '</item>';
				}

				$ReceiverOptionsXML .= '</invoiceData>';
			}

			if ( count( $ReceiverIdentifier ) > 0 ) {
				$ReceiverOptionsXML .= '<receiver xmlns="">';
				$ReceiverOptionsXML .= $ReceiverIdentifierEmail != '' ? '<email xmlns="">' . $ReceiverIdentifierEmail . '</email>' : '';
				$ReceiverOptionsXML .= $ReceiverIdentifierAccountID != '' ? '<accountId xmlns="">' . $ReceiverIdentifierAccountID . '</accountId>' : '';

				if ( $PhoneNumber != '' ) {
					$ReceiverOptionsXML .= '<phone xmlns="">';
					$ReceiverOptionsXML .= $PhoneCountryCode != '' ? '<countryCode xmlns="">' . $PhoneCountryCode . '</countryCode>' : '';
					$ReceiverOptionsXML .= $PhoneNumber != '' ? '<phoneNumber xmlns="">' . $PhoneNumber . '</phoneNumber>' : '';
					$ReceiverOptionsXML .= $PhoneExtension != '' ? '<extension xmlns="">' . $PhoneExtension . '</extension>' : '';
					$ReceiverOptionsXML .= '</phone>';
				}

				$ReceiverOptionsXML .= '</receiver>';
			}

			$ReceiverOptionsXML .= '</receiverOptions>';
		}

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<SetPaymentOptionsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $PayKey != '' ? '<payKey xmlns="">' . $PayKey . '</payKey>' : '';
		$XMLRequest .= $ShippingAddressID != '' ? '<shippingAddressId xmlns="">' . $ShippingAddressID . '</shippingAddressId>' : '';

		if ( count( $InstitutionCustomer ) > 0 ) {
			$XMLRequest .= '<initiatingEntity xmlns="">';
			$XMLRequest .= '<institutionCustomer xmlns="">';
			$XMLRequest .= $InstitutionID != '' ? '<institutionId xmlns="">' . $InstitutionID . '</institutionId>' : '';
			$XMLRequest .= $FirstName != '' ? '<firstName xmlns="">' . $FirstName . '</firstName>' : '';
			$XMLRequest .= $LastName != '' ? '<lastName xmlns="">' . $LastName . '</lastName>' : '';
			$XMLRequest .= $DisplayName != '' ? '<displayName xmlns="">' . $DisplayName . '</displayName>' : '';
			$XMLRequest .= $InstitutionCustomerID != '' ? '<institutionCustomerId xmlns="">' . $InstitutionCustomerID . '</institutionCustomerId>' : '';
			$XMLRequest .= $CountryCode != '' ? '<countryCode xmlns="">' . $CountryCode . '</countryCode>' : '';
			$XMLRequest .= $InstitutionCustomerEmail != '' ? '<email xmlns="">' . $InstitutionCustomerEmail . '</email>' : '';
			$XMLRequest .= '</institutionCustomer>';
			$XMLRequest .= '</initiatingEntity>';
		}

		if ( count( $DisplayOptions ) > 0 ) {
			$XMLRequest .= '<displayOptions xmlns="">';
			$XMLRequest .= $EmailHeaderImageURL != '' ? '<emailHeaderImageUrl xmlns="">' . $EmailHeaderImageURL . '</emailHeaderImageUrl>' : '';
			$XMLRequest .= $EmailMarketingImageURL != '' ? '<emailMarketingImageUrl xmlns="">' . $EmailMarketingImageURL . '</emailMarketingImageUrl>' : '';
			$XMLRequest .= $HeaderImageURL != '' ? '<headerImageUrl xmlns="">' . $HeaderImageURL . '</headerImageUrl>' : '';
			$XMLRequest .= $BusinessName != '' ? '<businessName xmlns="">' . $BusinessName . '</businessName>' : '';
			$XMLRequest .= '</displayOptions>';
		}

		if ( count( $SenderOptions ) > 0 ) {
			$XMLRequest .= '<senderOptions xmlns="">';
			$XMLRequest .= $RequireShippingAddressSelection != '' ? '<requireShippingAddressSelection xmlns="">' . $RequireShippingAddressSelection . '</requireShippingAddressSelection>' : '';
			$XMLRequest .= $ReferrerCode != '' ? '<referrerCode xmlns="">' . $ReferrerCode . '</referrerCode>' : '';
			$XMLRequest .= '</senderOptions>';
		}

		$XMLRequest .= $ReceiverOptionsXML;
		$XMLRequest .= '</SetPaymentOptionsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'SetPaymentOptions' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submits Preapproval API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function Preapproval( $DataArray ) {
		$PreapprovalFields            = isset( $DataArray['PreapprovalFields'] ) ? $DataArray['PreapprovalFields'] : array();
		$CancelURL                    = isset( $PreapprovalFields['CancelURL'] ) ? $PreapprovalFields['CancelURL'] : '';
		$CurrencyCode                 = isset( $PreapprovalFields['CurrencyCode'] ) ? $PreapprovalFields['CurrencyCode'] : '';
		$DateOfMonth                  = isset( $PreapprovalFields['DateOfMonth'] ) ? $PreapprovalFields['DateOfMonth'] : '';
		$DayOfWeek                    = isset( $PreapprovalFields['DayOfWeek'] ) ? $PreapprovalFields['DayOfWeek'] : '';
		$EndingDate                   = isset( $PreapprovalFields['EndingDate'] ) ? $PreapprovalFields['EndingDate'] : '';
		$IPNNotificationURL           = isset( $PreapprovalFields['IPNNotificationURL'] ) ? $PreapprovalFields['IPNNotificationURL'] : '';
		$MaxAmountPerPayment          = isset( $PreapprovalFields['MaxAmountPerPayment'] ) ? $PreapprovalFields['MaxAmountPerPayment'] : '';
		$MaxNumberOfPayments          = isset( $PreapprovalFields['MaxNumberOfPayments'] ) ? $PreapprovalFields['MaxNumberOfPayments'] : '';
		$MaxNumberOfPaymentsPerPeriod = isset( $PreapprovalFields['MaxNumberOfPaymentsPerPeriod'] ) ? $PreapprovalFields['MaxNumberOfPaymentsPerPeriod'] : '';
		$MaxTotalAmountOfAllPayments  = isset( $PreapprovalFields['MaxTotalAmountOfAllPayments'] ) ? $PreapprovalFields['MaxTotalAmountOfAllPayments'] : '';
		$Memo                         = isset( $PreapprovalFields['Memo'] ) ? $PreapprovalFields['Memo'] : '';
		$PaymentPeriod                = isset( $PreapprovalFields['PaymentPeriod'] ) ? $PreapprovalFields['PaymentPeriod'] : '';
		$PinType                      = isset( $PreapprovalFields['PinType'] ) ? $PreapprovalFields['PinType'] : '';
		$ReturnURL                    = isset( $PreapprovalFields['ReturnURL'] ) ? $PreapprovalFields['ReturnURL'] : '';
		$SenderEmail                  = isset( $PreapprovalFields['SenderEmail'] ) ? $PreapprovalFields['SenderEmail'] : '';
		$StartingDate                 = isset( $PreapprovalFields['StartingDate'] ) ? $PreapprovalFields['StartingDate'] : '';
		$FeesPayer                    = isset( $PreapprovalFields['FeesPayer'] ) ? $PreapprovalFields['FeesPayer'] : '';
		$DisplayMaxTotalAmount        = isset( $PreapprovalFields['DisplayMaxTotalAmount'] ) ? $PreapprovalFields['DisplayMaxTotalAmount'] : '';
		$RequireInstantFundingSource  = isset( $PreapprovalFields['RequireInstantFundingSource'] ) ? $PreapprovalFields['RequireInstantFundingSource'] : '';

		$ClientDetailsFields = isset( $DataArray['ClientDetailsFields'] ) ? $DataArray['ClientDetailsFields'] : array();
		$CustomerID          = isset( $ClientDetailsFields['CustomerID'] ) ? $ClientDetailsFields['CustomerID'] : '';
		$CustomerType        = isset( $ClientDetailsFields['CustomerType'] ) ? $ClientDetailsFields['CustomerType'] : '';
		$GeoLocation         = isset( $ClientDetailsFields['GeoLocation'] ) ? $ClientDetailsFields['GeoLocation'] : '';
		$Model               = isset( $ClientDetailsFields['Model'] ) ? $ClientDetailsFields['Model'] : '';
		$PartnerName         = isset( $ClientDetailsFields['PartnerName'] ) ? $ClientDetailsFields['PartnerName'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<PreapprovalRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= '<cancelUrl xmlns="">' . $CancelURL . '</cancelUrl>';

		$XMLRequest .= '<clientDetails xmlns="">';
		$XMLRequest .= $this->ApplicationID != '' ? '<applicationId xmlns="">' . $this->ApplicationID . '</applicationId>' : '';
		$XMLRequest .= $CustomerID != '' ? '<customerId xmlns="">' . $CustomerID . '</customerId>' : '';
		$XMLRequest .= $CustomerType != '' ? '<customerType xmlns="">' . $CustomerType . '</customerType>' : '';
		$XMLRequest .= $this->DeviceID != '' ? '<deviceId xmlns="">' . $this->DeviceID . '</deviceId>' : '';
		$XMLRequest .= $GeoLocation != '' ? '<geoLocation xmlns="">' . $GeoLocation . '</geoLocation>' : '';
		$XMLRequest .= $this->IPAddress != '' ? '<ipAddress xmlns="">' . $this->IPAddress . '</ipAddress>' : '';
		$XMLRequest .= $Model != '' ? '<model xmlns="">' . $Model . '</model>' : '';
		$XMLRequest .= $PartnerName != '' ? '<partnerName xmlns="">' . $PartnerName . '</partnerName>' : '';
		$XMLRequest .= '</clientDetails>';

		$XMLRequest .= '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>';
		$XMLRequest .= $DateOfMonth != '' ? '<dateOfMonth xmlns="">' . $DateOfMonth . '</dateOfMonth>' : '';
		$XMLRequest .= $DayOfWeek != '' ? '<dayOfWeek xmlns="">' . $DayOfWeek . '</dayOfWeek>' : '';
		$XMLRequest .= $EndingDate != '' ? '<endingDate xmlns="">' . $EndingDate . '</endingDate>' : '';
		$XMLRequest .= $IPNNotificationURL != '' ? '<ipnNotificationUrl xmlns="">' . $IPNNotificationURL . '</ipnNotificationUrl>' : '';
		$XMLRequest .= $MaxAmountPerPayment != '' ? '<maxAmountPerPayment xmlns="">' . $MaxAmountPerPayment . '</maxAmountPerPayment>' : '';
		$XMLRequest .= $MaxNumberOfPayments != '' ? '<maxNumberOfPayments xmlns="">' . $MaxNumberOfPayments . '</maxNumberOfPayments>' : '';
		$XMLRequest .= $MaxNumberOfPaymentsPerPeriod != '' ? '<maxNumberOfPaymentsPerPeriod xmlns="">' . $MaxNumberOfPaymentsPerPeriod . '</maxNumberOfPaymentsPerPeriod>' : '';
		$XMLRequest .= $MaxTotalAmountOfAllPayments != '' ? '<maxTotalAmountOfAllPayments xmlns="">' . $MaxTotalAmountOfAllPayments . '</maxTotalAmountOfAllPayments>' : '';
		$XMLRequest .= $Memo != '' ? '<memo xmlns="">' . $Memo . '</memo>' : '';
		$XMLRequest .= $PaymentPeriod != '' ? '<paymentPeriod xmlns="">' . $PaymentPeriod . '</paymentPeriod>' : '';
		$XMLRequest .= $PinType != '' ? '<pinType xmlns="">' . $PinType . '</pinType>' : '';
		$XMLRequest .= $FeesPayer != '' ? '<feesPayer xmlns="">' . $FeesPayer . '</feesPayer>' : '';
		$XMLRequest .= $RequireInstantFundingSource != '' ? '<requireInstantFundingSource xmlns="">' . $RequireInstantFundingSource . '</requireInstantFundingSource>' : '';
		$XMLRequest .= $DisplayMaxTotalAmount != '' ? '<displayMaxTotalAmount xmlns="">' . $DisplayMaxTotalAmount . '</displayMaxTotalAmount>' : '';
		$XMLRequest .= $ReturnURL != '' ? '<returnUrl xmlns="">' . $ReturnURL . '</returnUrl>' : '';
		$XMLRequest .= $SenderEmail != '' ? '<senderEmail xmlns="">' . $SenderEmail . '</senderEmail>' : '';
		$XMLRequest .= $StartingDate != '' ? '<startingDate xmlns="">' . $StartingDate . '</startingDate>' : '';
		$XMLRequest .= '</PreapprovalRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'Preapproval' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault          = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors         = $this->GetErrors( $XMLResponse );
		$Ack            = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build          = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID  = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp      = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';
		$PreapprovalKey = $DOM->getElementsByTagName( 'preapprovalKey' )->length > 0 ? $DOM->getElementsByTagName( 'preapprovalKey' )->item( 0 )->nodeValue : '';

		if ( $this->Sandbox ) {
			$RedirectURL = 'https://www.sandbox.paypal.com/webscr?cmd=_ap-preapproval&preapprovalkey=' . $PreapprovalKey;
		} else {
			$RedirectURL = 'https://www.paypal.com/webscr?cmd=_ap-preapproval&preapprovalkey=' . $PreapprovalKey;
		}

		$ResponseDataArray = array(
			'Errors'         => $Errors,
			'Ack'            => $Ack,
			'Build'          => $Build,
			'CorrelationID'  => $CorrelationID,
			'Timestamp'      => $Timestamp,
			'PreapprovalKey' => $PreapprovalKey,
			'RedirectURL'    => $PreapprovalKey != '' ? $RedirectURL : '',
			'XMLRequest'     => $XMLRequest,
			'XMLResponse'    => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit PreapprovalDetails API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function PreapprovalDetails( $DataArray ) {
		$PreapprovalDetailsFields = isset( $DataArray['PreapprovalDetailsFields'] ) ? $DataArray['PreapprovalDetailsFields'] : array();
		$GetBillingAddress        = isset( $PreapprovalDetailsFields['GetBillingAddress'] ) ? $PreapprovalDetailsFields['GetBillingAddress'] : '';
		$PreapprovalKey           = isset( $PreapprovalDetailsFields['PreapprovalKey'] ) ? $PreapprovalDetailsFields['PreapprovalKey'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<PreapprovalDetailsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $GetBillingAddress != '' ? '<getBillingAddress xmlns="">' . $GetBillingAddress . '</getBillingAddress>' : '';
		$XMLRequest .= $PreapprovalKey != '' ? '<preapprovalKey xmlns="">' . $PreapprovalKey . '</preapprovalKey>' : '';
		$XMLRequest .= '</PreapprovalDetailsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'PreapprovalDetails' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$Approved                     = $DOM->getElementsByTagName( 'approved' )->length > 0 ? $DOM->getElementsByTagName( 'approved' )->item( 0 )->nodeValue : '';
		$CancelURL                    = $DOM->getElementsByTagName( 'cancelUrl' )->length > 0 ? $DOM->getElementsByTagName( 'cancelUrl' )->item( 0 )->nodeValue : '';
		$CurPayments                  = $DOM->getElementsByTagName( 'curPayments' )->length > 0 ? $DOM->getElementsByTagName( 'curPayments' )->item( 0 )->nodeValue : '';
		$CurPaymentsAmount            = $DOM->getElementsByTagName( 'curPaymentsAmount' )->length > 0 ? $DOM->getElementsByTagName( 'curPaymentsAmount' )->item( 0 )->nodeValue : '';
		$CurPeriodAttempts            = $DOM->getElementsByTagName( 'curPeriodAttempts' )->length > 0 ? $DOM->getElementsByTagName( 'curPeriodAttempts' )->item( 0 )->nodeValue : '';
		$CurPeriodEndingDate          = $DOM->getElementsByTagName( 'curPeriodEndingDate' )->length > 0 ? $DOM->getElementsByTagName( 'curPeriodEndingDate' )->item( 0 )->nodeValue : '';
		$CurrencyCode                 = $DOM->getElementsByTagName( 'currencyCode' )->length > 0 ? $DOM->getElementsByTagName( 'currencyCode' )->item( 0 )->nodeValue : '';
		$DateOfMonth                  = $DOM->getElementsByTagName( 'dateOfMonth' )->length > 0 ? $DOM->getElementsByTagName( 'dateOfMonth' )->item( 0 )->nodeValue : '';
		$DayOfWeek                    = $DOM->getElementsByTagName( 'dayOfWeek' )->length > 0 ? $DOM->getElementsByTagName( 'dayOfWeek' )->item( 0 )->nodeValue : '';
		$EndingDate                   = $DOM->getElementsByTagName( 'endingDate' )->length > 0 ? $DOM->getElementsByTagName( 'endingDate' )->item( 0 )->nodeValue : '';
		$IPNNotificationURL           = $DOM->getElementsByTagName( 'ipnNotificationUrl' )->length > 0 ? $DOM->getElementsByTagName( 'ipnNotificationUrl' )->item( 0 )->nodeValue : '';
		$MaxAmountPerPayment          = $DOM->getElementsByTagName( 'maxAmountPerPayment' )->length > 0 ? $DOM->getElementsByTagName( 'maxAmountPerPayment' )->item( 0 )->nodeValue : '';
		$MaxNumberOfPayments          = $DOM->getElementsByTagName( 'maxNumberOfPayments' )->length > 0 ? $DOM->getElementsByTagName( 'maxNumberOfPayments' )->item( 0 )->nodeValue : '';
		$MaxNumberOfPaymentsPerPeriod = $DOM->getElementsByTagName( 'maxNumberOfPaymentsPerPeriod' )->length > 0 ? $DOM->getElementsByTagName( 'maxNumberOfPaymentsPerPeriod' )->item( 0 )->nodeValue : '';
		$MaxTotalAmountOfAllPayments  = $DOM->getElementsByTagName( 'maxTotalAmountOfAllPayments' )->length > 0 ? $DOM->getElementsByTagName( 'maxTotalAmountOfAllPayments' )->item( 0 )->nodeValue : '';
		$Memo                         = $DOM->getElementsByTagName( 'memo' )->length > 0 ? $DOM->getElementsByTagName( 'memo' )->item( 0 )->nodeValue : '';
		$PaymentPeriod                = $DOM->getElementsByTagName( 'paymentPeriod' )->length > 0 ? $DOM->getElementsByTagName( 'paymentPeriod' )->item( 0 )->nodeValue : '';
		$PinType                      = $DOM->getElementsByTagName( 'pinType' )->length > 0 ? $DOM->getElementsByTagName( 'pinType' )->item( 0 )->nodeValue : '';
		$ReturnUrl                    = $DOM->getElementsByTagName( 'returnUrl' )->length > 0 ? $DOM->getElementsByTagName( 'returnUrl' )->item( 0 )->nodeValue : '';
		$SenderEmail                  = $DOM->getElementsByTagName( 'senderEmail' )->length > 0 ? $DOM->getElementsByTagName( 'senderEmail' )->item( 0 )->nodeValue : '';
		$StartingDate                 = $DOM->getElementsByTagName( 'startingDate' )->length > 0 ? $DOM->getElementsByTagName( 'startingDate' )->item( 0 )->nodeValue : '';
		$Status                       = $DOM->getElementsByTagName( 'status' )->length > 0 ? $DOM->getElementsByTagName( 'status' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'                       => $Errors,
			'Ack'                          => $Ack,
			'Build'                        => $Build,
			'CorrelationID'                => $CorrelationID,
			'Timestamp'                    => $Timestamp,
			'Approved'                     => $Approved,
			'CancelURL'                    => $CancelURL,
			'CurPayments'                  => $CurPayments,
			'CurPaymentsAmount'            => $CurPaymentsAmount,
			'CurPeriodAttempts'            => $CurPeriodAttempts,
			'CurPeriodEndingDate'          => $CurPeriodEndingDate,
			'CurrencyCode'                 => $CurrencyCode,
			'DateOfMonth'                  => $DateOfMonth,
			'DayOfWeek'                    => $DayOfWeek,
			'EndingDate'                   => $EndingDate,
			'IPNNotificationURL'           => $IPNNotificationURL,
			'MaxAmountPerPayment'          => $MaxAmountPerPayment,
			'MaxNumberOfPayments'          => $MaxNumberOfPayments,
			'MaxNumberOfPaymentsPerPeriod' => $MaxNumberOfPaymentsPerPeriod,
			'MaxTotalAmountOfAllPayments'  => $MaxTotalAmountOfAllPayments,
			'Memo'                         => $Memo,
			'PaymentPeriod'                => $PaymentPeriod,
			'PinType'                      => $PinType,
			'ReturnUrl'                    => $ReturnUrl,
			'SenderEmail'                  => $SenderEmail,
			'StartingDate'                 => $StartingDate,
			'Status'                       => $Status,
			'XMLRequest'                   => $XMLRequest,
			'XMLResponse'                  => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit CancelPreapproval API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function CancelPreapproval( $DataArray ) {
		$CancelPreapprovalFields = isset( $DataArray['CancelPreapprovalFields'] ) ? $DataArray['CancelPreapprovalFields'] : array();
		$PreapprovalKey          = isset( $CancelPreapprovalFields['PreapprovalKey'] ) ? $CancelPreapprovalFields['PreapprovalKey'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<CancelPreapprovalRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $PreapprovalKey != '' ? '<preapprovalKey xmlns="">' . $PreapprovalKey . '</preapprovalKey>' : '';
		$XMLRequest .= '</CancelPreapprovalRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'CancelPreapproval' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit Refund API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function Refund( $DataArray ) {
		$RefundFields  = isset( $DataArray['RefundFields'] ) ? $DataArray['RefundFields'] : array();
		$CurrencyCode  = isset( $RefundFields['CurrencyCode'] ) ? $RefundFields['CurrencyCode'] : '';
		$PayKey        = isset( $RefundFields['PayKey'] ) ? $RefundFields['PayKey'] : '';
		$TransactionID = isset( $RefundFields['TransactionID'] ) ? $RefundFields['TransactionID'] : '';
		$TrackingID    = isset( $RefundFields['TrackingID'] ) ? $RefundFields['TrackingID'] : '';

		$Receivers   = isset( $DataArray['Receivers'] ) ? $DataArray['Receivers'] : array();
		$Amount      = isset( $Receivers['Amount'] ) ? $Receivers['Amount'] : '';
		$Email       = isset( $Receivers['Email'] ) ? $Receivers['Email'] : '';
		$InvoiceID   = isset( $Receivers['InvoiceID'] ) ? $Receivers['InvoiceID'] : '';
		$Primary     = isset( $Receivers['Primary'] ) ? $Receivers['Primary'] : '';
		$PaymentType = isset( $Receivers['PaymentType'] ) ? $Receivers['PaymentType'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<RefundRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
		$XMLRequest .= $PayKey != '' ? '<payKey xmlns="">' . $PayKey . '</payKey>' : '';

		if ( ! empty( $Receivers ) ) {
			$XMLRequest .= '<receiverList xmlns="">';
			foreach ( $Receivers as $Receiver ) {
				$XMLRequest .= '<receiver xmlns="">';
				$XMLRequest .= $Receiver['Amount'] != '' ? '<amount xmlns="">' . $Receiver['Amount'] . '</amount>' : '';
				$XMLRequest .= $Receiver['Email'] != '' ? '<email xmlns="">' . $Receiver['Email'] . '</email>' : '';
				$XMLRequest .= $Receiver['InvoiceID'] != '' ? '<invoiceId xmlns="">' . $Receiver['InvoiceID'] . '</invoiceId>' : '';
				$XMLRequest .= $Receiver['PaymentType'] != '' ? '<paymentType xmlns="">' . $Receiver['PaymentType'] . '</paymentType>' : '';
				$XMLRequest .= '</receiver>';
			}
			$XMLRequest .= '</receiverList>';
		}

		$XMLRequest .= $TransactionID != '' ? '<transactionId xmlns="">' . $TransactionID . '</transactionId>' : '';
		$XMLRequest .= $TrackingID != '' ? '<trackingId xmlns="">' . $TrackingID . '</trackingId>' : '';
		$XMLRequest .= '</RefundRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'Refund' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$EncryptedTransactionID  = $DOM->getElementsByTagName( 'encryptedRefundTransactionId' )->length > 0 ? $DOM->getElementsByTagName( 'encryptedRefundTransactionId' )->item( 0 )->nodeValue : '';
		$RefundFeeAmount         = $DOM->getElementsByTagName( 'refundFeeAmount' )->length > 0 ? $DOM->getElementsByTagName( 'refundFeeAmount' )->item( 0 )->nodeValue : '';
		$RefundGrossAmount       = $DOM->getElementsByTagName( 'refundGrossAmount' )->length > 0 ? $DOM->getElementsByTagName( 'refundGrossAmount' )->item( 0 )->nodeValue : '';
		$RefundHasBecomeFull     = $DOM->getElementsByTagName( 'refundHasBecomeFull' )->length > 0 ? $DOM->getElementsByTagName( 'refundHasBecomeFull' )->item( 0 )->nodeValue : '';
		$RefundNetAmount         = $DOM->getElementsByTagName( 'refundNetAmount' )->length > 0 ? $DOM->getElementsByTagName( 'refundNetAmount' )->item( 0 )->nodeValue : '';
		$RefundStatus            = $DOM->getElementsByTagName( 'refundStatus' )->length > 0 ? $DOM->getElementsByTagName( 'refundStatus' )->item( 0 )->nodeValue : '';
		$RefundTransactionStatus = $DOM->getElementsByTagName( 'refundTransactionStatus' )->length > 0 ? $DOM->getElementsByTagName( 'refundTransactionStatus' )->item( 0 )->nodeValue : '';
		$TotalOfAllRefunds       = $DOM->getElementsByTagName( 'totalOfAllRefunds' )->length > 0 ? $DOM->getElementsByTagName( 'totalOfAllRefunds' )->item( 0 )->nodeValue : '';

		$Amount      = $DOM->getElementsByTagName( 'amount' )->length > 0 ? $DOM->getElementsByTagName( 'amount' )->item( 0 )->nodeValue : '';
		$Email       = $DOM->getElementsByTagName( 'email' )->length > 0 ? $DOM->getElementsByTagName( 'email' )->item( 0 )->nodeValue : '';
		$InvoiceID   = $DOM->getElementsByTagName( 'invoiceId' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceId' )->item( 0 )->nodeValue : '';
		$PaymentType = $DOM->getElementsByTagName( 'paymentType' )->length > 0 ? $DOM->getElementsByTagName( 'paymentType' )->item( 0 )->nodeValue : '';
		$Primary     = $DOM->getElementsByTagName( 'primary' )->length > 0 ? $DOM->getElementsByTagName( 'primary' )->item( 0 )->nodeValue : '';
		$Receiver    = array(
			'Amount'      => $Amount,
			'Email'       => $Email,
			'InvoiceID'   => $InvoiceID,
			'PaymentType' => $PaymentType,
			'Primary'     => $Primary,
		);

		$ResponseDataArray = array(
			'Errors'                  => $Errors,
			'Ack'                     => $Ack,
			'Build'                   => $Build,
			'CorrelationID'           => $CorrelationID,
			'Timestamp'               => $Timestamp,
			'EncryptedTransactionID'  => $EncryptedTransactionID,
			'RefundFeeAmount'         => $RefundFeeAmount,
			'RefundGrossAmount'       => $RefundGrossAmount,
			'RefundHasBecomeFull'     => $RefundHasBecomeFull,
			'RefundNetAmount'         => $RefundNetAmount,
			'RefundStatus'            => $RefundStatus,
			'RefundTransactionStatus' => $RefundTransactionStatus,
			'TotalOfAllRefunds'       => $TotalOfAllRefunds,
			'Receiver'                => $Receiver,
			'RawRequest'              => $XMLRequest,
			'RawResponse'             => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit ConvertCurrency API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function ConvertCurrency( $DataArray ) {
		$BaseAmountList        = isset( $DataArray['BaseAmountList'] ) ? $DataArray['BaseAmountList'] : array();
		$ConvertToCurrencyList = isset( $DataArray['ConvertToCurrencyList'] ) ? $DataArray['ConvertToCurrencyList'] : array();

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<ConvertCurrencyRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= '<baseAmountList xmlns="">';
		foreach ( $BaseAmountList as $BaseAmount ) {
			$XMLRequest .= '<currency xmlns="">';
			$XMLRequest .= '<code xmlns="">' . $BaseAmount['Code'] . '</code>';
			$XMLRequest .= '<amount xmlns="">' . $BaseAmount['Amount'] . '</amount>';
			$XMLRequest .= '</currency>';
		}
		$XMLRequest .= '</baseAmountList>';
		$XMLRequest .= '<convertToCurrencyList xmlns="">';

		foreach ( $ConvertToCurrencyList as $CurrencyCode ) {
			$XMLRequest .= '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>';
		}

		$XMLRequest .= '</convertToCurrencyList>';
		$XMLRequest .= '</ConvertCurrencyRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'ConvertCurrency' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$CurrencyConversionListArray = array();
		$CurrencyConversionListDOM   = $DOM->getElementsByTagName( 'currencyConversionList' )->length > 0 ? $DOM->getElementsByTagName( 'currencyConversionList' ) : array();

		foreach ( $CurrencyConversionListDOM as $CurrencyConversionList ) {
			$BaseAmountDOM = $CurrencyConversionList->getElementsByTagName( 'baseAmount' )->length > 0 ? $CurrencyConversionList->getElementsByTagName( 'baseAmount' ) : array();
			foreach ( $BaseAmountDOM as $BaseAmount ) {
				$BaseAmountCurrencyCode = $BaseAmount->getElementsByTagName( 'code' )->length > 0 ? $BaseAmount->getElementsByTagName( 'code' )->item( 0 )->nodeValue : '';
				$BaseAmountValue        = $BaseAmount->getElementsByTagName( 'amount' )->length > 0 ? $BaseAmount->getElementsByTagName( 'amount' )->item( 0 )->nodeValue : '';
				$BaseAmountArray        = array(
					'Code'   => $BaseAmountCurrencyCode,
					'Amount' => $BaseAmountValue,
				);
			}

			$CurrencyListArray = array();
			$CurrencyListDOM   = $CurrencyConversionList->getElementsByTagName( 'currency' )->length > 0 ? $CurrencyConversionList->getElementsByTagName( 'currency' ) : array();
			foreach ( $CurrencyListDOM as $CurrencyList ) {
				$ListCurrencyCode    = $CurrencyList->getElementsByTagName( 'code' )->length > 0 ? $CurrencyList->getElementsByTagName( 'code' )->item( 0 )->nodeValue : '';
				$ListCurrencyAmount  = $CurrencyList->getElementsByTagName( 'amount' )->length > 0 ? $CurrencyList->getElementsByTagName( 'amount' )->item( 0 )->nodeValue : '';
				$ListCurrencyCurrent = array(
					'Code'   => $ListCurrencyCode,
					'Amount' => $ListCurrencyAmount,
				);
				array_push( $CurrencyListArray, $ListCurrencyCurrent );
			}

			$CurrencyConversionListCurrent = array(
				'BaseAmount'   => $BaseAmountArray,
				'CurrencyList' => $CurrencyListArray,
			);

			array_push( $CurrencyConversionListArray, $CurrencyConversionListCurrent );
		}

		$ResponseDataArray = array(
			'Errors'                 => $Errors,
			'Ack'                    => $Ack,
			'Build'                  => $Build,
			'CorrelationID'          => $CorrelationID,
			'Timestamp'              => $Timestamp,
			'CurrencyConversionList' => $CurrencyConversionListArray,
			'XMLRequest'             => $XMLRequest,
			'XMLResponse'            => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit CreateAccount API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function CreateAccount( $DataArray ) {
		$CreateAccountFields              = isset( $DataArray['CreateAccountFields'] ) ? $DataArray['CreateAccountFields'] : array();
		$AccountType                      = isset( $CreateAccountFields['AccountType'] ) ? $CreateAccountFields['AccountType'] : '';
		$CitizenshipCountryCode           = isset( $CreateAccountFields['CitizenshipCountryCode'] ) ? $CreateAccountFields['CitizenshipCountryCode'] : '';
		$ContactPhoneNumber               = isset( $CreateAccountFields['ContactPhoneNumber'] ) ? $CreateAccountFields['ContactPhoneNumber'] : '';
		$HomePhoneNumber                  = isset( $CreateAccountFields['HomePhoneNumber'] ) ? $CreateAccountFields['HomePhoneNumber'] : '';
		$MobilePhoneNumber                = isset( $CreateAccountFields['MobilePhoneNumber'] ) ? $CreateAccountFields['MobilePhoneNumber'] : '';
		$CurrencyCode                     = isset( $CreateAccountFields['CurrencyCode'] ) ? $CreateAccountFields['CurrencyCode'] : '';
		$DateOfBirth                      = isset( $CreateAccountFields['DateOfBirth'] ) ? $CreateAccountFields['DateOfBirth'] : '';
		$EmailAddress                     = isset( $CreateAccountFields['EmailAddress'] ) ? $CreateAccountFields['EmailAddress'] : '';
		$FunctionalArea                   = isset( $CreateAccountFields['FunctionalArea'] ) ? $CreateAccountFields['FunctionalArea'] : '';
		$Salutation                       = isset( $CreateAccountFields['Salutation'] ) ? $CreateAccountFields['Salutation'] : '';
		$FirstName                        = isset( $CreateAccountFields['FirstName'] ) ? $CreateAccountFields['FirstName'] : '';
		$MiddleName                       = isset( $CreateAccountFields['MiddleName'] ) ? $CreateAccountFields['MiddleName'] : '';
		$LastName                         = isset( $CreateAccountFields['LastName'] ) ? $CreateAccountFields['LastName'] : '';
		$Suffix                           = isset( $CreateAccountFields['Suffix'] ) ? $CreateAccountFields['Suffix'] : '';
		$NotificationURL                  = isset( $CreateAccountFields['NotificationURL'] ) ? $CreateAccountFields['NotificationURL'] : '';
		$Occupation                       = isset( $CreateAccountFields['Occupation'] ) ? $CreateAccountFields['Occupation'] : '';
		$PerformExtraVettingOnThisAccount = isset( $CreateAccountFields['PerformExtraVettingOnThisAccount'] ) ? $CreateAccountFields['PerformExtraVettingOnThisAccount'] : '';
		$PurposeOfAccount                 = isset( $CreateAccountFields['PurposeOfAccount'] ) ? $CreateAccountFields['PurposeOfAccount'] : '';
		$Profession                       = isset( $CreateAccountFields['Profession'] ) ? $CreateAccountFields['Profession'] : '';
		$PreferredLanguageCode            = isset( $CreateAccountFields['PreferredLanguageCode'] ) && $CreateAccountFields['PreferredLanguageCode'] != '' ? $CreateAccountFields['PreferredLanguageCode'] : 'en_US';
		$RegistrationType                 = isset( $CreateAccountFields['RegistrationType'] ) ? $CreateAccountFields['RegistrationType'] : 'Web';
		$SuppressWelcomeEmail             = isset( $CreateAccountFields['SuppressWelcomeEmail'] ) ? $CreateAccountFields['SuppressWelcomeEmail'] : '';
		$TaxID                            = isset( $CreateAccountFields['TaxID'] ) ? $CreateAccountFields['TaxID'] : '';

		$ReturnURL              = isset( $CreateAccountFields['ReturnURL'] ) ? $CreateAccountFields['ReturnURL'] : '';
		$ShowAddCreditCard      = isset( $CreateAccountFields['ShowAddCreditCard'] ) ? $CreateAccountFields['ShowAddCreditCard'] : '';
		$ShowMobileConfirm      = isset( $CreateAccountFields['ShowMobileConfirm'] ) ? $CreateAccountFields['ShowMobileConfirm'] : '';
		$ReturnURLDescription   = isset( $CreateAccountFields['ReturnURLDescription'] ) ? $CreateAccountFields['ReturnURLDescription'] : '';
		$UseMiniBrowser         = isset( $CreateAccountFields['UseMiniBrowser'] ) ? $CreateAccountFields['UseMiniBrowser'] : '';
		$ReminderEmailFrequency = isset( $CreateAccountFields['ReminderEmailFrequency'] ) ? $CreateAccountFields['ReminderEmailFrequency'] : '';
		$ConfirmEmail           = isset( $CreateAccountFields['ConfirmEmail'] ) ? $CreateAccountFields['ConfirmEmail'] : '';

		$Address     = isset( $DataArray['Address'] ) ? $DataArray['Address'] : array();
		$Line1       = isset( $Address['Line1'] ) ? $Address['Line1'] : '';
		$Line2       = isset( $Address['Line2'] ) ? $Address['Line2'] : '';
		$City        = isset( $Address['City'] ) ? $Address['City'] : '';
		$State       = isset( $Address['State'] ) ? $Address['State'] : '';
		$PostalCode  = isset( $Address['PostalCode'] ) ? $Address['PostalCode'] : '';
		$CountryCode = isset( $Address['CountryCode'] ) ? $Address['CountryCode'] : '';

		$BusinessInfo                   = isset( $DataArray['BusinessInfo'] ) ? $DataArray['BusinessInfo'] : array();
		$AveragePrice                   = isset( $BusinessInfo['AveragePrice'] ) ? $BusinessInfo['AveragePrice'] : '';
		$AverageMonthlyVolume           = isset( $BusinessInfo['AverageMonthlyVolume'] ) ? $BusinessInfo['AverageMonthlyVolume'] : '';
		$BusinessName                   = isset( $BusinessInfo['BusinessName'] ) ? $BusinessInfo['BusinessName'] : '';
		$BusinessType                   = isset( $BusinessInfo['BusinessType'] ) ? $BusinessInfo['BusinessType'] : '';
		$BusinessSubType                = isset( $BusinessInfo['BusinessSubType'] ) ? $BusinessInfo['BusinessSubType'] : '';
		$Category                       = isset( $BusinessInfo['Category'] ) ? $BusinessInfo['Category'] : '';
		$CommercialRegistrationLocation = isset( $BusinessInfo['CommercialRegistrationLocation'] ) ? $BusinessInfo['CommercialRegistrationLocation'] : '';
		$CompanyID                      = isset( $BusinessInfo['CompanyID'] ) ? $BusinessInfo['CompanyID'] : '';
		$CustomerServiceEmail           = isset( $BusinessInfo['CustomerServiceEmail'] ) ? $BusinessInfo['CustomerServiceEmail'] : '';
		$CustomerServicePhone           = isset( $BusinessInfo['CustomerServicePhone'] ) ? $BusinessInfo['CustomerServicePhone'] : '';
		$DateOfEstablishment            = isset( $BusinessInfo['DateOfEstablishment'] ) ? $BusinessInfo['DateOfEstablishment'] : '';
		$DisputeEmail                   = isset( $BusinessInfo['DisputeEmail'] ) ? $BusinessInfo['DisputeEmail'] : '';
		$DoingBusinessAs                = isset( $BusinessInfo['DoingBusinessAs'] ) ? $BusinessInfo['DoingBusinessAs'] : '';
		$EstablishmentCountryCode       = isset( $BusinessInfo['EstablishmentCountryCode'] ) ? $BusinessInfo['EstablishmentCountryCode'] : '';
		$EstablishmentState             = isset( $BusinessInfo['EstablishmentState'] ) ? $BusinessInfo['EstablishmentState'] : '';
		$IncorporationID                = isset( $BusinessInfo['IncorporationID'] ) ? $BusinessInfo['IncorporationID'] : '';
		$MerchantCategoryCode           = isset( $BusinessInfo['MerchantCategoryCode'] ) ? $BusinessInfo['MerchantCategoryCode'] : '';
		$PercentageRevenueFromOnline    = isset( $BusinessInfo['PercentageRevenueFromOnline'] ) ? $BusinessInfo['PercentageRevenueFromOnline'] : '';
		$SalesVenu                      = isset( $BusinessInfo['SalesVenu'] ) ? $BusinessInfo['SalesVenu'] : '';
		$SalesVenuDesc                  = isset( $BusinessInfo['SalesVenuDesc'] ) ? $BusinessInfo['SalesVenuDesc'] : '';
		$SubCategory                    = isset( $BusinessInfo['SubCategory'] ) ? $BusinessInfo['SubCategory'] : '';
		$VatCountryCode                 = isset( $BusinessInfo['VatCountryCode'] ) ? $BusinessInfo['VatCountryCode'] : '';
		$VatID                          = isset( $BusinessInfo['VatID'] ) ? $BusinessInfo['VatID'] : '';
		$WebSite                        = isset( $BusinessInfo['WebSite'] ) ? $BusinessInfo['WebSite'] : '';
		$WorkPhone                      = isset( $BusinessInfo['WorkPhone'] ) ? $BusinessInfo['WorkPhone'] : '';

		$GovernmentIDPair  = isset( $DataArray['GovernmentIDPair'] ) ? $DataArray['GovernmentIDPair'] : array();
		$GovernmentIDValue = isset( $GovernmentIDPair['Value'] ) ? $GovernmentIDPair['Value'] : '';
		$GovernmentIDType  = isset( $GovernmentIDPair['Type'] ) ? $GovernmentIDPair['Type'] : '';

		$LegalAgreement         = isset( $DataArray['LegalAgreement'] ) ? $DataArray['LegalAgreement'] : array();
		$LegalAgreementAccepted = isset( $LegalAgreement['Accepted'] ) ? $LegalAgreement['Accepted'] : '';
		$LegalAgreementType     = isset( $LegalAgreement['Type'] ) ? $LegalAgreement['Type'] : '';

		$BusinessAddress            = isset( $DataArray['BusinessAddress'] ) ? $DataArray['BusinessAddress'] : array();
		$BusinessAddressLine1       = isset( $BusinessAddress['Line1'] ) ? $BusinessAddress['Line1'] : '';
		$BusinessAddressLine2       = isset( $BusinessAddress['Line2'] ) ? $BusinessAddress['Line2'] : '';
		$BusinessAddressCity        = isset( $BusinessAddress['City'] ) ? $BusinessAddress['City'] : '';
		$BusinessAddressState       = isset( $BusinessAddress['State'] ) ? $BusinessAddress['State'] : '';
		$BusinessAddressPostalCode  = isset( $BusinessAddress['PostalCode'] ) ? $BusinessAddress['PostalCode'] : '';
		$BusinessAddressCountryCode = isset( $BusinessAddress['CountryCode'] ) ? $BusinessAddress['CountryCode'] : '';

		$PrinciplePlaceOfBusinessAddress            = isset( $DataArray['PrinciplePlaceOfBusinessAddress'] ) ? $DataArray['PrinciplePlaceOfBusinessAddress'] : array();
		$PrinciplePlaceOfBusinessAddressLine1       = isset( $PrinciplePlaceOfBusinessAddress['Line1'] ) ? $PrinciplePlaceOfBusinessAddress['Line1'] : '';
		$PrinciplePlaceOfBusinessAddressLine2       = isset( $PrinciplePlaceOfBusinessAddress['Line2'] ) ? $PrinciplePlaceOfBusinessAddress['Line2'] : '';
		$PrinciplePlaceOfBusinessAddressCity        = isset( $PrinciplePlaceOfBusinessAddress['City'] ) ? $PrinciplePlaceOfBusinessAddress['City'] : '';
		$PrinciplePlaceOfBusinessAddressState       = isset( $PrinciplePlaceOfBusinessAddress['State'] ) ? $PrinciplePlaceOfBusinessAddress['State'] : '';
		$PrinciplePlaceOfBusinessAddressPostalCode  = isset( $PrinciplePlaceOfBusinessAddress['PostalCode'] ) ? $PrinciplePlaceOfBusinessAddress['PostalCode'] : '';
		$PrinciplePlaceOfBusinessAddressCountryCode = isset( $PrinciplePlaceOfBusinessAddress['CountryCode'] ) ? $PrinciplePlaceOfBusinessAddress['CountryCode'] : '';

		$RegisteredOfficeAddress            = isset( $DataArray['RegisteredOfficeAddress'] ) ? $DataArray['RegisteredOfficeAddress'] : array();
		$RegisteredOfficeAddressLine1       = isset( $RegisteredOfficeAddress['Line1'] ) ? $RegisteredOfficeAddress['Line1'] : '';
		$RegisteredOfficeAddressLine2       = isset( $RegisteredOfficeAddress['Line2'] ) ? $RegisteredOfficeAddress['Line2'] : '';
		$RegisteredOfficeAddressCity        = isset( $RegisteredOfficeAddress['City'] ) ? $RegisteredOfficeAddress['City'] : '';
		$RegisteredOfficeAddressState       = isset( $RegisteredOfficeAddress['State'] ) ? $RegisteredOfficeAddress['State'] : '';
		$RegisteredOfficeAddressPostalCode  = isset( $RegisteredOfficeAddress['PostalCode'] ) ? $RegisteredOfficeAddress['PostalCode'] : '';
		$RegisteredOfficeAddressCountryCode = isset( $RegisteredOfficeAddress['CountryCode'] ) ? $RegisteredOfficeAddress['CountryCode'] : '';

		$BusinessStakeHolder              = isset( $DataArray['BusinessStakeHolder'] ) ? $DataArray['BusinessStakeHolder'] : array();
		$BusinessStakeHolderDateOfBirth   = isset( $BusinessStakeHolder['DateOfBirth'] ) ? $BusinessStakeHolder['DateOfBirth'] : '';
		$BusinessStakeHolderFullLegalName = isset( $BusinessStakeHolder['FullLegalName'] ) ? $BusinessStakeHolder['FullLegalName'] : '';
		$BusinessStakeHolderSalutation    = isset( $BusinessStakeHolder['Salutation'] ) ? $BusinessStakeHolder['Salutation'] : '';
		$BusinessStakeHolderFirstName     = isset( $BusinessStakeHolder['FirstName'] ) ? $BusinessStakeHolder['FirstName'] : '';
		$BusinessStakeHolderMiddleName    = isset( $BusinessStakeHolder['MiddleName'] ) ? $BusinessStakeHolder['MiddleName'] : '';
		$BusinessStakeHolderLastName      = isset( $BusinessStakeHolder['LastName'] ) ? $BusinessStakeHolder['LastName'] : '';
		$BusinessStakeHolderSuffix        = isset( $BusinessStakeHolder['Suffix'] ) ? $BusinessStakeHolder['Suffix'] : '';
		$BusinessStakeHolderRole          = isset( $BusinessStakeHolder['Role'] ) ? $BusinessStakeHolder['Role'] : '';
		$BusinessStakeHolderCountryCode   = isset( $BusinessStakeHolder['CountryCode'] ) ? $BusinessStakeHolder['CountryCode'] : '';

		$BusinessStakeHolderAddress            = isset( $DataArray['BusinessStakeHolderAddress'] ) ? $DataArray['BusinessStakeHolderAddress'] : array();
		$BusinessStakeHolderAddressLine1       = isset( $BusinessStakeHolderAddress['Line1'] ) ? $BusinessStakeHolderAddress['Line1'] : '';
		$BusinessStakeHolderAddressLine2       = isset( $BusinessStakeHolderAddress['Line2'] ) ? $BusinessStakeHolderAddress['Line2'] : '';
		$BusinessStakeHolderAddressCity        = isset( $BusinessStakeHolderAddress['City'] ) ? $BusinessStakeHolderAddress['City'] : '';
		$BusinessStakeHolderAddressState       = isset( $BusinessStakeHolderAddress['State'] ) ? $BusinessStakeHolderAddress['State'] : '';
		$BusinessStakeHolderAddressPostalCode  = isset( $BusinessStakeHolderAddress['PostalCode'] ) ? $BusinessStakeHolderAddress['PostalCode'] : '';
		$BusinessStakeHolderAddressCountryCode = isset( $BusinessStakeHolderAddress['CountryCode'] ) ? $BusinessStakeHolderAddress['CountryCode'] : '';

		$PartnerFields = isset( $DataArray['PartnerFields'] ) ? $DataArray['PartnerFields'] : array();
		$PartnerField1 = isset( $PartnerFields['Field1'] ) ? $PartnerFields['Field1'] : '';
		$PartnerField2 = isset( $PartnerFields['Field2'] ) ? $PartnerFields['Field2'] : '';
		$PartnerField3 = isset( $PartnerFields['Field3'] ) ? $PartnerFields['Field3'] : '';
		$PartnerField4 = isset( $PartnerFields['Field4'] ) ? $PartnerFields['Field4'] : '';
		$PartnerField5 = isset( $PartnerFields['Field5'] ) ? $PartnerFields['Field5'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<CreateAccountRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $AccountType != '' ? '<accountType xmlns="">' . $AccountType . '</accountType>' : '';
		$XMLRequest .= $EmailAddress != '' ? '<emailAddress xmlns="">' . $EmailAddress . '</emailAddress>' : '';
		$XMLRequest .= $FunctionalArea != '' ? '<functionalArea xmlns="">' . $FunctionalArea . '</functionalArea>' : '';

		if ( $Salutation != '' || $FirstName != '' || $MiddleName != '' || $LastName != '' || $Suffix != '' ) {
			$XMLRequest .= '<name xmlns="">';
			$XMLRequest .= $Salutation != '' ? '<salutation xmlns="">' . $Salutation . '</salutation>' : '';
			$XMLRequest .= $FirstName != '' ? '<firstName xmlns="">' . $FirstName . '</firstName>' : '';
			$XMLRequest .= $MiddleName != '' ? '<middleName xmlns="">' . $MiddleName . '</middleName>' : '';
			$XMLRequest .= $LastName != '' ? '<lastName xmlns="">' . $LastName . '</lastName>' : '';
			$XMLRequest .= $Suffix != '' ? '<suffix xmlns="">' . $Suffix . '</suffix>' : '';
			$XMLRequest .= '</name>';
		}

		$XMLRequest .= $DateOfBirth != '' ? '<dateOfBirth xmlns="">' . $DateOfBirth . '</dateOfBirth>' : '';

		if ( ! empty( $Address ) ) {
			$XMLRequest .= '<address xmlns="">';
			$XMLRequest .= $Line1 != '' ? '<line1 xmlns="">' . $Line1 . '</line1>' : '';
			$XMLRequest .= $Line2 != '' ? '<line2 xmlns="">' . $Line2 . '</line2>' : '';
			$XMLRequest .= $City != '' ? '<city xmlns="">' . $City . '</city>' : '';
			$XMLRequest .= $State != '' ? '<state xmlns="">' . $State . '</state>' : '';
			$XMLRequest .= $PostalCode != '' ? '<postalCode xmlns="">' . $PostalCode . '</postalCode>' : '';
			$XMLRequest .= $CountryCode != '' ? '<countryCode xmlns="">' . $CountryCode . '</countryCode>' : '';
			$XMLRequest .= '</address>';
		}

		$XMLRequest .= $ContactPhoneNumber != '' ? '<contactPhoneNumber xmlns="">' . $ContactPhoneNumber . '</contactPhoneNumber>' : '';
		$XMLRequest .= $HomePhoneNumber != '' ? '<homePhoneNumber xmlns="">' . $HomePhoneNumber . '</homePhoneNumber>' : '';
		$XMLRequest .= $MobilePhoneNumber != '' ? '<mobilePhoneNumber xmlns="">' . $MobilePhoneNumber . '</mobilePhoneNumber>' : '';
		$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
		$XMLRequest .= $CitizenshipCountryCode != '' ? '<citizenshipCountryCode xmlns="">' . $CitizenshipCountryCode . '</citizenshipCountryCode>' : '';
		$XMLRequest .= $PreferredLanguageCode != '' ? '<preferredLanguageCode xmlns="">' . $PreferredLanguageCode . '</preferredLanguageCode>' : '';
		$XMLRequest .= $NotificationURL != '' ? '<notificationURL xmlns="">' . $NotificationURL . '</notificationURL>' : '';
		$XMLRequest .= $Occupation != '' ? '<occupation xmlns="">' . $Occupation . '</occupation>' : '';
		$XMLRequest .= $PartnerField1 != '' ? '<partnerField1 xmlns="">' . $PartnerField1 . '</partnerField1>' : '';
		$XMLRequest .= $PartnerField2 != '' ? '<partnerField2 xmlns="">' . $PartnerField2 . '</partnerField2>' : '';
		$XMLRequest .= $PartnerField3 != '' ? '<partnerField3 xmlns="">' . $PartnerField3 . '</partnerField3>' : '';
		$XMLRequest .= $PartnerField4 != '' ? '<partnerField4 xmlns="">' . $PartnerField4 . '</partnerField4>' : '';
		$XMLRequest .= $PartnerField5 != '' ? '<partnerField5 xmlns="">' . $PartnerField5 . '</partnerField5>' : '';
		$XMLRequest .= $RegistrationType != '' ? '<registrationType xmlns="">' . $RegistrationType . '</registrationType>' : '';
		$XMLRequest .= $SuppressWelcomeEmail != '' ? '<suppressWelcomeEmail xmlns="">' . $SuppressWelcomeEmail . '</suppressWelcomeEmail>' : '';
		$XMLRequest .= $PerformExtraVettingOnThisAccount != '' ? '<performExtraVettingOnthisAccount xmlns="">' . $PerformExtraVettingOnThisAccount . '</performExtraVettingOnthisAccount>' : '';
		$XMLRequest .= $PurposeOfAccount != '' ? '<purposeOfAccount xmlns="">' . $PurposeOfAccount . '</purposeOfAccount>' : '';
		$XMLRequest .= $Profession != '' ? '<profession xmlns="">' . $Profession . '</profession>' : '';
		$XMLRequest .= $TaxID != '' ? '<taxId xmlns="">' . $TaxID . '</taxId>' : '';

		if ( $ReturnURL != '' || $ReturnURLDescription != '' || $ShowAddCreditCard != '' || $ShowMobileConfirm != '' || $UseMiniBrowser != '' || $ReminderEmailFrequency != '' ) {
			$XMLRequest .= '<createAccountWebOptions xmlns="">';
			$XMLRequest .= $ReturnURL != '' ? '<returnUrl xmlns="">' . $ReturnURL . '</returnUrl>' : '';
			$XMLRequest .= $ReturnURLDescription != '' ? '<returnUrlDescription xmlns="">' . $ReturnURLDescription . '</returnUrlDescription>' : '';
			$XMLRequest .= $ShowAddCreditCard != '' ? '<showAddCreditCard xmlns="">' . $ShowAddCreditCard . '</showAddCreditCard>' : '';
			$XMLRequest .= $ShowMobileConfirm != '' ? '<showMobileConfirm xmlns="">' . $ShowMobileConfirm . '</showMobileConfirm>' : '';
			$XMLRequest .= $UseMiniBrowser != '' ? '<useMiniBrowser xmlns="">' . $UseMiniBrowser . '</useMiniBrowser>' : '';
			$XMLRequest .= $ReminderEmailFrequency != '' ? '<reminderEmailFrequency xmlns="">' . $ReminderEmailFrequency . '</reminderEmailFrequency>' : '';
			$XMLRequest .= $ConfirmEmail != '' ? '<confirmEmail xmlns="">' . $ConfirmEmail . '</confirmEmail>' : '';
			$XMLRequest .= '</createAccountWebOptions>';
		}

		if ( ! empty( $GovernmentIDPair ) ) {
			$XMLRequest .= '<governmentId xmlns="">';
			$XMLRequest .= $GovernmentIDValue != '' ? '<value xmlns="">' . $GovernmentIDValue . '</value>' : '';
			$XMLRequest .= $GovernmentIDType != '' ? '<type xmlns="">' . $GovernmentIDType . '</type>' : '';
			$XMLRequest .= '</governmentId>';
		}

		if ( ! empty( $LegalAgreement ) ) {
			$XMLRequest .= '<legalAgreement xmlns="">';
			$XMLRequest .= $LegalAgreementAccepted != '' ? '<accepted xmlns="">' . $LegalAgreementAccepted . '</accepted>' : '';
			$XMLRequest .= $LegalAgreementType != '' ? '<type xmlns="">' . $LegalAgreementType . '</type>' : '';
			$XMLRequest .= '</legalAgreement>';
		}

		if ( ! empty( $BusinessInfo ) ) {
			$XMLRequest .= '<businessInfo xmlns="">';
			$XMLRequest .= $BusinessName != '' ? '<businessName xmlns="">' . $BusinessName . '</businessName>' : '';

			if ( ! empty( $BusinessAddress ) ) {
				$XMLRequest .= '<businessAddress xmlns="">';
				$XMLRequest .= $BusinessAddressLine1 != '' ? '<line1 xmlns="">' . $BusinessAddressLine1 . '</line1>' : '';
				$XMLRequest .= $BusinessAddressLine2 != '' ? '<line2 xmlns="">' . $BusinessAddressLine2 . '</line2>' : '';
				$XMLRequest .= $BusinessAddressCity != '' ? '<city xmlns="">' . $BusinessAddressCity . '</city>' : '';
				$XMLRequest .= $BusinessAddressState != '' ? '<state xmlns="">' . $BusinessAddressState . '</state>' : '';
				$XMLRequest .= $BusinessAddressPostalCode != '' ? '<postalCode xmlns="">' . $BusinessAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $BusinessAddressCountryCode != '' ? '<countryCode xmlns="">' . $BusinessAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= '</businessAddress>';
			}

			$XMLRequest .= $WorkPhone != '' ? '<workPhone xmlns="">' . $WorkPhone . '</workPhone>' : '';
			$XMLRequest .= $Category != '' ? '<category xmlns="">' . $Category . '</category>' : '';
			$XMLRequest .= $SubCategory != '' ? '<subCategory xmlns="">' . $SubCategory . '</subCategory>' : '';
			$XMLRequest .= $MerchantCategoryCode != '' ? '<merchantCategoryCode xmlns="">' . $MerchantCategoryCode . '</merchantCategoryCode>' : '';
			$XMLRequest .= $DoingBusinessAs != '' ? '<doingBusinessAs xmlns="">' . $DoingBusinessAs . '</doingBusinessAs>' : '';
			$XMLRequest .= $CustomerServicePhone != '' ? '<customerServicePhone xmlns="">' . $CustomerServicePhone . '</customerServicePhone>' : '';
			$XMLRequest .= $CustomerServiceEmail != '' ? '<customerServiceEmail xmlns="">' . $CustomerServiceEmail . '</customerServiceEmail>' : '';
			$XMLRequest .= $DisputeEmail != '' ? '<disputeEmail xmlns="">' . $DisputeEmail . '</disputeEmail>' : '';
			$XMLRequest .= $WebSite != '' ? '<webSite xmlns="">' . $WebSite . '</webSite>' : '';
			$XMLRequest .= $CompanyID != '' ? '<companyId xmlns="">' . $CompanyID . '</companyId>' : '';
			$XMLRequest .= $DateOfEstablishment != '' ? '<dateOfEstablishment xmlns="">' . $DateOfEstablishment . '</dateOfEstablishment>' : '';
			$XMLRequest .= $BusinessType != '' ? '<businessType xmlns="">' . $BusinessType . '</businessType>' : '';
			$XMLRequest .= $BusinessSubType != '' ? '<businessSubType xmlns="">' . $BusinessSubType . '</businessSubType>' : '';
			$XMLRequest .= $IncorporationID != '' ? '<incorporationId xmlns="">' . $IncorporationID . '</incorporationId>' : '';
			$XMLRequest .= $AveragePrice != '' ? '<averagePrice xmlns="">' . $AveragePrice . '</averagePrice>' : '';
			$XMLRequest .= $AverageMonthlyVolume != '' ? '<averageMonthlyVolume xmlns="">' . $AverageMonthlyVolume . '</averageMonthlyVolume>' : '';
			$XMLRequest .= $PercentageRevenueFromOnline != '' ? '<percentageRevenueFromOnline xmlns="">' . $PercentageRevenueFromOnline . '</percentageRevenueFromOnline>' : '';
			$XMLRequest .= $SalesVenu != '' ? '<salesVenue xmlns="">' . $SalesVenu . '</salesVenue>' : '';
			$XMLRequest .= $SalesVenuDesc != '' ? '<salesVenueDesc xmlns="">' . $SalesVenuDesc . '</salesVenueDesc>' : '';
			$XMLRequest .= $VatID != '' ? '<vatId xmlns="">' . $VatID . '</vatId>' : '';
			$XMLRequest .= $VatCountryCode != '' ? '<vatCountryCode xmlns="">' . $VatCountryCode . '</vatCountryCode>' : '';
			$XMLRequest .= $CommercialRegistrationLocation != '' ? '<commercialRegistrationLocation xmlns="">' . $CommercialRegistrationLocation . '</commercialRegistrationLocation>' : '';

			if ( ! empty( $PrinciplePlaceOfBusinessAddress ) ) {
				$XMLRequest .= '<principlePlaceOfBusinessAddress xmlns="">';
				$XMLRequest .= $PrinciplePlaceOfBusinessAddressLine1 != '' ? '<line1 xmlns="">' . $PrinciplePlaceOfBusinessAddressLine1 . '</line1>' : '';
				$XMLRequest .= $PrinciplePlaceOfBusinessAddressLine2 != '' ? '<line2 xmlns="">' . $PrinciplePlaceOfBusinessAddressLine2 . '</line2>' : '';
				$XMLRequest .= $PrinciplePlaceOfBusinessAddressCity != '' ? '<city xmlns="">' . $PrinciplePlaceOfBusinessAddressCity . '</city>' : '';
				$XMLRequest .= $PrinciplePlaceOfBusinessAddressState != '' ? '<state xmlns="">' . $PrinciplePlaceOfBusinessAddressState . '</state>' : '';
				$XMLRequest .= $PrinciplePlaceOfBusinessAddressPostalCode != '' ? '<postalCode xmlns="">' . $PrinciplePlaceOfBusinessAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $PrinciplePlaceOfBusinessAddressCountryCode != '' ? '<countryCode xmlns="">' . $PrinciplePlaceOfBusinessAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= '</principlePlaceOfBusinessAddress>';
			}

			if ( ! empty( $RegisteredOfficeAddress ) ) {
				$XMLRequest .= '<registeredOfficeAddress xmlns="">';
				$XMLRequest .= $RegisteredOfficeAddressLine1 != '' ? '<line1 xmlns="">' . $RegisteredOfficeAddressLine1 . '</line1>' : '';
				$XMLRequest .= $RegisteredOfficeAddressLine2 != '' ? '<line2 xmlns="">' . $RegisteredOfficeAddressLine2 . '</line2>' : '';
				$XMLRequest .= $RegisteredOfficeAddressCity != '' ? '<city xmlns="">' . $RegisteredOfficeAddressCity . '</city>' : '';
				$XMLRequest .= $RegisteredOfficeAddressState != '' ? '<state xmlns="">' . $RegisteredOfficeAddressState . '</state>' : '';
				$XMLRequest .= $RegisteredOfficeAddressPostalCode != '' ? '<postalCode xmlns="">' . $RegisteredOfficeAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $RegisteredOfficeAddressCountryCode != '' ? '<countryCode xmlns="">' . $RegisteredOfficeAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= '</registeredOfficeAddress>';
			}

			$XMLRequest .= $EstablishmentCountryCode != '' ? '<establishmentCountryCode xmlns="">' . $EstablishmentCountryCode . '</establishmentCountryCode>' : '';
			$XMLRequest .= $EstablishmentState != '' ? '<establishmentState xmlns="">' . $EstablishmentState . '</establishmentState>' : '';

			if ( ! empty( $BusinessStakeHolder ) ) {
				$XMLRequest .= '<businessStakeHolder xmlns="">';
				$XMLRequest .= $BusinessStakeHolderRole != '' ? '<role xmlns="">' . $BusinessStakeHolderRole . '</role>' : '';

				if ( $BusinessStakeHolderSalutation != '' || $BusinessStakeHolderFirstName != '' || $BusinessStakeHolderMiddleName != '' || $BusinessStakeHolderLastName != '' || $BusinessStakeHolderSuffix != '' ) {
					$XMLRequest .= '<name xmlns="">';
					$XMLRequest .= $BusinessStakeHolderSalutation != '' ? '<salutation xmlns="">' . $BusinessStakeHolderSalutation . '</salutation>' : '';
					$XMLRequest .= $BusinessStakeHolderFirstName != '' ? '<firstName xmlns="">' . $BusinessStakeHolderFirstName . '</firstName>' : '';
					$XMLRequest .= $BusinessStakeHolderMiddleName != '' ? '<middleName xmlns="">' . $BusinessStakeHolderMiddleName . '</middleName>' : '';
					$XMLRequest .= $BusinessStakeHolderLastName != '' ? '<lastName xmlns="">' . $BusinessStakeHolderLastName . '</lastName>' : '';
					$XMLRequest .= $BusinessStakeHolderSuffix != '' ? '<suffix xmlns="">' . $BusinessStakeHolderSuffix . '</suffix>' : '';
					$XMLRequest .= '</name>';
				}

				$XMLRequest .= $BusinessStakeHolderFullLegalName != '' ? '<fullLegalName xmlns="">' . $BusinessStakeHolderFullLegalName . '</fullLegalName>' : '';

				if ( ! empty( $BusinessStakeHolderAddress ) ) {
					$XMLRequest .= '<address xmlns="">';
					$XMLRequest .= $BusinessStakeHolderAddressLine1 != '' ? '<line1 xmlns="">' . $BusinessStakeHolderAddressLine1 . '</line1>' : '';
					$XMLRequest .= $BusinessStakeHolderAddressLine2 != '' ? '<line2 xmlns="">' . $BusinessStakeHolderAddressLine2 . '</line2>' : '';
					$XMLRequest .= $BusinessStakeHolderAddressCity != '' ? '<city xmlns="">' . $BusinessStakeHolderAddressCity . '</city>' : '';
					$XMLRequest .= $BusinessStakeHolderAddressState != '' ? '<state xmlns="">' . $BusinessStakeHolderAddressState . '</state>' : '';
					$XMLRequest .= $BusinessStakeHolderAddressPostalCode != '' ? '<postalCode xmlns="">' . $BusinessStakeHolderAddressPostalCode . '</postalCode>' : '';
					$XMLRequest .= $BusinessStakeHolderAddressCountryCode != '' ? '<countryCode xmlns="">' . $BusinessStakeHolderAddressCountryCode . '</countryCode>' : '';
					$XMLRequest .= '</address>';
				}

				$XMLRequest .= $BusinessStakeHolderDateOfBirth != '' ? '<dateOfBirth xmlns="">' . $BusinessStakeHolderDateOfBirth . '</dateOfBirth>' : '';
				$XMLRequest .= '</businessStakeHolder>';
			}

			$XMLRequest .= '</businessInfo>';
		}

		$XMLRequest .= '</CreateAccountRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptiveAccounts', 'CreateAccount' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$AccountID        = $DOM->getElementsByTagName( 'accountId' )->length > 0 ? $DOM->getElementsByTagName( 'accountId' )->item( 0 )->nodeValue : '';
		$CreateAccountKey = $DOM->getElementsByTagName( 'createAccountKey' )->length > 0 ? $DOM->getElementsByTagName( 'createAccountKey' )->item( 0 )->nodeValue : '';
		$ExecStatus       = $DOM->getElementsByTagName( 'execStatus' )->length > 0 ? $DOM->getElementsByTagName( 'execStatus' )->item( 0 )->nodeValue : '';
		$RedirectURL      = $DOM->getElementsByTagName( 'redirectURL' )->length > 0 ? $DOM->getElementsByTagName( 'redirectURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'           => $Errors,
			'Ack'              => $Ack,
			'Build'            => $Build,
			'CorrelationID'    => $CorrelationID,
			'Timestamp'        => $Timestamp,
			'AccountID'        => $AccountID,
			'CreateAccountKey' => $CreateAccountKey,
			'ExecStatus'       => $ExecStatus,
			'RedirectURL'      => $RedirectURL,
			'XMLRequest'       => $XMLRequest,
			'XMLResponse'      => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit AddBankAccount API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function AddBankAccount( $DataArray ) {
		$AddBankAccountFields     = isset( $DataArray['AddBankAccountFields'] ) ? $DataArray['AddBankAccountFields'] : array();
		$EmailAddress             = isset( $AddBankAccountFields['EmailAddress'] ) ? $AddBankAccountFields['EmailAddress'] : '';
		$AccountID                = isset( $AddBankAccountFields['AccountID'] ) ? $AddBankAccountFields['AccountID'] : '';
		$CreateAccountKey         = isset( $AddBankAccountFields['CreateAccountKey'] ) ? $AddBankAccountFields['CreateAccountKey'] : '';
		$BankCountryCode          = isset( $AddBankAccountFields['BankCountryCode'] ) ? $AddBankAccountFields['BankCountryCode'] : '';
		$BankName                 = isset( $AddBankAccountFields['BankName'] ) ? $AddBankAccountFields['BankName'] : '';
		$RoutingNumber            = isset( $AddBankAccountFields['RoutingNumber'] ) ? $AddBankAccountFields['RoutingNumber'] : '';
		$BankAccountType          = isset( $AddBankAccountFields['BankAccountType'] ) ? $AddBankAccountFields['BankAccountType'] : '';
		$BankAccountNumber        = isset( $AddBankAccountFields['BankAccountNumber'] ) ? $AddBankAccountFields['BankAccountNumber'] : '';
		$IBAN                     = isset( $AddBankAccountFields['IBAN'] ) ? $AddBankAccountFields['IBAN'] : '';
		$CLABE                    = isset( $AddBankAccountFields['CLABE'] ) ? $AddBankAccountFields['CLABE'] : '';
		$BSBNumber                = isset( $AddBankAccountFields['BSBNumber'] ) ? $AddBankAccountFields['BSBNumber'] : '';
		$BranchLocation           = isset( $AddBankAccountFields['BranchLocation'] ) ? $AddBankAccountFields['BranchLocation'] : '';
		$SortCode                 = isset( $AddBankAccountFields['SortCode'] ) ? $AddBankAccountFields['SortCode'] : '';
		$BankTransitNumber        = isset( $AddBankAccountFields['BankTransitNumber'] ) ? $AddBankAccountFields['BankTransitNumber'] : '';
		$InstitutionNumber        = isset( $AddBankAccountFields['InstitutionNumber'] ) ? $AddBankAccountFields['InstitutionNumber'] : '';
		$BranchCode               = isset( $AddBankAccountFields['BranchCode'] ) ? $AddBankAccountFields['BranchCode'] : '';
		$AgencyNumber             = isset( $AddBankAccountFields['AgencyNumber'] ) ? $AddBankAccountFields['AgencyNumber'] : '';
		$BankCode                 = isset( $AddBankAccountFields['BankCode'] ) ? $AddBankAccountFields['BankCode'] : '';
		$RibKey                   = isset( $AddBankAccountFields['RibKey'] ) ? $AddBankAccountFields['RibKey'] : '';
		$ControlDigit             = isset( $AddBankAccountFields['ControlDigit'] ) ? $AddBankAccountFields['ControlDigit'] : '';
		$TaxIDType                = isset( $AddBankAccountFields['TaxIDType'] ) ? $AddBankAccountFields['TaxIDType'] : '';
		$TaxIDNumber              = isset( $AddBankAccountFields['TaxIDNumber'] ) ? $AddBankAccountFields['TaxIDNumber'] : '';
		$AccountHolderDateOfBirth = isset( $AddBankAccountFields['AccountHolderDateOfBirth'] ) ? $AddBankAccountFields['AccountHolderDateOfBirth'] : '';
		$ConfirmationType         = isset( $AddBankAccountFields['ConfirmationType'] ) ? $AddBankAccountFields['ConfirmationType'] : '';

		$WebOptions           = isset( $DataArray['WebOptions'] ) ? $DataArray['WebOptions'] : array();
		$ReturnURL            = isset( $WebOptions['ReturnURL'] ) ? $WebOptions['ReturnURL'] : '';
		$CancelURL            = isset( $WebOptions['CancelURL'] ) ? $WebOptions['CancelURL'] : '';
		$ReturnURLDescription = isset( $WebOptions['ReturnURLDescription'] ) ? $WebOptions['ReturnURLDescription'] : '';
		$CancelURLDescription = isset( $WebOptions['CancelURLDescription'] ) ? $WebOptions['CancelURLDescription'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<AddBankAccountRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $EmailAddress != '' ? '<emailAddress xmlns="">' . $EmailAddress . '</emailAddress>' : '';
		$XMLRequest .= $AccountID != '' ? '<accountId xmlns="">' . $AccountID . '</accountId>' : '';
		$XMLRequest .= $CreateAccountKey != '' ? '<createAccountKey xmlns="">' . $CreateAccountKey . '</createAccountKey>' : '';
		$XMLRequest .= $BankCountryCode != '' ? '<bankCountryCode xmlns="">' . $BankCountryCode . '</bankCountryCode>' : '';
		$XMLRequest .= $BankName != '' ? '<bankName xmlns="">' . $BankName . '</bankName>' : '';
		$XMLRequest .= $RoutingNumber != '' ? '<routingNumber xmlns="">' . $RoutingNumber . '</routingNumber>' : '';
		$XMLRequest .= $BankAccountType != '' ? '<bankAccountType xmlns="">' . $BankAccountType . '</bankAccountType>' : '';
		$XMLRequest .= $BankAccountNumber != '' ? '<bankAccountNumber xmlns="">' . $BankAccountNumber . '</bankAccountNumber>' : '';
		$XMLRequest .= $IBAN != '' ? '<iban xmlns="">' . $IBAN . '</iban>' : '';
		$XMLRequest .= $CLABE != '' ? '<clabe xmlns="">' . $CLABE . '</clabe>' : '';
		$XMLRequest .= $BSBNumber != '' ? '<bsbNumber xmlns="">' . $BSBNumber . '</bsbNumber>' : '';
		$XMLRequest .= $BranchLocation != '' ? '<branchLocation xmlns="">' . $BranchLocation . '</branchLocation>' : '';
		$XMLRequest .= $SortCode != '' ? '<sortCode xmlns="">' . $SortCode . '</sortCode>' : '';
		$XMLRequest .= $BankTransitNumber != '' ? '<bankTransitNumber xmlns="">' . $BankTransitNumber . '</bankTransitNumber>' : '';
		$XMLRequest .= $InstitutionNumber != '' ? '<institutionNumber xmlns="">' . $InstitutionNumber . '</institutionNumber>' : '';
		$XMLRequest .= $BranchCode != '' ? '<branchCode xmlns="">' . $BranchCode . '</branchCode>' : '';
		$XMLRequest .= $AgencyNumber != '' ? '<agencyNumber xmlns="">' . $AgencyNumber . '</agencyNumber>' : '';
		$XMLRequest .= $BankCode != '' ? '<bankCode xmlns="">' . $BankCode . '</bankCode>' : '';
		$XMLRequest .= $RibKey != '' ? '<ribKey xmlns="">' . $RibKey . '</ribKey>' : '';
		$XMLRequest .= $ControlDigit != '' ? '<controlDigit xmlns="">' . $ControlDigit . '</controlDigit>' : '';
		$XMLRequest .= $TaxIDType != '' ? '<taxIdType xmlns="">' . $TaxIDType . '</taxIdType>' : '';
		$XMLRequest .= $TaxIDNumber != '' ? '<taxIdNumber xmlns="">' . $TaxIDNumber . '</taxIdNumber>' : '';
		$XMLRequest .= $AccountHolderDateOfBirth != '' ? '<accountHolderDateOfBirth xmlns="">' . $AccountHolderDateOfBirth . '</accountHolderDateOfBirth>' : '';
		$XMLRequest .= $ConfirmationType != '' ? '<confirmationType xmlns="">' . $ConfirmationType . '</confirmationType>' : '';

		if ( ! empty( $WebOptions ) ) {
			$XMLRequest .= '<webOptions xmlns="">';
			$XMLRequest .= $ReturnURL != '' ? '<returnUrl xmlns="">' . $ReturnURL . '</returnUrl>' : '';
			$XMLRequest .= $CancelURL != '' ? '<cancelUrl xmlns="">' . $CancelURL . '</cancelUrl>' : '';
			$XMLRequest .= $ReturnURLDescription != '' ? '<returnUrlDescription xmlns="">' . $ReturnURLDescription . '</returnUrlDescription>' : '';
			$XMLRequest .= $CancelURLDescription != '' ? '<cancelUrlDescription xmlns="">' . $CancelURLDescription . '</cancelUrlDescription>' : '';
			$XMLRequest .= '</webOptions>';
		}

		$XMLRequest .= '</AddBankAccountRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptiveAccounts', 'AddBankAccount', $this->PrintHeaders );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ExecStatus       = $DOM->getElementsByTagName( 'execStatus' )->length > 0 ? $DOM->getElementsByTagName( 'execStatus' )->item( 0 )->nodeValue : '';
		$FundingSourceKey = $DOM->getElementsByTagName( 'fundingSourceKey' )->length > 0 ? $DOM->getElementsByTagName( 'fundingSourceKey' )->item( 0 )->nodeValue : '';
		$RedirectURL      = $DOM->getElementsByTagName( 'redirectURL' )->length > 0 ? $DOM->getElementsByTagName( 'redirectURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'           => $Errors,
			'Ack'              => $Ack,
			'Build'            => $Build,
			'CorrelationID'    => $CorrelationID,
			'Timestamp'        => $Timestamp,
			'ExecStatus'       => $ExecStatus,
			'FundingSourceKey' => $FundingSourceKey,
			'RedirectURL'      => $RedirectURL,
			'XMLRequest'       => $XMLRequest,
			'XMLResponse'      => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit AddPaymentCard API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function AddPaymentCard( $DataArray ) {
		$AddPaymentCardFields   = isset( $DataArray['AddPaymentCardFields'] ) ? $DataArray['AddPaymentCardFields'] : array();
		$EmailAddress           = isset( $AddPaymentCardFields['EmailAddress'] ) ? $AddPaymentCardFields['EmailAddress'] : '';
		$AccountID              = isset( $AddPaymentCardFields['AccountID'] ) ? $AddPaymentCardFields['AccountID'] : '';
		$CreateAccountKey       = isset( $AddPaymentCardFields['CreateAccountKey'] ) ? $AddPaymentCardFields['CreateAccountKey'] : '';
		$CardOwnerDateOfBirth   = isset( $AddPaymentCardFields['CardOwnerDateOfBirth'] ) ? $AddPaymentCardFields['CardOwnerDateOfBirth'] : '';
		$CardNumber             = isset( $AddPaymentCardFields['CardNumber'] ) ? $AddPaymentCardFields['CardNumber'] : '';
		$CardType               = isset( $AddPaymentCardFields['CardType'] ) ? $AddPaymentCardFields['CardType'] : '';
		$CardVerificationNumber = isset( $AddPaymentCardFields['CardVerificationNumber'] ) ? $AddPaymentCardFields['CardVerificationNumber'] : '';
		$StartDate              = isset( $AddPaymentCardFields['StartDate'] ) ? $AddPaymentCardFields['StartDate'] : '';
		$IssueNumber            = isset( $AddPaymentCardFields['IssueNumber'] ) ? $AddPaymentCardFields['IssueNumber'] : '';
		$ConfirmationType       = isset( $AddPaymentCardFields['ConfirmationType'] ) ? $AddPaymentCardFields['ConfirmationType'] : '';

		$NameOnCard = isset( $DataArray['NameOnCard'] ) ? $DataArray['NameOnCard'] : array();
		$Salutation = isset( $NameOnCard['Salutation'] ) ? $NameOnCard['Salutation'] : '';
		$FirstName  = isset( $NameOnCard['FirstName'] ) ? $NameOnCard['FirstName'] : '';
		$MiddleName = isset( $NameOnCard['MiddleName'] ) ? $NameOnCard['MiddleName'] : '';
		$LastName   = isset( $NameOnCard['LastName'] ) ? $NameOnCard['LastName'] : '';
		$Suffix     = isset( $NameOnCard['Suffix'] ) ? $NameOnCard['Suffix'] : '';

		$BillingAddress = isset( $DataArray['BillingAddress'] ) ? $DataArray['BillingAddress'] : array();
		$Line1          = isset( $BillingAddress['Line1'] ) ? $BillingAddress['Line1'] : '';
		$Line2          = isset( $BillingAddress['Line2'] ) ? $BillingAddress['Line2'] : '';
		$City           = isset( $BillingAddress['City'] ) ? $BillingAddress['City'] : '';
		$State          = isset( $BillingAddress['State'] ) ? $BillingAddress['State'] : '';
		$PostalCode     = isset( $BillingAddress['PostalCode'] ) ? $BillingAddress['PostalCode'] : '';
		$CountryCode    = isset( $BillingAddress['CountryCode'] ) ? $BillingAddress['CountryCode'] : '';

		$ExpirationDate = isset( $DataArray['ExpirationDate'] ) ? $DataArray['ExpirationDate'] : array();
		$Month          = isset( $ExpirationDate['Month'] ) ? $ExpirationDate['Month'] : '';
		$Year           = isset( $ExpirationDate['Year'] ) ? $ExpirationDate['Year'] : '';

		$WebOptions           = isset( $DataArray['WebOptions'] ) ? $DataArray['WebOptions'] : array();
		$ReturnURL            = isset( $WebOptions['ReturnURL'] ) ? $WebOptions['ReturnURL'] : '';
		$CancelURL            = isset( $WebOptions['CancelURL'] ) ? $WebOptions['CancelURL'] : '';
		$ReturnURLDescription = isset( $WebOptions['ReturnURLDescription'] ) ? $WebOptions['ReturnURLDescription'] : '';
		$CancelURLDescription = isset( $WebOptions['CancelURLDescription'] ) ? $WebOptions['CancelURLDescription'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<AddPaymentCardRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $EmailAddress != '' ? '<emailAddress xmlns="">' . $EmailAddress . '</emailAddress>' : '';
		$XMLRequest .= $AccountID != '' ? '<accountId xmlns="">' . $AccountID . '</accountId>' : '';
		$XMLRequest .= $CreateAccountKey != '' ? '<createAccountKey xmlns="">' . $CreateAccountKey . '</createAccountKey>' : '';

		if ( ! empty( $NameOnCard ) ) {
			$XMLRequest .= '<nameOnCard xmlns="">';
			$XMLRequest .= $Salutation != '' ? '<salutation xmlns="">' . $Salutation . '</salutation>' : '';
			$XMLRequest .= $FirstName != '' ? '<firstName xmlns="">' . $FirstName . '</firstName>' : '';
			$XMLRequest .= $MiddleName != '' ? '<middleName xmlns="">' . $MiddleName . '</middleName>' : '';
			$XMLRequest .= $LastName != '' ? '<lastName xmlns="">' . $LastName . '</lastName>' : '';
			$XMLRequest .= $Suffix != '' ? '<suffix xmlns="">' . $Suffix . '</suffix>' : '';
			$XMLRequest .= '</nameOnCard>';
		}

		if ( ! empty( $BillingAddress ) ) {
			$XMLRequest .= '<billingAddress xmlns="">';
			$XMLRequest .= $Line1 != '' ? '<line1 xmlns="">' . $Line1 . '</line1>' : '';
			$XMLRequest .= $Line2 != '' ? '<line2 xmlns="">' . $Line2 . '</line2>' : '';
			$XMLRequest .= $City != '' ? '<city xmlns="">' . $City . '</city>' : '';
			$XMLRequest .= $State != '' ? '<state xmlns="">' . $State . '</state>' : '';
			$XMLRequest .= $PostalCode != '' ? '<postalCode xmlns="">' . $PostalCode . '</postalCode>' : '';
			$XMLRequest .= $CountryCode != '' ? '<countryCode xmlns="">' . $CountryCode . '</countryCode>' : '';
			$XMLRequest .= '</billingAddress>';
		}

		$XMLRequest .= $CardOwnerDateOfBirth != '' ? '<cardOwnerDateOfBirth xmlns="">' . $CardOwnerDateOfBirth . '</cardOwnerDateOfBirth>' : '';
		$XMLRequest .= $CardNumber != '' ? '<cardNumber xmlns="">' . $CardNumber . '</cardNumber>' : '';
		$XMLRequest .= $CardType != '' ? '<cardType xmlns="">' . $CardType . '</cardType>' : '';

		if ( ! empty( $ExpirationDate ) ) {
			$XMLRequest .= '<expirationDate xmlns="">';
			$XMLRequest .= $Month != '' ? '<month xmlns="">' . $Month . '</month>' : '';
			$XMLRequest .= $Year != '' ? '<year xmlns="">' . $Year . '</year>' : '';
			$XMLRequest .= '</expirationDate>';
		}

		$XMLRequest .= $CardVerificationNumber != '' ? '<cardVerificationNumber xmlns="">' . $CardVerificationNumber . '</cardVerificationNumber>' : '';
		$XMLRequest .= $StartDate != '' ? '<startDate xmlns="">' . $StartDate . '</startDate>' : '';
		$XMLRequest .= $IssueNumber != '' ? '<issueNumber xmlns="">' . $IssueNumber . '</issueNumber>' : '';
		$XMLRequest .= $ConfirmationType != '' ? '<confirmationType xmlns="">' . $ConfirmationType . '</confirmationType>' : '';

		if ( ! empty( $WebOptions ) ) {
			$XMLRequest .= '<webOptions xmlns="">';
			$XMLRequest .= $ReturnURL != '' ? '<returnUrl xmlns="">' . $ReturnURL . '</returnUrl>' : '';
			$XMLRequest .= $CancelURL != '' ? '<cancelUrl xmlns="">' . $CancelURL . '</cancelUrl>' : '';
			$XMLRequest .= $ReturnURLDescription != '' ? '<returnUrlDescription xmlns="">' . $ReturnURLDescription . '</returnUrlDescription>' : '';
			$XMLRequest .= $CancelURLDescription != '' ? '<cancelUrlDescription xmlns="">' . $CancelURLDescription . '</cancelUrlDescription>' : '';
			$XMLRequest .= '</webOptions>';
		}

		$XMLRequest .= '</AddPaymentCardRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptiveAccounts', 'AddPaymentCard' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ExecStatus       = $DOM->getElementsByTagName( 'execStatus' )->length > 0 ? $DOM->getElementsByTagName( 'execStatus' )->item( 0 )->nodeValue : '';
		$FundingSourceKey = $DOM->getElementsByTagName( 'fundingSourceKey' )->length > 0 ? $DOM->getElementsByTagName( 'fundingSourceKey' )->item( 0 )->nodeValue : '';
		$RedirectURL      = $DOM->getElementsByTagName( 'redirectURL' )->length > 0 ? $DOM->getElementsByTagName( 'redirectURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'           => $Errors,
			'Ack'              => $Ack,
			'Build'            => $Build,
			'CorrelationID'    => $CorrelationID,
			'Timestamp'        => $Timestamp,
			'ExecStatus'       => $ExecStatus,
			'FundingSourceKey' => $FundingSourceKey,
			'RedirectURL'      => $RedirectURL,
			'XMLRequest'       => $XMLRequest,
			'XMLResponse'      => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit SetFundingSourceConfirmed API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function SetFundingSourceConfirmed( $DataArray ) {
		$SetFundingSourceConfirmedFields = isset( $DataArray['SetFundingSourceConfirmedFields'] ) ? $DataArray['SetFundingSourceConfirmedFields'] : array();
		$EmailAddress                    = isset( $SetFundingSourceConfirmedFields['EmailAddress'] ) ? $SetFundingSourceConfirmedFields['EmailAddress'] : '';
		$AccountID                       = isset( $SetFundingSourceConfirmedFields['AccountID'] ) ? $SetFundingSourceConfirmedFields['AccountID'] : '';
		$FundingSourceKey                = isset( $SetFundingSourceConfirmedFields['FundingSourceKey'] ) ? $SetFundingSourceConfirmedFields['FundingSourceKey'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<SetFundingSourceConfirmedRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $EmailAddress != '' ? '<emailAddress xmlns="">' . $EmailAddress . '</emailAddress>' : '';
		$XMLRequest .= $AccountID != '' ? '<accountId xmlns="">' . $AccountID . '</accountId>' : '';
		$XMLRequest .= $FundingSourceKey != '' ? '<fundingSourceKey xmlns="">' . $FundingSourceKey . '</fundingSourceKey>' : '';
		$XMLRequest .= '</SetFundingSourceConfirmedRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptiveAccounts', 'SetFundingSourceConfirmed' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GetVerifiedStatus API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetVerifiedStatus( $DataArray ) {
		$GetVerifiedStatusFields = isset( $DataArray['GetVerifiedStatusFields'] ) ? $DataArray['GetVerifiedStatusFields'] : array();
		$EmailAddress            = isset( $GetVerifiedStatusFields['EmailAddress'] ) ? $GetVerifiedStatusFields['EmailAddress'] : '';
		$MatchCriteria           = isset( $GetVerifiedStatusFields['MatchCriteria'] ) ? $GetVerifiedStatusFields['MatchCriteria'] : '';
		$FirstName               = isset( $GetVerifiedStatusFields['FirstName'] ) ? $GetVerifiedStatusFields['FirstName'] : '';
		$LastName                = isset( $GetVerifiedStatusFields['LastName'] ) ? $GetVerifiedStatusFields['LastName'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetVerifiedStatusRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $EmailAddress != '' ? '<emailAddress xmlns="">' . $EmailAddress . '</emailAddress>' : '';
		$XMLRequest .= $MatchCriteria != '' ? '<matchCriteria xmlns="">' . $MatchCriteria . '</matchCriteria>' : '';
		$XMLRequest .= $FirstName != '' ? '<firstName xmlns="">' . $FirstName . '</firstName>' : '';
		$XMLRequest .= $LastName != '' ? '<lastName xmlns="">' . $LastName . '</lastName>' : '';
		$XMLRequest .= '</GetVerifiedStatusRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptiveAccounts', 'GetVerifiedStatus' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$AccountStatus = $DOM->getElementsByTagName( 'accountStatus' )->length > 0 ? $DOM->getElementsByTagName( 'accountStatus' )->item( 0 )->nodeValue : '';
		$CountryCode   = $DOM->getElementsByTagName( 'countryCode' )->length > 0 ? $DOM->getElementsByTagName( 'countryCode' )->item( 0 )->nodeValue : '';
		$EmailAddress  = $DOM->getElementsByTagName( 'emailAddress' )->length > 0 ? $DOM->getElementsByTagName( 'emailAddress' )->item( 0 )->nodeValue : '';
		$AccountID     = $DOM->getElementsByTagName( 'accountId' )->length > 0 ? $DOM->getElementsByTagName( 'accountId' )->item( 0 )->nodeValue : '';
		$AccountType   = $DOM->getElementsByTagName( 'accountType' )->length > 0 ? $DOM->getElementsByTagName( 'accountType' )->item( 0 )->nodeValue : '';
		$BusinessName  = $DOM->getElementsByTagName( 'businessName' )->length > 0 ? $DOM->getElementsByTagName( 'businessName' )->item( 0 )->nodeValue : '';
		$Salutation    = $DOM->getElementsByTagName( 'salutation' )->length > 0 ? $DOM->getElementsByTagName( 'salutation' )->item( 0 )->nodeValue : '';
		$FirstName     = $DOM->getElementsByTagName( 'firstName' )->length > 0 ? $DOM->getElementsByTagName( 'firstName' )->item( 0 )->nodeValue : '';
		$MiddleName    = $DOM->getElementsByTagName( 'middleName' )->length > 0 ? $DOM->getElementsByTagName( 'middleName' )->item( 0 )->nodeValue : '';
		$LastName      = $DOM->getElementsByTagName( 'lastName' )->length > 0 ? $DOM->getElementsByTagName( 'lastName' )->item( 0 )->nodeValue : '';
		$Suffix        = $DOM->getElementsByTagName( 'suffix' )->length > 0 ? $DOM->getElementsByTagName( 'suffix' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'AccountStatus' => $AccountStatus,
			'CountryCode'   => $CountryCode,
			'EmailAddress'  => $EmailAddress,
			'AccountID'     => $AccountID,
			'AccountType'   => $AccountType,
			'BusinessName'  => $BusinessName,
			'Salutation'    => $Salutation,
			'FirstName'     => $FirstName,
			'MiddleName'    => $MiddleName,
			'LastName'      => $LastName,
			'Suffix'        => $Suffix,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * GetUserAgreement.
	 *
	 * Retrieves the user agreement for the customer to approve the new PayPal account.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetUserAgreement( $DataArray ) {
		$GetUserAgreementFields = isset( $DataArray['GetUserAgreementFields'] ) ? $DataArray['GetUserAgreementFields'] : array();
		$CountryCode            = isset( $GetUserAgreementFields['CountryCode'] ) ? $GetUserAgreementFields['CountryCode'] : '';
		$CreateAccountKey       = isset( $GetUserAgreementFields['CreateAccountKey'] ) ? $GetUserAgreementFields['CreateAccountKey'] : '';
		$LanguageCode           = isset( $GetUserAgreementFields['LanguageCode'] ) ? $GetUserAgreementFields['LanguageCode'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetUserAgreementRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $CountryCode != '' ? '<countryCode xmlns="">' . $CountryCode . '</countryCode>' : '';
		$XMLRequest .= $CreateAccountKey != '' ? '<createAccountKey xmlns="">' . $CreateAccountKey . '</createAccountKey>' : '';
		$XMLRequest .= $LanguageCode != '' ? '<languageCode xmlns="">' . $LanguageCode . '</languageCode>' : '';
		$XMLRequest .= '</GetUserAgreementRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptiveAccounts', 'GetUserAgreement' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$Agreement = $DOM->getElementsByTagName( 'agreement' )->length > 0 ? $DOM->getElementsByTagName( 'agreement' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'Agreement'     => $Agreement,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GetFundingPlans API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetFundingPlans( $DataArray ) {
		$GetFundingPlansFields = isset( $DataArray['GetFundingPlansFields'] ) ? $DataArray['GetFundingPlansFields'] : array();
		$PayKey                = isset( $GetFundingPlansFields['PayKey'] ) ? $GetFundingPlansFields['PayKey'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetFundingPlansRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $PayKey != '' ? '<payKey xmlns="">' . $PayKey . '</payKey>' : '';
		$XMLRequest .= '</GetFundingPlansRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptiveAccounts', 'GetFundingPlans' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$FundingPlanType = $DOM->getElementsByTagName( 'fundingPlan' )->length > 0 ? $DOM->getElementsByTagName( 'fundingPlan' ) : array();
		foreach ( $FundingPlanType as $FundingPlan ) {
			$FundingPlanID     = $FundingPlan->getElementsByTagName( 'fundingPlanId' )->length > 0 ? $FundingPlan->getElementsByTagName( 'fundingPlanId' )->item( 0 )->nodeValue : '';
			$FundingAmountType = $FundingPlan->getElementsByTagName( 'fundingAmount' )->length > 0 ? $FundingPlan->getElementsByTagName( 'fundingAmount' ) : array();

			foreach ( $FundingAmountType as $FundingAmount ) {
				$FundingAmountCode   = $FundingAmount->getElementsByTagName( 'code' )->length > 0 ? $FundingAmount->getElementsByTagName( 'code' )->item( 0 )->nodeValue : '';
				$FundingAmountAmount = $FundingAmount->getElementsByTagName( 'amount' )->length > 0 ? $FundingAmount->getElementsByTagName( 'amount' )->item( 0 )->nodeValue : '';
			}

			$BackupFundingSourceType = $FundingPlan->getElementsByTagName( 'backupFundingSource' )->length > 0 ? $FundingPlan->getElementsByTagName( 'backupFundingSource' ) : array();
			foreach ( $BackupFundingSourceType as $BackupFundingSource ) {
				$BackupFundingSource_LastFourOfAccountNumber = $BackupFundingSource->getElementsByTagName( 'lastFourOfAccountNumber' )->length > 0 ? $BackupFundingSource->getElementsByTagName( 'lastFourOfAccountNumber' )->item( 0 )->nodeValue : '';
				$BackupFundingSource_Type                    = $BackupFundingSource->getElementsByTagName( 'type' )->length > 0 ? $BackupFundingSource->getElementsByTagName( 'type' )->item( 0 )->nodeValue : '';
				$BackupFundingSource_DisplayName             = $BackupFundingSource->getElementsByTagName( 'displayName' )->length > 0 ? $BackupFundingSource->getElementsByTagName( 'displayName' )->item( 0 )->nodeValue : '';
				$BackupFundingSource_FundingSourceID         = $BackupFundingSource->getElementsByTagName( 'fundingSourceId' )->length > 0 ? $BackupFundingSource->getElementsByTagName( 'fundingSourceId' )->item( 0 )->nodeValue : '';
				$BackupFundingSource_Allowed                 = $BackupFundingSource->getElementsByTagName( 'allowed' )->length > 0 ? $BackupFundingSource->getElementsByTagName( 'allowed' )->item( 0 )->nodeValue : '';
			}

			$SenderFeesType = $FundingPlan->getElementsByTagName( 'senderFees' )->length > 0 ? $FundingPlan->getElementsByTagName( 'senderFees' ) : array();
			foreach ( $SenderFeesType as $SenderFees ) {
				$SenderFeesCode   = $SenderFees->getElementsByTagName( 'code' )->length > 0 ? $SenderFees->getElementsByTagName( 'code' )->item( 0 )->nodeValue : '';
				$SenderFeesAmount = $SenderFees->getElementsByTagName( 'amount' )->length > 0 ? $SenderFees->getElementsByTagName( 'amount' )->item( 0 )->nodeValue : '';
			}

			$CurrencyConversionType = $FundingPlan->getElementsByTagName( 'currencyConversion' )->length > 0 ? $FundingPlan->getElementsByTagName( 'currencyConversion' ) : array();
			foreach ( $CurrencyConversionType as $CurrencyConversion ) {
				$CurrencyConversion_From         = $CurrencyConversion->getElementsByTagName( 'from' )->length > 0 ? $CurrencyConversion->getElementsByTagName( 'from' )->item( 0 )->nodeValue : '';
				$CurrencyConversion_To           = $CurrencyConversion->getElementsByTagName( 'to' )->length > 0 ? $CurrencyConversion->getElementsByTagName( 'to' )->item( 0 )->nodeValue : '';
				$CurrencyConversion_ExchangeRate = $CurrencyConversion->getElementsByTagName( 'exchangeRate' )->length > 0 ? $CurrencyConversion->getElementsByTagName( 'exchangeRate' )->item( 0 )->nodeValue : '';
			}

			$FundingPlanChargeType = $FundingPlan->getElementsByTagName( 'charge' )->length > 0 ? $FundingPlan->getElementsByTagName( 'charge' ) : array();
			foreach ( $FundingPlanChargeType as $FundingPlanCharge ) {
				$FundingPlanChargeCode              = $FundingPlanCharge->getElementsByTagName( 'code' )->length > 0 ? $FundingPlanCharge->getElementsByTagName( 'code' )->item( 0 )->nodeValue : '';
				$FundingPlanChargeAmount            = $FundingPlanCharge->getElementsByTagName( 'amount' )->length > 0 ? $FundingPlanCharge->getElementsByTagName( 'amount' )->item( 0 )->nodeValue : '';
				$FundingPlanChargeFundingSourceType = $FundingPlanCharge->getElementsByTagName( 'fundingSource' )->length > 0 ? $FundingPlanCharge->getElementsByTagName( 'fundingSource' ) : array();
				foreach ( $FundingPlanChargeFundingSourceType as $FundingPlanChargeFundingSource ) {
					$FundingPlanChargeFundingSource_LastFourOfAccountNumber = $FundingPlanChargeFundingSource->getElementsByTagName( 'lastFourOfAccountNumber' )->length > 0 ? $FundingPlanChargeFundingSource->getElementsByTagName( 'lastFourOfAccountNumber' )->item( 0 )->nodeValue : '';
					$FundingPlanChargeFundingSource_Type                    = $FundingPlanChargeFundingSource->getElementsByTagName( 'type' )->length > 0 ? $FundingPlanChargeFundingSource->getElementsByTagName( 'type' )->item( 0 )->nodeValue : '';
					$FundingPlanChargeFundingSource_DisplayName             = $FundingPlanChargeFundingSource->getElementsByTagName( 'displayName' )->length > 0 ? $FundingPlanChargeFundingSource->getElementsByTagName( 'displayName' )->item( 0 )->nodeValue : '';
					$FundingPlanChargeFundingSource_FundingSourceID         = $FundingPlanChargeFundingSource->getElementsByTagName( 'fundingSourceId' )->length > 0 ? $FundingPlanChargeFundingSource->getElementsByTagName( 'fundingSourceId' )->item( 0 )->nodeValue : '';
					$FundingPlanChargeFundingSource_Allowed                 = $FundingPlanChargeFundingSource->getElementsByTagName( 'allowed' )->length > 0 ? $FundingPlanChargeFundingSource->getElementsByTagName( 'allowed' )->item( 0 )->nodeValue : '';
				}
			}
		}

		$ResponseDataArray = array(
			'Errors'                                                 => $Errors,
			'Ack'                                                    => $Ack,
			'Build'                                                  => $Build,
			'CorrelationID'                                          => $CorrelationID,
			'Timestamp'                                              => $Timestamp,
			'FundingPlanID'                                          => isset( $FundingPlanID ) ? $FundingPlanID : '',
			'FundingAmountCode'                                      => isset( $FundingAmountCode ) ? $FundingAmountCode : '',
			'FundingAmountAmount'                                    => isset( $FundingAmountAmount ) ? $FundingAmountAmount : '',
			'SenderFeesCode'                                         => isset( $SenderFeesCode ) ? $SenderFeesCode : '',
			'SenderFeesAmount'                                       => isset( $SenderFeesAmount ) ? $SenderFeesAmount : '',
			'BackupFundingSource_LastFourOfAccountNumber'            => isset( $BackupFundingSource_LastFourOfAccountNumber ) ? $BackupFundingSource_LastFourOfAccountNumber : '',
			'BackupFundingSource_Type'                               => isset( $BackupFundingSource_Type ) ? $BackupFundingSource_Type : '',
			'BackupFundingSource_DisplayName'                        => isset( $BackupFundingSource_DisplayName ) ? $BackupFundingSource_DisplayName : '',
			'BackupFundingSource_FundingSourceID'                    => isset( $BackupFundingSource_FundingSourceID ) ? $BackupFundingSource_FundingSourceID : '',
			'BackupFundingSource_Allowed'                            => isset( $BackupFundingSource_Allowed ) ? $BackupFundingSource_Allowed : '',
			'CurrencyConversion_From'                                => isset( $CurrencyConversion_From ) ? $CurrencyConversion_From : '',
			'CurrencyConversion_To'                                  => isset( $CurrencyConversion_To ) ? $CurrencyConversion_To : '',
			'CurrencyConversion_ExchangeRate'                        => isset( $CurrencyConversion_ExchangeRate ) ? $CurrencyConversion_ExchangeRate : '',
			'FundingPlanChargeCode'                                  => isset( $FundingPlanChargeCode ) ? $FundingPlanChargeCode : '',
			'FundingPlanChargeAmount'                                => isset( $FundingPlanChargeAmount ) ? $FundingPlanChargeAmount : '',
			'FundingPlanChargeFundingSource_LastFourOfAccountNumber' => isset( $FundingPlanChargeFundingSource_LastFourOfAccountNumber ) ? $FundingPlanChargeFundingSource_LastFourOfAccountNumber : '',
			'FundingPlanChargeFundingSource_Type'                    => isset( $FundingPlanChargeFundingSource_Type ) ? $FundingPlanChargeFundingSource_Type : '',
			'FundingPlanChargeFundingSource_DisplayName'             => isset( $FundingPlanChargeFundingSource_DisplayName ) ? $FundingPlanChargeFundingSource_DisplayName : '',
			'FundingPlanChargeFundingSource_FundingSourceID'         => isset( $FundingPlanChargeFundingSource_FundingSourceID ) ? $FundingPlanChargeFundingSource_FundingSourceID : '',
			'FundingPlanChargeFundingSource_Allowed'                 => isset( $FundingPlanChargeFundingSource_Allowed ) ? $FundingPlanChargeFundingSource_Allowed : '',
			'XMLRequest'                                             => $XMLRequest,
			'XMLResponse'                                            => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GetShippingAddresses API request to PayPal.
	 *
	 * @access    public
	 * @param string $Paykey PayKey returned from a previous Pay request.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetShippingAddresses( $PayKey ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetShippingAddressesRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $PayKey != '' ? '<key xmlns="">' . $PayKey . '</key>' : '';
		$XMLRequest .= '</GetShippingAddressesRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'AdaptivePayments', 'GetShippingAddresses' );

		$DOM = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$AddresseeName = $DOM->getElementsByTagName( 'addresseeName' )->length > 0 ? $DOM->getElementsByTagName( 'addresseeName' )->item( 0 )->nodeValue : '';
		$AddressID     = $DOM->getElementsByTagName( 'addressId' )->length > 0 ? $DOM->getElementsByTagName( 'addressId' )->item( 0 )->nodeValue : '';
		$Line1         = $DOM->getElementsByTagName( 'line1' )->length > 0 ? $DOM->getElementsByTagName( 'line1' )->item( 0 )->nodeValue : '';
		$Line2         = $DOM->getElementsByTagName( 'line2' )->length > 0 ? $DOM->getElementsByTagName( 'line2' )->item( 0 )->nodeValue : '';
		$City          = $DOM->getElementsByTagName( 'city' )->length > 0 ? $DOM->getElementsByTagName( 'city' )->item( 0 )->nodeValue : '';
		$State         = $DOM->getElementsByTagName( 'state' )->length > 0 ? $DOM->getElementsByTagName( 'state' )->item( 0 )->nodeValue : '';
		$PostalCode    = $DOM->getElementsByTagName( 'postalCode' )->length > 0 ? $DOM->getElementsByTagName( 'postalCode' )->item( 0 )->nodeValue : '';
		$CountryCode   = $DOM->getElementsByTagName( 'countryCode' )->length > 0 ? $DOM->getElementsByTagName( 'countryCode' )->item( 0 )->nodeValue : '';
		$Type          = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';


		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'AddresseeName' => $AddresseeName,
			'AddressID'     => $AddressID,
			'Line1'         => $Line1,
			'Line2'         => $Line2,
			'City'          => $City,
			'State'         => $State,
			'PostalCode'    => $PostalCode,
			'CountryCode'   => $CountryCode,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit CreateInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function CreateInvoice( $DataArray ) {
		$CreateInvoiceFields = isset( $DataArray['CreateInvoiceFields'] ) ? $DataArray['CreateInvoiceFields'] : array();
		$MerchantEmail       = isset( $CreateInvoiceFields['MerchantEmail'] ) ? $CreateInvoiceFields['MerchantEmail'] : '';
		$PayerEmail          = isset( $CreateInvoiceFields['PayerEmail'] ) ? $CreateInvoiceFields['PayerEmail'] : '';
		$Number              = isset( $CreateInvoiceFields['Number'] ) ? $CreateInvoiceFields['Number'] : '';
		$CurrencyCode        = isset( $CreateInvoiceFields['CurrencyCode'] ) ? $CreateInvoiceFields['CurrencyCode'] : '';
		$InvoiceDate         = isset( $CreateInvoiceFields['InvoiceDate'] ) ? $CreateInvoiceFields['InvoiceDate'] : '';
		$DueDate             = isset( $CreateInvoiceFields['DueDate'] ) ? $CreateInvoiceFields['DueDate'] : '';
		$PaymentTerms        = isset( $CreateInvoiceFields['PaymentTerms'] ) ? $CreateInvoiceFields['PaymentTerms'] : '';
		$DiscountPercent     = isset( $CreateInvoiceFields['DiscountPercent'] ) ? $CreateInvoiceFields['DiscountPercent'] : '';
		$DiscountAmount      = isset( $CreateInvoiceFields['DiscountAmount'] ) ? $CreateInvoiceFields['DiscountAmount'] : '';
		$Terms               = isset( $CreateInvoiceFields['Terms'] ) ? $CreateInvoiceFields['Terms'] : '';
		$Note                = isset( $CreateInvoiceFields['Note'] ) ? $CreateInvoiceFields['Note'] : '';
		$MerchantMemo        = isset( $CreateInvoiceFields['MerchantMemo'] ) ? $CreateInvoiceFields['MerchantMemo'] : '';
		$ShippingAmount      = isset( $CreateInvoiceFields['ShippingAmount'] ) ? $CreateInvoiceFields['ShippingAmount'] : '';
		$ShippingTaxName     = isset( $CreateInvoiceFields['ShippingTaxName'] ) ? $CreateInvoiceFields['ShippingTaxName'] : '';
		$ShippingTaxRate     = isset( $CreateInvoiceFields['ShippingTaxRate'] ) ? $CreateInvoiceFields['ShippingTaxRate'] : '';
		$LogoURL             = isset( $CreateInvoiceFields['LogoURL'] ) ? $CreateInvoiceFields['LogoURL'] : '';

		$BusinessInfo         = isset( $DataArray['BusinessInfo'] ) ? $DataArray['BusinessInfo'] : array();
		$BusinessFirstName    = isset( $BusinessInfo['FirstName'] ) ? $BusinessInfo['FirstName'] : '';
		$BusinessLastName     = isset( $BusinessInfo['LastName'] ) ? $BusinessInfo['LastName'] : '';
		$BusinessBusinessName = isset( $BusinessInfo['BusinessName'] ) ? $BusinessInfo['BusinessName'] : '';
		$BusinessPhone        = isset( $BusinessInfo['Phone'] ) ? $BusinessInfo['Phone'] : '';
		$BusinessFax          = isset( $BusinessInfo['Fax'] ) ? $BusinessInfo['Fax'] : '';
		$BusinessWebsite      = isset( $BusinessInfo['Website'] ) ? $BusinessInfo['Website'] : '';
		$BusinessCustom       = isset( $BusinessInfo['Custom'] ) ? $BusinessInfo['Custom'] : '';

		$BusinessInfoAddress            = isset( $DataArray['BusinessInfoAddress'] ) ? $DataArray['BusinessInfoAddress'] : array();
		$BusinessInfoAddressLine1       = isset( $BusinessInfoAddress['Line1'] ) ? $BusinessInfoAddress['Line1'] : '';
		$BusinessInfoAddressLine2       = isset( $BusinessInfoAddress['Line2'] ) ? $BusinessInfoAddress['Line2'] : '';
		$BusinessInfoAddressCity        = isset( $BusinessInfoAddress['City'] ) ? $BusinessInfoAddress['City'] : '';
		$BusinessInfoAddressState       = isset( $BusinessInfoAddress['State'] ) ? $BusinessInfoAddress['State'] : '';
		$BusinessInfoAddressPostalCode  = isset( $BusinessInfoAddress['PostalCode'] ) ? $BusinessInfoAddress['PostalCode'] : '';
		$BusinessInfoAddressCountryCode = isset( $BusinessInfoAddress['CountryCode'] ) ? $BusinessInfoAddress['CountryCode'] : '';
		$BusinessInfoAddressType        = isset( $BusinessInfoAddress['AddressType'] ) ? $BusinessInfoAddress['AddressType'] : '';

		$BillingInfo         = isset( $DataArray['BillingInfo'] ) ? $DataArray['BillingInfo'] : array();
		$BillingFirstName    = isset( $BillingInfo['FirstName'] ) ? $BillingInfo['FirstName'] : '';
		$BillingLastName     = isset( $BillingInfo['LastName'] ) ? $BillingInfo['LastName'] : '';
		$BillingBusinessName = isset( $BillingInfo['BusinessName'] ) ? $BillingInfo['BusinessName'] : '';
		$BillingPhone        = isset( $BillingInfo['Phone'] ) ? $BillingInfo['Phone'] : '';
		$BillingFax          = isset( $BillingInfo['Fax'] ) ? $BillingInfo['Fax'] : '';
		$BillingWebsite      = isset( $BillingInfo['Website'] ) ? $BillingInfo['Website'] : '';
		$BillingCustom       = isset( $BillingInfo['Custom'] ) ? $BillingInfo['Custom'] : '';

		$BillingInfoAddress            = isset( $DataArray['BillingInfoAddress'] ) ? $DataArray['BillingInfoAddress'] : array();
		$BillingInfoAddressLine1       = isset( $BillingInfoAddress['Line1'] ) ? $BillingInfoAddress['Line1'] : '';
		$BillingInfoAddressLine2       = isset( $BillingInfoAddress['Line2'] ) ? $BillingInfoAddress['Line2'] : '';
		$BillingInfoAddressCity        = isset( $BillingInfoAddress['City'] ) ? $BillingInfoAddress['City'] : '';
		$BillingInfoAddressState       = isset( $BillingInfoAddress['State'] ) ? $BillingInfoAddress['State'] : '';
		$BillingInfoAddressPostalCode  = isset( $BillingInfoAddress['PostalCode'] ) ? $BillingInfoAddress['PostalCode'] : '';
		$BillingInfoAddressCountryCode = isset( $BillingInfoAddress['CountryCode'] ) ? $BillingInfoAddress['CountryCode'] : '';
		$BillingInfoAddressType        = isset( $BillingInfoAddress['AddressType'] ) ? $BillingInfoAddress['AddressType'] : '';

		$ShippingInfo         = isset( $DataArray['ShippingInfo'] ) ? $DataArray['ShippingInfo'] : array();
		$ShippingFirstName    = isset( $ShippingInfo['FirstName'] ) ? $ShippingInfo['FirstName'] : '';
		$ShippingLastName     = isset( $ShippingInfo['LastName'] ) ? $ShippingInfo['LastName'] : '';
		$ShippingBusinessName = isset( $ShippingInfo['BusinessName'] ) ? $ShippingInfo['BusinessName'] : '';
		$ShippingPhone        = isset( $ShippingInfo['Phone'] ) ? $ShippingInfo['Phone'] : '';
		$ShippingFax          = isset( $ShippingInfo['Fax'] ) ? $ShippingInfo['Fax'] : '';
		$ShippingWebsite      = isset( $ShippingInfo['Website'] ) ? $ShippingInfo['Website'] : '';
		$ShippingCustom       = isset( $ShippingInfo['Custom'] ) ? $ShippingInfo['Custom'] : '';

		$ShippingInfoAddress            = isset( $DataArray['ShippingInfoAddress'] ) ? $DataArray['ShippingInfoAddress'] : array();
		$ShippingInfoAddressLine1       = isset( $ShippingInfoAddress['Line1'] ) ? $ShippingInfoAddress['Line1'] : '';
		$ShippingInfoAddressLine2       = isset( $ShippingInfoAddress['Line2'] ) ? $ShippingInfoAddress['Line2'] : '';
		$ShippingInfoAddressCity        = isset( $ShippingInfoAddress['City'] ) ? $ShippingInfoAddress['City'] : '';
		$ShippingInfoAddressState       = isset( $ShippingInfoAddress['State'] ) ? $ShippingInfoAddress['State'] : '';
		$ShippingInfoAddressPostalCode  = isset( $ShippingInfoAddress['PostalCode'] ) ? $ShippingInfoAddress['PostalCode'] : '';
		$ShippingInfoAddressCountryCode = isset( $ShippingInfoAddress['CountryCode'] ) ? $ShippingInfoAddress['CountryCode'] : '';
		$ShippingInfoAddressType        = isset( $ShippingInfoAddress['AddressType'] ) ? $ShippingInfoAddress['AddressType'] : '';

		$InvoiceItems = isset( $DataArray['InvoiceItems'] ) ? $DataArray['InvoiceItems'] : array();

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<CreateInvoiceRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= '<invoice xmlns="">';
		$XMLRequest .= $MerchantEmail != '' ? '<merchantEmail xmlns="">' . $MerchantEmail . '</merchantEmail>' : '';
		$XMLRequest .= $PayerEmail != '' ? '<payerEmail xmlns="">' . $PayerEmail . '</payerEmail>' : '';
		$XMLRequest .= $Number != '' ? '<number xmlns="">' . $Number . '</number>' : '';

		if ( ! empty( $BusinessInfo ) ) {
			$XMLRequest .= '<merchantInfo xmlns="">';
			$XMLRequest .= $BusinessFirstName != '' ? '<firstName xmlns="">' . $BusinessFirstName . '</firstName>' : '';
			$XMLRequest .= $BusinessLastName != '' ? '<lastName xmlns="">' . $BusinessLastName . '</lastName>' : '';
			$XMLRequest .= $BusinessBusinessName != '' ? '<businessName xmlns="">' . $BusinessBusinessName . '</businessName>' : '';
			$XMLRequest .= $BusinessPhone != '' ? '<phone xmlns="">' . $BusinessPhone . '</phone>' : '';
			$XMLRequest .= $BusinessFax != '' ? '<fax xmlns="">' . $BusinessFax . '</fax>' : '';
			$XMLRequest .= $BusinessWebsite != '' ? '<website xmlns="">' . $BusinessWebsite . '</website>' : '';
			$XMLRequest .= $BusinessCustom != '' ? '<customValue xmlns="">' . $BusinessCustom . '</customValue>' : '';

			if ( ! empty( $BusinessInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $BusinessInfoAddressLine1 != '' ? '<line1 xmlns="">' . $BusinessInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $BusinessInfoAddressLine2 != '' ? '<line2 xmlns="">' . $BusinessInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $BusinessInfoAddressCity != '' ? '<city xmlns="">' . $BusinessInfoAddressCity . '</city>' : '';
				$XMLRequest .= $BusinessInfoAddressState != '' ? '<state xmlns="">' . $BusinessInfoAddressState . '</state>' : '';
				$XMLRequest .= $BusinessInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $BusinessInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $BusinessInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $BusinessInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $BusinessInfoAddressType != '' ? '<type xmlns="">' . $BusinessInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</merchantInfo>';
		}

		if ( ! empty( $InvoiceItems ) ) {
			$XMLRequest .= '<itemList xmlns="">';
			foreach ( $InvoiceItems as $InvoiceItem ) {
				$XMLRequest .= '<item xmlns="">';
				$XMLRequest .= $InvoiceItem['Name'] != '' ? '<name xmlns="">' . $InvoiceItem['Name'] . '</name>' : '';
				$XMLRequest .= $InvoiceItem['Description'] != '' ? '<description xmlns="">' . $InvoiceItem['Description'] . '</description>' : '';
				$XMLRequest .= $InvoiceItem['Date'] != '' ? '<date xmlns="">' . $InvoiceItem['Date'] . '</date>' : '';
				$XMLRequest .= $InvoiceItem['Quantity'] != '' ? '<quantity xmlns="">' . $InvoiceItem['Quantity'] . '</quantity>' : '';
				$XMLRequest .= $InvoiceItem['UnitPrice'] != '' ? '<unitPrice xmlns="">' . $InvoiceItem['UnitPrice'] . '</unitPrice>' : '';
				$XMLRequest .= $InvoiceItem['TaxName'] != '' ? '<taxName xmlns="">' . $InvoiceItem['TaxName'] . '</taxName>' : '';
				$XMLRequest .= $InvoiceItem['TaxRate'] != '' ? '<taxRate xmlns="">' . $InvoiceItem['TaxRate'] . '</taxRate>' : '';
				$XMLRequest .= '</item>';
			}
			$XMLRequest .= '</itemList>';
		}

		$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
		$XMLRequest .= $InvoiceDate != '' ? '<invoiceDate xmlns="">' . $InvoiceDate . '</invoiceDate>' : '';
		$XMLRequest .= $DueDate != '' ? '<dueDate xmlns="">' . $DueDate . '</dueDate>' : '';
		$XMLRequest .= $PaymentTerms != '' ? '<paymentTerms xmlns="">' . $PaymentTerms . '</paymentTerms>' : '';
		$XMLRequest .= $DiscountPercent != '' ? '<discountPercent xmlns="">' . $DiscountPercent . '</discountPercent>' : '';
		$XMLRequest .= $DiscountAmount != '' ? '<discountAmount xmlns="">' . $DiscountAmount . '</discountAmount>' : '';
		$XMLRequest .= $Terms != '' ? '<terms xmlns="">' . $Terms . '</terms>' : '';
		$XMLRequest .= $Note != '' ? '<note xmlns="">' . $Note . '</note>' : '';
		$XMLRequest .= $MerchantMemo != '' ? '<merchantMemo xmlns="">' . $MerchantMemo . '</merchantMemo>' : '';

		if ( ! empty( $BillingInfo ) ) {
			$XMLRequest .= '<billingInfo xmlns="">';
			$XMLRequest .= $BillingFirstName != '' ? '<firstName xmlns="">' . $BillingFirstName . '</firstName>' : '';
			$XMLRequest .= $BillingLastName != '' ? '<lastName xmlns="">' . $BillingLastName . '</lastName>' : '';
			$XMLRequest .= $BillingBusinessName != '' ? '<businessName xmlns="">' . $BillingBusinessName . '</businessName>' : '';
			$XMLRequest .= $BillingPhone != '' ? '<phone xmlns="">' . $BillingPhone . '</phone>' : '';
			$XMLRequest .= $BillingFax != '' ? '<fax xmlns="">' . $BillingFax . '</fax>' : '';
			$XMLRequest .= $BillingWebsite != '' ? '<website xmlns="">' . $BillingWebsite . '</website>' : '';
			$XMLRequest .= $BillingCustom != '' ? '<customValue xmlns="">' . $BillingCustom . '</customValue>' : '';

			if ( ! empty( $BillingInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $BillingInfoAddressLine1 != '' ? '<line1 xmlns="">' . $BillingInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $BillingInfoAddressLine2 != '' ? '<line2 xmlns="">' . $BillingInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $BillingInfoAddressCity != '' ? '<city xmlns="">' . $BillingInfoAddressCity . '</city>' : '';
				$XMLRequest .= $BillingInfoAddressState != '' ? '<state xmlns="">' . $BillingInfoAddressState . '</state>' : '';
				$XMLRequest .= $BillingInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $BillingInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $BillingInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $BillingInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $BillingInfoAddressType != '' ? '<type xmlns="">' . $BillingInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</billingInfo>';
		}

		if ( ! empty( $ShippingInfo ) ) {
			$XMLRequest .= '<shippingInfo xmlns="">';
			$XMLRequest .= $ShippingFirstName != '' ? '<firstName xmlns="">' . $ShippingFirstName . '</firstName>' : '';
			$XMLRequest .= $ShippingLastName != '' ? '<lastName xmlns="">' . $ShippingLastName . '</lastName>' : '';
			$XMLRequest .= $ShippingBusinessName != '' ? '<businessName xmlns="">' . $ShippingBusinessName . '</businessName>' : '';
			$XMLRequest .= $ShippingPhone != '' ? '<phone xmlns="">' . $ShippingPhone . '</phone>' : '';
			$XMLRequest .= $ShippingFax != '' ? '<fax xmlns="">' . $ShippingFax . '</fax>' : '';
			$XMLRequest .= $ShippingWebsite != '' ? '<website xmlns="">' . $ShippingWebsite . '</website>' : '';
			$XMLRequest .= $ShippingCustom != '' ? '<customValue xmlns="">' . $ShippingCustom . '</customValue>' : '';

			if ( ! empty( $ShippingInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $ShippingInfoAddressLine1 != '' ? '<line1 xmlns="">' . $ShippingInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $ShippingInfoAddressLine2 != '' ? '<line2 xmlns="">' . $ShippingInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $ShippingInfoAddressCity != '' ? '<city xmlns="">' . $ShippingInfoAddressCity . '</city>' : '';
				$XMLRequest .= $ShippingInfoAddressState != '' ? '<state xmlns="">' . $ShippingInfoAddressState . '</state>' : '';
				$XMLRequest .= $ShippingInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $ShippingInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $ShippingInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $ShippingInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $ShippingInfoAddressType != '' ? '<type xmlns="">' . $ShippingInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</shippingInfo>';
		}

		$XMLRequest .= $ShippingAmount != '' ? '<shippingAmount xmlns="">' . $ShippingAmount . '</shippingAmount>' : '';
		$XMLRequest .= $ShippingTaxName != '' ? '<shippingTaxName xmlns="">' . $ShippingTaxName . '</shippingTaxName>' : '';
		$XMLRequest .= $ShippingTaxRate != '' ? '<shippingTaxRate xmlns="">' . $ShippingTaxRate . '</shippingTaxRate>' : '';
		$XMLRequest .= $LogoURL != '' ? '<logoUrl xmlns="">' . $LogoURL . '</logoUrl>' : '';
		$XMLRequest .= '<referrerCode xmlns="">' . $this->APIButtonSource . '</referrerCode>';
		$XMLRequest .= '</invoice>';
		$XMLRequest .= '</CreateInvoiceRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'CreateInvoice' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceNumber' => $InvoiceNumber,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit SendInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param string $InvoiceID Invoice ID of the invoice to be sent.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function SendInvoice( $InvoiceID ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<SendInvoiceRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';
		$XMLRequest .= '</SendInvoiceRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'SendInvoice' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID  = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceURL = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit CreateAndSendInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function CreateAndSendInvoice( $DataArray ) {
		$CreateInvoiceFields = isset( $DataArray['CreateInvoiceFields'] ) ? $DataArray['CreateInvoiceFields'] : array();
		$MerchantEmail       = isset( $CreateInvoiceFields['MerchantEmail'] ) ? $CreateInvoiceFields['MerchantEmail'] : '';
		$PayerEmail          = isset( $CreateInvoiceFields['PayerEmail'] ) ? $CreateInvoiceFields['PayerEmail'] : '';
		$Number              = isset( $CreateInvoiceFields['Number'] ) ? $CreateInvoiceFields['Number'] : '';
		$CurrencyCode        = isset( $CreateInvoiceFields['CurrencyCode'] ) ? $CreateInvoiceFields['CurrencyCode'] : '';
		$InvoiceDate         = isset( $CreateInvoiceFields['InvoiceDate'] ) ? $CreateInvoiceFields['InvoiceDate'] : '';
		$DueDate             = isset( $CreateInvoiceFields['DueDate'] ) ? $CreateInvoiceFields['DueDate'] : '';
		$PaymentTerms        = isset( $CreateInvoiceFields['PaymentTerms'] ) ? $CreateInvoiceFields['PaymentTerms'] : '';
		$DiscountPercent     = isset( $CreateInvoiceFields['DiscountPercent'] ) ? $CreateInvoiceFields['DiscountPercent'] : '';
		$DiscountAmount      = isset( $CreateInvoiceFields['DiscountAmount'] ) ? $CreateInvoiceFields['DiscountAmount'] : '';
		$Terms               = isset( $CreateInvoiceFields['Terms'] ) ? $CreateInvoiceFields['Terms'] : '';
		$Note                = isset( $CreateInvoiceFields['Note'] ) ? $CreateInvoiceFields['Note'] : '';
		$MerchantMemo        = isset( $CreateInvoiceFields['MerchantMemo'] ) ? $CreateInvoiceFields['MerchantMemo'] : '';
		$ShippingAmount      = isset( $CreateInvoiceFields['ShippingAmount'] ) ? $CreateInvoiceFields['ShippingAmount'] : '';
		$ShippingTaxName     = isset( $CreateInvoiceFields['ShippingTaxName'] ) ? $CreateInvoiceFields['ShippingTaxName'] : '';
		$ShippingTaxRate     = isset( $CreateInvoiceFields['ShippingTaxRate'] ) ? $CreateInvoiceFields['ShippingTaxRate'] : '';
		$LogoURL             = isset( $CreateInvoiceFields['LogoURL'] ) ? $CreateInvoiceFields['LogoURL'] : '';

		$BusinessInfo         = isset( $DataArray['BusinessInfo'] ) ? $DataArray['BusinessInfo'] : array();
		$BusinessFirstName    = isset( $BusinessInfo['FirstName'] ) ? $BusinessInfo['FirstName'] : '';
		$BusinessLastName     = isset( $BusinessInfo['LastName'] ) ? $BusinessInfo['LastName'] : '';
		$BusinessBusinessName = isset( $BusinessInfo['BusinessName'] ) ? $BusinessInfo['BusinessName'] : '';
		$BusinessPhone        = isset( $BusinessInfo['Phone'] ) ? $BusinessInfo['Phone'] : '';
		$BusinessFax          = isset( $BusinessInfo['Fax'] ) ? $BusinessInfo['Fax'] : '';
		$BusinessWebsite      = isset( $BusinessInfo['Website'] ) ? $BusinessInfo['Website'] : '';
		$BusinessCustom       = isset( $BusinessInfo['Custom'] ) ? $BusinessInfo['Custom'] : '';

		$BusinessInfoAddress            = isset( $DataArray['BusinessInfoAddress'] ) ? $DataArray['BusinessInfoAddress'] : array();
		$BusinessInfoAddressLine1       = isset( $BusinessInfoAddress['Line1'] ) ? $BusinessInfoAddress['Line1'] : '';
		$BusinessInfoAddressLine2       = isset( $BusinessInfoAddress['Line2'] ) ? $BusinessInfoAddress['Line2'] : '';
		$BusinessInfoAddressCity        = isset( $BusinessInfoAddress['City'] ) ? $BusinessInfoAddress['City'] : '';
		$BusinessInfoAddressState       = isset( $BusinessInfoAddress['State'] ) ? $BusinessInfoAddress['State'] : '';
		$BusinessInfoAddressPostalCode  = isset( $BusinessInfoAddress['PostalCode'] ) ? $BusinessInfoAddress['PostalCode'] : '';
		$BusinessInfoAddressCountryCode = isset( $BusinessInfoAddress['CountryCode'] ) ? $BusinessInfoAddress['CountryCode'] : '';
		$BusinessInfoAddressType        = isset( $BusinessInfoAddress['AddressType'] ) ? $BusinessInfoAddress['AddressType'] : '';

		$BillingInfo         = isset( $DataArray['BillingInfo'] ) ? $DataArray['BillingInfo'] : array();
		$BillingFirstName    = isset( $BillingInfo['FirstName'] ) ? $BillingInfo['FirstName'] : '';
		$BillingLastName     = isset( $BillingInfo['LastName'] ) ? $BillingInfo['LastName'] : '';
		$BillingBusinessName = isset( $BillingInfo['BusinessName'] ) ? $BillingInfo['BusinessName'] : '';
		$BillingPhone        = isset( $BillingInfo['Phone'] ) ? $BillingInfo['Phone'] : '';
		$BillingFax          = isset( $BillingInfo['Fax'] ) ? $BillingInfo['Fax'] : '';
		$BillingWebsite      = isset( $BillingInfo['Website'] ) ? $BillingInfo['Website'] : '';
		$BillingCustom       = isset( $BillingInfo['Custom'] ) ? $BillingInfo['Custom'] : '';

		$BillingInfoAddress            = isset( $DataArray['BillingInfoAddress'] ) ? $DataArray['BillingInfoAddress'] : array();
		$BillingInfoAddressLine1       = isset( $BillingInfoAddress['Line1'] ) ? $BillingInfoAddress['Line1'] : '';
		$BillingInfoAddressLine2       = isset( $BillingInfoAddress['Line2'] ) ? $BillingInfoAddress['Line2'] : '';
		$BillingInfoAddressCity        = isset( $BillingInfoAddress['City'] ) ? $BillingInfoAddress['City'] : '';
		$BillingInfoAddressState       = isset( $BillingInfoAddress['State'] ) ? $BillingInfoAddress['State'] : '';
		$BillingInfoAddressPostalCode  = isset( $BillingInfoAddress['PostalCode'] ) ? $BillingInfoAddress['PostalCode'] : '';
		$BillingInfoAddressCountryCode = isset( $BillingInfoAddress['CountryCode'] ) ? $BillingInfoAddress['CountryCode'] : '';
		$BillingInfoAddressType        = isset( $BillingInfoAddress['AddressType'] ) ? $BillingInfoAddress['AddressType'] : '';

		$ShippingInfo         = isset( $DataArray['ShippingInfo'] ) ? $DataArray['ShippingInfo'] : array();
		$ShippingFirstName    = isset( $ShippingInfo['FirstName'] ) ? $ShippingInfo['FirstName'] : '';
		$ShippingLastName     = isset( $ShippingInfo['LastName'] ) ? $ShippingInfo['LastName'] : '';
		$ShippingBusinessName = isset( $ShippingInfo['BusinessName'] ) ? $ShippingInfo['BusinessName'] : '';
		$ShippingPhone        = isset( $ShippingInfo['Phone'] ) ? $ShippingInfo['Phone'] : '';
		$ShippingFax          = isset( $ShippingInfo['Fax'] ) ? $ShippingInfo['Fax'] : '';
		$ShippingWebsite      = isset( $ShippingInfo['Website'] ) ? $ShippingInfo['Website'] : '';
		$ShippingCustom       = isset( $ShippingInfo['Custom'] ) ? $ShippingInfo['Custom'] : '';

		$ShippingInfoAddress            = isset( $DataArray['ShippingInfoAddress'] ) ? $DataArray['ShippingInfoAddress'] : array();
		$ShippingInfoAddressLine1       = isset( $ShippingInfoAddress['Line1'] ) ? $ShippingInfoAddress['Line1'] : '';
		$ShippingInfoAddressLine2       = isset( $ShippingInfoAddress['Line2'] ) ? $ShippingInfoAddress['Line2'] : '';
		$ShippingInfoAddressCity        = isset( $ShippingInfoAddress['City'] ) ? $ShippingInfoAddress['City'] : '';
		$ShippingInfoAddressState       = isset( $ShippingInfoAddress['State'] ) ? $ShippingInfoAddress['State'] : '';
		$ShippingInfoAddressPostalCode  = isset( $ShippingInfoAddress['PostalCode'] ) ? $ShippingInfoAddress['PostalCode'] : '';
		$ShippingInfoAddressCountryCode = isset( $ShippingInfoAddress['CountryCode'] ) ? $ShippingInfoAddress['CountryCode'] : '';
		$ShippingInfoAddressType        = isset( $ShippingInfoAddress['AddressType'] ) ? $ShippingInfoAddress['AddressType'] : '';

		$InvoiceItems = isset( $DataArray['InvoiceItems'] ) ? $DataArray['InvoiceItems'] : array();

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<CreateAndSendInvoiceRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= '<invoice xmlns="">';
		$XMLRequest .= $MerchantEmail != '' ? '<merchantEmail xmlns="">' . $MerchantEmail . '</merchantEmail>' : '';
		$XMLRequest .= $PayerEmail != '' ? '<payerEmail xmlns="">' . $PayerEmail . '</payerEmail>' : '';
		$XMLRequest .= $Number != '' ? '<number xmlns="">' . $Number . '</number>' : '';

		if ( ! empty( $BusinessInfo ) ) {
			$XMLRequest .= '<merchantInfo xmlns="">';
			$XMLRequest .= $BusinessFirstName != '' ? '<firstName xmlns="">' . $BusinessFirstName . '</firstName>' : '';
			$XMLRequest .= $BusinessLastName != '' ? '<lastName xmlns="">' . $BusinessLastName . '</lastName>' : '';
			$XMLRequest .= $BusinessBusinessName != '' ? '<businessName xmlns="">' . $BusinessBusinessName . '</businessName>' : '';
			$XMLRequest .= $BusinessPhone != '' ? '<phone xmlns="">' . $BusinessPhone . '</phone>' : '';
			$XMLRequest .= $BusinessFax != '' ? '<fax xmlns="">' . $BusinessFax . '</fax>' : '';
			$XMLRequest .= $BusinessWebsite != '' ? '<website xmlns="">' . $BusinessWebsite . '</website>' : '';
			$XMLRequest .= $BusinessCustom != '' ? '<customValue xmlns="">' . $BusinessCustom . '</customValue>' : '';

			if ( ! empty( $BusinessInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $BusinessInfoAddressLine1 != '' ? '<line1 xmlns="">' . $BusinessInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $BusinessInfoAddressLine2 != '' ? '<line2 xmlns="">' . $BusinessInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $BusinessInfoAddressCity != '' ? '<city xmlns="">' . $BusinessInfoAddressCity . '</city>' : '';
				$XMLRequest .= $BusinessInfoAddressState != '' ? '<state xmlns="">' . $BusinessInfoAddressState . '</state>' : '';
				$XMLRequest .= $BusinessInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $BusinessInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $BusinessInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $BusinessInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $BusinessInfoAddressType != '' ? '<type xmlns="">' . $BusinessInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</merchantInfo>';
		}

		if ( ! empty( $InvoiceItems ) ) {
			$XMLRequest .= '<itemList xmlns="">';
			foreach ( $InvoiceItems as $InvoiceItem ) {
				$XMLRequest .= '<item xmlns="">';
				$XMLRequest .= $InvoiceItem['Name'] != '' ? '<name xmlns="">' . $InvoiceItem['Name'] . '</name>' : '';
				$XMLRequest .= $InvoiceItem['Description'] != '' ? '<description xmlns="">' . $InvoiceItem['Description'] . '</description>' : '';
				$XMLRequest .= $InvoiceItem['Date'] != '' ? '<date xmlns="">' . $InvoiceItem['Date'] . '</date>' : '';
				$XMLRequest .= $InvoiceItem['Quantity'] != '' ? '<quantity xmlns="">' . $InvoiceItem['Quantity'] . '</quantity>' : '';
				$XMLRequest .= $InvoiceItem['UnitPrice'] != '' ? '<unitPrice xmlns="">' . $InvoiceItem['UnitPrice'] . '</unitPrice>' : '';
				$XMLRequest .= $InvoiceItem['TaxName'] != '' ? '<taxName xmlns="">' . $InvoiceItem['TaxName'] . '</taxName>' : '';
				$XMLRequest .= $InvoiceItem['TaxRate'] != '' ? '<taxRate xmlns="">' . $InvoiceItem['TaxRate'] . '</taxRate>' : '';
				$XMLRequest .= '</item>';
			}
			$XMLRequest .= '</itemList>';
		}

		$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
		$XMLRequest .= $InvoiceDate != '' ? '<invoiceDate xmlns="">' . $InvoiceDate . '</invoiceDate>' : '';
		$XMLRequest .= $DueDate != '' ? '<dueDate xmlns="">' . $DueDate . '</dueDate>' : '';
		$XMLRequest .= $PaymentTerms != '' ? '<paymentTerms xmlns="">' . $PaymentTerms . '</paymentTerms>' : '';
		$XMLRequest .= $DiscountPercent != '' ? '<discountPercent xmlns="">' . $DiscountPercent . '</discountPercent>' : '';
		$XMLRequest .= $DiscountAmount != '' ? '<discountAmount xmlns="">' . $DiscountAmount . '</discountAmount>' : '';
		$XMLRequest .= $Terms != '' ? '<terms xmlns="">' . $Terms . '</terms>' : '';
		$XMLRequest .= $Note != '' ? '<note xmlns="">' . $Note . '</note>' : '';
		$XMLRequest .= $MerchantMemo != '' ? '<merchantMemo xmlns="">' . $MerchantMemo . '</merchantMemo>' : '';

		if ( ! empty( $BillingInfo ) ) {
			$XMLRequest .= '<billingInfo xmlns="">';
			$XMLRequest .= $BillingFirstName != '' ? '<firstName xmlns="">' . $BillingFirstName . '</firstName>' : '';
			$XMLRequest .= $BillingLastName != '' ? '<lastName xmlns="">' . $BillingLastName . '</lastName>' : '';
			$XMLRequest .= $BillingBusinessName != '' ? '<businessName xmlns="">' . $BillingBusinessName . '</businessName>' : '';
			$XMLRequest .= $BillingPhone != '' ? '<phone xmlns="">' . $BillingPhone . '</phone>' : '';
			$XMLRequest .= $BillingFax != '' ? '<fax xmlns="">' . $BillingFax . '</fax>' : '';
			$XMLRequest .= $BillingWebsite != '' ? '<website xmlns="">' . $BillingWebsite . '</website>' : '';
			$XMLRequest .= $BillingCustom != '' ? '<customValue xmlns="">' . $BillingCustom . '</customValue>' : '';

			if ( ! empty( $BillingInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $BillingInfoAddressLine1 != '' ? '<line1 xmlns="">' . $BillingInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $BillingInfoAddressLine2 != '' ? '<line2 xmlns="">' . $BillingInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $BillingInfoAddressCity != '' ? '<city xmlns="">' . $BillingInfoAddressCity . '</city>' : '';
				$XMLRequest .= $BillingInfoAddressState != '' ? '<state xmlns="">' . $BillingInfoAddressState . '</state>' : '';
				$XMLRequest .= $BillingInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $BillingInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $BillingInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $BillingInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $BillingInfoAddressType != '' ? '<type xmlns="">' . $BillingInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</billingInfo>';
		}

		if ( ! empty( $ShippingInfo ) ) {
			$XMLRequest .= '<shippingInfo xmlns="">';
			$XMLRequest .= $ShippingFirstName != '' ? '<firstName xmlns="">' . $ShippingFirstName . '</firstName>' : '';
			$XMLRequest .= $ShippingLastName != '' ? '<lastName xmlns="">' . $ShippingLastName . '</lastName>' : '';
			$XMLRequest .= $ShippingBusinessName != '' ? '<businessName xmlns="">' . $ShippingBusinessName . '</businessName>' : '';
			$XMLRequest .= $ShippingPhone != '' ? '<phone xmlns="">' . $ShippingPhone . '</phone>' : '';
			$XMLRequest .= $ShippingFax != '' ? '<fax xmlns="">' . $ShippingFax . '</fax>' : '';
			$XMLRequest .= $ShippingWebsite != '' ? '<website xmlns="">' . $ShippingWebsite . '</website>' : '';
			$XMLRequest .= $ShippingCustom != '' ? '<customValue xmlns="">' . $ShippingCustom . '</customValue>' : '';

			if ( ! empty( $ShippingInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $ShippingInfoAddressLine1 != '' ? '<line1 xmlns="">' . $ShippingInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $ShippingInfoAddressLine2 != '' ? '<line2 xmlns="">' . $ShippingInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $ShippingInfoAddressCity != '' ? '<city xmlns="">' . $ShippingInfoAddressCity . '</city>' : '';
				$XMLRequest .= $ShippingInfoAddressState != '' ? '<state xmlns="">' . $ShippingInfoAddressState . '</state>' : '';
				$XMLRequest .= $ShippingInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $ShippingInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $ShippingInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $ShippingInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $ShippingInfoAddressType != '' ? '<type xmlns="">' . $ShippingInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</shippingInfo>';
		}

		$XMLRequest .= $ShippingAmount != '' ? '<shippingAmount xmlns="">' . $ShippingAmount . '</shippingAmount>' : '';
		$XMLRequest .= $ShippingTaxName != '' ? '<shippingTaxName xmlns="">' . $ShippingTaxName . '</shippingTaxName>' : '';
		$XMLRequest .= $ShippingTaxRate != '' ? '<shippingTaxRate xmlns="">' . $ShippingTaxRate . '</shippingTaxRate>' : '';
		$XMLRequest .= $LogoURL != '' ? '<logoUrl xmlns="">' . $LogoURL . '</logoUrl>' : '';
		$XMLRequest .= '<referrerCode xmlns="">' . $this->APIButtonSource . '</referrerCode>';
		$XMLRequest .= '</invoice>';
		$XMLRequest .= '</CreateAndSendInvoiceRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'CreateAndSendInvoice' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceNumber' => $InvoiceNumber,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit UpdateInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function UpdateInvoice( $DataArray ) {
		$UpdateInvoiceFields = isset( $DataArray['UpdateInvoiceFields'] ) ? $DataArray['UpdateInvoiceFields'] : array();
		$InvoiceID           = isset( $UpdateInvoiceFields['InvoiceID'] ) ? $UpdateInvoiceFields['InvoiceID'] : '';
		$MerchantEmail       = isset( $UpdateInvoiceFields['MerchantEmail'] ) ? $UpdateInvoiceFields['MerchantEmail'] : '';
		$PayerEmail          = isset( $UpdateInvoiceFields['PayerEmail'] ) ? $UpdateInvoiceFields['PayerEmail'] : '';
		$Number              = isset( $UpdateInvoiceFields['Number'] ) ? $UpdateInvoiceFields['Number'] : '';
		$CurrencyCode        = isset( $UpdateInvoiceFields['CurrencyCode'] ) ? $UpdateInvoiceFields['CurrencyCode'] : '';
		$InvoiceDate         = isset( $UpdateInvoiceFields['InvoiceDate'] ) ? $UpdateInvoiceFields['InvoiceDate'] : '';
		$DueDate             = isset( $UpdateInvoiceFields['DueDate'] ) ? $UpdateInvoiceFields['DueDate'] : '';
		$PaymentTerms        = isset( $UpdateInvoiceFields['PaymentTerms'] ) ? $UpdateInvoiceFields['PaymentTerms'] : '';
		$DiscountPercent     = isset( $UpdateInvoiceFields['DiscountPercent'] ) ? $UpdateInvoiceFields['DiscountPercent'] : '';
		$DiscountAmount      = isset( $UpdateInvoiceFields['DiscountAmount'] ) ? $UpdateInvoiceFields['DiscountAmount'] : '';
		$Terms               = isset( $UpdateInvoiceFields['Terms'] ) ? $UpdateInvoiceFields['Terms'] : '';
		$Note                = isset( $UpdateInvoiceFields['Note'] ) ? $UpdateInvoiceFields['Note'] : '';
		$MerchantMemo        = isset( $UpdateInvoiceFields['MerchantMemo'] ) ? $UpdateInvoiceFields['MerchantMemo'] : '';
		$ShippingAmount      = isset( $UpdateInvoiceFields['ShippingAmount'] ) ? $UpdateInvoiceFields['ShippingAmount'] : '';
		$ShippingTaxName     = isset( $UpdateInvoiceFields['ShippingTaxName'] ) ? $UpdateInvoiceFields['ShippingTaxName'] : '';
		$ShippingTaxRate     = isset( $UpdateInvoiceFields['ShippingTaxRate'] ) ? $UpdateInvoiceFields['ShippingTaxRate'] : '';
		$LogoURL             = isset( $UpdateInvoiceFields['LogoURL'] ) ? $UpdateInvoiceFields['LogoURL'] : '';

		$BusinessInfo         = isset( $DataArray['BusinessInfo'] ) ? $DataArray['BusinessInfo'] : array();
		$BusinessFirstName    = isset( $BusinessInfo['FirstName'] ) ? $BusinessInfo['FirstName'] : '';
		$BusinessLastName     = isset( $BusinessInfo['LastName'] ) ? $BusinessInfo['LastName'] : '';
		$BusinessBusinessName = isset( $BusinessInfo['BusinessName'] ) ? $BusinessInfo['BusinessName'] : '';
		$BusinessPhone        = isset( $BusinessInfo['Phone'] ) ? $BusinessInfo['Phone'] : '';
		$BusinessFax          = isset( $BusinessInfo['Fax'] ) ? $BusinessInfo['Fax'] : '';
		$BusinessWebsite      = isset( $BusinessInfo['Website'] ) ? $BusinessInfo['Website'] : '';
		$BusinessCustom       = isset( $BusinessInfo['Custom'] ) ? $BusinessInfo['Custom'] : '';

		$BusinessInfoAddress            = isset( $DataArray['BusinessInfoAddress'] ) ? $DataArray['BusinessInfoAddress'] : array();
		$BusinessInfoAddressLine1       = isset( $BusinessInfoAddress['Line1'] ) ? $BusinessInfoAddress['Line1'] : '';
		$BusinessInfoAddressLine2       = isset( $BusinessInfoAddress['Line2'] ) ? $BusinessInfoAddress['Line2'] : '';
		$BusinessInfoAddressCity        = isset( $BusinessInfoAddress['City'] ) ? $BusinessInfoAddress['City'] : '';
		$BusinessInfoAddressState       = isset( $BusinessInfoAddress['State'] ) ? $BusinessInfoAddress['State'] : '';
		$BusinessInfoAddressPostalCode  = isset( $BusinessInfoAddress['PostalCode'] ) ? $BusinessInfoAddress['PostalCode'] : '';
		$BusinessInfoAddressCountryCode = isset( $BusinessInfoAddress['CountryCode'] ) ? $BusinessInfoAddress['CountryCode'] : '';
		$BusinessInfoAddressType        = isset( $BusinessInfoAddress['AddressType'] ) ? $BusinessInfoAddress['AddressType'] : '';

		$BillingInfo         = isset( $DataArray['BillingInfo'] ) ? $DataArray['BillingInfo'] : array();
		$BillingFirstName    = isset( $BillingInfo['FirstName'] ) ? $BillingInfo['FirstName'] : '';
		$BillingLastName     = isset( $BillingInfo['LastName'] ) ? $BillingInfo['LastName'] : '';
		$BillingBusinessName = isset( $BillingInfo['BusinessName'] ) ? $BillingInfo['BusinessName'] : '';
		$BillingPhone        = isset( $BillingInfo['Phone'] ) ? $BillingInfo['Phone'] : '';
		$BillingFax          = isset( $BillingInfo['Fax'] ) ? $BillingInfo['Fax'] : '';
		$BillingWebsite      = isset( $BillingInfo['Website'] ) ? $BillingInfo['Website'] : '';
		$BillingCustom       = isset( $BillingInfo['Custom'] ) ? $BillingInfo['Custom'] : '';

		$BillingInfoAddress            = isset( $DataArray['BillingInfoAddress'] ) ? $DataArray['BillingInfoAddress'] : array();
		$BillingInfoAddressLine1       = isset( $BillingInfoAddress['Line1'] ) ? $BillingInfoAddress['Line1'] : '';
		$BillingInfoAddressLine2       = isset( $BillingInfoAddress['Line2'] ) ? $BillingInfoAddress['Line2'] : '';
		$BillingInfoAddressCity        = isset( $BillingInfoAddress['City'] ) ? $BillingInfoAddress['City'] : '';
		$BillingInfoAddressState       = isset( $BillingInfoAddress['State'] ) ? $BillingInfoAddress['State'] : '';
		$BillingInfoAddressPostalCode  = isset( $BillingInfoAddress['PostalCode'] ) ? $BillingInfoAddress['PostalCode'] : '';
		$BillingInfoAddressCountryCode = isset( $BillingInfoAddress['CountryCode'] ) ? $BillingInfoAddress['CountryCode'] : '';
		$BillingInfoAddressType        = isset( $BillingInfoAddress['AddressType'] ) ? $BillingInfoAddress['AddressType'] : '';

		$ShippingInfo         = isset( $DataArray['ShippingInfo'] ) ? $DataArray['ShippingInfo'] : array();
		$ShippingFirstName    = isset( $ShippingInfo['FirstName'] ) ? $ShippingInfo['FirstName'] : '';
		$ShippingLastName     = isset( $ShippingInfo['LastName'] ) ? $ShippingInfo['LastName'] : '';
		$ShippingBusinessName = isset( $ShippingInfo['BusinessName'] ) ? $ShippingInfo['BusinessName'] : '';
		$ShippingPhone        = isset( $ShippingInfo['Phone'] ) ? $ShippingInfo['Phone'] : '';
		$ShippingFax          = isset( $ShippingInfo['Fax'] ) ? $ShippingInfo['Fax'] : '';
		$ShippingWebsite      = isset( $ShippingInfo['Website'] ) ? $ShippingInfo['Website'] : '';
		$ShippingCustom       = isset( $ShippingInfo['Custom'] ) ? $ShippingInfo['Custom'] : '';

		$ShippingInfoAddress            = isset( $DataArray['ShippingInfoAddress'] ) ? $DataArray['ShippingInfoAddress'] : array();
		$ShippingInfoAddressLine1       = isset( $ShippingInfoAddress['Line1'] ) ? $ShippingInfoAddress['Line1'] : '';
		$ShippingInfoAddressLine2       = isset( $ShippingInfoAddress['Line2'] ) ? $ShippingInfoAddress['Line2'] : '';
		$ShippingInfoAddressCity        = isset( $ShippingInfoAddress['City'] ) ? $ShippingInfoAddress['City'] : '';
		$ShippingInfoAddressState       = isset( $ShippingInfoAddress['State'] ) ? $ShippingInfoAddress['State'] : '';
		$ShippingInfoAddressPostalCode  = isset( $ShippingInfoAddress['PostalCode'] ) ? $ShippingInfoAddress['PostalCode'] : '';
		$ShippingInfoAddressCountryCode = isset( $ShippingInfoAddress['CountryCode'] ) ? $ShippingInfoAddress['CountryCode'] : '';
		$ShippingInfoAddressType        = isset( $ShippingInfoAddress['AddressType'] ) ? $ShippingInfoAddress['AddressType'] : '';

		$InvoiceItems = isset( $DataArray['InvoiceItems'] ) ? $DataArray['InvoiceItems'] : array();

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<UpdateInvoiceRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';
		$XMLRequest .= '<invoice xmlns="">';
		$XMLRequest .= $MerchantEmail != '' ? '<merchantEmail xmlns="">' . $MerchantEmail . '</merchantEmail>' : '';
		$XMLRequest .= $PayerEmail != '' ? '<payerEmail xmlns="">' . $PayerEmail . '</payerEmail>' : '';
		$XMLRequest .= $Number != '' ? '<number xmlns="">' . $Number . '</number>' : '';

		if ( ! empty( $BusinessInfo ) ) {
			$XMLRequest .= '<merchantInfo xmlns="">';
			$XMLRequest .= $BusinessFirstName != '' ? '<firstName xmlns="">' . $BusinessFirstName . '</firstName>' : '';
			$XMLRequest .= $BusinessLastName != '' ? '<lastName xmlns="">' . $BusinessLastName . '</lastName>' : '';
			$XMLRequest .= $BusinessBusinessName != '' ? '<businessName xmlns="">' . $BusinessBusinessName . '</businessName>' : '';
			$XMLRequest .= $BusinessPhone != '' ? '<phone xmlns="">' . $BusinessPhone . '</phone>' : '';
			$XMLRequest .= $BusinessFax != '' ? '<fax xmlns="">' . $BusinessFax . '</fax>' : '';
			$XMLRequest .= $BusinessWebsite != '' ? '<website xmlns="">' . $BusinessWebsite . '</website>' : '';
			$XMLRequest .= $BusinessCustom != '' ? '<customValue xmlns="">' . $BusinessCustom . '</customValue>' : '';

			if ( ! empty( $BusinessInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $BusinessInfoAddressLine1 != '' ? '<line1 xmlns="">' . $BusinessInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $BusinessInfoAddressLine2 != '' ? '<line2 xmlns="">' . $BusinessInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $BusinessInfoAddressCity != '' ? '<city xmlns="">' . $BusinessInfoAddressCity . '</city>' : '';
				$XMLRequest .= $BusinessInfoAddressState != '' ? '<state xmlns="">' . $BusinessInfoAddressState . '</state>' : '';
				$XMLRequest .= $BusinessInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $BusinessInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $BusinessInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $BusinessInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $BusinessInfoAddressType != '' ? '<type xmlns="">' . $BusinessInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</merchantInfo>';
		}

		if ( ! empty( $InvoiceItems ) ) {
			$XMLRequest .= '<itemList xmlns="">';
			foreach ( $InvoiceItems as $InvoiceItem ) {
				$XMLRequest .= '<item xmlns="">';
				$XMLRequest .= $InvoiceItem['Name'] != '' ? '<name xmlns="">' . $InvoiceItem['Name'] . '</name>' : '';
				$XMLRequest .= $InvoiceItem['Description'] != '' ? '<description xmlns="">' . $InvoiceItem['Description'] . '</description>' : '';
				$XMLRequest .= $InvoiceItem['Date'] != '' ? '<date xmlns="">' . $InvoiceItem['Date'] . '</date>' : '';
				$XMLRequest .= $InvoiceItem['Quantity'] != '' ? '<quantity xmlns="">' . $InvoiceItem['Quantity'] . '</quantity>' : '';
				$XMLRequest .= $InvoiceItem['UnitPrice'] != '' ? '<unitPrice xmlns="">' . $InvoiceItem['UnitPrice'] . '</unitPrice>' : '';
				$XMLRequest .= $InvoiceItem['TaxName'] != '' ? '<taxName xmlns="">' . $InvoiceItem['TaxName'] . '</taxName>' : '';
				$XMLRequest .= $InvoiceItem['TaxRate'] != '' ? '<taxRate xmlns="">' . $InvoiceItem['TaxRate'] . '</taxRate>' : '';
				$XMLRequest .= '</item>';
			}
			$XMLRequest .= '</itemList>';
		}

		$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
		$XMLRequest .= $InvoiceDate != '' ? '<invoiceDate xmlns="">' . $InvoiceDate . '</invoiceDate>' : '';
		$XMLRequest .= $DueDate != '' ? '<dueDate xmlns="">' . $DueDate . '</dueDate>' : '';
		$XMLRequest .= $PaymentTerms != '' ? '<paymentTerms xmlns="">' . $PaymentTerms . '</paymentTerms>' : '';
		$XMLRequest .= $DiscountPercent != '' ? '<discountPercent xmlns="">' . $DiscountPercent . '</discountPercent>' : '';
		$XMLRequest .= $DiscountAmount != '' ? '<discountAmount xmlns="">' . $DiscountAmount . '</discountAmount>' : '';
		$XMLRequest .= $Terms != '' ? '<terms xmlns="">' . $Terms . '</terms>' : '';
		$XMLRequest .= $Note != '' ? '<note xmlns="">' . $Note . '</note>' : '';
		$XMLRequest .= $MerchantMemo != '' ? '<merchantMemo xmlns="">' . $MerchantMemo . '</merchantMemo>' : '';

		if ( ! empty( $BillingInfo ) ) {
			$XMLRequest .= '<billingInfo xmlns="">';
			$XMLRequest .= $BillingFirstName != '' ? '<firstName xmlns="">' . $BillingFirstName . '</firstName>' : '';
			$XMLRequest .= $BillingLastName != '' ? '<lastName xmlns="">' . $BillingLastName . '</lastName>' : '';
			$XMLRequest .= $BillingBusinessName != '' ? '<businessName xmlns="">' . $BillingBusinessName . '</businessName>' : '';
			$XMLRequest .= $BillingPhone != '' ? '<phone xmlns="">' . $BillingPhone . '</phone>' : '';
			$XMLRequest .= $BillingFax != '' ? '<fax xmlns="">' . $BillingFax . '</fax>' : '';
			$XMLRequest .= $BillingWebsite != '' ? '<website xmlns="">' . $BillingWebsite . '</website>' : '';
			$XMLRequest .= $BillingCustom != '' ? '<customValue xmlns="">' . $BillingCustom . '</customValue>' : '';

			if ( ! empty( $BillingInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $BillingInfoAddressLine1 != '' ? '<line1 xmlns="">' . $BillingInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $BillingInfoAddressLine2 != '' ? '<line2 xmlns="">' . $BillingInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $BillingInfoAddressCity != '' ? '<city xmlns="">' . $BillingInfoAddressCity . '</city>' : '';
				$XMLRequest .= $BillingInfoAddressState != '' ? '<state xmlns="">' . $BillingInfoAddressState . '</state>' : '';
				$XMLRequest .= $BillingInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $BillingInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $BillingInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $BillingInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $BillingInfoAddressType != '' ? '<type xmlns="">' . $BillingInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</billingInfo>';
		}

		if ( ! empty( $ShippingInfo ) ) {
			$XMLRequest .= '<shippingInfo xmlns="">';
			$XMLRequest .= $ShippingFirstName != '' ? '<firstName xmlns="">' . $ShippingFirstName . '</firstName>' : '';
			$XMLRequest .= $ShippingLastName != '' ? '<lastName xmlns="">' . $ShippingLastName . '</lastName>' : '';
			$XMLRequest .= $ShippingBusinessName != '' ? '<businessName xmlns="">' . $ShippingBusinessName . '</businessName>' : '';
			$XMLRequest .= $ShippingPhone != '' ? '<phone xmlns="">' . $ShippingPhone . '</phone>' : '';
			$XMLRequest .= $ShippingFax != '' ? '<fax xmlns="">' . $ShippingFax . '</fax>' : '';
			$XMLRequest .= $ShippingWebsite != '' ? '<website xmlns="">' . $ShippingWebsite . '</website>' : '';
			$XMLRequest .= $ShippingCustom != '' ? '<customValue xmlns="">' . $ShippingCustom . '</customValue>' : '';

			if ( ! empty( $ShippingInfoAddress ) ) {
				$XMLRequest .= '<address xmlns="">';
				$XMLRequest .= $ShippingInfoAddressLine1 != '' ? '<line1 xmlns="">' . $ShippingInfoAddressLine1 . '</line1>' : '';
				$XMLRequest .= $ShippingInfoAddressLine2 != '' ? '<line2 xmlns="">' . $ShippingInfoAddressLine2 . '</line2>' : '';
				$XMLRequest .= $ShippingInfoAddressCity != '' ? '<city xmlns="">' . $ShippingInfoAddressCity . '</city>' : '';
				$XMLRequest .= $ShippingInfoAddressState != '' ? '<state xmlns="">' . $ShippingInfoAddressState . '</state>' : '';
				$XMLRequest .= $ShippingInfoAddressPostalCode != '' ? '<postalCode xmlns="">' . $ShippingInfoAddressPostalCode . '</postalCode>' : '';
				$XMLRequest .= $ShippingInfoAddressCountryCode != '' ? '<countryCode xmlns="">' . $ShippingInfoAddressCountryCode . '</countryCode>' : '';
				$XMLRequest .= $ShippingInfoAddressType != '' ? '<type xmlns="">' . $ShippingInfoAddressType . '</type>' : '';
				$XMLRequest .= '</address>';
			}
			$XMLRequest .= '</shippingInfo>';
		}

		$XMLRequest .= $ShippingAmount != '' ? '<shippingAmount xmlns="">' . $ShippingAmount . '</shippingAmount>' : '';
		$XMLRequest .= $ShippingTaxName != '' ? '<shippingTaxName xmlns="">' . $ShippingTaxName . '</shippingTaxName>' : '';
		$XMLRequest .= $ShippingTaxRate != '' ? '<shippingTaxRate xmlns="">' . $ShippingTaxRate . '</shippingTaxRate>' : '';
		$XMLRequest .= $LogoURL != '' ? '<logoUrl xmlns="">' . $LogoURL . '</logoUrl>' : '';
		$XMLRequest .= '</invoice>';
		$XMLRequest .= '</UpdateInvoiceRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'UpdateInvoice' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceNumber' => $InvoiceNumber,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit UpdateInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param string $InvoiceID Invoice ID of which you would like to obtain details.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetInvoiceDetails( $InvoiceID ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetInvoiceDetailsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';
		$XMLRequest .= '</GetInvoiceDetailsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'GetInvoiceDetails' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceURL = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$InvoiceType = $DOM->getElementsByTagName( 'invoice' )->length > 0 ? $DOM->getElementsByTagName( 'invoice' ) : array();
		foreach ( $InvoiceType as $Invoice ) {
			$MerchantEmail   = $Invoice->getElementsByTagName( 'merchantEmail' )->length > 0 ? $Invoice->getElementsByTagName( 'merchantEmail' )->item( 0 )->nodeValue : '';
			$PayerEmail      = $Invoice->getElementsByTagName( 'payerEmail' )->length > 0 ? $Invoice->getElementsByTagName( 'payerEmail' )->item( 0 )->nodeValue : '';
			$Number          = $Invoice->getElementsByTagName( 'number' )->length > 0 ? $Invoice->getElementsByTagName( 'number' )->item( 0 )->nodeValue : '';
			$CurrencyCode    = $Invoice->getElementsByTagName( 'currencyCode' )->length > 0 ? $Invoice->getElementsByTagName( 'currencyCode' )->item( 0 )->nodeValue : '';
			$InvoiceDate     = $Invoice->getElementsByTagName( 'invoiceDate' )->length > 0 ? $Invoice->getElementsByTagName( 'invoiceDate' )->item( 0 )->nodeValue : '';
			$DueDate         = $Invoice->getElementsByTagName( 'dueDate' )->length > 0 ? $Invoice->getElementsByTagName( 'dueDate' )->item( 0 )->nodeValue : '';
			$PaymentTerms    = $Invoice->getElementsByTagName( 'paymentTerms' )->length > 0 ? $Invoice->getElementsByTagName( 'paymentTerms' )->item( 0 )->nodeValue : '';
			$DiscountPercent = $Invoice->getElementsByTagName( 'discountPercent' )->length > 0 ? $Invoice->getElementsByTagName( 'discountPercent' )->item( 0 )->nodeValue : '';
			$DiscountAmount  = $Invoice->getElementsByTagName( 'discountAmount' )->length > 0 ? $Invoice->getElementsByTagName( 'discountAmount' )->item( 0 )->nodeValue : '';
			$Terms           = $Invoice->getElementsByTagName( 'terms' )->length > 0 ? $Invoice->getElementsByTagName( 'terms' )->item( 0 )->nodeValue : '';
			$InvoiceNote     = $Invoice->getElementsByTagName( 'note' )->length > 0 ? $Invoice->getElementsByTagName( 'note' )->item( 0 )->nodeValue : '';
			$MerchantMemo    = $Invoice->getElementsByTagName( 'merchantMemo' )->length > 0 ? $Invoice->getElementsByTagName( 'merchantMemo' )->item( 0 )->nodeValue : '';
			$ShippingAmount  = $Invoice->getElementsByTagName( 'shippingAmount' )->length > 0 ? $Invoice->getElementsByTagName( 'shippingAmount' )->item( 0 )->nodeValue : '';
			$ShippingTaxName = $Invoice->getElementsByTagName( 'shippingTaxName' )->length > 0 ? $Invoice->getElementsByTagName( 'shippingTaxName' )->item( 0 )->nodeValue : '';
			$ShippingTaxRate = $Invoice->getElementsByTagName( 'shippingTaxRate' )->length > 0 ? $Invoice->getElementsByTagName( 'shippingTaxRate' )->item( 0 )->nodeValue : '';
			$LogoURL         = $Invoice->getElementsByTagName( 'logoUrl' )->length > 0 ? $Invoice->getElementsByTagName( 'logoUrl' )->item( 0 )->nodeValue : '';
		}

		$InvoiceDetailsType = $DOM->getElementsByTagName( 'invoiceDetails' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceDetails' ) : array();
		foreach ( $InvoiceDetailsType as $InvoiceDetails ) {
			$Status          = $InvoiceDetails->getElementsByTagName( 'status' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'status' )->item( 0 )->nodeValue : '';
			$TotalAmount     = $InvoiceDetails->getElementsByTagName( 'totalAmount' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'totalAmount' )->item( 0 )->nodeValue : '';
			$Origin          = $InvoiceDetails->getElementsByTagName( 'origin' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'origin' )->item( 0 )->nodeValue : '';
			$CreatedDate     = $InvoiceDetails->getElementsByTagName( 'createdDate' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'createdDate' )->item( 0 )->nodeValue : '';
			$CreatedBy       = $InvoiceDetails->getElementsByTagName( 'createdBy' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'createdBy' )->item( 0 )->nodeValue : '';
			$CanceledDate    = $InvoiceDetails->getElementsByTagName( 'canceledDate' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'canceledDate' )->item( 0 )->nodeValue : '';
			$CanceledByActor = $InvoiceDetails->getElementsByTagName( 'canceledByActor' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'canceledByActor' )->item( 0 )->nodeValue : '';
			$CanceledBy      = $InvoiceDetails->getElementsByTagName( 'canceledBy' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'canceledBy' )->item( 0 )->nodeValue : '';
			$LastUpdatedDate = $InvoiceDetails->getElementsByTagName( 'lastUpdatedDate' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'lastUpdatedDate' )->item( 0 )->nodeValue : '';
			$LastUpdatedBy   = $InvoiceDetails->getElementsByTagName( 'lastUpdatedBy' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'lastUpdatedBy' )->item( 0 )->nodeValue : '';
			$FirstSentDate   = $InvoiceDetails->getElementsByTagName( 'firstSentDate' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'firstSentDate' )->item( 0 )->nodeValue : '';
			$LastSentDate    = $InvoiceDetails->getElementsByTagName( 'lastSentDate' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'lastSentDate' )->item( 0 )->nodeValue : '';
			$LastSentBy      = $InvoiceDetails->getElementsByTagName( 'lastSentBy' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'lastSentBy' )->item( 0 )->nodeValue : '';
			$PaidDate        = $InvoiceDetails->getElementsByTagName( 'paidDate' )->length > 0 ? $InvoiceDetails->getElementsByTagName( 'paidDate' )->item( 0 )->nodeValue : '';
		}

		$InvoiceItems     = array();
		$InvoiceItemsType = $DOM->getElementsByTagName( 'item' )->length > 0 ? $DOM->getElementsByTagName( 'item' ) : array();
		foreach ( $InvoiceItemsType as $InvoiceItem ) {
			$ItemName         = $InvoiceItem->getElementsByTagName( 'name' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'name' )->item( 0 )->nodeValue : '';
			$ItemDescription  = $InvoiceItem->getElementsByTagName( 'description' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'description' )->item( 0 )->nodeValue : '';
			$ItemDate         = $InvoiceItem->getElementsByTagName( 'date' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'date' )->item( 0 )->nodeValue : '';
			$ItemQuantity     = $InvoiceItem->getElementsByTagName( 'quantity' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'quantity' )->item( 0 )->nodeValue : '';
			$ItemUnitPrice    = $InvoiceItem->getElementsByTagName( 'unitPrice' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'unitPrice' )->item( 0 )->nodeValue : '';
			$ItemTaxName      = $InvoiceItem->getElementsByTagName( 'taxName' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'taxName' )->item( 0 )->nodeValue : '';
			$ItemTaxRate      = $InvoiceItem->getElementsByTagName( 'taxRate' )->length > 0 ? $InvoiceItem->getElementsByTagName( 'taxRate' )->item( 0 )->nodeValue : '';
			$InvoiceItemArray = array(
				'Name'        => $ItemName,
				'Description' => $ItemDescription,
				'Date'        => $ItemDate,
				'Quantity'    => $ItemQuantity,
				'UnitPrice'   => $ItemUnitPrice,
				'TaxName'     => $ItemTaxName,
				'TaxRate'     => $ItemTaxRate,
			);
			array_push( $InvoiceItems, $InvoiceItemArray );
		}

		$MerchantInfoType = $DOM->getElementsByTagName( 'merchantInfo' )->length > 0 ? $DOM->getElementsByTagName( 'merchantInfo' ) : array();
		foreach ( $MerchantInfoType as $MerchantInfo ) {
			$MerchantFirstName    = $MerchantInfo->getElementsByTagName( 'firstName' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'firstName' )->item( 0 )->nodeValue : '';
			$MerchantLastName     = $MerchantInfo->getElementsByTagName( 'lastName' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'lastName' )->item( 0 )->nodeValue : '';
			$MerchantBusinessName = $MerchantInfo->getElementsByTagName( 'businessName' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'businessName' )->item( 0 )->nodeValue : '';
			$MerchantPhone        = $MerchantInfo->getElementsByTagName( 'phone' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'phone' )->item( 0 )->nodeValue : '';
			$MerchantFax          = $MerchantInfo->getElementsByTagName( 'fax' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'fax' )->item( 0 )->nodeValue : '';
			$MerchantWebsite      = $MerchantInfo->getElementsByTagName( 'website' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'website' )->item( 0 )->nodeValue : '';
			$MerchantCustom       = $MerchantInfo->getElementsByTagName( 'customValue' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'customValue' )->item( 0 )->nodeValue : '';

			$MerchantInfoAddressType = $MerchantInfo->getElementsByTagName( 'address' )->length > 0 ? $MerchantInfo->getElementsByTagName( 'address' ) : array();
			foreach ( $MerchantInfoAddressType as $MerchantInfoAddress ) {
				$MerchantAddressLine1       = $MerchantInfoAddress->getElementsByTagName( 'line1' )->length > 0 ? $MerchantInfoAddress->getElementsByTagName( 'line1' )->item( 0 )->nodeValue : '';
				$MerchantAddressLine2       = $MerchantInfoAddress->getElementsByTagName( 'line2' )->length > 0 ? $MerchantInfoAddress->getElementsByTagName( 'line2' )->item( 0 )->nodeValue : '';
				$MerchantAddressCity        = $MerchantInfoAddress->getElementsByTagName( 'city' )->length > 0 ? $MerchantInfoAddress->getElementsByTagName( 'city' )->item( 0 )->nodeValue : '';
				$MerchantAddressState       = $MerchantInfoAddress->getElementsByTagName( 'state' )->length > 0 ? $MerchantInfoAddress->getElementsByTagName( 'state' )->item( 0 )->nodeValue : '';
				$MerchantAddressPostalCode  = $MerchantInfoAddress->getElementsByTagName( 'postalCode' )->length > 0 ? $MerchantInfoAddress->getElementsByTagName( 'postalCode' )->item( 0 )->nodeValue : '';
				$MerchantAddressCountryCode = $MerchantInfoAddress->getElementsByTagName( 'countryCode' )->length > 0 ? $MerchantInfoAddress->getElementsByTagName( 'countryCode' )->item( 0 )->nodeValue : '';
				$MerchantAddressType        = $MerchantInfoAddress->getElementsByTagName( 'type' )->length > 0 ? $MerchantInfoAddress->getElementsByTagName( 'type' )->item( 0 )->nodeValue : '';
			}
		}

		$BillingInfoType = $DOM->getElementsByTagName( 'billingInfo' )->length > 0 ? $DOM->getElementsByTagName( 'billingInfo' ) : array();
		foreach ( $BillingInfoType as $BillingInfo ) {
			$BillingFirstName    = $BillingInfo->getElementsByTagName( 'firstName' )->length > 0 ? $BillingInfo->getElementsByTagName( 'firstName' )->item( 0 )->nodeValue : '';
			$BillingLastName     = $BillingInfo->getElementsByTagName( 'lastName' )->length > 0 ? $BillingInfo->getElementsByTagName( 'lastName' )->item( 0 )->nodeValue : '';
			$BillingBusinessName = $BillingInfo->getElementsByTagName( 'businessName' )->length > 0 ? $BillingInfo->getElementsByTagName( 'businessName' )->item( 0 )->nodeValue : '';
			$BillingPhone        = $BillingInfo->getElementsByTagName( 'phone' )->length > 0 ? $BillingInfo->getElementsByTagName( 'phone' )->item( 0 )->nodeValue : '';
			$BillingFax          = $BillingInfo->getElementsByTagName( 'fax' )->length > 0 ? $BillingInfo->getElementsByTagName( 'fax' )->item( 0 )->nodeValue : '';
			$BillingWebsite      = $BillingInfo->getElementsByTagName( 'website' )->length > 0 ? $BillingInfo->getElementsByTagName( 'website' )->item( 0 )->nodeValue : '';
			$BillingCustom       = $BillingInfo->getElementsByTagName( 'customValue' )->length > 0 ? $BillingInfo->getElementsByTagName( 'customValue' )->item( 0 )->nodeValue : '';

			$BillingInfoAddressType = $BillingInfo->getElementsByTagName( 'address' )->length > 0 ? $BillingInfo->getElementsByTagName( 'address' ) : array();
			foreach ( $BillingInfoAddressType as $BillingInfoAddress ) {
				$BillingAddressLine1       = $BillingInfoAddress->getElementsByTagName( 'line1' )->length > 0 ? $BillingInfoAddress->getElementsByTagName( 'line1' )->item( 0 )->nodeValue : '';
				$BillingAddressLine2       = $BillingInfoAddress->getElementsByTagName( 'line2' )->length > 0 ? $BillingInfoAddress->getElementsByTagName( 'line2' )->item( 0 )->nodeValue : '';
				$BillingAddressCity        = $BillingInfoAddress->getElementsByTagName( 'city' )->length > 0 ? $BillingInfoAddress->getElementsByTagName( 'city' )->item( 0 )->nodeValue : '';
				$BillingAddressState       = $BillingInfoAddress->getElementsByTagName( 'state' )->length > 0 ? $BillingInfoAddress->getElementsByTagName( 'state' )->item( 0 )->nodeValue : '';
				$BillingAddressPostalCode  = $BillingInfoAddress->getElementsByTagName( 'postalCode' )->length > 0 ? $BillingInfoAddress->getElementsByTagName( 'postalCode' )->item( 0 )->nodeValue : '';
				$BillingAddressCountryCode = $BillingInfoAddress->getElementsByTagName( 'countryCode' )->length > 0 ? $BillingInfoAddress->getElementsByTagName( 'countryCode' )->item( 0 )->nodeValue : '';
				$BillingAddressType        = $BillingInfoAddress->getElementsByTagName( 'type' )->length > 0 ? $BillingInfoAddress->getElementsByTagName( 'type' )->item( 0 )->nodeValue : '';
			}
		}

		$ShippingInfoType = $DOM->getElementsByTagName( 'shippingInfo' )->length > 0 ? $DOM->getElementsByTagName( 'shippingInfo' ) : array();
		foreach ( $ShippingInfoType as $ShippingInfo ) {
			$ShippingFirstName    = $ShippingInfo->getElementsByTagName( 'firstName' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'firstName' )->item( 0 )->nodeValue : '';
			$ShippingLastName     = $ShippingInfo->getElementsByTagName( 'lastName' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'lastName' )->item( 0 )->nodeValue : '';
			$ShippingBusinessName = $ShippingInfo->getElementsByTagName( 'businessName' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'businessName' )->item( 0 )->nodeValue : '';
			$ShippingPhone        = $ShippingInfo->getElementsByTagName( 'phone' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'phone' )->item( 0 )->nodeValue : '';
			$ShippingFax          = $ShippingInfo->getElementsByTagName( 'fax' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'fax' )->item( 0 )->nodeValue : '';
			$ShippingWebsite      = $ShippingInfo->getElementsByTagName( 'website' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'website' )->item( 0 )->nodeValue : '';
			$ShippingCustom       = $ShippingInfo->getElementsByTagName( 'customValue' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'customValue' )->item( 0 )->nodeValue : '';

			$ShippingInfoAddressType = $ShippingInfo->getElementsByTagName( 'address' )->length > 0 ? $ShippingInfo->getElementsByTagName( 'address' ) : array();
			foreach ( $ShippingInfoAddressType as $ShippingInfoAddress ) {
				$ShippingAddressLine1       = $ShippingInfoAddress->getElementsByTagName( 'line1' )->length > 0 ? $ShippingInfoAddress->getElementsByTagName( 'line1' )->item( 0 )->nodeValue : '';
				$ShippingAddressLine2       = $ShippingInfoAddress->getElementsByTagName( 'line2' )->length > 0 ? $ShippingInfoAddress->getElementsByTagName( 'line2' )->item( 0 )->nodeValue : '';
				$ShippingAddressCity        = $ShippingInfoAddress->getElementsByTagName( 'city' )->length > 0 ? $ShippingInfoAddress->getElementsByTagName( 'city' )->item( 0 )->nodeValue : '';
				$ShippingAddressState       = $ShippingInfoAddress->getElementsByTagName( 'state' )->length > 0 ? $ShippingInfoAddress->getElementsByTagName( 'state' )->item( 0 )->nodeValue : '';
				$ShippingAddressPostalCode  = $ShippingInfoAddress->getElementsByTagName( 'postalCode' )->length > 0 ? $ShippingInfoAddress->getElementsByTagName( 'postalCode' )->item( 0 )->nodeValue : '';
				$ShippingAddressCountryCode = $ShippingInfoAddress->getElementsByTagName( 'countryCode' )->length > 0 ? $ShippingInfoAddress->getElementsByTagName( 'countryCode' )->item( 0 )->nodeValue : '';
				$ShippingAddressType        = $ShippingInfoAddress->getElementsByTagName( 'type' )->length > 0 ? $ShippingInfoAddress->getElementsByTagName( 'type' )->item( 0 )->nodeValue : '';
			}
		}

		$ViaPayPal                = $DOM->getElementsByTagName( 'viaPayPal' )->length > 0 ? $DOM->getElementsByTagName( 'viaPayPal' )->item( 0 )->nodeValue : '';
		$PayPalPaymentDetailsType = $DOM->getElementsByTagName( 'paypalPayment' )->length > 0 ? $DOM->getElementsByTagName( 'paypalPayment' ) : array();
		foreach ( $PayPalPaymentDetailsType as $PayPalPaymentDetails ) {
			$PayPalTransactionID   = $PayPalPaymentDetails->getElementsByTagName( 'transactionID' )->length > 0 ? $PayPalPaymentDetails->getElementsByTagName( 'transactionID' )->item( 0 )->nodeValue : '';
			$PayPalTransactionDate = $PayPalPaymentDetails->getElementsByTagName( 'date' )->length > 0 ? $PayPalPaymentDetails->getElementsByTagName( 'date' )->item( 0 )->nodeValue : '';
		}

		$OtherPaymentDetailsType = $DOM->getElementsByTagName( 'otherPayment' )->length > 0 ? $DOM->getElementsByTagName( 'otherPayment' ) : array();
		foreach ( $OtherPaymentDetailsType as $OtherPaymentDetails ) {
			$PaymentMethod     = $OtherPaymentDetails->getElementsByTagName( 'method' )->length > 0 ? $OtherPaymentDetails->getElementsByTagName( 'method' )->item( 0 )->nodeValue : '';
			$PaymentMethodNote = $OtherPaymentDetails->getElementsByTagName( 'note' )->length > 0 ? $OtherPaymentDetails->getElementsByTagName( 'note' )->item( 0 )->nodeValue : '';
			$PaymentMethodDate = $OtherPaymentDetails->getElementsByTagName( 'date' )->length > 0 ? $OtherPaymentDetails->getElementsByTagName( 'date' )->item( 0 )->nodeValue : '';
		}

		$ResponseDataArray = array(
			'Errors'                     => $Errors,
			'Ack'                        => $Ack,
			'Build'                      => $Build,
			'CorrelationID'              => $CorrelationID,
			'Timestamp'                  => $Timestamp,
			'InvoiceURL'                 => $InvoiceURL,
			'MerchantEmail'              => isset( $MerchantEmail ) ? $MerchantEmail : '',
			'PayerEmail'                 => isset( $PayerEmail ) ? $PayerEmail : '',
			'Number'                     => isset( $Number ) ? $Number : '',
			'CurrencyCode'               => isset( $CurrencyCode ) ? $CurrencyCode : '',
			'InvoiceDate'                => isset( $InvoiceDate ) ? $InvoiceDate : '',
			'DueDate'                    => isset( $DueDate ) ? $DueDate : '',
			'PaymentTerms'               => isset( $PaymentTerms ) ? $PaymentTerms : '',
			'DiscountPercent'            => isset( $DiscountPercent ) ? $DiscountPercent : '',
			'DiscountAmount'             => isset( $DiscountAmount ) ? $DiscountAmount : '',
			'Terms'                      => isset( $Terms ) ? $Terms : '',
			'InvoiceNote'                => isset( $InvoiceNote ) ? $InvoiceNote : '',
			'MerchantMemo'               => isset( $MerchantMemo ) ? $MerchantMemo : '',
			'ShippingAmount'             => isset( $ShippingAmount ) ? $ShippingAmount : '',
			'ShippingTaxName'            => isset( $ShippingTaxName ) ? $ShippingTaxName : '',
			'ShippingTaxRate'            => isset( $ShippingTaxRate ) ? $ShippingTaxRate : '',
			'LogoURL'                    => isset( $LogoURL ) ? $LogoURL : '',
			'Status'                     => isset( $Status ) ? $Status : '',
			'TotalAmount'                => isset( $TotalAmount ) ? $TotalAmount : '',
			'Origin'                     => isset( $Origin ) ? $Origin : '',
			'CreatedDate'                => isset( $CreatedDate ) ? $CreatedDate : '',
			'CreatedBy'                  => isset( $CreatedBy ) ? $CreatedBy : '',
			'CanceledDate'               => isset( $CanceledDate ) ? $CanceledDate : '',
			'CanceledByActor'            => isset( $CanceledByActor ) ? $CanceledByActor : '',
			'CanceledBy'                 => isset( $CanceledBy ) ? $CanceledBy : '',
			'LastUpdatedDate'            => isset( $LastUpdatedDate ) ? $LastUpdatedDate : '',
			'LastUpdatedBy'              => isset( $LastUpdatedBy ) ? $LastUpdatedBy : '',
			'FistSentDate'               => isset( $FirstSentDate ) ? $FirstSentDate : '',
			'LastSentDate'               => isset( $LastSentDate ) ? $LastSentDate : '',
			'LastSentBy'                 => isset( $LastSentBy ) ? $LastSentBy : '',
			'PaidDate'                   => isset( $PaidDate ) ? $PaidDate : '',
			'InvoiceItems'               => isset( $InvoiceItems ) ? $InvoiceItems : '',
			'MerchantFirstName'          => isset( $MerchantFirstName ) ? $MerchantFirstName : '',
			'MerchantLastName'           => isset( $MerchantLastName ) ? $MerchantLastName : '',
			'MerchantBusinessName'       => isset( $MerchantBusinessName ) ? $MerchantBusinessName : '',
			'MerchantPhone'              => isset( $MerchantPhone ) ? $MerchantPhone : '',
			'MerchantFax'                => isset( $MerchantFax ) ? $MerchantFax : '',
			'MerchantWebsite'            => isset( $MerchantWebsite ) ? $MerchantWebsite : '',
			'MerchantCustom'             => isset( $MerchantCustom ) ? $MerchantCustom : '',
			'MerchantAddressLine1'       => isset( $MerchantAddressLine1 ) ? $MerchantAddressLine1 : '',
			'MerchantAddressLine2'       => isset( $MerchantAddressLine2 ) ? $MerchantAddressLine2 : '',
			'MerchantAddressCity'        => isset( $MerchantAddressCity ) ? $MerchantAddressCity : '',
			'MerchantAddressState'       => isset( $MerchantAddressState ) ? $MerchantAddressState : '',
			'MerchantAddressPostalCode'  => isset( $MerchantAddressPostalCode ) ? $MerchantAddressPostalCode : '',
			'MerchantAddressCountryCode' => isset( $MerchantAddressCountryCode ) ? $MerchantAddressCountryCode : '',
			'MerchantAddressType'        => isset( $MerchantAddressType ) ? $MerchantAddressType : '',
			'BillingFirstName'           => isset( $BillingFirstName ) ? $BillingFirstName : '',
			'BillingLastName'            => isset( $BillingLastName ) ? $BillingLastName : '',
			'BillingBusinessName'        => isset( $BillingBusinessName ) ? $BillingBusinessName : '',
			'BillingPhone'               => isset( $BillingPhone ) ? $BillingPhone : '',
			'BillingFax'                 => isset( $BillingFax ) ? $BillingFax : '',
			'BillingWebsite'             => isset( $BillingWebsite ) ? $BillingWebsite : '',
			'BillingCustom'              => isset( $BillingCustom ) ? $BillingCustom : '',
			'BillingAddressLine1'        => isset( $BillingAddressLine1 ) ? $BillingAddressLine1 : '',
			'BillingAddressLine2'        => isset( $BillingAddressLine2 ) ? $BillingAddressLine2 : '',
			'BillingAddressCity'         => isset( $BillingAddressCity ) ? $BillingAddressCity : '',
			'BillingAddressState'        => isset( $BillingAddressState ) ? $BillingAddressState : '',
			'BillingAddressPostalCode'   => isset( $BillingAddressPostalCode ) ? $BillingAddressPostalCode : '',
			'BillingAddressCountryCode'  => isset( $BillingAddressCountryCode ) ? $BillingAddressCountryCode : '',
			'BillingAddressType'         => isset( $BillingAddressType ) ? $BillingAddressType : '',
			'ShippingFirstName'          => isset( $ShippingFirstName ) ? $ShippingFirstName : '',
			'ShippingLastName'           => isset( $ShippingLastName ) ? $ShippingLastName : '',
			'ShippingBusinessName'       => isset( $ShippingBusinessName ) ? $ShippingBusinessName : '',
			'ShippingPhone'              => isset( $ShippingPhone ) ? $ShippingPhone : '',
			'ShippingFax'                => isset( $ShippingFax ) ? $ShippingFax : '',
			'ShippingWebsite'            => isset( $ShippingWebsite ) ? $ShippingWebsite : '',
			'ShippingCustom'             => isset( $ShippingCustom ) ? $ShippingCustom : '',
			'ShippingAddressLine1'       => isset( $ShippingAddressLine1 ) ? $ShippingAddressLine1 : '',
			'ShippingAddressLine2'       => isset( $ShippingAddressLine2 ) ? $ShippingAddressLine2 : '',
			'ShippingAddressCity'        => isset( $ShippingAddressCity ) ? $ShippingAddressCity : '',
			'ShippingAddressState'       => isset( $ShippingAddressState ) ? $ShippingAddressState : '',
			'ShippingAddressPostalCode'  => isset( $ShippingAddressPostalCode ) ? $ShippingAddressPostalCode : '',
			'ShippingAddressCountryCode' => isset( $ShippingAddressCountryCode ) ? $ShippingAddressCountryCode : '',
			'ShippingAddressType'        => isset( $ShippingAddressType ) ? $ShippingAddressType : '',
			'ViaPayPal'                  => isset( $ViaPayPal ) ? $ViaPayPal : '',
			'PayPalTransactionID'        => isset( $PayPalTransactionID ) ? $PayPalTransactionID : '',
			'PayPalTransactionDate'      => isset( $PayPalTransactionDate ) ? $PayPalTransactionDate : '',
			'PaymentMethod'              => isset( $PaymentMethod ) ? $PaymentMethod : '',
			'PaymentMethodNote'          => isset( $PaymentMethodNote ) ? $PaymentMethodNote : '',
			'PaymentMethodDate'          => isset( $PaymentMethodDate ) ? $PaymentMethodDate : '',
			'XMLRequest'                 => $XMLRequest,
			'XMLResponse'                => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit CancelInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function CancelInvoice( $DataArray ) {
		$CancelInvoiceFields = isset( $DataArray['CancelInvoiceFields'] ) ? $DataArray['CancelInvoiceFields'] : array();
		$InvoiceID           = isset( $CancelInvoiceFields['InvoiceID'] ) ? $CancelInvoiceFields['InvoiceID'] : '';
		$Subject             = isset( $CancelInvoiceFields['Subject'] ) ? $CancelInvoiceFields['Subject'] : '';
		$NoteForPayer        = isset( $CancelInvoiceFields['NoteForPayer'] ) ? $CancelInvoiceFields['NoteForPayer'] : '';
		$SendCopyToMerchant  = isset( $CancelInvoiceFields['SendCopyToMerchant'] ) ? $CancelInvoiceFields['SendCopyToMerchant'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<CancelInvoiceRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';
		$XMLRequest .= $Subject != '' ? '<subject xmlns="">' . $Subject . '</subject>' : '';
		$XMLRequest .= $NoteForPayer != '' ? '<noteForPayer xmlns="">' . $NoteForPayer . '</noteForPayer>' : '';
		$XMLRequest .= $SendCopyToMerchant != '' ? '<sendCopyToMerchant xmlns="">' . $SendCopyToMerchant . '</sendCopyToMerchant>' : '';
		$XMLRequest .= '</CancelInvoiceRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'CancelInvoice' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceNumber' => $InvoiceNumber,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}

	/**
	 * Submit DeleteInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param string $InvoiceID Invoice ID of the invoice to be deleted.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function DeleteInvoice( $InvoiceID ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<DeleteInvoiceRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';
		$XMLRequest .= '</DeleteInvoiceRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'DeleteInvoice' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GenerateInvoiceNumber API request to PayPal.
	 *
	 * @access    public
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GenerateInvoiceNumber() {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GenerateInvoiceNumberRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= '</GenerateInvoiceNumberRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'GenerateInvoiceNumber' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceNumber' => $InvoiceNumber,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit SearchInvoices API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function SearchInvoices( $DataArray ) {
		$SearchInvoicesFields = isset( $DataArray['SearchInvoicesFields'] ) ? $DataArray['SearchInvoicesFields'] : array();
		$MerchantEmail        = isset( $SearchInvoicesFields['MerchantEmail'] ) ? $SearchInvoicesFields['MerchantEmail'] : '';
		$Page                 = isset( $SearchInvoicesFields['Page'] ) ? $SearchInvoicesFields['Page'] : '';
		$PageSize             = isset( $SearchInvoicesFields['PageSize'] ) ? $SearchInvoicesFields['PageSize'] : '';

		$Parameters    = isset( $DataArray['Parameters'] ) ? $DataArray['Parameters'] : array();
		$Email         = isset( $Parameters['Email'] ) ? $Parameters['Email'] : '';
		$RecipientName = isset( $Parameters['RecipientName'] ) ? $Parameters['RecipientName'] : '';
		$BusinessName  = isset( $Parameters['BusinessName'] ) ? $Parameters['BusinessName'] : '';
		$InvoiceNumber = isset( $Parameters['InvoiceNumber'] ) ? $Parameters['InvoiceNumber'] : '';
		$Status        = isset( $Parameters['Status'] ) ? $Parameters['Status'] : '';
		$LowerAmount   = isset( $Parameters['LowerAmount'] ) ? $Parameters['LowerAmount'] : '';
		$UpperAmount   = isset( $Parameters['UpperAmount'] ) ? $Parameters['UpperAmount'] : '';
		$CurrencyCode  = isset( $Parameters['CurrencyCode'] ) ? $Parameters['CurrencyCode'] : '';
		$Memo          = isset( $Parameters['Memo'] ) ? $Parameters['Memo'] : '';
		$Origin        = isset( $Parameters['Origin'] ) ? $Parameters['Origin'] : '';
		$InvoiceDate   = isset( $Parameters['InvoiceDate'] ) ? $Parameters['InvoiceDate'] : array();
		$DueDate       = isset( $Parameters['DueDate'] ) ? $Parameters['DueDate'] : array();
		$PaymentDate   = isset( $Parameters['PaymentDate'] ) ? $Parameters['PaymentDate'] : array();
		$CreationDate  = isset( $Parameters['CreationDate'] ) ? $Parameters['CreationDate'] : array();

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<SearchInvoicesRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $MerchantEmail != '' ? '<merchantEmail xmlns="">' . $MerchantEmail . '</merchantEmail>' : '';
		$XMLRequest .= $Page != '' ? '<page xmlns="">' . $Page . '</page>' : '';
		$XMLRequest .= $PageSize != '' ? '<pageSize xmlns="">' . $PageSize . '</pageSize>' : '';

		if ( ! empty( $Parameters ) ) {
			$XMLRequest .= '<parameters xmlns="">';
			$XMLRequest .= $Email != '' ? '<email xmlns="">' . $Email . '</email>' : '';
			$XMLRequest .= $RecipientName != '' ? '<recipientName xmlns="">' . $RecipientName . '</recipientName>' : '';
			$XMLRequest .= $BusinessName != '' ? '<businessName xmlns="">' . $BusinessName . '</businessName>' : '';
			$XMLRequest .= $InvoiceNumber != '' ? '<invoiceNumber xmlns="">' . $InvoiceNumber . '</invoiceNumber>' : '';
			$XMLRequest .= $Status != '' ? '<status xmlns="">' . $Status . '</status>' : '';
			$XMLRequest .= $LowerAmount != '' ? '<lowerAmount xmlns="">' . $LowerAmount . '</lowerAmount>' : '';
			$XMLRequest .= $UpperAmount != '' ? '<upperAmount xmlns="">' . $UpperAmount . '</upperAmount>' : '';
			$XMLRequest .= $CurrencyCode != '' ? '<currencyCode xmlns="">' . $CurrencyCode . '</currencyCode>' : '';
			$XMLRequest .= $Memo != '' ? '<memo xmlns="">' . $Memo . '</memo>' : '';
			$XMLRequest .= $Origin != '' ? '<origin xmlns="">' . $Origin . '</origin>' : '';

			if ( ! empty( $InvoiceDate ) ) {
				$XMLRequest .= '<invoiceDate xmlns="">';
				$XMLRequest .= '<startDate xmlns="">' . $InvoiceDate['StartDate'] . '</startDate>';
				$XMLRequest .= '<endDate xmlns="">' . $InvoiceDate['EndDate'] . '</endDate>';
				$XMLRequest .= '</invoiceDate>';
			}

			if ( ! empty( $DueDate ) ) {
				$XMLRequest .= '<dueDate xmlns="">';
				$XMLRequest .= '<startDate xmlns="">' . $DueDate['StartDate'] . '</startDate>';
				$XMLRequest .= '<endDate xmlns="">' . $DueDate['EndDate'] . '</endDate>';
				$XMLRequest .= '</dueDate>';
			}

			if ( ! empty( $PaymentDate ) ) {
				$XMLRequest .= '<paymentDate xmlns="">';
				$XMLRequest .= '<startDate xmlns="">' . $PaymentDate['StartDate'] . '</startDate>';
				$XMLRequest .= '<endDate xmlns="">' . $PaymentDate['EndDate'] . '</endDate>';
				$XMLRequest .= '</paymentDate>';
			}

			if ( ! empty( $CreationDate ) ) {
				$XMLRequest .= '<creationDate xmlns="">';
				$XMLRequest .= '<startDate xmlns="">' . $CreationDate['StartDate'] . '</startDate>';
				$XMLRequest .= '<endDate xmlns="">' . $CreationDate['EndDate'] . '</endDate>';
				$XMLRequest .= '</creationDate>';
			}

			$XMLRequest .= '</parameters>';
		}

		$XMLRequest .= '</SearchInvoicesRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'SearchInvoices' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$Count           = $DOM->getElementsByTagName( 'count' )->length > 0 ? $DOM->getElementsByTagName( 'count' )->item( 0 )->nodeValue : '';
		$Page            = $DOM->getElementsByTagName( 'page' )->length > 0 ? $DOM->getElementsByTagName( 'page' )->item( 0 )->nodeValue : '';
		$HasNextPage     = $DOM->getElementsByTagName( 'hasNextPage' )->length > 0 ? $DOM->getElementsByTagName( 'hasNextPage' )->item( 0 )->nodeValue : '';
		$HasPreviousPage = $DOM->getElementsByTagName( 'hasPreviousPage' )->length > 0 ? $DOM->getElementsByTagName( 'hasPreviousPage' )->item( 0 )->nodeValue : '';
		$InvoicesType    = $DOM->getElementsByTagName( 'invoice' )->length > 0 ? $DOM->getElementsByTagName( 'invoice' ) : array();

		$Invoices = array();
		foreach ( $InvoicesType as $Invoice ) {
			$InvoiceID            = $Invoice->getElementsByTagName( 'invoiceID' )->length > 0 ? $Invoice->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
			$MerchantEmail        = $Invoice->getElementsByTagName( 'merchantEmail' )->length > 0 ? $Invoice->getElementsByTagName( 'merchantEmail' )->item( 0 )->nodeValue : '';
			$PayerEmail           = $Invoice->getElementsByTagName( 'payerEmail' )->length > 0 ? $Invoice->getElementsByTagName( 'payerEmail' )->item( 0 )->nodeValue : '';
			$Number               = $Invoice->getElementsByTagName( 'number' )->length > 0 ? $Invoice->getElementsByTagName( 'number' )->item( 0 )->nodeValue : '';
			$BillingBusinessName  = $Invoice->getElementsByTagName( 'billingBusinessName' )->length > 0 ? $Invoice->getElementsByTagName( 'billingBusinessName' )->item( 0 )->nodeValue : '';
			$BillingFirstName     = $Invoice->getElementsByTagName( 'billingFirstName' )->length > 0 ? $Invoice->getElementsByTagName( 'billingFirstName' )->item( 0 )->nodeValue : '';
			$BillingLastName      = $Invoice->getElementsByTagName( 'billingLastName' )->length > 0 ? $Invoice->getElementsByTagName( 'billingLastName' )->item( 0 )->nodeValue : '';
			$ShippingBusinessName = $Invoice->getElementsByTagName( 'shippingBusinessName' )->length > 0 ? $Invoice->getElementsByTagName( 'shippingBusinessName' )->item( 0 )->nodeValue : '';
			$ShippingFirstName    = $Invoice->getElementsByTagName( 'shippingFirstName' )->length > 0 ? $Invoice->getElementsByTagName( 'shippingFirstName' )->item( 0 )->nodeValue : '';
			$ShippingLastName     = $Invoice->getElementsByTagName( 'shippingLastName' )->length > 0 ? $Invoice->getElementsByTagName( 'shippingLastName' )->item( 0 )->nodeValue : '';
			$TotalAmount          = $Invoice->getElementsByTagName( 'totalAmount' )->length > 0 ? $Invoice->getElementsByTagName( 'totalAmount' )->item( 0 )->nodeValue : '';
			$CurrencyCode         = $Invoice->getElementsByTagName( 'currencyCode' )->length > 0 ? $Invoice->getElementsByTagName( 'currencyCode' )->item( 0 )->nodeValue : '';
			$InvoiceDate          = $Invoice->getElementsByTagName( 'invoiceDate' )->length > 0 ? $Invoice->getElementsByTagName( 'invoiceDate' )->item( 0 )->nodeValue : '';
			$DueDate              = $Invoice->getElementsByTagName( 'dueDate' )->length > 0 ? $Invoice->getElementsByTagName( 'dueDate' )->item( 0 )->nodeValue : '';
			$Status               = $Invoice->getElementsByTagName( 'status' )->length > 0 ? $Invoice->getElementsByTagName( 'status' )->item( 0 )->nodeValue : '';
			$Origin               = $Invoice->getElementsByTagName( 'origin' )->length > 0 ? $Invoice->getElementsByTagName( 'origin' )->item( 0 )->nodeValue : '';

			$InvoiceItem = array(
				'InvoiceID'            => $InvoiceID,
				'MerchantEmail'        => $MerchantEmail,
				'PayerEmail'           => $PayerEmail,
				'Number'               => $Number,
				'BillingBusinessName'  => $BillingBusinessName,
				'BillingFirstName'     => $BillingFirstName,
				'BillingLastName'      => $BillingLastName,
				'ShippingBusinessName' => $ShippingBusinessName,
				'ShippingFirstName'    => $ShippingFirstName,
				'ShippingLastName'     => $ShippingLastName,
				'TotalAmount'          => $TotalAmount,
				'CurrencyCode'         => $CurrencyCode,
				'InvoiceDate'          => $InvoiceDate,
				'DueDate'              => $DueDate,
				'Status'               => $Status,
				'Origin'               => $Origin,
			);
			array_push( $Invoices, $InvoiceItem );
		}

		$ResponseDataArray = array(
			'Errors'          => $Errors,
			'Ack'             => $Ack,
			'Build'           => $Build,
			'CorrelationID'   => $CorrelationID,
			'Timestamp'       => $Timestamp,
			'Count'           => $Count,
			'Page'            => $Page,
			'HasNextPage'     => $HasNextPage,
			'HasPreviousPage' => $HasPreviousPage,
			'Invoices'        => $Invoices,
			'XMLRequest'      => $XMLRequest,
			'XMLResponse'     => $XMLResponse,
		);

		return $ResponseDataArray;

	}


	/**
	 * Submit MarkInvoiceAsPaid API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function MarkInvoiceAsPaid( $DataArray ) {
		$MarkInvoiceAsPaidFields = isset( $DataArray['MarkInvoiceAsPaidFields'] ) ? $DataArray['MarkInvoiceAsPaidFields'] : array();
		$InvoiceID               = isset( $MarkInvoiceAsPaidFields['InvoiceID'] ) ? $MarkInvoiceAsPaidFields['InvoiceID'] : '';
		$Method                  = isset( $MarkInvoiceAsPaidFields['Method'] ) ? $MarkInvoiceAsPaidFields['Method'] : '';
		$Note                    = isset( $MarkInvoiceAsPaidFields['Note'] ) ? $MarkInvoiceAsPaidFields['Note'] : '';
		$Date                    = isset( $MarkInvoiceAsPaidFields['Date'] ) ? $MarkInvoiceAsPaidFields['Date'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<MarkInvoiceAsPaidRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';

		$XMLRequest .= '<payment xmlns="">';
		$XMLRequest .= $Method != '' ? '<method xmlns="">' . $Method . '</method>' : '';
		$XMLRequest .= $Note != '' ? '<note xmlns="">' . $Note . '</note>' : '';
		$XMLRequest .= $Date != '' ? '<date xmlns="">' . $Date . '</date>' : '';
		$XMLRequest .= '</payment>';

		$XMLRequest .= '</MarkInvoiceAsPaidRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'MarkInvoiceAsPaid' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceNumber' => $InvoiceNumber,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;

	}

	/**
	 * Submit MarkInvoiceAsUnpaid API request to PayPal.
	 *
	 * @access    public
	 * @param string $InvoiceID Invoice ID of the invoice to be marked as unpaid.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function MarkInvoiceAsUnpaid( $InvoiceID = '' ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<MarkInvoiceAsUnpaidRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';
		$XMLRequest .= '</MarkInvoiceAsUnpaidRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'MarkInvoiceAsUnpaid' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceNumber' => $InvoiceNumber,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;

	}


	/**
	 * Submit MarkInvoiceAsRefunded API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function MarkInvoiceAsRefunded( $DataArray ) {
		$MarkInvoiceAsRefundedFields = isset( $DataArray['MarkInvoiceAsRefundedFields'] ) ? $DataArray['MarkInvoiceAsRefundedFields'] : array();
		$InvoiceID                   = isset( $MarkInvoiceAsRefundedFields['InvoiceID'] ) ? $MarkInvoiceAsRefundedFields['InvoiceID'] : '';
		$Note                        = isset( $MarkInvoiceAsRefundedFields['Note'] ) ? $MarkInvoiceAsRefundedFields['Note'] : '';
		$Date                        = isset( $MarkInvoiceAsRefundedFields['Date'] ) ? $MarkInvoiceAsRefundedFields['Date'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<MarkInvoiceAsRefundedRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';

		$XMLRequest .= '<refundDetail xmlns="">';
		$XMLRequest .= $Note != '' ? '<note xmlns="">' . $Note . '</note>' : '';
		$XMLRequest .= $Date != '' ? '<date xmlns="">' . $Date . '</date>' : '';
		$XMLRequest .= '</refundDetail>';

		$XMLRequest .= '</MarkInvoiceAsRefundedRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'MarkInvoiceAsRefunded' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceNumber' => $InvoiceNumber,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;

	}


	/**
	 * Submit RemindInvoice API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function RemindInvoice( $DataArray ) {
		$RemindInvoiceFields = isset( $DataArray['RemindInvoiceFields'] ) ? $DataArray['RemindInvoiceFields'] : array();
		$InvoiceID           = isset( $RemindInvoiceFields['InvoiceID'] ) ? $RemindInvoiceFields['InvoiceID'] : '';
		$Subject             = isset( $RemindInvoiceFields['Subject'] ) ? $RemindInvoiceFields['Subject'] : '';
		$NoteForPayer        = isset( $RemindInvoiceFields['NoteForPayer'] ) ? $RemindInvoiceFields['NoteForPayer'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<RemindInvoiceRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $InvoiceID != '' ? '<invoiceID xmlns="">' . $InvoiceID . '</invoiceID>' : '';
		$XMLRequest .= $Subject != '' ? '<subject xmlns="">' . $Subject . '</subject>' : '';
		$XMLRequest .= $NoteForPayer != '' ? '<noteForPayer xmlns="">' . $NoteForPayer . '</noteForPayer>' : '';
		$XMLRequest .= '</RemindInvoiceRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Invoice', 'RemindInvoice' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$InvoiceID     = $DOM->getElementsByTagName( 'invoiceID' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceID' )->item( 0 )->nodeValue : '';
		$InvoiceNumber = $DOM->getElementsByTagName( 'invoiceNumber' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceNumber' )->item( 0 )->nodeValue : '';
		$InvoiceURL    = $DOM->getElementsByTagName( 'invoiceURL' )->length > 0 ? $DOM->getElementsByTagName( 'invoiceURL' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'InvoiceID'     => $InvoiceID,
			'InvoiceURL'    => $InvoiceURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;

	}

	/**
	 * Submit RequestPermissions API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function RequestPermissions( $DataArray ) {
		$RequestPermissionsFields = isset( $DataArray['RequestPermissionsFields'] ) ? $DataArray['RequestPermissionsFields'] : array();
		$Scope                    = isset( $RequestPermissionsFields['Scope'] ) ? $RequestPermissionsFields['Scope'] : array();
		$Callback                 = isset( $RequestPermissionsFields['Callback'] ) ? $RequestPermissionsFields['Callback'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<RequestPermissionsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();

		foreach ( $Scope as $Value ) {
			$XMLRequest .= $Scope != '' ? '<scope xmlns="">' . $Value . '</scope>' : '';
		}

		$XMLRequest .= $Callback != '' ? '<callback xmlns="">' . $Callback . '</callback>' : '';
		$XMLRequest .= '</RequestPermissionsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Permissions', 'RequestPermissions' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$Token       = $DOM->getElementsByTagName( 'token' )->length > 0 ? $DOM->getElementsByTagName( 'token' )->item( 0 )->nodeValue : '';
		$RedirectURL = $this->Sandbox ? 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token=' . $Token : 'https://www.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token=' . $Token;

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'Token'         => $Token,
			'RedirectURL'   => $RedirectURL,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GetAccessToken API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $DataArray Array structure of PayPal request data.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetAccessToken( $DataArray ) {
		$GetAccessTokenFields = isset( $DataArray['GetAccessTokenFields'] ) ? $DataArray['GetAccessTokenFields'] : array();
		$Token                = isset( $GetAccessTokenFields['Token'] ) ? $GetAccessTokenFields['Token'] : '';
		$Verifier             = isset( $GetAccessTokenFields['Verifier'] ) ? $GetAccessTokenFields['Verifier'] : '';
		$SubjectAlias         = isset( $GetAccessTokenFields['SubjectAlias'] ) ? $GetAccessTokenFields['SubjectAlias'] : '';

		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetAccessTokenRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $Token != '' ? '<token xmlns="">' . $Token . '</token>' : '';
		$XMLRequest .= $Verifier != '' ? '<verifier xmlns="">' . $Verifier . '</verifier>' : '';
		$XMLRequest .= $SubjectAlias != '' ? '<subjectAlias xmlns="">' . $SubjectAlias . '</subjectAlias>' : '';
		$XMLRequest .= '</GetAccessTokenRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Permissions', 'GetAccessToken' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$Scope  = array();
		$Scopes = $DOM->getElementsByTagName( 'scope' )->length > 0 ? $DOM->getElementsByTagName( 'scope' ) : array();
		foreach ( $Scopes as $ScopeType ) {
			array_push( $Scope, $ScopeType->nodeValue );
		}

		$Token       = $DOM->getElementsByTagName( 'token' )->length > 0 ? $DOM->getElementsByTagName( 'token' )->item( 0 )->nodeValue : '';
		$TokenSecret = $DOM->getElementsByTagName( 'tokenSecret' )->length > 0 ? $DOM->getElementsByTagName( 'tokenSecret' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'Scope'         => $Scope,
			'Token'         => $Token,
			'TokenSecret'   => $TokenSecret,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GetPermissions API request to PayPal.
	 *
	 * @access    public
	 * @param string $Token Token returned from a GetAccessToken request.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetPermissions( $Token ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetPermissionsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $Token != '' ? '<token xmlns="">' . $Token . '</token>' : '';
		$XMLRequest .= '</GetPermissionsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Permissions', 'GetPermissions' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$Scope  = array();
		$Scopes = $DOM->getElementsByTagName( 'scope' )->length > 0 ? $DOM->getElementsByTagName( 'scope' ) : array();
		foreach ( $Scopes as $ScopeType ) {
			array_push( $Scope, $ScopeType->nodeValue );
		}


		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'Scope'         => $Scope,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit CancelPermissions API request to PayPal.
	 *
	 * @access    public
	 * @param string $Token Token returned from a GetAccessToken request.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function CancelPermissions( $Token ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<CancelPermissionsRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= $Token != '' ? '<token xmlns="">' . $Token . '</token>' : '';
		$XMLRequest .= '</CancelPermissionsRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Permissions', 'CancelPermissions' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GetBasicPersonalData API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $AttributeList Array structure of the list of attributes to obtain for a user.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetBasicPersonalData( $AttributeList ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetBasicPersonalDataRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= '<attributeList xmlns="">';
		foreach ( $AttributeList as $Attribute ) {
			$XMLRequest .= '<attribute xmlns="">' . $Attribute . '</attribute>';
		}
		$XMLRequest .= '</attributeList>';
		$XMLRequest .= '</GetBasicPersonalDataRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Permissions', 'GetBasicPersonalData' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$PersonalDataList = $DOM->getElementsByTagName( 'personalData' )->length > 0 ? $DOM->getElementsByTagName( 'personalData' ) : array();

		$PersonalData = array();
		foreach ( $PersonalDataList as $PersonalDataType ) {
			$PersonalDataKey   = $PersonalDataType->getElementsByTagName( 'personalDataKey' )->length > 0 ? $PersonalDataType->getElementsByTagName( 'personalDataKey' )->item( 0 )->nodeValue : '';
			$PersonalDataValue = $PersonalDataType->getElementsByTagName( 'personalDataValue' )->length > 0 ? $PersonalDataType->getElementsByTagName( 'personalDataValue' )->item( 0 )->nodeValue : '';

			$PersonalDataItem = array( 'PersonalDataKey' => $PersonalDataKey, 'PersonalDataValue' => $PersonalDataValue );
			array_push( $PersonalData, $PersonalDataItem );
		}

		$PersonalDataKey   = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';
		$PersonalDataValue = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'PersonalData'  => $PersonalData,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}


	/**
	 * Submit GetAdvancedPersonalData API request to PayPal.
	 *
	 * @access    public
	 * @param mixed[] $AttributeList Array structure of the list of attributes to obtain for a user.
	 * @return    mixed[] $ResponseDataArray    Returns XML result parsed as an array.
	 */
	function GetAdvancedPersonalData( $AttributeList ) {
		// Generate XML Request
		$XMLRequest = '<?xml version="1.0" encoding="utf-8"?>';
		$XMLRequest .= '<GetAdvancedPersonalDataRequest xmlns="' . $this->XMLNamespace . '">';
		$XMLRequest .= $this->GetXMLRequestEnvelope();
		$XMLRequest .= '<attributeList xmlns="">';
		foreach ( $AttributeList as $Attribute ) {
			$XMLRequest .= '<attribute xmlns="">' . $Attribute . '</attribute>';
		}
		$XMLRequest .= '</attributeList>';
		$XMLRequest .= '</GetAdvancedPersonalDataRequest>';

		// Call the API and load XML response into DOM
		$XMLResponse = $this->CURLRequest( $XMLRequest, 'Permissions', 'GetAdvancedPersonalData' );
		$DOM         = new DOMDocument();
		$DOM->loadXML( $XMLResponse );

		$this->Logger( $this->LogPath, __FUNCTION__ . 'Request', $XMLRequest );
		$this->Logger( $this->LogPath, __FUNCTION__ . 'Response', $XMLResponse );

		// Parse XML values
		$Fault         = $DOM->getElementsByTagName( 'FaultMessage' )->length > 0 ? true : false;
		$Errors        = $this->GetErrors( $XMLResponse );
		$Ack           = $DOM->getElementsByTagName( 'ack' )->length > 0 ? $DOM->getElementsByTagName( 'ack' )->item( 0 )->nodeValue : '';
		$Build         = $DOM->getElementsByTagName( 'build' )->length > 0 ? $DOM->getElementsByTagName( 'build' )->item( 0 )->nodeValue : '';
		$CorrelationID = $DOM->getElementsByTagName( 'correlationId' )->length > 0 ? $DOM->getElementsByTagName( 'correlationId' )->item( 0 )->nodeValue : '';
		$Timestamp     = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$PersonalDataList = $DOM->getElementsByTagName( 'personalData' )->length > 0 ? $DOM->getElementsByTagName( 'personalData' ) : array();

		$PersonalData = array();
		foreach ( $PersonalDataList as $PersonalDataType ) {
			$PersonalDataKey   = $PersonalDataType->getElementsByTagName( 'personalDataKey' )->length > 0 ? $PersonalDataType->getElementsByTagName( 'personalDataKey' )->item( 0 )->nodeValue : '';
			$PersonalDataValue = $PersonalDataType->getElementsByTagName( 'personalDataValue' )->length > 0 ? $PersonalDataType->getElementsByTagName( 'personalDataValue' )->item( 0 )->nodeValue : '';

			$PersonalDataItem = array( 'PersonalDataKey' => $PersonalDataKey, 'PersonalDataValue' => $PersonalDataValue );
			array_push( $PersonalData, $PersonalDataItem );
		}

		$PersonalDataKey   = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';
		$PersonalDataValue = $DOM->getElementsByTagName( 'timestamp' )->length > 0 ? $DOM->getElementsByTagName( 'timestamp' )->item( 0 )->nodeValue : '';

		$ResponseDataArray = array(
			'Errors'        => $Errors,
			'Ack'           => $Ack,
			'Build'         => $Build,
			'CorrelationID' => $CorrelationID,
			'Timestamp'     => $Timestamp,
			'PersonalData'  => $PersonalData,
			'XMLRequest'    => $XMLRequest,
			'XMLResponse'   => $XMLResponse,
		);

		return $ResponseDataArray;
	}

} // End Class PayPal_Adaptive
