Files
elwig/WGneu/Validator.cs

192 lines
6.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace WGneu
{
static class Validator
{
private static readonly Dictionary<string, string[][]> PHONE_NRS = new() {
{ "43", new string[][] {
Array.Empty<string>(),
new string[] { "57", "59" },
new string[] {
"50", "517", "718", "804", "720", "780", "800", "802", "810",
"820", "821", "828", "900", "901", "930", "931", "939",
"650", "651", "652", "653", "655", "657", "659", "660", "661",
"663", "664", "665", "666", "667", "668", "669", "67", "68", "69"
}
} },
{ "49", Array.Empty<string[]>() },
{ "48", Array.Empty<string[]>() },
{ "420", Array.Empty<string[]>() },
{ "421", Array.Empty<string[]>() },
{ "36", Array.Empty<string[]>() },
{ "386", Array.Empty<string[]>() },
{ "39", Array.Empty<string[]>() },
{ "33", Array.Empty<string[]>() },
{ "41", Array.Empty<string[]>() },
{ "423", Array.Empty<string[]>() },
};
public static ValidationResult CheckNumericInput(TextBox input)
{
return CheckNumericInput(input, -1);
}
private static ValidationResult CheckNumericInput(TextBox input, int maxLen)
{
string text = "";
int pos = input.CaretIndex;
for (int i = 0; i < input.Text.Length; i++)
{
char ch = input.Text[i];
if (Char.IsDigit(ch))
text += ch;
if (i == input.CaretIndex - 1)
pos = text.Length;
}
input.Text = text;
input.CaretIndex = pos;
if (maxLen >= 0 && input.Text.Length > maxLen)
{
input.Text = input.Text.Substring(0, maxLen);
input.CaretIndex = Math.Min(pos, maxLen);
}
return new(true, null);
}
public static ValidationResult CheckPhoneNumber(TextBox input)
{
string text = "";
int pos = input.CaretIndex;
for (int i = 0, v = 0; i < input.Text.Length; i++)
{
char ch = input.Text[i];
if (v == 0 && input.Text.Length - i >= 2 && ch == '0' && input.Text[i + 1] == '0') {
v++; i++;
text += "+";
} else if (ch == '(' && input.Text.Length - i >= 3 && input.Text[i + 1] == '0' && input.Text[i + 2] == ')') {
i += 2;
}
else if (v == 0 && ch == '0')
{
v += 3;
text += "+43";
}
else if (v == 0 && ch == '+')
{
v++;
text += ch;
}
else if (v > 0 && char.IsDigit(ch))
{
if (PHONE_NRS.Any(kv => text == "+" + kv.Key))
text += " ";
if (text.StartsWith("+43 ")) {
var nr = text[4..];
var vws = PHONE_NRS["43"];
if (v >= 4 && v - 4 < vws.Length && vws[v - 4].Any(vw => nr.StartsWith(vw)))
text += " ";
else if (nr == "1")
text += " ";
else if (v == 7 && nr.Length == 4)
text += " ";
}
v++;
text += ch;
}
if (i == input.CaretIndex - 1)
pos = text.Length;
}
input.Text = text;
input.CaretIndex = pos;
if (text.Length == 0)
return new(true, null);
if (text.Length < 10)
return new(false, "Telefonnummer zu kurz");
return new(true, null);
}
public static ValidationResult CheckEmailAddress(TextBox input)
{
string text = "";
int pos = input.CaretIndex;
bool domain = false;
for (int i = 0; i < input.Text.Length; i++)
{
char ch = input.Text[i];
if (domain)
{
if ((char.IsAscii(ch) && char.IsLetterOrDigit(ch)) || ".-_öäüßÖÄÜẞ".Any(c => c == ch))
{
if (!(text.Last() == '.' && ch == '.'))
text += char.ToLower(ch);
}
}
else
{
if (ch == '@') domain = true;
if (!char.IsControl(ch) && !char.IsWhiteSpace(ch))
text += ch;
}
if (i == input.CaretIndex - 1)
pos = text.Length;
}
input.Text = text;
input.CaretIndex = pos;
if (text.Length == 0)
return new(true, null);
else if (text[0] == '@' || !domain)
return new(false, "E-Mail-Adresse ungültig");
var last = text.Split(".").Last();
if (last.Length < 2 || !last.All(ch => char.IsAscii(ch) && char.IsLower(ch)))
return new(false, "E-Mail-Adresse ungültig");
return new(true, null);
}
public static ValidationResult CheckLfbisNr(TextBox input)
{
var res = CheckNumericInput(input, 7);
if (!res.IsValid)
return res;
if (input.Text.Length == 0)
return new(true, null);
if (input.Text.Length != 7)
return new(false, "Betriebsnummer zu kurz");
// TODO
return new(true, "Not implemented yet");
}
public static ValidationResult CheckUstIdInput(TextBox input)
{
return new(false, "Not implemented yet");
}
public static void SetInputInvalid(TextBox input)
{
input.BorderBrush = System.Windows.Media.Brushes.Red;
}
public static void SetInputValid(TextBox input)
{
input.ClearValue(TextBox.BorderBrushProperty);
}
}
}