/**
 * Implement buildForm hook to remove billing fields if elsewhere on the form.
 *
 * @param string $formName
 * @param CRM_Contribute_Form_Contribution_Main|CRM_Event_Form_Registration_Register $form
 */
function omnipaymultiprocessor_civicrm_buildForm($formName, &$form)
{
    if ($formName == 'CRM_Admin_Form_PaymentProcessor') {
        foreach (array('signature', 'test_signature') as $fieldName) {
            if ($form->elementExists($fieldName)) {
                $label = $form->_elements[$form->_elementIndex[$fieldName]]->_label;
                $form->removeElement($fieldName);
                $form->add('textarea', $fieldName, $label, array('rows' => 4, 'cols' => 40));
            }
        }
    }
    if (omnipaymultiprocessor__versionAtLeast(4.6)) {
        return;
    }
    if (!omnipaymultiprocessor_is_credit_card_form($formName) || $form->_paymentProcessor['class_name'] != 'Payment_OmnipayMultiProcessor') {
        return;
    }
    $paymentType = civicrm_api3('option_value', 'getsingle', array('value' => $form->_paymentProcessor['payment_type'], 'option_group_id' => 'payment_type'));
    $form->assign('paymentTypeName', $paymentType['name']);
    $paymentFields = omnipaymultiprocessor_get_valid_form_payment_fields($formName == 'CRM_Contribute_Form_Contribution_Main' ? 'contribute' : 'event', $form->_paymentProcessor, empty($form->_paymentFields) ? array() : $form->_paymentFields);
    if (!empty($paymentFields)) {
        $form->assign('paymentFields', $paymentFields);
        $form->assign('paymentTypeLabel', ts($paymentType['label'] . ' Information'));
    } else {
        $form->assign('paymentFields', NULL);
        $form->assign('paymentTypeLabel', NULL);
    }
    $billingDetailsFields = omnipaymultiprocessor_getBillingPersonalDetailsFields($form->_paymentProcessor);
    //we trick CiviCRM into adding the credit card form so we can remove the parts we don't want (the credit card fields)
    //for a transparent redirect like Cybersource
    $billingMode = $form->_paymentProcessor['billing_mode'];
    $form->_paymentProcessor['billing_mode'] = CRM_Core_Payment::BILLING_MODE_FORM;
    CRM_Core_Payment_Form::buildCreditCard($form);
    $form->_paymentProcessor['billing_mode'] = $billingMode;
    //CiviCRM assumes that if it is Not a credit card it MUST be a direct debit & makes those required
    $suppressedFields = omnipaymultiprocessor_get_suppressed_billing_fields((array) $billingDetailsFields, (array) $paymentFields, (array) $form->_paymentFields);
    foreach ($suppressedFields as $suppressedField) {
        $form->_paymentFields[$suppressedField]['is_required'] = FALSE;
    }
    $form->assign('suppressedFields', $suppressedFields);
    $form->assign('billingDetailsFields', $billingDetailsFields);
    CRM_Core_Region::instance('billing-block')->update('default', array('disabled' => TRUE));
    CRM_Core_Region::instance('billing-block')->add(array('template' => 'SubstituteBillingBlock.tpl'));
}
/**
 * Add the billing field to the payment form if required.
 *
 * This requires 4.6.10 or greater due to an earlier bug. 4.7 should not require this.
 *
 * @param CRM_Core_Form $form
 */
function omnipaymultiprocessor_addBillingFieldsTo46Form(&$form)
{
    $billingDetailsFields = omnipaymultiprocessor_getBillingPersonalDetailsFields($form->_paymentProcessor);
    if (!empty($billingDetailsFields)) {
        if (empty($form->_paymentFields)) {
            $form->_paymentFields = $billingDetailsFields;
        }
        $metadata = omnipaymultiprocessor_getBillingPersonalDetailsMetadata($form->_paymentProcessor);
        foreach ($metadata as $name => $field) {
            if (!empty($field['cc_field'])) {
                if (!empty($field['cc_field'])) {
                    if ($field['htmlType'] == 'chainSelect') {
                        $form->addChainSelect($field['name'], array('required' => FALSE));
                    } else {
                        $form->add($field['htmlType'], $field['name'], $field['title'], $field['attributes'], FALSE);
                    }
                }
            }
            $requiredPaymentFields[$field['name']] = $field['is_required'];
        }
        $form->assign('requiredPaymentFields', $requiredPaymentFields);
        $form->assign('billingDetailsFields', $billingDetailsFields);
    }
    $form->billingFieldSets['billing_name_address-group']['fields'] = array();
}