﻿//////////////////////////dataValidation.js Version 1.0//////////////////////////////
/*
To use this datavalidation class, call the static method DataValidation.validateRequest 
from your button that either submits or will be doing the validation of your form. 

Application Requirements: this javascript requires the use of prototype-1.6.0.2.js for the 
utility methods


Specify the following:
d_id: the DIV container that all the form elements you want to validate are contained in.
classToValidate: assign a CSS class to all the form elements you want to have validated 
    (conversely, do not put this class on the for the elements you do not want validated, 
    like Address 2).
errorClass: CSS class defined in your style markup that will be the visual queue for the user 
    to adjust or fix the fields.
    
OPTIONAL FEATURES:

Email Address Validation:

If you have an email form element that you want validated, use [classTovalidate] + 'Email'
Example: ValidateThisCssClass is your normal form element class to validate, 
    ValidateThisCssClassEmail will validate for a valid (well formed) email address.

*/
////////////////////////////////////////////////////////////////////////////////////////////

var DataValidation = Class.create({
    initialize: function()
    {
    }
});

DataValidation.isNull = function(p_id)
{
    try
    {
        p_id = $F(p_id);
        return (p_id == null || DataValidation.trim(p_id) == '');
    } catch(ex) {
        return (true);
    }
}

DataValidation.validateElement = function(elmId, errorClass, checkMinMax, lengthToCheck)
{
    var elm = $(elmId);
    var errorCount = 0;
    switch(elm.tagName.toLowerCase())
    {
        case 'input':
            switch(elm.type.toLowerCase())
            {
                case 'text':
                    if(DataValidation.isNull(elmId))
                    {
                        $(elmId).addClassName(errorClass);
                        errorCount++;
                    }
                    else
                    {
                        $(elmId).removeClassName(errorClass);
                    }
                    break;
            }
            break;
        case 'textarea':
            if($F(elmId).length == 0)
            {
                $(elmId).addClassName(errorClass);
                errorCount++;
            }
            else
            {
                $(elmId).removeClassName(errorClass);
            }
            break;
        case 'select':
            if($(elmId).selectedIndex == 0)
                {
                    $(elmId).addClassName(errorClass);
                    errorCount++;
                }
                else
                {
                    $(elmId).removeClassName(errorClass);
                }
            break;
    }
    
    
    if(checkMinMax != undefined)
    {
        switch(checkMinMax)
        {
            case 'max':
                if(!DataValidation.checkMaxLength(elmId, lengthToCheck))
                {
                    $(elmId).addClassName(errorClass);
                    errorCount++;
                }
                else
                {
                    $(elmId).removeClassName(errorClass);
                }
                break;
            case 'min':
                if(!DataValidation.checkMinLength(elmId, lengthToCheck))
                {
                    $(elmId).addClassName(errorClass);
                    errorCount++;
                }
                else
                {
                    $(elmId).removeClassName(errorClass);
                }
                break;
        }
    }
    
    if(errorCount > 0)
    {
        return (false);
    }
    else
    {
        return (true);
    }
}




DataValidation.validateRequest = function(d_id, classToValidate, errorClass, ddlCCTypeId)
{
    var errorCount = 0;
    var elms = $$('#' + d_id + ' .' + classToValidate);
    var emailElms = $$('#' + d_id + ' .' + classToValidate + 'Email');
    var passwordMatchElms = $$('#' + d_id + ' .' + classToValidate + 'Password');
    var ccElms = $$('#' + d_id + ' .' + classToValidate + 'CreditCard');
    for(var i = 0; i < elms.length; i++)
    {
        switch(elms[i].tagName.toLowerCase())
        {
            case 'input':
                switch(elms[i].type)
                {
                    case 'text':
                        if(DataValidation.isNull(elms[i].id))
                        {
                            $(elms[i].id).addClassName(errorClass);
                            errorCount++;
                        }
                        else 
                        {
                            $(elms[i].id).removeClassName(errorClass);
                            $(elms[i].id).addClassName(classToValidate);
                        }
                        break;
                    case 'checkbox':
                        var lbls = $$('label');
                        var lbl;
                        for(var lblcount = 0; lblcount < lbls.length; lblcount++)
                        {
                            if(lbls[lblcount].htmlFor == elms[i].id)
                            {
                                lbl = lbls[lblcount];
                            }
                        }
                        
                        if(!elms[i].checked)
                        {
                            lbl.addClassName(errorClass);
                            $(elms[i].id).addClassName(errorClass);
                            errorCount++;
                        }
                        else
                        {
                            
                            
                            $(elms[i].id).removeClassName(errorClass);
                            lbl.removeClassName(errorClass);
                            $(elms[i].id).addClassName(classToValidate);
                            lbl.addClassName(classToValidate);
                            
                        }
                        break;
                    case 'password':
                        if(DataValidation.isNull(elms[i].id))
                        {
                            $(elms[i].id).addClassName(errorClass);
                            errorCount++;
                        }
                        else 
                        {
                            $(elms[i].id).removeClassName(errorClass);
                            $(elms[i].id).addClassName(classToValidate);
                        }
                        break;
                        
                }
                break;
            case 'select':
                if(elms[i].selectedIndex == 0)
                {
                    $(elms[i].id).addClassName(errorClass);
                    errorCount++;
                }
                else
                {
                    $(elms[i].id).removeClassName(errorClass);
                    $(elms[i].id).addClassName(classToValidate);
                }
                break;
            case 'select-one':
                if(elms[i].selectedIndex == 0)
                {
                    $(elms[i].id).addClassName(errorClass);
                    errorCount++;
                }
                else
                {
                    $(elms[i].id).removeClassName(errorClass);
                    $(elms[i].id).addClassName(classToValidate);
                }
                break;
            case 'textarea':
                if($F(elms[i].id).length == 0)
                {
                    $(elms[i].id).addClassName(errorClass);
                    errorCount++;
                }
                else
                {
                    $(elms[i].id).removeClassName(errorClass);
                    $(elms[i].id).addClassName(classToValidate);
                }
                break;
        }
    }
    for(var j = 0; j < emailElms.length; j++)
    {
        if(DataValidation.isNull(emailElms[j].id))
        {
            $(emailElms[j].id).addClassName(errorClass);
            errorCount++;
        }
        else 
        {
            if(DataValidation.isValidEmailAddress($F(emailElms[j].id)))
            {
                $(emailElms[j].id).removeClassName(errorClass);
                $(emailElms[j].id).addClassName(classToValidate + 'Email');
            }
            else
            {
                $(emailElms[j].id).addClassName(errorClass);
                errorCount++;
            }
        }
    }
    
    
    if(passwordMatchElms.length > 1)
    {
        
        if(passwordMatchElms[0].value != passwordMatchElms[1].value)
        {
            //$('sPasswordMatch').innerHTML = 'hi';
            for(var k = 0; k < 2; k++)
            {
                passwordMatchElms[k].addClassName(errorClass);
                errorCount++;
                $('sPasswordMatch').innerHTML = 'passwords don\'t match';
            }
        }
        else
        {
            //passwords match or both textboxes are blank.
            for(var l = 0; l < 2; l++)
            {
                if(DataValidation.isNull(passwordMatchElms[l].id))
                {
                    //textbox is blank
                    passwordMatchElms[l].addClassName(errorClass);
                    errorCount++;
                }
                else
                {
                    //textbox is not blank and they both match
                    $('sPasswordMatch').innerHTML = 'we have a match!!';
                    passwordMatchElms[l].removeClassName(errorClass);
                    passwordMatchElms[l].addClassName(classToValidate + 'Password');
                }
            }
        }
    }
    
    if(ccElms.length > 0)
    {
        //$('sMessage').innerHTML = 'hello 1';
        for(var m = 0; m < ccElms.length; m++)
        {
            if(DataValidation.isNull(ccElms[m].id))
            {
                ccElms[m].addClassName(errorClass);
                errorCount++;
            }
            else
            {
                //$('sMessage').innerHTML = 'hello' + DataValidation.isValidCreditCard(ddlCCTypeId, ccElms[m].id, errorClass);
                if(parseInt(DataValidation.isValidCreditCard(ddlCCTypeId, ccElms[m].id, errorClass)) > 0)
                {
                    //$('sMessage').innerHTML = 'mike' + DataValidation.isValidCreditCard(ddlCCTypeId, ccElms[m].id, errorClass);
                    ccElms[m].removeClassName(errorClass);
                    ccElms[m].addClassName(classToValidate + 'CreditCard');
                    
                }
                else
                {
                    //$('sMessage').innerHTML = 'hello' + DataValidation.isValidCreditCard(ddlCCTypeId, ccElms[m].id, errorClass);
                    ccElms[m].addClassName(errorClass);
                    errorCount++;
                    
                }
                //ccElms[m].removeClassName(errorClass);
                //ccElms[m].addClassName(classToValidate + 'CreditCard');
            }
        }
    }
    
    if(errorCount > 0)
    {
        return (false);
    }
    else
    {
        return (true);
    }
}

DataValidation.clearForm = function(d_id)
{
    var elms = $$(d_id);
    //$('sMessage').innerHTML = elms.length;
    
}

DataValidation.isValidEmailAddress = function(txt)
{
    var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/
    if(filter.test(txt))
    {
        return (true);
    }
    else
    {
        return (false);
    }
}


DataValidation.isValidCreditCard = function(p_cardTypeId, p_cardNumberId, errorClass)
{
    var regExp = '';
    var type = $F(p_cardTypeId);
    var number = $F(p_cardNumberId);
    
    if(type == 'VISA')
    {
        regExp = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
    }
    else if(type == 'MasterCard')
    {
        regExp = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
    }
    else if(type == 'Discover')
    {
        regExp = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
    }
    else if(type == 'AmericanExpress')
    {
        regExp = /^3[4,7]\d{13}$/;
    }
    else if(type == 'Diners')
    {
        regExp = /^3[0,6,8]\d{12}$/;
    }
    
    if(!regExp.test(number))
    {
         $(p_cardNumberId).addClassName(errorClass);
         $(p_cardTypeId).addClassName(errorClass);
         return (false);
    }
    
    number = (number.split('-')).join('');
    number = (number.split('-')).join('');
    
    var checksum = 0;
    
    for(var i = (2 - (number.length % 2)), il = number.length; i <= il; i+= 2)
    {
        checksum += parseInt(number.charAt(i - 1));
    }
    for(var i = (number.length % 2) + 1, il = number.length; i < il; i += 2)
    {
        var digit = parseInt(number.charAt(i - 1)) * 2;
        
        checksum += ((digit < 10) ? digit : (digit - 9));
    }
   return (!(checksum % 10) && checksum);
}

DataValidation.trim = function(stringToTrim)
{
    return stringToTrim.replace(/^\s+|\s+$/g,'');
}

DataValidation.checkMinLength = function(elmId, minLength)
{
    if($F(elmId).length >= minLength)
    {
        return (true);
    }
    else
    {
        return (false);
    }
}

DataValidation.checkMaxLength = function(elmId, maxLength)
{
    if($F(elmId).length <= maxLength)
    {
        return (true);
    }
    else
    {
        return (false);
    }
}