﻿/// <reference path="../../Common/jquery/jquery.js"/>

//Created by Tiago de Souza 06-07-2010
//Validation file, functions in here should be generic
//and only used for validation or to support validation functions


var lfValidation = {}; //used as namespace to avoid conflicts

lfValidation.valReq = function valReq(obj, errorMsg, onValidFunction) {
    var sVal = lfValidation.getTrimmedValue(obj)
    var isValid = false;
    if (sVal == "") {
        lfValidation.setError(obj, errorMsg);
    } else {
        isValid = true;
        lfValidation.clearError(obj);
        if (onValidFunction != undefined) {
            onValidFunction(obj);
        }
    }
    return isValid;
}

lfValidation.valReqEx = function valReq(ValueElement, DisplayElement,  errorMsg, onValidFunction) {
    var sVal = lfValidation.getTrimmedValue(ValueElement)
    var isValid = false;
    if (sVal == "") {
        lfValidation.setError(DisplayElement, errorMsg);
    } else {
        isValid = true;
        lfValidation.clearError(DisplayElement);
        if (onValidFunction != undefined) {
            onValidFunction(obj);
        }
    }
    return isValid;
}

lfValidation.valReg = function valReg(obj, regExp, errorMsg, onValidFunction) {
    var sVal = lfValidation.getTrimmedValue(obj);
    if (sVal != '') {
        if (sVal.match(regExp) == null) {
            lfValidation.setError(obj, errorMsg);
        } else {
            lfValidation.clearError(obj);
            if (onValidFunction != undefined) {
                onValidFunction(obj);
            }
        }
    } else {//not enought to validate, just clear error
        lfValidation.clearError(obj);
    }
}
lfValidation.valCheckBoxRange = function (obj, errorMsg, onValidFunction) {
    if ($('#callPurpose').find('input:checked').length == 0) {
        lfValidation.setError(obj, errorMsg);
    } else {
        lfValidation.clearError(obj);
        if (onValidFunction != undefined) {
            onValidFunction(obj);
        }
    }
};
lfValidation.valDate = function valDate(obj, errorMsg, minDateDiff, minDateDiffError, onValidFunction) {
    //if you do not require a min date diff, pass 0 and '' for the error msg.
    var sDate = '';
    var objid;
    var isSelect = false;
    var isValid = false;
    if ($(obj).is('select')) {//multiple dropdowns make a date,
        //dropdown id should be XXXX_day for the day, XXXX_year...and so on
        isSelect = true;
        objid = lfValidation.getCmbDateId(obj);
        sDate = lfValidation.getCmbDate(obj);
    } else {
        sDate = $(obj).val();
    }
    if (sDate != '') {
        if (lfValidation.isDate(sDate)) {
            if (minDateDiff != 0) { //validate min age.
                if (lfValidation.isMinimunAge(sDate, minDateDiff)) {
                    isValid = true;
                } else {
                    errorMsg = minDateDiffError;
                }
            }
        }
        if (isValid) {
            if (isSelect) {
                lfValidation.clearError($('#' + objid + '_month'));
                lfValidation.clearError($('#' + objid + '_day'));
                lfValidation.clearError($('#' + objid + '_year'));
            } else {
                lfValidation.clearError(obj);
            }
            if (onValidFunction != undefined) {
                onValidFunction(obj);
            }
        } else {
            if (isSelect) {
                lfValidation.setError($('#' + objid + '_month'), errorMsg);
                lfValidation.setError($('#' + objid + '_day'), errorMsg);
                lfValidation.setError($('#' + objid + '_year'), errorMsg);
            } else {
                lfValidation.setError(obj, errorMsg);
            }

        }
    }
}
lfValidation.valComp = function valComp(obj, compareID, errorMsg, onValidFunction) {
    var sVal = lfValidation.getTrimmedValue(obj);
    var sCompVal = lfValidation.getTrimmedValue($("#" + compareID));

    if (sVal.toLowerCase() != sCompVal.toLowerCase()) {
        lfValidation.setError(obj, errorMsg);
    } else {
        lfValidation.clearError(obj);
        if (onValidFunction != undefined) {
            onValidFunction(obj);
        }
    }
}
lfValidation.valABA = function valABA(obj, errorMsg, onValidFunction) {
    var bIsValid = false;
    var sVal = lfValidation.getTrimmedValue(obj);
    // Run through each digit and calculate the total.
    var c = 0;
    var i = 0;
    var n = 0;
    var t = "";
    try {
        for (i = 0; i < sVal.length; i++) {
            c = parseInt(sVal.charAt(i), 10);
            t = t + c;
        }


        if (t.length == 9)// pass 9 digit check
        {
            // Now run through each digit and calculate the total.
            n = 0;
            for (i = 0; i < t.length; i += 3) {
                n += (parseInt(t.charAt(i), 10) * 3) + (parseInt(t.charAt(i + 1), 10) * 7) + parseInt(t.charAt(i + 2), 10);
            }
            // If the resulting sum is an even multiple of ten (but not zero),
            // the aba routing number is good.
            bIsValid = (n != 0 && n % 10 == 0);
        }
    }
    catch (err) {
        //do nothing
    }
    if (bIsValid == false) {
        lfValidation.setError(obj, errorMsg);
    } else {
        lfValidation.clearError(obj);
        if (onValidFunction != undefined) {
            onValidFunction(obj);
        }
    }
}

//**************************************************
//          validation helper functions            |
//**************************************************
lfValidation.setError = function setError(obj, errorMsg) {
    $(obj).addClass('cc_error_control');
    $("#" + $(obj).attr('id') + "_img").attr('alt', errorMsg).attr('title', errorMsg).show();
}
lfValidation.clearError = function clearError(obj) {
    $("#" + $(obj).attr('id') + "_img").hide();
    $(obj).removeClass('cc_error_control');
}
lfValidation.getCmbDateId = function getCmbDateId(obj) {
    var objid;
    var ic = $(obj).children().length; //item count
    switch (ic) {
        case 13: //month
            objid = $(obj).attr('id').replace('_month', '');
            break;
        case 32: //day
            objid = $(obj).attr('id').replace('_day', '');
            break;
        default: //year
            objid = $(obj).attr('id').replace('_year', '');
            break;
    }
    return objid;
}
lfValidation.getCmbDate = function getCmbDate(obj) {
    //dropdown id should be XXXX_day for the day, XXXX_year...and so on
    var sDate = '';
    var m, d, y;
    var objid = lfValidation.getCmbDateId(obj);
    m = $('#' + objid + '_month').val();
    d = $('#' + objid + '_day').val();
    y = $('#' + objid + '_year').val();
    if ((m != '') && (d != '') && (y != '')) { //have all values..validate
        sDate = m + '/' + d + '/' + y;
    }
    return sDate;
}
lfValidation.getTrimmedValue = function getTrimmedValue(obj) {
    var sVal = $(obj).val();
    if (sVal.length > 0) { //test first and last
        if ((sVal[0] == ' ') || (sVal[sVal.length - 1] == ' ')) { //replace
            sVal = $.trim(sVal);
            $(obj).val(sVal); //replace contents
        }
    }
    return sVal;
}
lfValidation.isDate = function isDate(dateStr) {
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
    var matchArray = dateStr.match(datePat); // is the format ok?

    if (matchArray == null)
    { return false; }

    month = matchArray[1]; // parse date into variables
    day = matchArray[3];
    year = matchArray[5];

    if (month < 1 || month > 12) { // check month range
        return false;
    }

    if (day < 1 || day > 31)
    { return false; }

    if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31)
    { return false; }

    if (month == 2) { // check for february 29th
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day > 29 || (day == 29 && !isleap))
        { return false; }
    }
    return true; // date is valid
}
lfValidation.isMinimunAge = function isMinimunAge(i_date, minAge) {
    i_date = new Date(i_date);
    var dtDate = new Date(); //today
    var intAge;
    intAge = dtDate.getFullYear() - i_date.getFullYear();
    i_date.setYear(dtDate.getFullYear())
    i_date.setHours(0, 0, 0, 0);
    i_date.setHours(0, 0, 0, 0);
    if (dtDate < i_date)
    { intAge--; }

    if (intAge < minAge)
        return false;
    else
        return true;

}
///stepElementsIDs should be an array of ID's or a single string
lfValidation.validateStep = function (stepElementIDs) {
    if ($.isArray(stepElementIDs)){
        $.each(stepElementIDs, function(i, item){
            $("#" + item + ":input:visible").blur().change();
        });
    }else{ //do a single div
        $("#" + stepElementIDs + " :input:visible").blur().change();
    }
    return lfValidation.isFormValid(stepElementIDs);
};
// stepElementID is the id of the wrapping element of the control you want to see if its valid
//If not passed it will check if controls are valid based on the class.
lfValidation.isFormValid = function isFormValid(stepElementID) {
    var RetVal = false;
    var controlsThatFailed = "";
    var SelectorText;

    if (stepElementID && stepElementID != "") { //validate one step
        SelectorText = "#" + stepElementID + " .cc_error_control:visible";
    }
    else { //validate all errors
        SelectorText = ".cc_error_control:visible";
    }

    $(SelectorText).each(function () {
        controlsThatFailed += this.id + "; ";
    });
    if (controlsThatFailed == "") {
        RetVal = true;
    }
    return RetVal;
}
