﻿function getElementByFMFID(controlID)
{
    var qtyArray = $j("[FMFID=\"" + controlID + "\"]").get();
    if (qtyArray.length == 1)
        return qtyArray[0];

    return null;
}

function isCheckBoxListValid(controlID)
{
    var RBL = getElementByFMFID(controlID);
    var checkBoxes = $(RBL).getElementsBySelector('input[type="checkbox"]');
    for(var i = 0; i < checkBoxes.length; i++)
        if(checkBoxes[i].checked)
            return true;
    return false;
}

function isRadioButtonListValid(controlID)
{
    var RBL = getElementByFMFID(controlID);
    var radioButtons = $(RBL).getElementsBySelector('input[type="radio"]');
    for(var i = 0; i < radioButtons.length; i++)
        if(radioButtons[i].checked)
            return true;
    return false;
}

function getValidatorByFMFID(controlID)
{
    var element = getElementByFMFID(controlID);
    if(element)
    {
        var validator;

        // The prototype $$() selector fails to return the validator element.
        // So, I resorted to iterating for it instead.
        for(var i = 0; i < Page_Validators.length; i++)
            if(Page_Validators[i].controltovalidate == element.id)
                validator = Page_Validators[i];
                
        if(validator)
            ValidatorValidate(validator);
    }
}

function registerEventsForCheckBoxList(controlID)
{
    var checkboxes = $$('[FMFID="' + controlID + '"]')[0].getElementsBySelector('input');
    var validator;
    for(var i = 0; i < checkboxes.length; i++)
    {
        Event.observe(checkboxes[i], 'click',
            function(e)
            {
                var table = Event.element(e).ancestors()[3];
                if(table)
                {
                    for(var i = 0; i < Page_Validators.length; i++)
                    {
                        var attrib = $(Page_Validators[i]).readAttribute('ValidateFMFID');
                        if(attrib)
                            if(table.id.endsWith(attrib))
                                validator = Page_Validators[i];
                    }

                    if(validator)
                        ValidatorValidate(validator);
                }
            }
            );
    }
}

function ensureTextAreaMaxLength(controlID)
{
    var textarea = getElementByFMFID(controlID);
    if(textarea)
        {
            var attrib = $(textarea).readAttribute('custommaxlength');
            if(attrib)
            {
                var func =
                    function(e)
                    {
                        var element = Event.element(e);
                        if($F(element).length > attrib)
                            element.value = $F(element).substring(0, attrib);
                    };
                
                Event.observe(textarea, 'change', func);
                Event.observe(textarea, 'keyup', func);
            }
        }
}

function CheckBoxListValidate(source, args)
{
    var fmfid = $(source).readAttribute('ValidateFMFID');
    args.IsValid = isCheckBoxListValid(fmfid);
}

function RadioButtonListValidate(source, args)
{
    args.IsValid = args.Value != '';
}

function StatesDropDownValidate(source, args)
{
    args.IsValid = args.Value != 'Select a State';
}

function CreditCardExpirationValidate(source, args)
{
    var monthYear = args.Value.split(new RegExp('/'));
    args.IsValid = IsCreditCardExpirationValid(monthYear[0], monthYear[1]);
}

function IsCreditCardExpirationValid(month, year)
{
    var date = new Date();
    var currentYear = date.getFullYear();
    var currentMonth = date.getMonth() + 1;
    
    if(year > currentYear)
        return true;
    else
        return year == currentYear & month >= currentMonth;
}

function CreditCardValidate(source, args)
{
    args.IsValid = checkLuhn(args.Value);
}

function checkLuhn(input)
{
    var input = $A(input);
    var sum = 0;
    var numdigits = input.length;
    var parity = numdigits % 2;
    for(var i=0; i < numdigits; i++)
    {
      var digit = parseInt(input[i])
      if(i % 2 == parity) digit *= 2;
      if(digit > 9) digit -= 9;
      sum += digit;
    }
    return (sum % 10) == 0;
}
