﻿// <reference path="~/Scripts/Library.js" />
// <reference path="~/Scripts/WebService.js" />
/// <reference path="~/Scripts/json.js" />

// Name:        InputValidation.js
// Assembly:    logicbase.Web
// Version:     1.0.0
// Author:      lb.sr
// Date:        06.10.2009
//-----------------------------------------------------------------------
// Copyright (C) logic-base GmbH
//-----------------------------------------------------------------------

var messages = null;

/// <summary locid="Behandelt eine valide Eingabe" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b><returns>
function inputValid(control, showMessages) {
    control.className = control.getAttribute('cssErrorOff');
    if (showMessages == true) setMessageInactive(control.getAttribute('id'));
    return true;
}

/// <summary locid="Behandelt eine ungültige Eingabe" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function inputError(control, showMessages) {
    control.className =  control.getAttribute('cssErrorOn');
    addMessage(control.getAttribute('id'), control.getAttribute('messageObject'), showMessages);
    return false;
}

/// <summary locid="Eingabevalidierung Formular" />
/// <param name="groupName">Name der zu validierenden Gruppe</param>
/// <returns type="boolean"><b>true</b> wenn alle Elemente der Gruppe valide, ansonsten <b>false</b><returns>
function doInputGroupValidation(groupName) {
    messages = new Array();
    var ret = true;
    var controlStates = new Array;
    var inputCollection = document.getElementsByTagName("input");
    for (var i = 0; i < inputCollection.length; ++i) {
        var input = inputCollection[i];
        if (input.getAttribute('groupName') != null && input.getAttribute('groupName') == groupName) {
            if (input.type == "checkbox") {
                if (validateCheckbox(input, false) == false) ret = false;
            }
            else {
                if (validateInputBox(input, false) == false) ret = false;
            }
        }
    }
    inputCollection = document.getElementsByTagName("select");
    for (var i = 0; i < inputCollection.length; ++i) {
        var input = inputCollection[i];
        if (input.getAttribute('groupName') != null && input.getAttribute('groupName') == groupName) {
            if (input.getAttribute('inputOptional') == 'false' && input.value == -1) {
                ret = false;
                input.className =  input.getAttribute('cssErrorOn');
                addMessage(input.getAttribute('id'), input.getAttribute('messageObject'), false);
            }
            else{
                input.getAttribute('className', input.getAttribute('cssErrorOff'));
            }
        }
    }
    inputCollection = document.getElementsByTagName("textarea");
    for (var i = 0; i < inputCollection.length; ++i) {
        var input = inputCollection[i];
        if (input.getAttribute('groupName') != null && input.getAttribute('groupName') == groupName) {
            if (validateInputBox(input, false) == false) ret = false;
        }
    }

    if (messages.length != 0) webServiceProxy.AddMessagesArray(messages, lbWebDisplayMessages, lbWebCallFailed);

    return ret;
}

/// <summary locid="Validiert eine Checkbox" />
/// <param name="control">Name der zu Validierenden Checkbox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function validateCheckbox(control, showMessages) {

    if ((control.checked == true) || (control.getAttribute('inputOptional') == 'true')) {
        document.getElementById(control.getAttribute('labelId')).className =  document.getElementById(control.getAttribute('labelId')).getAttribute('cssErrorOff');
        return inputValid(control, showMessages);
    }
    else {
        document.getElementById(control.getAttribute('labelId')).className =  document.getElementById(control.getAttribute('labelId')).getAttribute('cssErrorOn');
        return inputError(control, showMessages);
    }
    
}

/// <summary locid="Eingabevalidierung einzelne Inputbox" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function validateInputBox(control, showMessages) {

    if (control.getAttribute('inputBoxIdToCompare') != null && control.getAttribute('inputBoxIdToCompare') != "") {
        if (control.value != document.getElementById(control.getAttribute('inputBoxIdToCompare')).value) {
            return inputError(control, showMessages);
        }
        else {
            return inputValid(control, showMessages); ;
        }
    }
    else if (control.getAttribute('inputType') == "0") { return checkInputText(control, showMessages); }
    else if (control.getAttribute('inputType') == "1") { return checkInputEmail(control, showMessages); }
    else if (control.getAttribute('inputType') == "2") { return checkInputPosInt(control, showMessages); }
    else if (control.getAttribute('inputType') == "3") { return checkInputPrice(control, showMessages); }
    else if (control.getAttribute('inputType') == "4") { return checkInputDate(control, showMessages); }
    else if (control.getAttribute('inputType') == "5") { return checkInputPasswordSafety(control, showMessages); }
    else if (control.getAttribute('inputType') == "6") { return checkInputPhone(control, showMessages); }
    else if (control.getAttribute('inputType') == "7") { return checkInputUserDefined(control, showMessages); }
    else if (control.getAttribute('inputType') == "8") { return checkInputPosIntOrZero(control, showMessages); }
    else if (control.getAttribute('inputType') == "9") { return checkInputLength(control, showMessages); }
    else if (control.getAttribute('inputType') == "10") { return checkInputIntRange(control, showMessages); }
    else if (control.getAttribute('inputType') == "11") { return checkInputText(control, showMessages); }
    
}

/// <summary locid="Überprüft ein Textfeld auf Gültigkeit" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputText(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'false' && control.value == '') return inputError(control, showMessages);
    return inputValid(control, showMessages);
}

/// <summary locid="Überprüft eine Telefonnummer auf Gültigkeit" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe Gruppe valide, ansonsten <b>false</b><returns>
function checkInputPhone(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'false' && control.value == '') return inputError(control, showMessages);
    return inputValid(control, showMessages);
}

/// <summary locid="Überpfrüft ein Passwort auf Sicherheit" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputPasswordSafety(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'true' && control.value == '') return inputValid(control, showMessages);
    if (checkPasswordSafety(control.value, control.getAttribute('passwordSafetyLevel'))) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Überpfrüft auf eine Positive Zahl oder 0" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputPosIntOrZero(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'true' && control.value == '') return inputValid(control, showMessages);
    if (parseInt(control.value) == 0) return inputValid(control, showMessages);
    if (isPositiveInteger(control.value, control.getAttribute('inputOptional'))) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Überprüft ob die eingabe eine bestimmte Länge hat" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputLength(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'true' && control.value == '') return inputValid(control, showMessages);
    if (control.value.length == control.getAttribute('inputLength')) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Überprüft ob der eingegebene Integer innerhalb eines Wertebereichs liegt" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputIntRange(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'true' && control.value == '') return inputValid(control, showMessages);
    if (checkRegularExpression('[' + control.getAttribute('intRangeMin') + '-' + control.getAttribute('intRangeMax') + ']', control.value)) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Checkt die Eingabe anhand eines vom Programmier festgelegten regulären ausdrucks" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputUserDefined(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'true' && control.value == '') return inputValid(control, showMessages);
    if (checkRegularExpression(control.getAttribute('regExp'), control.getAttribute('valueOf'))) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Prüft einen String gegen einen regulären Ausdruck" />
/// <param name="control">InputBox</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkRegularExpression(regExp, stringToValidate) {
    return stringToValidate.match(regExp);
}

/// <summary locid="Prüft ein Passwort auf Sicherheit" />
/// <param name="pwd">das zu überprüfende Passwort</param>
/// <param name="passwordSafetyLevel">Level der Passwortsicherheit</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe Gruppe valide, ansonsten <b>false</b><returns>
function checkPasswordSafety(pwd, passwordSafetyLevel) {

    var points = pwd.length;

    var has_letter = new RegExp("[a-z]");
    var has_caps = new RegExp("[A-Z]");
    var has_numbers = new RegExp("[0-9]");
    var has_symbols = new RegExp("\\W");

    if (has_letter.test(pwd)) { points += 4; }
    if (has_caps.test(pwd)) { points += 4; }
    if (has_numbers.test(pwd)) { points += 4; }
    if (has_symbols.test(pwd)) { points += 4; }

    if (points >= passwordSafetyLevel) {
        return true;
    }
    else {
        return false;
    }
}

/// <summary locid="Validiert die Eingabe einer Email-Adresse und schreibt ggf. eine FehlerNachricht in die Session" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputEmail(control, showMessages) {
    if (isValidEmail(control.value, control.getAttribute('inputOptional'))) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Validiert die Eingabe eines Positiven Integers und schreibt ggf. eine FehlerNachricht in die Session" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputPosInt(control, showMessages) {
    if (isPositiveInteger(control.value, control.getAttribute('inputOptional'))) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Validiert die Eingabe eines Preises und schreibt ggf. eine FehlerNachricht in die Session. Der Preis kann mit . oder mit , eingegeben werden" />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputPrice(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'true' && control.value == '') return inputValid(control, showMessages);
    if (isNumeric(control.value.replace(',', '.'))) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Validiert die Eingabe eines deutschen Datums und schreibt ggf. eine FehlerNachricht in die Session." />
/// <param name="control">InputBox</param>
/// <param name="showMessages">gibt an, ob beim Hinzufügen der Message direkt die Funktion lbWebDisplayMessages aufgerufen werden soll</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function checkInputDate(control, showMessages) {
    if (control.getAttribute('inputOptional') == 'true' && control.value == '') return inputValid(control, showMessages);
    if (isValidGermanDate(control.value)) {
        return inputValid(control, showMessages);
    }
    else {
        return inputError(control, showMessages);
    }
}

/// <summary locid="Überprüft ein gültiges deutsches Datum. Format: dd.mm.yyyy" />
/// <param name="value">Datum</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function isValidGermanDate(value) {
    var regExResult = /^\d\d?\.\d\d?\.\d\d\d\d$/.test(value);
    if (regExResult == false) return false;
    var dateParts = value.split(".");
    var day = parseInt(dateParts[0].replace(/^0+/, ""));
    var month = parseInt(dateParts[1].replace(/^0+/, "")) - 1;
    var year = parseInt(dateParts[2]);

    var d = new Date(year, month, day);
    return d.getDate() == day && d.getMonth() == month && d.getFullYear() == year;
}

/// <summary locid="Überprüft eine Zahl" />
/// <param name="input">Eingabe</param>
/// <param name="inputOptional">Eingabe optional</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe Gruppe valide, ansonsten <b>false</b><returns>
function isNumeric(input) {
    return (input - 0) == input && input.length > 0;
}

/// <summary locid="Validiert einen positiven Integer auf Gültigkeit" />
/// <param name="input">Eingabe</param>
/// <param name="inputOptional">Eingabe optional</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function validatePosInt(input, inputOptional) {
    if (inputOptional == 'true' && input == '') return true;
    switch (isPositiveInteger(input)) {
        case true:
            return true;
            break;
        case false:
            return false;
    }
}

/// <summary locid="Überprüft einen positiven Integer" />
/// <param name="s">Eingabe</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function isPositiveInteger(s) {
    var secondArg = false;

    if (isPositiveInteger.arguments.length > 1)
        secondArg = isPositiveInteger.arguments[1];

    return (isSignedInteger(s, secondArg)
          && ((isEmpty(s) && secondArg) || (parseInt(s) > 0)));
}

/// <summary locid="Überprüft einen vorzeichenbehafteten Integer" />
/// <param name="s">Eingabe</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function isSignedInteger(s) {
    if (isEmpty(s))
        if (isSignedInteger.arguments.length == 1) return false;
    else return (isSignedInteger.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = false;

        if (isSignedInteger.arguments.length > 1)
            secondArg = isSignedInteger.arguments[1];

        if ((s.charAt(0) == "-") || (s.charAt(0) == "+"))
            startPos = 1;
        return (isInteger(s.substring(startPos, s.length), secondArg))
    }
}

/// <summary locid="Überprüft ob eine Variable null bzw. leer ist" />
/// <param name="s">Eingabe</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function isEmpty(s) {
    return ((s == null) || (s.length == 0))
}

/// <summary locid="Überprüft ob ein einzelnes Zeichen eine Zahl ist" />
/// <param name="c">Eingabe</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function isDigit(c) {
    return ((c >= "0") && (c <= "9"))
}

/// <summary locid="Überpfrüft einen Integer" />
/// <param name="s">Eingabe</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe valide, ansonsten <b>false</b><returns>
function isInteger(s) {
    var i;

    if (isEmpty(s))
        if (isInteger.arguments.length == 1) return 0;
    else return (isInteger.arguments[1] == true);

    for (i = 0; i < s.length; i++) {
        var c = s.charAt(i);

        if (!isDigit(c)) return false;
    }

    return true;
}

/// <summary locid="Validiert eine Email-Adresse auf Gültigkeit" />
/// <param name="email">Email-Adresse</param>
/// <param name="inputOptional">Eingabe optional</param>
/// <returns type="boolean"><b>true</b> wenn Eingabe Gruppe valide, ansonsten <b>false</b><returns>
function isValidEmail(email, inputOptional) {
    if (inputOptional == 'true' && email == '') return true;
    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    if (filter.test(email)) return true
    else return false;
}
