﻿//////////////////////////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;
                case 'password':
                    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');
    var numElms = $$('#' + d_id + ' .' + classToValidate + 'Number');
    for(var i = 0; i < elms.length; i++)
    {
        switch(elms[i].tagName.toLowerCase())
        {
            case 'input':
                //$('sMessage').innerHTML += elms[i].name + ' ' + elms[i].id + ' ';
                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;
                    //Added 06/18/2009
                    case 'radio':
                        var rblname = elms[i].name;
                        var rblSelected = false;
                        var rblLbls = $$('label');
                        var rbls = $$('input[name="' + rblname + '"]');
                        for(var r = 0; r < rbls.length; r++)
                        {
                            if(rbls[r].checked)
                            {
                                //$('sMessage').innerHTML = 'yes';
                                rblSelected = true;
                            }
                        }
                        if(!rblSelected)
                        {
                            for(var r = 0; r < rbls.length; r++)
                            {
                                if(rblLbls[0].htmlFor == rbls[r].id)
                                {
                                    rbls[r].addClassName(errorClass);
                                    errorCount++;
                                }
                            }
                        }
                        else
                        {
                        
                        }
                        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(numElms.length > 0)
    {
        for(var r = 0; r < numElms.length; r++)
        {
            if(!DataValidation.validateNumber($F(numElms[r].id)))
            {
                numElms[r].addClassName(errorClass);
                errorCount++;
            }
            else
            {
                numElms[r].removeClassName(errorClass);
                numElms[r].addClassName(classToValidate + 'Number');
            }
        }
    }
    
    if(errorCount > 0)
    {
        return (false);
    }
    else
    {
        return (true);
    }
}

DataValidation.clearForm = function(d_id, classesToClear)
{
    //var elms = $$(d_id);
    for(var i = 0; i < classesToClear.length; i++)
    {
        var elms = $$('div#' + d_id + ' .' + classesToClear[i]);
        for(var j = 0; j < elms.length; j++)
        {
            //$('sMessage').innerHTML += elms[j].id + ' ';
            switch(elms[j].tagName.toLowerCase())
            {
                case 'input':
                    switch(elms[j].type.toLowerCase())
                    {
                        case 'text':
                            elms[j].value = '';
                            elms[j].disabled = false;
                            break;
                        case 'password':
                            elms[j].value = '';
                            elms[j].disabled = false;
                            break;
                        case 'checkbox':
                            elms[j].checked = false;
                            elms[j].disabled = false;
                            break;
                    }
                    break;
                case 'select':
                    elms[j].selectedIndex = 0;
                    elms[j].disabled = false;
                    break;
                case 'select-one':
                    elms[j].selectedIndex = 0;
                    elms[j].disabled = false;
                    break;
                case 'textarea':
                    //elms[j].innerHTML = '';
                    elms[j].value = '';
                    elms[j].disabled = false;
                    break;
                    
                
            }
        }
    }
    
}

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' || type == 'AMEX')
    {
        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.validateNumber = function(str)
{
    return /^-?\d+(\.\d+)?$/.test(str);
}


var Common = Class.create({
    initialize: function()
    {
    }
});
Common.swapDiv = function(oldDiv, newDiv)
{
    $(oldDiv).style.display = 'none';
    $(oldDiv).style.visibility = 'hidden';
    
    $(newDiv).style.display = 'block';
    $(newDiv).style.visibility = 'visible';
}

Common.showDiv = function(d)
{
    $(d).style.display = 'block';
    $(d).style.visibility = 'visible';
}

Common.hideDiv = function(d)
{
    $(d).style.display = 'none';
    $(d).style.visibility = 'hidden';
}

Common.toggleDiv = function(d)
{
    if($(d).style.display == 'none')
    {
        $(d).style.display = 'block';
        $(d).style.visibility = 'visible';
    }
    else
    {
        $(d).style.display = 'none';
        $(d).style.visibility = 'hidden';
    }
}

Common.clearDiv = function(d_id)
{
    $(d_id).innerHTML = '';
}

Common.uncheckAll = function(d_id)
{
    var cbs = $$('div[id="' + d_id + '"] input[type="checkbox"]');
    //$('sMessage').innerHTML = cbs.length;
    for(var i = 0; i < cbs.length; i++)
    {
        $(cbs[i].id).checked = false;
        //$('sMessage').innerHTML += cbs[i].id;
    }
}

Common.clickButton = function (e, buttonid) {
    var evt = e ? e : window.event;
    //var bt = document.getElementById(buttonid);
    var bt = $$('input[id$="' + buttonid + '"]')[0];

    if (bt) {
        if (evt.keyCode == 13) {
            bt.click();
            return false;
        }
    }
}

Common.showMenu = function(targetMenu, menuButton, menuButtonSelectedClass)
{
    Common.showDiv(targetMenu);
    $(menuButton).addClassName(menuButtonSelectedClass);
}

Common.hideMenu = function(targetMenu, menuButton, menuButtonSelectedClass)
{
    Common.hideDiv(targetMenu);
    $(menuButton).removeClassName(menuButtonSelectedClass);
}

Common.toggleMenu = function(targetMenu, menuButton, menuButtonSelectedClass)
{
    if($(targetMenu).style.display == 'block')
    {
        Common.hideMenu(targetMenu, menuButton, menuButtonSelectedClass);  
    } 
    else 
    {
        Common.closeAllMenus('MenuContainer', 'MenuItem', menuButtonSelectedClass);
        Common.showMenu(targetMenu, menuButton, menuButtonSelectedClass);
    }
}   

Common.closeAllMenus = function(menuContainerClass, menuItemsClass, selectedClass)
{
    var cons = $$('.' + menuContainerClass);
    for(var i = 0; i < cons.length; i++)
    {
        Common.hideDiv(cons[i].id);
    }
    
    var its = $$('.' + menuItemsClass);
    for(var j = 0; j < its.length; j++)
    {
        $(its[j]).removeClassName(selectedClass);
    }
}

Common.swapDivCollection = function(dRoot, dToCloseClassName, dToShowClassName, rowIndex)
{
    var dToClose = $$('div#' + dRoot + ' div[id$="_' + rowIndex + '"]');
    var dToShow = $$('div#' + dRoot + ' div[id=$="_' + rowIndex + '"]');
    for(var i = 0; i < dToClose.length; i++)
    {
        Common.hideDiv(dToClose[i].id);
        $('sMessage').innerHTML += dToClose[i].id + ' ';
    }
    
    for(var j = 0; j < dToShow.length; j++)
    {
        Common.showDiv(dToShow[j].id);
    }
//    $('sMessage').innerHTML = dToClose.length;
}

Common.swapImage = function(imgId, newSrc, oldSrc)
{
    if($(imgId).src.indexOf(oldSrc) > -1)
    {
        $(imgId).src = newSrc;
    }
    else
    {
        $(imgId).src = oldSrc;
    }
}

//This method will switch a row in a GridView to the edit mode or display mode depending
//on which mode it is currently in. You pass in the objId which is what needs to be assigned
//to each DIV container that would be either in the Edit collection or the Display collection
Common.toggleEditDisplayRecord = function(dEditCollection, dDisplayCollection, hfMode, objId)
{
    if($F(hfMode + '_' + objId) == 'Display')
    {
        for(var i = 0; i < dEditCollection.length; i++)
        {
            
            $(dEditCollection[i] + '_' + objId).style.display = 'block';
            $(dEditCollection[i] + '_' + objId).style.visibility = 'visible';
            
            $(dDisplayCollection[i] + '_' + objId).style.display = 'none';
            $(dDisplayCollection[i] + '_' + objId).style.visibility = 'hidden';
        }
        $(hfMode + '_' + objId).value = 'Edit';
    }
    else
    {
        for(var j = 0; j < dEditCollection.length; j++)
        {   
            $(dEditCollection[j] + '_' + objId).style.display = 'none';
            $(dEditCollection[j] + '_' + objId).style.visibility = 'hidden';
            
            $(dDisplayCollection[j] + '_' + objId).style.display = 'block';
            $(dDisplayCollection[j] + '_' + objId).style.visibility = 'visible';
        }
        $(hfMode + '_' + objId).value = 'Display';
    }
}


Common.setDropDownListItem = function(ddlId, stringToSet)
{
    for(var i = 0; i < $(ddlId).options.length; i++)
    {
        if($(ddlId).options[i].value == stringToSet)
        {       
            $(ddlId).selectedIndex = i;
        }
    }
}

Common.changeClass = function(elmId, newClass)
{
    $(elmId).setAttribute('class', newClass);
}

Common.compareElementValues = function(elm1, elm2) {
    return $F(elm1) == $F(elm2);
}