﻿function validateGroup(container, errorCssClassName) {
    var log = '';
    
    if (!container) {
        return false;
    }

    var inputFields = container.getElementsByTagName('input');
    var isValid = true;

    for (var i = 0; i < inputFields.length; i++) {
        var inputField = inputFields[i];

        if (!inputField.getAttribute("validationDisabled")) {
            if (!validateElement(inputField, errorCssClassName)) {
                isValid = false;
                log += inputField.nodeName + '[' + inputField.getAttribute('id') + '] : false\n';
            }
        }
    }

    var selectFields = container.getElementsByTagName('select');

    for (var i = 0; i < selectFields.length; i++) {
        var selectField = selectFields[i];

        if (!selectField.getAttribute("validationDisabled")) {
            if (!validateElement(selectField, errorCssClassName)) {
                isValid = false;
                log += selectField.nodeName + '[' + selectField.getAttribute('id') + '] : false\n';
            }
        }
    }
    
    return isValid;
}

function validateElement(inputField, errorCssClassName) {
    if (inputField.getAttribute("validationDisabled")) {
        return true;
    }

    var classAttribute = (Sys.Browser.name == 'Microsoft Internet Explorer') ? inputField.className : inputField.getAttribute('class');
    var isValid = true;
    
    if (classAttribute) {
        var classAttributes = classAttribute.split(' ');

        for (var z = 0; z < classAttributes.length; z++) {
            switch (classAttributes[z]) {
                case 'required':
                    isValid &= validateRequired(inputField) ? true : false;
                    break;
                case 'required2':
                    isValid &= validateRequired2(inputField) ? true : false;
                    break;
                case 'email':
                    isValid &= validateEmailAddress(inputField) ? true : false;
                    break;
                case 'double':
                    isValid &= validateDouble(inputField) ? true : false;
                    break;
                case 'integer':
                    isValid &= validateInteger(inputField) ? true : false;
                    break;
                case 'individualIdentificationNumber':
                    isValid &= validateIndividualIdentificationNumber(inputField) ? true : false;
                    break;
                case 'vatNumber':
                    isValid &= validateVatNumber(inputField) ? true : false;
                    break;
                case 'url':
                    isValid &= validateUrl(inputField) ? true : false;
                    break;
            }

            if (!isValid) {
                break;
            }
        }
    }

    var spnErrorID = inputField.id + '_error';
    var spnError = $get(spnErrorID);

    if (!isValid) {        
        if (spnError) {
            spnError.style.display = 'inline';
        }
        
        if (!Sys.UI.DomElement.containsCssClass(inputField, errorCssClassName)) {
            Sys.UI.DomElement.addCssClass(inputField, errorCssClassName);
        }
    }
    else {
        if (spnError) {
            spnError.style.display = 'none';
        }

        if (Sys.UI.DomElement.containsCssClass(inputField, errorCssClassName)) {
            Sys.UI.DomElement.removeCssClass(inputField, errorCssClassName);
        }
    }
    
    return isValid;
}

function validateRequired(element) {
    if (!element) {
        return false;
    }
    
    var result = false;

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            result = false;
        }
        else {
            switch (typeAttribute) {
                case 'text':
                    result = (element.value == '') ? false : true;
                    break;
                case 'password':
                    result = (element.value == '') ? false : true;
                    break;
                case 'checkbox':
                    result = element.checked;
                    break;
            }
        }
    }
    else if (element.nodeName == 'SELECT') {
        result = (element.selectedIndex >= 0) ? true : false;
    }

    return result;
}

function validateRequired2(element) {
    if (!element) {
        return false;
    }

    var result = false;

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            result = false;
        }
        else {
            switch (typeAttribute) {
                case 'text':
                    result = (element.value == '') ? false : true;
                    break;
                case 'password':
                    result = (element.value == '') ? false : true;
                    break;
                case 'checkbox':
                    result = element.checked;
                    break;
            }
        }
    }
    else if (element.nodeName == 'SELECT') {
        result = (element.selectedIndex > 0) ? true : false;
    }

    return result;
}

function validateInteger(element) {
    if (!element) {
        return false;
    }

    var valueToValidate = '';

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            return false;
        }

        if ((typeAttribute != 'text') && (typeAttribute != 'password')) {
            return false;
        }

        valueToValidate = element.value;
    }
    else if (element.nodeName == 'SELECT') {
        valueToValidate = element.options[element.selectedIndex].value;
    }

    return /^\d*$/.test(valueToValidate) ? true : false;
}

function validateDouble(element) {
    if (!element) {
        return false;
    }

    var valueToValidate = '';

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            return false;
        }

        if ((typeAttribute != 'text') && (typeAttribute != 'password')) {
            return false;
        }

        valueToValidate = element.value;
    }
    else if (element.nodeName == 'SELECT') {
        valueToValidate = element.options[element.selectedIndex].value;
    }

    return /^\d*,?\d*$/.test(valueToValidate) ? true : false;
}

function validateEmailAddress(element) {
    if (!element) {
        return false;
    }

    var valueToValidate = '';

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            return false;
        }

        if ((typeAttribute != 'text') && (typeAttribute != 'password')) {
            return false;
        }

        valueToValidate = element.value;
    }
    else if (element.nodeName == 'SELECT') {
        valueToValidate = element.options[element.selectedIndex].value;
    }

    return /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/.test(valueToValidate) ? true : false;
}

function validateUrl(element) {
    if (!element) {
        return false;
    }

    var valueToValidate = '';

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            return false;
        }

        if ((typeAttribute != 'text') && (typeAttribute != 'password')) {
            return false;
        }

        valueToValidate = element.value;
    }
    else if (element.nodeName == 'SELECT') {
        valueToValidate = element.options[element.selectedIndex].value;
    }

    return /\b([\d\w\.\/\+\-\?\:]*)((ht|f)tp(s|)\:\/\/|[\d\d\d|\d\d]\.[\d\d\d|\d\d]\.|www\.|\.tv|\.ac|\.com|\.edu|\.gov|\.int|\.mil|\.net|\.org|\.biz|\.info|\.name|\.pro|\.museum|\.co)([\d\w\.\/\%\+\-\=\&amp;\?\:\\\&quot;\'\,\|\~\;]*)\b/.test(valueToValidate) ? true : false;
}

function validateIndividualIdentificationNumber(element) {
    if (!element) {
        return false;
    }

    var valueToValidate = '';

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            return false;
        }

        if (typeAttribute != 'text') {
            return false;
        }

        valueToValidate = element.value;
    }

    if (valueToValidate == '') {
        return false;
    }

    valueToValidate = valueToValidate.toUpperCase();

    if (valueToValidate.length != 16)
        return false;

    var allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    for (var i = 0; i < valueToValidate.length; i++) {
        if (allowedCharacters.indexOf(valueToValidate.charAt(i)) < 0) {
            return false;
        }
    }

    var firstSet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var secondSet = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var s = 0;
    var pairSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var despairSet = "BAKPLCQDREVOSFTGUHMINJWZYX";

    for (var i = 1; i <= 13; i += 2) {
        s += pairSet.indexOf(secondSet.charAt(firstSet.indexOf(valueToValidate.charAt(i))));
    }

    for (var i = 0; i <= 14; i += 2) {
        s += despairSet.indexOf(secondSet.charAt(firstSet.indexOf(valueToValidate.charAt(i))));
    }

    if ((s % 26) != (valueToValidate.charCodeAt(15) - 'A'.charCodeAt(0))) {
        return false;
    }

    return true;
}

function validateVatNumber(element) {
    if (!element) {
        return false;
    }

    var valueToValidate = '';

    if (element.nodeName == 'INPUT') {
        var typeAttribute = element.getAttribute('type');

        if (!typeAttribute) {
            return false;
        }

        if (typeAttribute != 'text') {
            return false;
        }

        valueToValidate = element.value;
    }

    if (valueToValidate == '') {
        return false;
    }

    if (valueToValidate.length != 11) {
        return false;
    }

    var allowedCharacters = "0123456789";

    for (var i = 0; i < valueToValidate.length; i++) {
        if (allowedCharacters.indexOf(valueToValidate.charAt(i)) == -1) {
            return false;
        }
    }

    var s = 0;

    for (var i = 0; i <= 9; i += 2) {
        s += valueToValidate.charCodeAt(i) - '0'.charCodeAt(0);
    }

    for (var i = 1; i <= 9; i += 2) {
        var c = 2 * (valueToValidate.charCodeAt(i) - '0'.charCodeAt(0));

        if (c > 9) {
            c = c - 9;
        }

        s += c;
    }

    if ((10 - s % 10) % 10 != valueToValidate.charCodeAt(10) - '0'.charCodeAt(0)) {
        return false;
    }

    return true;
}
