﻿ClientValidation = function (p_vGrp, p_errMsgWrpId) {
    if ('undefined' == typeof (p_vGrp) || 'undefined' == typeof (p_errMsgWrpId)) {
        alert('Creating the ClientValidation object failed since one or more parameters is missing!');
        return false;
    }
    // Private members
    var _this = this;
    var m_vGrpName = p_vGrp;
    var m_errMsgWrpObj = document.getElementById(p_errMsgWrpId);
    var m_invalidItemsArr = new Array();
    var m_cbxValidationArr = new Array();
    // Public Properties
    this.get_isValid = function () { return 1 > m_invalidItemsArr.length; }
    /// <summary>
    /// Private class for storing validation errors
    /// </summary>
    CVItem = function (p_validatedCtrlId, p_errMsg) {
        this.validatedCtrlId = p_validatedCtrlId;
        this.errMsg = p_errMsg;
    }

    // Public functions
    this.addCbxValidationItem = function (p_cbxId, p_errMsg) {
        if ('undefined' == typeof (p_cbxId) || 'undefined' == typeof (p_errMsg)) {
            alert('Creating a CbxValidationItem object failed since one or more parameters is missing!');
            return false;
        }
        m_cbxValidationArr[m_cbxValidationArr.length] = new CVItem(p_cbxId, p_errMsg);
    }

    this.validate = function () {
        var isValid = true;
        m_invalidItemsArr = new Array();
        _this.clearErrors();
        if (!Page_ClientValidate(m_vGrpName)) {
            isValid = false;
            if (0 < m_vGrpName.length) {
                for (var i = 0; i < Page_Validators.length; i++) {
                    if (Page_Validators[i].validationGroup == m_vGrpName && !Page_Validators[i].isvalid) {
                        m_invalidItemsArr[m_invalidItemsArr.length] = new CVItem(Page_Validators[i].controltovalidate, Page_Validators[i].errormessage);
                    }
                }
            }
            else {
                for (var i = 0; i < Page_Validators.length; i++) {
                    if (!Page_Validators[i].isvalid) {
                        m_invalidItemsArr[m_invalidItemsArr.length] = new CVItem(Page_Validators[i].controltovalidate, Page_Validators[i].errormessage);
                    }
                }
            }
        }
        var cbx;
        for (var i = 0; i < m_cbxValidationArr.length; i++) {
            cbx = document.getElementById(m_cbxValidationArr[i].validatedCtrlId);
            if (null != cbx && !cbx.checked) {
                m_invalidItemsArr[m_invalidItemsArr.length] = new CVItem(m_cbxValidationArr[i].validatedCtrlId, m_cbxValidationArr[i].errMsg);
                isValid = false;
            }
        }
        _this.renderErrors(false);
        if (!isValid) {
            Page_BlockSubmit = false; // Otherwise it requires at least two tries to submit even if the first try was valid
        }
    };

    this.renderErrors = function (p_clearErrors) {
        if (p_clearErrors)
            _this.clearErrors();

        var vCtrl, errMsg = '', firstVCtrl = null;
        for (var i = 0; i < m_invalidItemsArr.length; i++) {
            vCtrl = document.getElementById(m_invalidItemsArr[i].validatedCtrlId);
            if (null != vCtrl) {
                if (0 == i)
                    firstVCtrl = vCtrl;
                vCtrl.className += ' isInvalid';
                // If control is checkbox, check for label assuming it has the same parent as the checkbox
                if (vCtrl.type && 'checkbox' == vCtrl.type.toLowerCase()) {
                    var labelArr = vCtrl.parentNode.getElementsByTagName('label');
                    for (var j = 0; j < labelArr.length; j++) {
                        if (m_invalidItemsArr[i].validatedCtrlId == labelArr[j].getAttribute('for')) {
                            labelArr[j].className += ' isInvalid';
                            break;
                        }
                    }
                }
                vCtrl.tagName.toLowerCase() == ''
                errMsg += '<span class="errMsg">* ' + m_invalidItemsArr[i].errMsg + '</span>';
            }
        }
        // If fore some reason no error messages have been added to the validation controls
        if (0 < m_invalidItemsArr.length && 1 > errMsg.length)
            errMsg = '<span class="errMsg">Form is not valid! Make sure all mandatory fields has a correct value.</span>';

        m_errMsgWrpObj.innerHTML = errMsg;
        if (null != firstVCtrl)
            firstVCtrl.focus();
    }

    this.clearErrors = function () {
        var vCtrl;
        if (0 < m_vGrpName.length) {
            for (var i = 0; i < Page_Validators.length; i++) {
                if (Page_Validators[i].validationGroup == m_vGrpName) {
                    vCtrl.className = vCtrl = document.getElementById(Page_Validators[i].controltovalidate);
                    if (null != vCtrl) {
                        vCtrl.className.replace(/isInvalid/g, '').replace(/ isInvalid/g, '');
                    }
                }
            }
        }
        else {
            for (var i = 0; i < Page_Validators.length; i++) {
                vCtrl = document.getElementById(Page_Validators[i].controltovalidate);
                if (null != vCtrl) {
                    vCtrl.className = vCtrl.className.replace(/isInvalid/g, '').replace(/ isInvalid/g, '');
                }
            }
        }
        // If checkbox validation is used, make sure to reset these
        for (var i = 0; i < m_cbxValidationArr.length; i++) {
            vCtrl = document.getElementById(m_cbxValidationArr[i].validatedCtrlId);
            if (null != vCtrl) {
                // Check for label assuming it has the same parent as the checkbox
                var labelArr = vCtrl.parentNode.getElementsByTagName('label');
                for (var j = 0; j < labelArr.length; j++) {
                    if (m_cbxValidationArr[i].validatedCtrlId == labelArr[j].getAttribute('for')) {
                        labelArr[j].className = labelArr[j].className.replace(/isInvalid/g, '').replace(/ isInvalid/g, '');
                        break;
                    }
                }
            }
        }

        m_errMsgWrpObj.innerHTML = '';
    }

}
