void SetupCC()
        {
            ccText.ShouldChangeText = (UITextView textView, NSRange NSRange, string replace) => {
                if (replace != "" && !Char.IsDigit(replace.ToCharArray() [0]))
                {
                    return(false);
                }
                CSRange range         = new CSRange((int)NSRange.Location, (int)NSRange.Length);
                var     formattedText = "";
                flashForError = false;
                updateText    = false;
                scrollForward = false;
                deleting      = false;
                ret           = false;
                deletedSpace  = false;
                cardMonth     = 0;

                if (replace.Length == 0)
                {
                    updateText = true;
                    deleting   = true;
                    if (textView.Text.Length != 0)      // handle case of delete when there are no characters left to delete

                    {
                        char c = textView.Text.Substring(range.Location, 1).ToCharArray() [0];
                        if (range.Location != 0 && range.Length == 1 && (c == ' ' || c == '/'))
                        {
                            range.Location--;
                            range.Length++;
                            deletedSpace = true;
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }

                string newTextOrig = ReplaceInPlace(range.Location, range.Length, textView.Text, replace);

                int newTextLen = newTextOrig.Length;

                // causes the cc entry field to scroll back if the user deletes back beyond the end of the cc number
                if (range.Location <= numberLength)
                {
                    hasFullNumber = false;
                }

                if (textScroller.ContentOffset.X < 10f)
                {
                    ccPlaceHolderWidthConstraint.Constant = 198f;
                }
                if (!hasFullNumber)
                {
                    // scrolls backward
                    int textViewLen  = ccText.Text.Length;
                    int formattedLen = ccPlaceHolder.Text.Length;


                    if (textScroller.ContentOffset.X != 0)
                    {
                        textScroller.SetContentOffset(new PointF(0, 0), true);
                    }

                    UpdateCCimageWithTransitionTime(0, false, true);

                    StatusHelpLabel.Text = "Enter Card Details";

                    string newText = newTextOrig.Replace(" ", String.Empty);
                    int    len     = newText.Length;
                    if (len < JudoDotNetXamarin.Card.CC_LEN_FOR_TYPE)
                    {
                        updateText    = true;
                        formattedText = newTextOrig;

                        Type = CardType.UNKNOWN;
                    }
                    else
                    {
                        Type = cardHelper.GetCCType(newText);
                        switch (Type)
                        {
                        case CardType.UNKNOWN:
                            flashForError = true;
                            break;

                        case CardType.MAESTRO:
                            if (!JudoSDKManager.Instance.MaestroAccepted)
                            {
                                flashForError = true;
                                return(EndDelegate(ccPlaceHolder, ccText, formattedText));
                            }
                            break;

                        case CardType.AMEX:
                            if (!JudoSDKManager.Instance.AmExAccepted)
                            {
                                flashForError = true;
                                return(EndDelegate(ccPlaceHolder, ccText, formattedText));
                            }
                            break;
                        }

                        if (len == JudoDotNetXamarin.Card.CC_LEN_FOR_TYPE)
                        {
                            ccPlaceHolder.Text    = cardHelper.PromptStringForType(Type, true);
                            cvTwoPlaceHolder.Text = cardHelper.CVTwoPromptForType(Type, true);
                            cvTwoPlaceHolder.SetShowTextOffSet(Math.Min(0, 0));
                        }

                        formattedText = cardHelper.FormatForViewing(newText);
                        int lenForCard = cardHelper.LengthOfStringForType(Type);

                        if (len < lenForCard)
                        {
                            updateText = true;
                        }
                        else if (len == lenForCard)
                        {
                            if (cardHelper.isValidNumber(newText))
                            {
                                if (newText.IsLuhnValid())
                                {
                                    numberLength  = cardHelper.LengthOfFormattedStringForType(Type);
                                    creditCardNum = newText;

                                    updateText    = true;
                                    scrollForward = true;
                                    hasFullNumber = true;
                                }
                                else
                                {
                                    FlashRecheckNumberMessage();
                                }
                            }
                            else
                            {
                                FlashRecheckNumberMessage();
                            }
                        }
                    }
                    UpdateCCimageWithTransitionTime(0.25f);
                }

                return(EndDelegate(ccPlaceHolder, ccText, formattedText));
            };
        }