commit 73fbbf1be26dd382432eb74a55dcaf93917e04df Author: Reinhard X. Fürst Date: Sun Nov 2 22:52:08 2025 +0100 First Commit diff --git a/.htpasswd b/.htpasswd new file mode 100644 index 0000000..ee862f6 --- /dev/null +++ b/.htpasswd @@ -0,0 +1 @@ +beogruppe:$apr1$utAfC5bO$v/OQqJ3yfO8gJYeRaHoq1. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1063894 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,52 @@ +services: + nginx: + image: nginx:1.27 + container_name: sternwarte-nginx + depends_on: + - php + env_file: + - ./html/.env + volumes: + - ${PWD}/html:/var/www/html + - ${PWD}/nginx.conf:/etc/nginx/conf.d/default.conf:ro + - ${PWD}/.htpasswd:/etc/nginx/.htpasswd:ro + labels: + - "traefik.enable=true" + - "traefik.http.routers.sternwarte.entrypoints=http" + - "traefik.http.routers.sternwarte.rule=Host(`${MAIN_HOST}`)" + - "traefik.http.middlewares.sternwarte-https-redirect.redirectscheme.scheme=https" + - "traefik.http.routers.sternwarte.middlewares=sternwarte-https-redirect" + - "traefik.http.routers.sternwarte-secure.entrypoints=https" + - "traefik.http.routers.sternwarte-secure.rule=Host(`${MAIN_HOST}`)" + - "traefik.http.routers.sternwarte-secure.tls=true" + - "traefik.http.routers.sternwarte-secure.tls.certresolver=letsencrypt" + - "traefik.http.routers.sternwarte-secure.service=sternwarte" + - "traefik.http.services.sternwarte.loadbalancer.server.port=80" + - "traefik.docker.network=traefik_und_portainer_start_proxy" + networks: + - proxy + - internal + + php: + build: ./php + container_name: sternwarte-php + env_file: + - ./html/.env + volumes: + - ${PWD}/html:/var/www/html + - ${PWD}/php/php.ini:/usr/local/etc/php/conf.d/custom.ini + - ${PWD}/php/my.cnf:/etc/mysql/conf.d/my.cnf:ro + environment: + - DEVELOP=true + networks: + - proxy + - internal + + +networks: + proxy: + name: traefik_und_portainer_start_proxy + external: true + internal: + name: gitea_gitea-internal + external: true diff --git a/html/.env b/html/.env new file mode 100644 index 0000000..51a3e15 --- /dev/null +++ b/html/.env @@ -0,0 +1,6 @@ +PWD=/home/rxf/sternwarte +DB_HOST=gitea-db +DB_USER=sternwarte +DB_PASSWORD=Cast73Po! +DB_NAME=sternwarte +MAIN_HOST=sternwatre.rexfue.de \ No newline at end of file diff --git a/html/sternwarte/.gitignore b/html/sternwarte/.gitignore new file mode 100644 index 0000000..41e3078 --- /dev/null +++ b/html/sternwarte/.gitignore @@ -0,0 +1,10 @@ +OBSOLETE +skycam +wetter/*.png +wetter/*.htm +wetterDBsave +data +.DS_Store +HILFSProgramme/GO +.env +./html/sternwarte/checkfuehrung/node_modules diff --git a/html/sternwarte/.my.cnf b/html/sternwarte/.my.cnf new file mode 100644 index 0000000..d645be0 --- /dev/null +++ b/html/sternwarte/.my.cnf @@ -0,0 +1,4 @@ +[mysqldump] +user=admin_310927 +password=5D5u49cKNFqf + diff --git a/html/sternwarte/Anleitungen/FS2 - alte Steuerung/FS2-Steuerung_anleitung.pdf b/html/sternwarte/Anleitungen/FS2 - alte Steuerung/FS2-Steuerung_anleitung.pdf new file mode 100644 index 0000000..8584ffb Binary files /dev/null and b/html/sternwarte/Anleitungen/FS2 - alte Steuerung/FS2-Steuerung_anleitung.pdf differ diff --git a/html/sternwarte/Anleitungen/Laufschrift_Anleitung.pdf b/html/sternwarte/Anleitungen/Laufschrift_Anleitung.pdf new file mode 100644 index 0000000..5e49f72 Binary files /dev/null and b/html/sternwarte/Anleitungen/Laufschrift_Anleitung.pdf differ diff --git a/html/sternwarte/Anleitungen/NAS ohne VPN_Anleitung.pdf b/html/sternwarte/Anleitungen/NAS ohne VPN_Anleitung.pdf new file mode 100644 index 0000000..1f3bc9d Binary files /dev/null and b/html/sternwarte/Anleitungen/NAS ohne VPN_Anleitung.pdf differ diff --git a/html/sternwarte/Anleitungen/Panasonic-Telefone_Anleitunge.pdf b/html/sternwarte/Anleitungen/Panasonic-Telefone_Anleitunge.pdf new file mode 100644 index 0000000..3aada6a Binary files /dev/null and b/html/sternwarte/Anleitungen/Panasonic-Telefone_Anleitunge.pdf differ diff --git a/html/sternwarte/Anleitungen/Wireguard/Anleitung für Wireguard (VPN).pdf b/html/sternwarte/Anleitungen/Wireguard/Anleitung für Wireguard (VPN).pdf new file mode 100644 index 0000000..3535b10 Binary files /dev/null and b/html/sternwarte/Anleitungen/Wireguard/Anleitung für Wireguard (VPN).pdf differ diff --git a/html/sternwarte/Anleitungen/Wireguard/Sternwarte.conf b/html/sternwarte/Anleitungen/Wireguard/Sternwarte.conf new file mode 100644 index 0000000..d79187e --- /dev/null +++ b/html/sternwarte/Anleitungen/Wireguard/Sternwarte.conf @@ -0,0 +1,12 @@ +[Interface] +PrivateKey = 6GdKXap4VrVEaEtaIdempQHuZgbKSwFgHMYE3cs390g= +Address = 192.168.1.203/24 +DNS = 192.168.1.1 +DNS = fritz.box + +[Peer] +PublicKey = EnThUhGMz7Of+X+zlJYus0I5nzSAEw1dfsPsQnmOiUo= +PresharedKey = 7zd5rik2am3W0KgROEScBSojQ1acOdfkyYMeMv3fioU= +AllowedIPs = 192.168.1.0/24,0.0.0.0/0 +Endpoint = dmhxl5h2g43ho460.myfritz.net:53905 +PersistentKeepalive = 25 diff --git a/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 1.pdf b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 1.pdf new file mode 100644 index 0000000..9462a94 Binary files /dev/null and b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 1.pdf differ diff --git a/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 2.pdf b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 2.pdf new file mode 100644 index 0000000..bf8726d Binary files /dev/null and b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 2.pdf differ diff --git a/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 3.pdf b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 3.pdf new file mode 100644 index 0000000..1fbb1fd Binary files /dev/null and b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 3.pdf differ diff --git a/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 4.pdf b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 4.pdf new file mode 100644 index 0000000..b856699 Binary files /dev/null and b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 4.pdf differ diff --git a/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 5.pdf b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 5.pdf new file mode 100644 index 0000000..7352641 Binary files /dev/null and b/html/sternwarte/Anleitungen/ZVW_Wetterserver/ITServices2019040610000017 Wetterstation Sternwarte Welzheim 5.pdf differ diff --git a/html/sternwarte/Anleitungen/ZVW_Wetterserver/Wetterstation Sternwarte Welzheim_rsync.pdf b/html/sternwarte/Anleitungen/ZVW_Wetterserver/Wetterstation Sternwarte Welzheim_rsync.pdf new file mode 100644 index 0000000..d173db9 Binary files /dev/null and b/html/sternwarte/Anleitungen/ZVW_Wetterserver/Wetterstation Sternwarte Welzheim_rsync.pdf differ diff --git a/html/sternwarte/DB4js.php b/html/sternwarte/DB4js.php new file mode 100644 index 0000000..4707877 --- /dev/null +++ b/html/sternwarte/DB4js.php @@ -0,0 +1,597 @@ + so viele Einträge ab jetzt holen << $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + +// Holen der Daten aller oder eine einzelnen BEOs +// +// Parameter: +// $id ID des zu holenden BEOs, undefined -> alle holen +// $og true: nur die, die Führung machen, sonst alle +// Return: +// Array mit allen BEOs +function getBEOs($id, $og, $what) +{ + global $db; + if ($id != 'all') { + $sql_stmt = "SELECT $what FROM beos where id='$id' order by name"; + } else { + if($og == 'true') { + $sql_stmt = "SELECT $what FROM beos where gruppe !='' order by name"; + } else { + $sql_stmt = "SELECT $what FROM beos order by name"; + } + } + $erg = array(); + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + +function getOneBEO($kurz, $what) +{ + global $db; + + if ($what == 'true') { + $sql_stmt = "SELECT * FROM beos where name='$kurz'"; + } else { + $sql_stmt = "SELECT $what FROM beos where kürzel='$kurz'"; + } + $erg = array(); + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data ; + // while ($row = mysqli_fetch_assoc($result)) { + // foreach($row as $key => $value) { + // $entry[$key] = $value; + // } + // $erg[] = $entry; + // } + // return $erg; +} + +function updateOneBEOpw($data) +{ + global $db; + $sql_stmt = "UPDATE beos SET pw='$data[pw]' where kürzel='$data[kurz]'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + + +// Daten eines Teilnehmers abholen +// Parameter: +// $id: Teilnehmer - ID +// Return: +// Dict mit allen Daten des Teilnehmers +function getTeilnehmer($seed,$isid,$withdate) +{ + global $db; + $today = date('Ymd'); + $erg = array(); + $entry = array(); + if ($seed == -1) { + $sql_stmt = "SELECT email, fid, id, anzahl FROM anmeldungen WHERE email != '-'"; + } else if($isid) { + $sql_stmt = "SELECT * FROM anmeldungen WHERE id='$seed'"; + } else { + if ($withdate) { + $sql_stmt = "SELECT * FROM anmeldungen WHERE email='$seed' AND fdatum >= '$today'"; + } else { + $sql_stmt = "SELECT * FROM anmeldungen WHERE email='$seed'"; + } + } + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + +// Daten aller Teilnehmer ab eines Führungsdatumns abholen +// Parameter: +// $fid: Führungsdatum, ab dem die Info geholt wirdTeilnehmer - ID +// Return: +// Dict mit allen Daten des Teilnehmers +function getAllTeilnehmer($fdatum) +{ + global $db; + $erg = array(); + $entry = array(); + $sql_stmt = "SELECT * FROM anmeldungen WHERE fdatum>='$fdatum' ORDER BY fid ASC"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + + + +// die Daten der Führungen in dem Bereich start - end +// in ein Array als ISO8601 holen +// Parameter +// $start -> ab diesem Datum +// $end -> bis zu diesem Datum +// Retunrn: +// Array mit den Daten in ISO8601 +function getFuehrungen($start, $end) { + global $db; + $erg = array(); + $sql_sel = "SELECT * FROM fdatum1 where datum >= '$start' AND datum <= '$end' ORDER BY datum ASC"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + + +// die Daten der nächsten $soviel Führungen in ein Array holen +// Parameter +// $soviel -> so viele Einträge ab jetzt holen +// Retunrn: +// Array mit allen Werten aus der Table +function getNextFuehrungen($soviel, $fid) { + global $db; + $erg = array(); + $datum_heute = date("Ymd",strtotime("-1 days")); + if ($fid != 0) { + $sql_sel = "SELECT id, wtag, datum, uhrzeit FROM fdatum where id >= $fid order by datum ASC LIMIT $soviel"; + } else { + $sql_sel = "SELECT id, wtag, datum, uhrzeit FROM fdatum where datum >='$datum_heute' order by datum ASC LIMIT $soviel"; + } + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + while ($row = mysqli_fetch_row($result)) { + $entry = array(); + $entry['fid'] = $row[0]; + $entry['weekday'] = $row[1]; + $entry['date'] = $row[2]; + $entry['time'] = $row[3]; + $erg[] = $entry; + } + return $erg; +} + +function updateTeilnehmer_fdate($id, $fdatum, $fid) { + global $db; + $sql_stmt = "UPDATE anmeldungen SET fdatum=$fdatum,fid=$fid where id=$id"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + +function updateentries($nr,$val,$field) +{ + global $db; + $result = false; + for ($i = 0; $i < count($nr); $i++) { + $sql_stmt = "UPDATE anmeldungen SET $field=$val[0] where id=$nr[$i]"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + } + return $result; +} + +function delCalentry($id) { + global $db; + $sql_stmt = "DELETE FROM kalender WHERE id='$id'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + +function deleteEntry($id) { + global $db; + $sql_stmt = "DELETE FROM anmeldungen WHERE id='$id'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + +// Zählen, wieviele Personen zu einem Führungstermin angemeldet sind +// Parameter: +// $fid -> id des Führungsdatum +// Return: Anzahl der Personen +function getCountsPerDate($fid) { + global $db; + $sql_stmt = "SELECT SUM(anzahl) AS count FROM anmeldungen WHERE fid='$fid'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data['count'] ; +} + + +// Zählen, wieviele Personen zu einem Führungstermin angemeldet sind +// Parameter: +// $date -> Datum der Führung (YYYMDD) +// Return: Anzahl der Personen +function getCountsPerDatefromDate($date) { + global $db; + $sql_stmt = "SELECT SUM(anzahl) AS count FROM anmeldungen WHERE fdatum='$date'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data['count']; +} + +// aus dem Datum (yyyymmdd) die fid aus der Tabelle holen +function getfid($datum) { + global $db; + $sql_stmt = "SELECT * FROM fdatum1 WHERE datum >= $datum LIMIT 1"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data; +} + +// aus der fdatum-Tabelle die Details zur übergeben ID holen +function getOneDate($id) { + global $db; + $sql_stmt = "SELECT * FROM fdatum1 WHERE id='$id'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data; +} + +function insertteilnehmer($data) { + global $db; + $name = $data['name']; + $vorname = $data['vorname']; + $strasse = $data['strasse']; + $plz = intval($data['plz']); + $stadt = $data['stadt']; + $telefon = $data['telefon']; + $email = $data['email']; + $anzahl = intval($data['anzahl']); + $remarks = $data['remarks']; + $fid = intval($data['fid']); + + $sql_stmt = "INSERT INTO anmeldungen (name,vorname,strasse,plz,stadt,telefon,email,anzahl,remarks,fid,angemeldet) " . + "VALUES ('$name','$vorname','$strasse','$plz','$stadt','$telefon','$email','$anzahl','$remarks','$fid', CURDATE())"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + +function updateteilnehmer($data, $id) { + global $db; + $name = $data['name']; + $vorname = $data['vorname']; + $strasse = $data['strasse']; + $plz = $data['plz']; + $stadt = $data['stadt']; + $telefon = $data['telefon']; + $email = $data['email']; + $anzahl = $data['anzahl']; + $remarks = $data['remarks']; + $fid = $data['fid']; + + $sql_stmt = "UPDATE anmeldungen SET " . + "name='$name', vorname='$vorname', strasse='$strasse', plz='$plz', stadt='$stadt', " . + "telefon='$telefon', anzahl='$anzahl', remarks='$remarks', angemeldet=CURDATE() WHERE id='$id'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + +// Email raussenden +function sendConfirmation($subject, $to, $body) { + mb_internal_encoding('UTF-8'); + $subject = mb_encode_mimeheader($subject, 'UTF-8', 'Q'); + $absender = "noreply@sternwarte-welzheim.de"; + $headers = array(); + $headers[] = "MIME-Version: 1.0"; + $headers[] = "Content-type: text/plain; charset=utf-8"; + $headers[] = "From: {$absender}"; + $headers[] = "X-Mailer: PHP/" . phpversion(); + $headers[] = "Reply-To: {$absender}"; + mail($to, $subject, $body, implode("\r\n", $headers),"-f noreply@sternwarte-welzheim.de"); +} + +// Email raussenden +function sendInfoMail($subject, $to, $body) { + mb_internal_encoding('UTF-8'); + $subject = mb_encode_mimeheader($subject, 'UTF-8', 'Q'); + $absender = "noreply@sternwarte-welzheim.de"; + $headers = array(); + $headers[] = "MIME-Version: 1.0"; + $headers[] = "Content-type: text/html; charset=utf-8"; + $headers[] = "From: {$absender}"; + $headers[] = "X-Mailer: PHP/" . phpversion(); + $headers[] = "Reply-To: {$absender}"; + mail($to, $subject, $body, implode("\r\n", $headers),"-f noreply@sternwarte-welzheim.de"); +} + +// Führungsdaten eintragen (für kalender) +function putFdates($data) { + global $db; + + foreach ($data as $d) { + $start = $d['start']; + $grp = $d['group']; + $sql_stmt = "INSERT IGNORE INTO fdates (dateTime, grp)" . + "VALUES ('$start','$grp')"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + } + return $result; +} + +// die Daten der Führungen (fdatum) in dem Bereich start - end +// in ein Array als ISO8601 holen +// Parameter +// $start -> ab diesem Datum +// $end -> bis zu diesem Datum +// Return: +// Array mit den Daten +function getFdates($start, $end) { + global $db; + $erg = array(); + $s = date('Ymd', strtotime($start)); + $e = date('Ymd', strtotime($end)); + $sql_sel = "SELECT * FROM fdatum1 where datum >= '$s' AND datum <= '$e'"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + while ($row = mysqli_fetch_row($result)) { + $entry = array(); + $entry['start'] = $row[2]; + $entry['uhr'] = substr($row[3],0,2); + $entry['title'] = $row[5]; + $entry['count'] = getCountsPerDatefromDate($row[2]); + $erg[] = $entry; + } + return $erg; +} + +function putCalEntry($data) { + global $db; + $t = $data['title']; + $d = $data['description']; + $dt = $data['start']; + $e = $data['end']; + $sql_stmt = "INSERT INTO kalender (start, end, title, description)" . + "VALUES ('$dt', '$e', '$t', '$d')"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + +function getCalEntries($start, $end) { + global $db; + $erg = array(); + $s = date('Ymd', strtotime($start)); + $e = date('Ymd', strtotime($end)); + $sql_sel = "SELECT * FROM kalender where start >= '$s' AND start <= '$e'"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + +function updateCount($date, $anzahl) { + global $db; + $sql_stmt = "UPDATE fdatum1 SET count=count-$anzahl WHERE datum=$date AND count >0"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + return $result; +} + +function getOneRecordTermin($termin) { + global $db; + $erg = array(); + $sql_sel = "SELECT * FROM SoFue2 WHERE DATE(wtermin)='$termin' AND status=2"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + + +// Ein Record von den Sonderführungen mit der ID $id holen und kompleet übermitteln +function getOneSonderTeilnehmer($id) { + global $db; + $query = "select * from SoFue2 where id = $id"; + $result = mysqli_query($db, $query) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; +} + + + + +$_POST = json_decode(file_get_contents('php://input'), true); + +$erg = ""; + +if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $cmd = $_POST["cmd"]; +/* + $x = "["; + foreach ($_POST as $key => $value) { + if(gettype($value) == "array") { + $value = $value[0]; + } + $x = $x . $key . " => " . $value . ","; + } + $x = $x . "]"; +*/ + switch ($cmd) { + case 'GET_ANMELD': + $erg = getAnmeldungen($_POST['id']); + break; + case 'GET_TEILN': + $erg = getTeilnehmer($_POST['id'], true, false); + break; + case 'GET_DATES': + $erg = getNextFuehrungen($_POST['anzahl'], $_POST['fid']); + break; + case 'UPDATE': + $erg = "Nix gut"; + if ((count($_POST['ids']) != 0) and (count($_POST['values']) != 0)) { + $rows = $_POST['ids']; + $values = $_POST['values']; + $erg = updateEntries($rows, $values, $_POST['field']); + } + break; + case 'UPDATETLNFD': + $erg = updateTeilnehmer_fdate($_POST['id'], $_POST['fdatum'], $_POST['fid']); + break; + case 'DELETE_ENTRY': + $erg = deleteEntry($_POST['id']); + break; + case 'GET_COUNTS': + $erg = getCountsPerDate($_POST['id']); + break; + case 'GET_COUNTS_DATE': + $erg = getCountsPerDatefromDate($_POST['date']); + break; + case 'GET_TEILN_EMAIL': + $erg = getTeilnehmer($_POST['mail'], false, false); + break; + case 'GET_DATE_BY_EMAIL': + $erg = getTeilnehmer($_POST['mail'], false, true); + break; + case 'GET_ONE_DATE': + $erg = getOneDate($_POST['fid']); + break; + case 'GET_ALLTEILN': + $erg = getAllTeilnehmer($_POST['fdatum']); + break; + case 'SEND_MAIL': + $erg = sendConfirmation($_POST['subject'], $_POST['to'], $_POST['body']); + break; + case 'SEND_INFO_MAIL': + $erg = sendInfoMail($_POST['subject'], $_POST['to'], $_POST['body']); + break; + case 'SEND_MAIL_HTML': + $absender = "noreply@sternwarte-welzheim.de"; + $erg = sendmail($_POST['subject'], $absender, $_POST['body_txt'], [], [], $_POST['to'], $_POST['body_html']); +// function sendmail($subject, $from, $body_txt, $cc=[], $bcc=[], $to=[], $body_html="") { + break; + case 'INSERT_TLN': + $erg = insertTeilnehmer($_POST['data']); + break; + case 'UPDATE_TLN': + $erg = updateTeilnehmer($_POST['data'], $_POST['id']); + break; + case 'DELETE_TLN': + $erg = deleteEntry($_POST['id']); + break; + case 'UPDATECOUNT': + $erg = updateCount($_POST['date'], $_POST['anzahl']); + break; + case 'GET_ALL_EMAILS': + $erg = getTeilnehmer(-1, true, false); + break; + case 'GET_FUEHRUNGEN': + $erg = getFuehrungen($_POST['start'], $_POST['end']); + break; + case 'PUT_FDATES': + $erg = putFdates($_POST['data']); + break; + case 'GET_FDATES': + $erg = getFdates($_POST['start'], $_POST['end']); + break; + case 'GET_BEOS': + if ( isset($_POST['what'])) { + $erg = getBEOs($_POST['id'], $_POST['onlyguides'], $_POST['what']); + } else { + $erg = getBEOs($_POST['id'], $_POST['onlyguides'], '*'); + } + break; + case 'GET_ONEBEO': + $erg = getOneBEO($_POST['kurz'], $_POST['what']); + break; + case 'UPDATE_ONEBEOPW': + $erg = updateOneBEOpw($_POST['data']); + break; + case 'PUT_CALENTRY': + $erg = putCalEntry($_POST['data']); + break; + case 'GET_CALENTRIES': + $erg = getCalEntries($_POST['start'], $_POST['end']); + break; + case 'DEL_CALENTRY': + $erg = delCalentry($_POST['id']); + break; + case 'GET_FID': + $erg = getfid($_POST['fdatum']); + break; + case 'GET_MAINT': + include 'maintenance.php'; + $erg = $maint; + break; + case 'GET_ONETERMIN': + $erg = getOneRecordTermin($_POST["termin"]); + break; + case 'GET_ONESONDERTEILNEHMER': + $erg = getOneSonderTeilnehmer($_POST["id"]); + break; + + default: + $erg = ['error' => 'Unknown POST-Command', 'cmd' => $cmd, 'params' => $x]; + } +} else { +/* + $x = "["; + foreach ($_GET as $key => $value) { + $x = $x . $key . " => " . $value . ","; + } + $x = $x . "]"; +*/ + $cmd = $_GET['cmd']; + switch ($cmd) { + case 'GET_FDATES': + $erg = getFdates($_GET['start'], $_GET['end']); + break; + default: + $erg = ['error' => 'Unknown GET-Command', 'params' => $x]; + } +} + +// header("Content-type: text/json;charset=utf-8"); + +echo json_encode($erg); + + + diff --git a/html/sternwarte/HWeather/Anleitung.html b/html/sternwarte/HWeather/Anleitung.html new file mode 100755 index 0000000..297c511 --- /dev/null +++ b/html/sternwarte/HWeather/Anleitung.html @@ -0,0 +1,34 @@ + + + + + Historische Wetterdaten + + + + + +
+

Anleitung

+ Bei einem Klick in das Eingabefeld Startdatum erscheint ein Kalender zur Auswahl des Datums. + Im unteren Teil des Kalenders sind Schieberegler, mit denen die Uhrzeit eingestellt + werden kann.
+ Wird 00:00 Uhr eingestellt, so werden die Tageswerte (Höchst-, Tiefst-Werte etc.) angezeigt, + ansonsten die Werte zur angegebenen Uhrzeit.
+ Es können Daten zwischen 1. März 2012 und "gestern" ausgewählt werden.

+ + Wird in das Eingabefeld Enddatum geklickt, so erscheint ebenfalls ein Kalender zur Auswahl. Es kann nun ein + Datumsbereich beginnend mit dem Datum im Startdatum-Feld eingestellt werden.
+ Es sind max. 35 Tage für den Bereich möglich.
+ Es wird dann eine Tabelle mit den Min-/Max-Werten aller Tage in dem gewähten Bereich angezeigt.

+ Unter der Tabelle befinden sich 2 Buttons, mit dem linken gelangt man wieder zur Seite mit dem aktuellen Wetter, mit dem Rechten + kann die angezeigte Tabelle ausgedruckt werden. +
+ rxf 2012-11-20 +
+

+
+ +
+ + diff --git a/html/sternwarte/HWeather/HWeather.html b/html/sternwarte/HWeather/HWeather.html new file mode 100755 index 0000000..35d0d75 --- /dev/null +++ b/html/sternwarte/HWeather/HWeather.html @@ -0,0 +1,56 @@ + + + + + Historische Wetterdaten + + + + + + + + + + + + + + + +
+

Historische Wetterdaten

+

+ der Sternwarte Welzheim +

+ + +
+ +
+ +
+ Startdatum: + Enddatum: +
+ +
+
+
+ +
+ + +
+
+ rxf 2013-11-17 +
+
+ + + + + diff --git a/html/sternwarte/HWeather/HWett.php b/html/sternwarte/HWeather/HWett.php new file mode 100755 index 0000000..a0c7c78 --- /dev/null +++ b/html/sternwarte/HWeather/HWett.php @@ -0,0 +1,207 @@ +exec("set names 'utf8'"); + +function holWert($t,$wert,$minmax) +{ + global $dbh; + + if($minmax==1) + { + $tag = strftime("%d",$t)+0; +// echo "#Tag= $tag"; +// $query = "select $wert from archive where dateTime>=$t and dateTime<($t+86400)"; + $query = "select $wert from archive where dateTime>=$t and dateTime<($t+94000)"; // and strftime('%d',datetime(dateTime,'unixepoche','localtime'))==$tag"; + } + else + { + $query = "select $wert from archive where dateTime=$t"; + } + $sql = $dbh->prepare($query); + $sql->execute(); + $row = $sql->fetch(PDO::FETCH_ASSOC); +// echo "#1: $query\n2: "; +// print_r($row); +// echo "\n#"; + return ($row[$wert]); +} + + +function getTemp($t) +{ + $r = holwert($t,"outTemp",0); + return(round((($r - 32 ) * 5 / 9),1)); +} + +function getPress($t) +{ + $r = holwert($t,"barometer",0); + return(round($r/0.0295299)); +} + +function getHumi($t) +{ + $r = holwert($t,"outHumidity",0); + return($r); +} + +function getRain($t,$h,$m) +{ + global $dbh; + + $curtime = (($h*60)+$m)*60; + $t -= $curtime; // akt Tag, 0h00 berechnen + if($curtime==0) + { + $curtime=86400; + } + $query = "select sum(rain) from archive where dateTime>=$t and dateTime<($t+$curtime)"; + $sql = $dbh->prepare($query); + $sql->execute(); + $row = $sql->fetch(PDO::FETCH_ASSOC); +// echo "#1: $query\n2: $r\n3: $row\n#\n"; + return(round($row["sum(rain)"]*25.4,1)); +} + +function getWindDir($t) +{ + $r = holwert($t,"windDir",0); + return(round($r)); +} + +function getWindSpeed($t) +{ + $r = holwert($t,"windSpeed",0); + return(round($r*1.609344)); +} + +function getMaxTemp($t) +{ + $r = holWert($t,"max(outTemp)",1); + return(round((($r - 32 ) * 5 / 9),1)); +} + +function getMaxPress($t) +{ + $r = holWert($t,"max(barometer)",1); + return(round($r/0.0295299)); +} + +function getMaxHumi($t) +{ + $r = holWert($t,"max(outHumidity)",1); + return($r); +} + +function getMaxWindSpeed($t) +{ + $r = holWert($t,"max(windSpeed)",1); + return(round($r*1.609344,1)); +} + +function getMinTemp($t) +{ + $r = holWert($t,"min(outTemp)",1); + return(round((($r - 32 ) * 5 / 9),1)); +} + +function getMinPress($t) +{ + $r = holWert($t,"min(barometer)",1); + return(round($r/0.0295299)); +} + +function getMinHumi($t) +{ + $r = holWert($t,"min(outHumidity)",1); + return($r); +} + +// echo '# im php call #'; + +$YY = 0; +$YY = $_POST["Jahr"]; +$MM = $_POST["Monat"]; +$DD = $_POST["Tag"]; +$hh = $_POST["Stunde"]; +$mm = $_POST["Minute"]; +$anz = $_POST["Anzahl"]; + + +$utime = mktime($hh,$mm,0,$MM,$DD,$YY); + +// DEBUG-AUsgabe: Achtung, diese IMMER in # ... # einpacken, dann wird sie +// von dem auswertenden Javascript ausgeblendet +//$tz = date_default_timezone_get(); +//echo "#$tz\n$YY-$MM-$DD <$hh:$mm> =$anz= +$utime+ \n#"; + +$paket = Array ( + + "Temp" => 0, + "Humi" => 0, + "Press" =>0, + "Rain" => 0, + "WindDir" => 0, + "WindSpeed" => 0, + "TempMx" => 0, + "HumiMx" => 0, + "PressMx" => 0, + "Time" => 0, +); + +$erg = array(array()); + + +function buildMinMaxPaket($ut) +{ + global $paket; + $paket["Temp"] = getMinTemp($ut); + $paket["Humi"] = getMinHumi($ut); + $paket["Press"] = getMinPress($ut); + $paket["Rain"] = getRain($ut,0,0); + $paket["WindSpeed"] = getMaxWindSpeed($ut); + $paket["TempMx"] = getMaxTemp($ut); + $paket["HumiMx"] = getMaxHumi($ut); + $paket["PressMx"] = getMaxPress($ut); + $paket["Time"] = date("Y-m-d H:i",$ut); +} + +if ($YY!="") +{ + if($anz==0) + { + if (($hh != 0) || ($mm != 0)) + { + $paket["Temp"] = getTemp($utime); + $paket["Humi"] = getHumi($utime); + $paket["Press"] = getPress($utime); + $paket["Rain"] = getRain($utime,$hh,$mm); + $paket["WindDir"] = getWindDir($utime); + $paket["WindSpeed"] = getWindSpeed($utime); + $paket["Time"] = date("Y-m-d H:i",$utime); + } + else + { + buildMinMaxPaket($utime); + } + echo json_encode($paket); + } + else + { + for($i=0; $i<$anz; $i++) + { + buildMinMaxPaket($utime); + $erg[$i] = $paket; + $DD+=1; + $utime = mktime($hh,$mm,0,$MM,$DD,$YY); + } + echo json_encode($erg); + } +} + +?> diff --git a/html/sternwarte/HWeather/css/histwetter.css b/html/sternwarte/HWeather/css/histwetter.css new file mode 100644 index 0000000..fdf417e --- /dev/null +++ b/html/sternwarte/HWeather/css/histwetter.css @@ -0,0 +1,181 @@ +/* Style-Sheets für die Wetterseiten der Sternwarte Welzheim +* +* 2012-11-20 rxf +* +*/ + +body { + font-family: Verdana, Helevetica, sans-serif; + font-size: 80%; + position:relative; + max-width:800px; + margin: 0 auto; +} + +#Anleitung { + padding-left: 20px; + padding-right: 20px; + +} + +table { +/* width: 400px; */ + border-collapse: collapse; +/* text-align: left; */ +} + +td,tr,th, table { + border: solid 1px black; + padding-left:10px; +} + +th { + text-align: center; +} + +#tafelRange { + width:700px; + align:center; +} +#tafelSingle { + width:400px; + align:center; +} + +#tafelRange td { + text-align: center; +} +#dath { + width:100px; +} + +form { + text-align:center; + padding-left: 15px; + padding-top: 15px; + padding-bottom: 15px; +} +caption { + caption-side: top; + padding: 20px; + font-weight: bold; + font-size: 120%; +} + +#bilder { +/* margin: 0px; */ + padding: 10px 5px 10px 0px; + width: 795px; + height : 1180px; + background-color:#FFFFE0; +} + +#bilder h1 { + margin-bottom: 0px; + padding-top:0px; + padding-bottom:0px; + text-align:center; +} + +#bilder h2 { + font-size: 110%; + font-weight: bold; + margin-bottom: 5px; +} + +.floatleft { + margin: 5px; + padding: 0px; + float: left; + width: 380px; +} + +.floatright { + margin: 5px 5px 5px 20px; + padding: 0px; + float: right; + width: 280px; +} + + +.centern { + text-align: center; + font-weight: bold; + margin-bottom: 20px; +} + + +.tablediv { + text-align: center; +} + + +.max { + color: magenta; +} + +.min { + color: blue; +} + +.small { + width: 35px; +} + +.ungerade { + background-color: #EEE; +} + +.gerade { + background-color: #FFF; +} + +#retour { + text-align: center; + padding-top:35px; +} + +#retourbutton a{ + text-decoration:none; +/* color:black; */ +} + +#printbutton:hover { + cursor:pointer; +} + +.buttons { + color:#00f; +} + +#author { + text-align:right; + font-size:75%; + padding-top:15px; + padding-right:10px; +} + +#endd { + padding-left:60px; + } + +.xbtooltip { + display: none; + position: absolute; + background-color: #fff; + } + +#ttStart { + background-color: #00FFFF; + color: green; + padding: 3px; + width: 120px; +} + +/* Timepicker CSS */ +.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +.ui-timepicker-div dl { text-align: left; } +.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +.ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } +.ui-timepicker-div td { font-size: 90%; } +.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } diff --git a/html/sternwarte/HWeather/css/jquery-ui-1.8.16.custom.css b/html/sternwarte/HWeather/css/jquery-ui-1.8.16.custom.css new file mode 100644 index 0000000..72bac04 --- /dev/null +++ b/html/sternwarte/HWeather/css/jquery-ui-1.8.16.custom.css @@ -0,0 +1,418 @@ +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; } +.ui-widget-content a { color: #333333; } +.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; } +.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); } +.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* + * jQuery UI Button 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/* + * jQuery UI Slider 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Datepicker 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000..5b5dab2 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png new file mode 100644 index 0000000..e44f861 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png new file mode 100644 index 0000000..b8c9bb1 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png new file mode 100644 index 0000000..e44f861 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png new file mode 100644 index 0000000..cd79e9f Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png new file mode 100644 index 0000000..3550f06 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png new file mode 100644 index 0000000..8ad921a Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png new file mode 100644 index 0000000..89b88d8 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png b/html/sternwarte/HWeather/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png new file mode 100644 index 0000000..a265c62 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-icons_3383bb_256x240.png b/html/sternwarte/HWeather/css/overcast/images/ui-icons_3383bb_256x240.png new file mode 100644 index 0000000..905274f Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-icons_3383bb_256x240.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-icons_454545_256x240.png b/html/sternwarte/HWeather/css/overcast/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000..59bd45b Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-icons_454545_256x240.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-icons_70b2e1_256x240.png b/html/sternwarte/HWeather/css/overcast/images/ui-icons_70b2e1_256x240.png new file mode 100644 index 0000000..ed8543e Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-icons_70b2e1_256x240.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-icons_999999_256x240.png b/html/sternwarte/HWeather/css/overcast/images/ui-icons_999999_256x240.png new file mode 100644 index 0000000..50ff803 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-icons_999999_256x240.png differ diff --git a/html/sternwarte/HWeather/css/overcast/images/ui-icons_fbc856_256x240.png b/html/sternwarte/HWeather/css/overcast/images/ui-icons_fbc856_256x240.png new file mode 100644 index 0000000..9d1b027 Binary files /dev/null and b/html/sternwarte/HWeather/css/overcast/images/ui-icons_fbc856_256x240.png differ diff --git a/html/sternwarte/HWeather/css/overcast/jquery-ui-1.8.21.custom.css b/html/sternwarte/HWeather/css/overcast/jquery-ui-1.8.21.custom.css new file mode 100644 index 0000000..a64be74 --- /dev/null +++ b/html/sternwarte/HWeather/css/overcast/jquery-ui-1.8.21.custom.css @@ -0,0 +1,565 @@ +/*! + * jQuery UI CSS Framework 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } +.ui-helper-clearfix:after { clear: both; } +.ui-helper-clearfix { zoom: 1; } +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/*! + * jQuery UI CSS Framework 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Helvetica,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=02_glass.png&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=05_inset_soft.png&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=02_glass.png&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=01_flat.png&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Trebuchet MS, Helvetica, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Helvetica, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #c9c9c9 url(images/ui-bg_inset-soft_50_c9c9c9_1x100.png) 50% bottom repeat-x; color: #333333; } +.ui-widget-content a { color: #333333; } +.ui-widget-header { border: 1px solid #bbbbbb; background: #dddddd url(images/ui-bg_glass_35_dddddd_1x400.png) 50% 50% repeat-x; color: #444444; font-weight: bold; } +.ui-widget-header a { color: #444444; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #eeeeee url(images/ui-bg_glass_60_eeeeee_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #3383bb; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #3383bb; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #bbbbbb; background: #f8f8f8 url(images/ui-bg_glass_100_f8f8f8_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #599fcf; } +.ui-state-hover a, .ui-state-hover a:hover { color: #599fcf; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #999999; background: #999999 url(images/ui-bg_inset-hard_75_999999_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #ffffff; background: #eeeeee url(images/ui-bg_flat_55_eeeeee_40x100.png) 50% 50% repeat-x; color: #444444; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #444444; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #c0402a; background: #c0402a url(images/ui-bg_flat_55_c0402a_40x100.png) 50% 50% repeat-x; color: #ffffff; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_999999_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_999999_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_999999_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_70b2e1_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_3383bb_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_3383bb_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_fbc856_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; } + +/* Overlays */ +.ui-widget-overlay { background: #eeeeee url(images/ui-bg_flat_0_eeeeee_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); } +.ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0px; -khtml-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; }/*! + * jQuery UI Resizable 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; } +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*! + * jQuery UI Selectable 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/*! + * jQuery UI Accordion 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +/*! + * jQuery UI Autocomplete 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.21 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/*! + * jQuery UI Button 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/*! + * jQuery UI Dialog 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/*! + * jQuery UI Slider 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/*! + * jQuery UI Tabs 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/*! + * jQuery UI Datepicker 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/*! + * jQuery UI Progressbar 1.8.21 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; overflow: hidden; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/html/sternwarte/HWeather/js/HWeather.js b/html/sternwarte/HWeather/js/HWeather.js new file mode 100755 index 0000000..cdedbf5 --- /dev/null +++ b/html/sternwarte/HWeather/js/HWeather.js @@ -0,0 +1,416 @@ +// HWeather.js +// Version 1.1 2015-04-17 rxf +// Wochetage in die richtige Reihenfolge gebracht +// +// Version 1.0 2012-11-20 rxf +// Anzeige von Tabellen mit Bereichen +// Ausdruck der Tabellen +// Anleitung als POPUP + +var lineNo=0; +var STW="Sternwarte Welzheim
"; + +// Nullfill: +// Übergbenen Wert zweistellig machen, fall er nur einstellig ist +function nullfill(n) +{ + if(n < 10) + { + return("0"+n); + } + else + return(""+n); +} + +// Tabelle erzeugen +function fillTables(werte, anz) +{ + var unit = new Array(" °C", " %", " hPa", " mm", " km/h", " °"); + + if(anz == 0) + { + var txt = new Array("Temperatur", "Feuchte", "Luftdruck", "Regen ", + "Wind-Geschwindigkeit", "Windrichtung"); + var wrtmax = new Array(werte.TempMx, werte.HumiMx, werte.PressMx, + werte.Rain, werte.WindSpeed); + var wrtmin = new Array(werte.Temp, werte.Humi, werte.Press, werte.Rain, + werte.WindSpeed, werte.WindDir); +// var d = new Date(werte.Time * 1000); + var year = werte.Time.substring(0,4); + var month = werte.Time.substring(5,7); + var day = werte.Time.substring(8,10); + var hour = werte.Time.substring(11,13); + var minute = werte.Time.substring(14); + var ziel = ""; + + $("#tafelRange").remove(); + $("#tafelSingle").remove(); + + $("", { + id : "tafelSingle" + }).appendTo("div #tabelle"); + +// if ((d.getMinutes() != 0) || (d.getHours() != 0)) { + if ((minute != 0) || (hour != 0)) { + $( + "", { + "class" : (i & 1 == 1) ? "gerade" : "ungerade", + id : "trx" + i + }).appendTo("table"); + ziel = "table #trx" + i; + if (i == 3) { + $( + "", { + "class" : i == 1 ? "gerade" : "ungerade", + id : "trx" + i + }).appendTo("table"); + ziel = "table #trx" + i; + $("", { + "class" : i == 1 ? "gerade" : "ungerade", + id : "trn" + i + }).appendTo("table"); + ziel = "table #trn" + i; + $("", { + "class" : "gerade", + id : "trr" + }).appendTo("table"); + $("", { + "class" : "ungerade", + id : "trw" + }).appendTo("table"); + $("
", + { + html : STW + "Wetter am " + day + "." + + month + "." + year + " um " + + hour + ":" + minute + }).appendTo("table"); + + for ( var i = 0; i < 6; i++) { + $("
", + { + html : txt[i] + "bis " + hour + ":" + + minute + " Uhr" + }).appendTo(ziel); + } else { + $("", { + html : txt[i] + }).appendTo(ziel); + } + $("", { + html : wrtmin[i] + unit[i] + }).appendTo(ziel); + } + } + + else { + $( + "
", + { + html : STW + "Wetter-Werte für den " + day + "." + + month + "." + year + }).appendTo("table"); + + for ( var i = 0; i < 3; i++) { + $("
", { + rowspan : "2", + html : txt[i] + }).appendTo(ziel); + $("", { + "class" : "max small", + html : "max." + }).appendTo(ziel); + $("", { + "class" : "max", + html : wrtmax[i] + unit[i] + }).appendTo(ziel); + + $("
", { + "class" : "min small", + html : "min." + }).appendTo(ziel); + $("", { + "class" : "min", + html : wrtmin[i] + unit[i] + }).appendTo(ziel); + } + + $("
", { + colspan : "2", + html : txt[3] + "gesamt" + }).appendTo("table #trr"); + $("", { + html : wrtmax[3] + unit[3] + }).appendTo("table #trr"); + + $("
", { + colspan : "2", + html : "Max. " + txt[4] + }).appendTo("table #trw"); + $("", { + "class" : "max", + html : wrtmax[4] + unit[4] + }).appendTo("table #trw"); + } + } + else // hier ist es ein Datumsbereich + { +// alert("Datumsbereich"); + for(var i=0; i°C", "Feuchte
%", "Luftdruck
hPa", "Regen
mm", "Wind-V
max km/h"); + var minmax = new Array(" ","min","max","min","max","min","max"," "," "); + + $("#tafelSingle").remove(); + $("#tafelRange").remove(); + + $("",{ + id: "tafelRange" + }).appendTo("div #tabelle"); + + // Überschrift basteln + $("", { + id:"trxh", + "class": "ungerade" + }).appendTo("table"); + + var ziel = "table #trxh"; + for(var i=0; i<6; i++) + { + if(i==0) + { + $("", { + id:"trx2", + "class":"ungerade" + }).appendTo("table"); + + ziel = "table #trx2"; + for(var i=0; i<9; i++) + { + $("",{ + id:"tr"+n, + "class": (n&1==1)?"ungerade":"gerade" + }).appendTo("table"); + var ziel = "table #tr"+n; + + $(" */ + height: 1px /* better than 0, for firefox */ + + } +.fc .fc-scrollgrid-section > td { + height: 1px; /* needs a height so inner div within grow. better than 0, for firefox */ + } +.fc .fc-scrollgrid-section table { + height: 1px; + /* for most browsers, if a height isn't set on the table, can't do liquid-height within cells */ + /* serves as a min-height. harmless */ + } +.fc .fc-scrollgrid-section-liquid > td { + height: 100%; /* better than `auto`, for firefox */ + } +.fc .fc-scrollgrid-section > * { + border-top-width: 0; + border-left-width: 0; + } +.fc .fc-scrollgrid-section-header > *, + .fc .fc-scrollgrid-section-footer > * { + border-bottom-width: 0; + } +.fc .fc-scrollgrid-section-body table, + .fc .fc-scrollgrid-section-footer table { + border-bottom-style: hidden; /* head keeps its bottom border tho */ + } +.fc { + + /* stickiness */ + +} +.fc .fc-scrollgrid-section-sticky > * { + background: #fff; + background: var(--fc-page-bg-color, #fff); + position: sticky; + z-index: 3; /* TODO: var */ + /* TODO: box-shadow when sticking */ + } +.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky > * { + top: 0; /* because border-sharing causes a gap at the top */ + /* TODO: give safari -1. has bug */ + } +.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky > * { + bottom: 0; /* known bug: bottom-stickiness doesn't work in safari */ + } +.fc .fc-scrollgrid-sticky-shim { /* for horizontal scrollbar */ + height: 1px; /* needs height to create scrollbars */ + margin-bottom: -1px; + } +.fc-sticky { /* no .fc wrap because used as child of body */ + position: sticky; +} +.fc .fc-view-harness { + flex-grow: 1; /* because this harness is WITHIN the .fc's flexbox */ + position: relative; + } +.fc { + + /* when the harness controls the height, make the view liquid */ + +} +.fc .fc-view-harness-active > .fc-view { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + } +.fc .fc-col-header-cell-cushion { + display: inline-block; /* x-browser for when sticky (when multi-tier header) */ + padding: 2px 4px; + } +.fc .fc-bg-event, + .fc .fc-non-business, + .fc .fc-highlight { + /* will always have a harness with position:relative/absolute, so absolutely expand */ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } +.fc .fc-non-business { + background: rgba(215, 215, 215, 0.3); + background: var(--fc-non-business-color, rgba(215, 215, 215, 0.3)); + } +.fc .fc-bg-event { + background: rgb(143, 223, 130); + background: var(--fc-bg-event-color, rgb(143, 223, 130)); + opacity: 0.3; + opacity: var(--fc-bg-event-opacity, 0.3) + } +.fc .fc-bg-event .fc-event-title { + margin: .5em; + font-size: .85em; + font-size: var(--fc-small-font-size, .85em); + font-style: italic; + } +.fc .fc-highlight { + background: rgba(188, 232, 241, 0.3); + background: var(--fc-highlight-color, rgba(188, 232, 241, 0.3)); + } +.fc .fc-cell-shaded, + .fc .fc-day-disabled { + background: rgba(208, 208, 208, 0.3); + background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); + } +/* link resets */ +/* ---------------------------------------------------------------------------------------------------- */ +a.fc-event, +a.fc-event:hover { + text-decoration: none; +} +/* cursor */ +.fc-event[href], +.fc-event.fc-event-draggable { + cursor: pointer; +} +/* event text content */ +/* ---------------------------------------------------------------------------------------------------- */ +.fc-event .fc-event-main { + position: relative; + z-index: 2; + } +/* dragging */ +/* ---------------------------------------------------------------------------------------------------- */ +.fc-event-dragging:not(.fc-event-selected) { /* MOUSE */ + opacity: 0.75; + } +.fc-event-dragging.fc-event-selected { /* TOUCH */ + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3); + } +/* resizing */ +/* ---------------------------------------------------------------------------------------------------- */ +/* (subclasses should hone positioning for touch and non-touch) */ +.fc-event .fc-event-resizer { + display: none; + position: absolute; + z-index: 4; + } +.fc-event:hover, /* MOUSE */ +.fc-event-selected { /* TOUCH */ + +} +.fc-event:hover .fc-event-resizer, .fc-event-selected .fc-event-resizer { + display: block; + } +.fc-event-selected .fc-event-resizer { + border-radius: 4px; + border-radius: calc(var(--fc-event-resizer-dot-total-width, 8px) / 2); + border-width: 1px; + border-width: var(--fc-event-resizer-dot-border-width, 1px); + width: 8px; + width: var(--fc-event-resizer-dot-total-width, 8px); + height: 8px; + height: var(--fc-event-resizer-dot-total-width, 8px); + border-style: solid; + border-color: inherit; + background: #fff; + background: var(--fc-page-bg-color, #fff) + + /* expand hit area */ + + } +.fc-event-selected .fc-event-resizer:before { + content: ''; + position: absolute; + top: -20px; + left: -20px; + right: -20px; + bottom: -20px; + } +/* selecting (always TOUCH) */ +/* OR, focused by tab-index */ +/* (TODO: maybe not the best focus-styling for .fc-daygrid-dot-event) */ +/* ---------------------------------------------------------------------------------------------------- */ +.fc-event-selected, +.fc-event:focus { + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2) + + /* expand hit area (subclasses should expand) */ + +} +.fc-event-selected:before, .fc-event:focus:before { + content: ""; + position: absolute; + z-index: 3; + top: 0; + left: 0; + right: 0; + bottom: 0; + } +.fc-event-selected, +.fc-event:focus { + + /* dimmer effect */ + +} +.fc-event-selected:after, .fc-event:focus:after { + content: ""; + background: rgba(0, 0, 0, 0.25); + background: var(--fc-event-selected-overlay-color, rgba(0, 0, 0, 0.25)); + position: absolute; + z-index: 1; + + /* assume there's a border on all sides. overcome it. */ + /* sometimes there's NOT a border, in which case the dimmer will go over */ + /* an adjacent border, which looks fine. */ + top: -1px; + left: -1px; + right: -1px; + bottom: -1px; + } +/* +A HORIZONTAL event +*/ +.fc-h-event { /* allowed to be top-level */ + display: block; + border: 1px solid #3788d8; + border: 1px solid var(--fc-event-border-color, #3788d8); + background-color: #3788d8; + background-color: var(--fc-event-bg-color, #3788d8) + +} +.fc-h-event .fc-event-main { + color: #fff; + color: var(--fc-event-text-color, #fff); + } +.fc-h-event .fc-event-main-frame { + display: flex; /* for make fc-event-title-container expand */ + } +.fc-h-event .fc-event-time { + max-width: 100%; /* clip overflow on this element */ + overflow: hidden; + } +.fc-h-event .fc-event-title-container { /* serves as a container for the sticky cushion */ + flex-grow: 1; + flex-shrink: 1; + min-width: 0; /* important for allowing to shrink all the way */ + } +.fc-h-event .fc-event-title { + display: inline-block; /* need this to be sticky cross-browser */ + vertical-align: top; /* for not messing up line-height */ + left: 0; /* for sticky */ + right: 0; /* for sticky */ + max-width: 100%; /* clip overflow on this element */ + overflow: hidden; + } +.fc-h-event.fc-event-selected:before { + /* expand hit area */ + top: -10px; + bottom: -10px; + } +/* adjust border and border-radius (if there is any) for non-start/end */ +.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start), +.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left-width: 0; +} +.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end), +.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right-width: 0; +} +/* resizers */ +.fc-h-event:not(.fc-event-selected) .fc-event-resizer { + top: 0; + bottom: 0; + width: 8px; + width: var(--fc-event-resizer-thickness, 8px); +} +.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start, +.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end { + cursor: w-resize; + left: -4px; + left: calc(-0.5 * var(--fc-event-resizer-thickness, 8px)); +} +.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end, +.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start { + cursor: e-resize; + right: -4px; + right: calc(-0.5 * var(--fc-event-resizer-thickness, 8px)); +} +/* resizers for TOUCH */ +.fc-h-event.fc-event-selected .fc-event-resizer { + top: 50%; + margin-top: -4px; + margin-top: calc(-0.5 * var(--fc-event-resizer-dot-total-width, 8px)); +} +.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start, +.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end { + left: -4px; + left: calc(-0.5 * var(--fc-event-resizer-dot-total-width, 8px)); +} +.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end, +.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start { + right: -4px; + right: calc(-0.5 * var(--fc-event-resizer-dot-total-width, 8px)); +} +.fc .fc-popover { + position: absolute; + z-index: 9999; + box-shadow: 0 2px 6px rgba(0,0,0,.15); + } +.fc .fc-popover-header { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 3px 4px; + } +.fc .fc-popover-title { + margin: 0 2px; + } +.fc .fc-popover-close { + cursor: pointer; + opacity: 0.65; + font-size: 1.1em; + } +.fc-theme-standard .fc-popover { + border: 1px solid #ddd; + border: 1px solid var(--fc-border-color, #ddd); + background: #fff; + background: var(--fc-page-bg-color, #fff); + } +.fc-theme-standard .fc-popover-header { + background: rgba(208, 208, 208, 0.3); + background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); + } + + +:root { + --fc-daygrid-event-dot-width: 8px; +} +/* help things clear margins of inner content */ +.fc-daygrid-day-frame, +.fc-daygrid-day-events, +.fc-daygrid-event-harness { /* for event top/bottom margins */ +} +.fc-daygrid-day-frame:before, .fc-daygrid-day-events:before, .fc-daygrid-event-harness:before { + content: ""; + clear: both; + display: table; } +.fc-daygrid-day-frame:after, .fc-daygrid-day-events:after, .fc-daygrid-event-harness:after { + content: ""; + clear: both; + display: table; } +.fc .fc-daygrid-body { /* a
that wraps the table */ + position: relative; + z-index: 1; /* container inner z-index's because
s can't do it */ + } +.fc .fc-daygrid-day.fc-day-today { + background-color: rgba(255, 220, 40, 0.15); + background-color: var(--fc-today-bg-color, rgba(255, 220, 40, 0.15)); + } +.fc .fc-daygrid-day-frame { + position: relative; + min-height: 100%; /* seems to work better than `height` because sets height after rows/cells naturally do it */ + } +.fc { + + /* cell top */ + +} +.fc .fc-daygrid-day-top { + display: flex; + flex-direction: row-reverse; + } +.fc .fc-day-other .fc-daygrid-day-top { + opacity: 0.3; + } +.fc { + + /* day number (within cell top) */ + +} +.fc .fc-daygrid-day-number { + position: relative; + z-index: 4; + padding: 4px; + } +.fc { + + /* event container */ + +} +.fc .fc-daygrid-day-events { + margin-top: 1px; /* needs to be margin, not padding, so that available cell height can be computed */ + } +.fc { + + /* positioning for balanced vs natural */ + +} +.fc .fc-daygrid-body-balanced .fc-daygrid-day-events { + position: absolute; + left: 0; + right: 0; + } +.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events { + position: relative; /* for containing abs positioned event harnesses */ + min-height: 2em; /* in addition to being a min-height during natural height, equalizes the heights a little bit */ + } +.fc .fc-daygrid-body-natural { /* can coexist with -unbalanced */ + } +.fc .fc-daygrid-body-natural .fc-daygrid-day-events { + margin-bottom: 1em; + } +.fc { + + /* event harness */ + +} +.fc .fc-daygrid-event-harness { + position: relative; + } +.fc .fc-daygrid-event-harness-abs { + position: absolute; + top: 0; /* fallback coords for when cannot yet be computed */ + left: 0; /* */ + right: 0; /* */ + } +.fc .fc-daygrid-bg-harness { + position: absolute; + top: 0; + bottom: 0; + } +.fc { + + /* bg content */ + +} +.fc .fc-daygrid-day-bg .fc-non-business { z-index: 1 } +.fc .fc-daygrid-day-bg .fc-bg-event { z-index: 2 } +.fc .fc-daygrid-day-bg .fc-highlight { z-index: 3 } +.fc { + + /* events */ + +} +.fc .fc-daygrid-event { + z-index: 6; + margin-top: 1px; + } +.fc .fc-daygrid-event.fc-event-mirror { + z-index: 7; + } +.fc { + + /* cell bottom (within day-events) */ + +} +.fc .fc-daygrid-day-bottom { + font-size: .85em; + padding: 2px 3px 0 + } +.fc .fc-daygrid-day-bottom:before { + content: ""; + clear: both; + display: table; } +.fc .fc-daygrid-more-link { + position: relative; + z-index: 4; + cursor: pointer; + } +.fc { + + /* week number (within frame) */ + +} +.fc .fc-daygrid-week-number { + position: absolute; + z-index: 5; + top: 0; + padding: 2px; + min-width: 1.5em; + text-align: center; + background-color: rgba(208, 208, 208, 0.3); + background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); + color: #808080; + color: var(--fc-neutral-text-color, #808080); + } +.fc { + + /* popover */ + +} +.fc .fc-more-popover .fc-popover-body { + min-width: 220px; + padding: 10px; + } +.fc-direction-ltr .fc-daygrid-event.fc-event-start, +.fc-direction-rtl .fc-daygrid-event.fc-event-end { + margin-left: 2px; +} +.fc-direction-ltr .fc-daygrid-event.fc-event-end, +.fc-direction-rtl .fc-daygrid-event.fc-event-start { + margin-right: 2px; +} +.fc-direction-ltr .fc-daygrid-week-number { + left: 0; + border-radius: 0 0 3px 0; + } +.fc-direction-rtl .fc-daygrid-week-number { + right: 0; + border-radius: 0 0 0 3px; + } +.fc-liquid-hack .fc-daygrid-day-frame { + position: static; /* will cause inner absolute stuff to expand to \s*$/g,sb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"
",{ + html:STW + "Wetter vom " + + nullfill(sD.getDate()) + + "." + nullfill(sD.getMonth()+1) + + "." + sD.getFullYear() + + " bis " + nullfill(eD.getDate()) + + "." + nullfill(eD.getMonth()+1) + + "." + eD.getFullYear() + }).appendTo("table"); + + // Kopfzeile + $("
",{ + id: "dath", + html: header[i] + }).appendTo(ziel); + } + else if(i>=1 && i<=3) + { + $("",{ + colspan: "2", + html: header[i] + }).appendTo(ziel); + } + else + { + $("",{ + html: header[i] + }).appendTo(ziel); + } + } + + // Unter der Kopfzeile die min/max + $("
", { + html: minmax[i] + }).appendTo(ziel); + } + + // Nun per AJAX-Call alle Werte hoeln und im Callback dann anzeigen + var dt = new Date(sD); + dt.setHours(0); + dt.setMinutes(0); + var days = Math.round(Math.abs(eD - dt) / (1000 * 60 * 60 * 24 )); + if(days > 35) + { + alert("max. 35 Tage möglich !"); + return; + } + doAjaxCall(dt,days+1); // ALLE Werte des gefragten Bereiches holen +} + + +// eine Datenzeile in der Tabelle befüllen +function fillOneLine(wrt,datStr,n) +{ + $("
", { + html: datStr + }).appendTo(ziel); + + for(var i=1; i<9; i++) + { + $("", { + html: (wrt[1]==-17.8) ? "--" : wrt[i] + }).appendTo(ziel); + } +} + + +// Werte vom Server holen +// s ist Datum/Uhrzeit als String im Format 'yy-mm-dd hh:mm' +function doAjaxCall(datz, anz) +{ + var date = { Jahr:'2012', Monat:'3', Tag:'23', Stunde:'0', Minute:'0', Anzahl:'1' }; + + date["Jahr"] = datz.getFullYear(); // Variable nun mit den Übergabewerten belegen + date["Monat"] = datz.getMonth()+1; + date["Tag"] = datz.getDate(); + date["Stunde"] = datz.getHours(); + date["Minute"] = datz.getMinutes(); + date["Anzahl"] = anz; + + + $.ajax( // AJAX-Call + { + + type: "POST", // wir machen eine POST - Abfrage + url: "HWett.php", // an diese Seite auf dem Server + data: date, // mit diesen Daten (ein Array) + success : function(erg){ // wenn Erfolg, dann + if(erg.charAt(0)=='#') // DEBUG-Meldungen .. + { + alert(erg); // .. ausgeben und .. + erg = erg.substr(erg.lastIndexOf('#')+2); // .. wegblenden + } + fillTables($.parseJSON(erg),anz); // die Tabelle ensprechend ausfüllen + }, + error: function(xh,t) { // wenn Error, dann eine Alertbox hinmalen + alert("xh=" + xh + " t=" + t + xh.getAllResponseHeaders() + "\na) " + xh.responseText + "\nb) " + xh.statusText); + }, + }); +} + + +// Datepicker auf Deutsch einstellen +$.datepicker.regional['de'] = { + closeText: '', + prevText: '<', + nextText: '>', + currentText: '', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['SON','MON','DIE','MIT','DON','FRE','SAM'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'KW', + dateFormat: 'yyyy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' + }; +$.datepicker.setDefaults($.datepicker.regional['de']); // diese Einstellung nun übernehmen + +// Script-Aktionen +// Wenn das Dokument geladen wird +$(document).ready(function() +{ + var sDate = $('#startdate'); + var eDate = $('#enddate'); + var maxDate = new Date(); + + // Datums-Zeit-Picker für die Startzeit + sDate.datetimepicker( // Initialisierung des datetimepickers + { + showOn: 'focus' , // onFocus wird der Picker angezeigt + dateFormat: "yy-mm-dd", // angezeigt wird in diesem Format + defaultDate: -1, + maxDate: "-1d", // max Datum unbegrenzt + minDate: "2012-03-01", // min Datum: da beginnt unsere Datenbank + closeText: "OK", // erst wenn OK geklickt wird, dann gehts weiter + showOtherMonths: "true", // Monat via Pfeile wähleen lassen + stepMinute: 5, // Zeischieber haben eien Auflösung von 5min + timeText: "Uhrzeit", // Texte dazu + hourText: "Stunde", + minuteText : "Minute", + onClose: function (dateText, inst) // was passiert, wenn OK gedrückt wird: + { + var dt = new Date(sDate.datepicker('getDate')); + eDate.datepicker('option','minDate',sDate.datepicker('getDate')); // minWert des EndeDatums wird auf Startdatum gesetzt + test = sDate.datepicker('getDate'); + testm = new Date(test.getTime()); + testm.setDate(testm.getDate() + 35); + eDate.datepicker('option','maxDate',testm); + eDate.attr("value",sDate.val().substring(0,10)); // Wert des EndeDatums wird auf das StartDatum gesetzt (ohne die Uhrzeit) + doAjaxCall(dt,0); // und die Werte werden angefordert + }, + }); + + // Datumspicker für das Ende-Datum + eDate.datepicker( + { + showOn: 'focus' , + dateFormat: "yy-mm-dd", + defaultDate: -1, + maxDate: "-1d", + showOtherMonths: "true", +// showButtonPanel: "true", +// closeText: "OK", // erst wenn OK geklickt wird, dann gehts weiter + onClose: function (dateText, inst) // wenn ein Zeitpunkt gewählt ist, dann + { + var sdat = new Date(sDate.datepicker('getDate')); + sDate.attr("value",$.datepicker.formatDate('yy-mm-dd', sdat)+" 00:00"); + fillRangeTable(sDate.datepicker('getDate'), eDate.datepicker('getDate')); + } + }); + + // Drucken: + $("#printbutton").click( function() + { + $('div#Area').jqprint(); + }); + + // PopUp + $("#manualbutton").popupWindow({ + windowURL:"Anleitung.html", + height: 350, + width: 900, + left: 50, + top: 50 + }); + + +// nach oben scrollen + $(window.parent).scrollTop(0); // damit der Anfang der Tabelle zu sehen ist + + // Inputfeld mit 'gestern' um 0h00 vorbelegen + var yesterday = new Date(); + yesterday.setDate(yesterday.getDate()-1); + sDate.attr("value",$.datepicker.formatDate('yy-mm-dd', yesterday)+" 00:00"); // Startdatum auf 'gestern' + eDate.attr("value",$.datepicker.formatDate('yy-mm-dd', yesterday)); // Enddatumn auch (aber ohne Uhrzeit) + eDate.datepicker('option','minDate',sDate.datepicker('getDate')); // minWert des EndeDatums wird auf Startdatum gesetzt + + // Gleich mal die Anfrage an Server absetzen und damit die Tageswerete für das Startdatum holen + var dt = new Date(sDate.datepicker('getDate')); + doAjaxCall(dt,0); +}); diff --git a/html/sternwarte/HWeather/js/jquery-ui-1.8.21.custom.min.js b/html/sternwarte/HWeather/js/jquery-ui-1.8.21.custom.min.js new file mode 100755 index 0000000..3fe9ccb --- /dev/null +++ b/html/sternwarte/HWeather/js/jquery-ui-1.8.21.custom.min.js @@ -0,0 +1,125 @@ +/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.21",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.position.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.draggable.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.21"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.selectable.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.leftthis.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}return f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabled)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.21",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.autocomplete.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("
    ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend(""),d.secondary&&b.append(""),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.dialog.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("
    ")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("
    ").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){if(a==="click")return;a in f?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.21",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.21"})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.tabs.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)return e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.21"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a'))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.21"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
    ')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
    '+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
    ":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
    '+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
    '+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
    "+(j?""+(g[0]>0&&N==g[1]-1?'
    ':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
    ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
    ",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.21",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.progressbar.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
    ").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.21"})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.21",save:function(a,b){for(var c=0;c").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return b==0?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fade.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fold.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.highlight.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.pulsate.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);; \ No newline at end of file diff --git a/html/sternwarte/HWeather/js/jquery-ui-sliderAccess.js b/html/sternwarte/HWeather/js/jquery-ui-sliderAccess.js new file mode 100755 index 0000000..473c1e9 --- /dev/null +++ b/html/sternwarte/HWeather/js/jquery-ui-sliderAccess.js @@ -0,0 +1,85 @@ +/* + * jQuery UI Slider Access + * By: Trent Richardson [http://trentrichardson.com] + * Version 0.2 + * Last Modified: 12/02/2011 + * + * Copyright 2011 Trent Richardson + * Dual licensed under the MIT and GPL licenses. + * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt + * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt + * + */ + (function($){ + + $.fn.extend({ + sliderAccess: function(options){ + options = options || {}; + options.touchonly = options.touchonly !== undefined? options.touchonly : true; // by default only show it if touch device + + if(options.touchonly === true && !("ontouchend" in document)) + return $(this); + + return $(this).each(function(i,obj){ + var $t = $(this), + o = $.extend({},{ + where: 'after', + step: $t.slider('option','step'), + upIcon: 'ui-icon-plus', + downIcon: 'ui-icon-minus', + text: false, + upText: '+', + downText: '-', + buttonset: true, + buttonsetTag: 'span' + }, options), + $buttons = $('<'+ o.buttonsetTag +' class="ui-slider-access">'+ + ''+ + ''+ + ''); + + $buttons.children('button').each(function(j, jobj){ + var $jt = $(this); + $jt.button({ + text: o.text, + icons: { primary: $jt.data('icon') } + }) + .click(function(e){ + var step = $jt.data('step'), + curr = $t.slider('value'), + newval = curr += step*1, + minval = $t.slider('option','min'), + maxval = $t.slider('option','max'); + + e.preventDefault(); + + if(newval < minval || newval > maxval) + return; + + $t.slider('value', newval); + + $t.slider("option", "slide").call($t, null, { value: newval }); + }); + }); + + // before or after + $t[o.where]($buttons); + + if(o.buttonset){ + $buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset(); + $buttons.eq(0).addClass('ui-corner-left'); + $buttons.eq(1).addClass('ui-corner-right'); + } + + // adjust the width so we don't break the original layout + var bOuterWidth = $buttons.css({ + marginLeft: (o.where == 'after'? 10:0), + marginRight: (o.where == 'before'? 10:0) + }).outerWidth(true) + 5; + var tOuterWidth = $t.outerWidth(true); + $t.css('display','inline-block').width(tOuterWidth-bOuterWidth); + }); + } + }); + +})(jQuery); diff --git a/html/sternwarte/HWeather/js/jquery-ui-timepicker-addon.js b/html/sternwarte/HWeather/js/jquery-ui-timepicker-addon.js new file mode 100755 index 0000000..f83839e --- /dev/null +++ b/html/sternwarte/HWeather/js/jquery-ui-timepicker-addon.js @@ -0,0 +1,1326 @@ +/* +* jQuery timepicker addon +* By: Trent Richardson [http://trentrichardson.com] +* Version 0.9.9 +* Last Modified: 02/05/2012 +* +* Copyright 2012 Trent Richardson +* Dual licensed under the MIT and GPL licenses. +* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt +* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt +* +* HERES THE CSS: +* .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +* .ui-timepicker-div dl { text-align: left; } +* .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +* .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } +* .ui-timepicker-div td { font-size: 90%; } +* .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } +*/ + +(function($) { + +$.extend($.ui, { timepicker: { version: "0.9.9" } }); + +/* Time picker manager. + Use the singleton instance of this class, $.timepicker, to interact with the time picker. + Settings for (groups of) time pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Timepicker() { + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + currentText: 'Now', + closeText: 'Done', + ampm: false, + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + timeFormat: 'hh:mm tt', + timeSuffix: '', + timeOnlyTitle: 'Choose Time', + timeText: 'Time', + hourText: 'Hour', + minuteText: 'Minute', + secondText: 'Second', + millisecText: 'Millisecond', + timezoneText: 'Time Zone' + }; + this._defaults = { // Global defaults for all the datetime picker instances + showButtonPanel: true, + timeOnly: false, + showHour: true, + showMinute: true, + showSecond: false, + showMillisec: false, + showTimezone: false, + showTime: true, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + stepMillisec: 1, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: '+0000', + hourMin: 0, + minuteMin: 0, + secondMin: 0, + millisecMin: 0, + hourMax: 23, + minuteMax: 59, + secondMax: 59, + millisecMax: 999, + minDateTime: null, + maxDateTime: null, + onSelect: null, + hourGrid: 0, + minuteGrid: 0, + secondGrid: 0, + millisecGrid: 0, + alwaysSetTime: true, + separator: ' ', + altFieldTimeOnly: true, + showTimepicker: true, + timezoneIso8609: false, + timezoneList: null, + addSliderAccess: false, + sliderAccessArgs: null + }; + $.extend(this._defaults, this.regional['']); +}; + +$.extend(Timepicker.prototype, { + $input: null, + $altInput: null, + $timeObj: null, + inst: null, + hour_slider: null, + minute_slider: null, + second_slider: null, + millisec_slider: null, + timezone_select: null, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: '+0000', + hourMinOriginal: null, + minuteMinOriginal: null, + secondMinOriginal: null, + millisecMinOriginal: null, + hourMaxOriginal: null, + minuteMaxOriginal: null, + secondMaxOriginal: null, + millisecMaxOriginal: null, + ampm: '', + formattedDate: '', + formattedTime: '', + formattedDateTime: '', + timezoneList: null, + + /* Override the default settings for all instances of the time picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + //######################################################################## + // Create a new Timepicker instance + //######################################################################## + _newInst: function($input, o) { + var tp_inst = new Timepicker(), + inlineSettings = {}; + + for (var attrName in this._defaults) { + var attrValue = $input.attr('time:' + attrName); + if (attrValue) { + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, { + beforeShow: function(input, dp_inst) { + if ($.isFunction(o.beforeShow)) + return o.beforeShow(input, dp_inst, tp_inst); + }, + onChangeMonthYear: function(year, month, dp_inst) { + // Update the time as well : this prevents the time from disappearing from the $input field. + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(o.onChangeMonthYear)) + o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); + }, + onClose: function(dateText, dp_inst) { + if (tp_inst.timeDefined === true && $input.val() != '') + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(o.onClose)) + o.onClose.call($input[0], dateText, dp_inst, tp_inst); + }, + timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); + }); + tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() }); + tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() }); + + if (tp_inst._defaults.timezoneList === null) { + var timezoneList = []; + for (var i = -11; i <= 12; i++) + timezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00'); + if (tp_inst._defaults.timezoneIso8609) + timezoneList = $.map(timezoneList, function(val) { + return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3)); + }); + tp_inst._defaults.timezoneList = timezoneList; + } + + tp_inst.hour = tp_inst._defaults.hour; + tp_inst.minute = tp_inst._defaults.minute; + tp_inst.second = tp_inst._defaults.second; + tp_inst.millisec = tp_inst._defaults.millisec; + tp_inst.ampm = ''; + tp_inst.$input = $input; + + if (o.altField) + tp_inst.$altInput = $(o.altField) + .css({ cursor: 'pointer' }) + .focus(function(){ $input.trigger("focus"); }); + + if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0) + { + tp_inst._defaults.minDate=new Date(); + } + if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0) + { + tp_inst._defaults.maxDate=new Date(); + } + + // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. + if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) + tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); + if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) + tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); + if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) + tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); + if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) + tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); + return tp_inst; + }, + + //######################################################################## + // add our sliders to the calendar + //######################################################################## + _addTimePicker: function(dp_inst) { + var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? + this.$input.val() + ' ' + this.$altInput.val() : + this.$input.val(); + + this.timeDefined = this._parseTime(currDT); + this._limitMinMaxDateTime(dp_inst, false); + this._injectTimePicker(); + }, + + //######################################################################## + // parse the time string from input value or _setTime + //######################################################################## + _parseTime: function(timeString, withDate) { + var regstr = this._defaults.timeFormat.toString() + .replace(/h{1,2}/ig, '(\\d?\\d)') + .replace(/m{1,2}/ig, '(\\d?\\d)') + .replace(/s{1,2}/ig, '(\\d?\\d)') + .replace(/l{1}/ig, '(\\d?\\d?\\d)') + .replace(/t{1,2}/ig, this._getPatternAmpm()) + .replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?') + .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$', + order = this._getFormatPositions(), + ampm = '', + treg; + + if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]); + + if (withDate || !this._defaults.timeOnly) { + // the time should come after x number of characters and a space. + // x = at least the length of text specified by the date format + var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); + // escape special regex characters in the seperator + var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); + regstr = '^.{' + dp_dateFormat.length + ',}?' + this._defaults.separator.replace(specials, "\\$&") + regstr; + } + + treg = timeString.match(new RegExp(regstr, 'i')); + + if (treg) { + if (order.t !== -1) { + if (treg[order.t] === undefined || treg[order.t].length === 0) { + ampm = ''; + this.ampm = ''; + } else { + ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM'; + this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0]; + } + } + + if (order.h !== -1) { + if (ampm == 'AM' && treg[order.h] == '12') + this.hour = 0; // 12am = 0 hour + else if (ampm == 'PM' && treg[order.h] != '12') + this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12 + else this.hour = Number(treg[order.h]); + } + + if (order.m !== -1) this.minute = Number(treg[order.m]); + if (order.s !== -1) this.second = Number(treg[order.s]); + if (order.l !== -1) this.millisec = Number(treg[order.l]); + if (order.z !== -1 && treg[order.z] !== undefined) { + var tz = treg[order.z].toUpperCase(); + switch (tz.length) { + case 1: // Z + tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000'; + break; + case 5: // +hhmm + if (this._defaults.timezoneIso8609) + tz = tz.substring(1) == '0000' + ? 'Z' + : tz.substring(0, 3) + ':' + tz.substring(3); + break; + case 6: // +hh:mm + if (!this._defaults.timezoneIso8609) + tz = tz == 'Z' || tz.substring(1) == '00:00' + ? '+0000' + : tz.replace(/:/, ''); + else if (tz.substring(1) == '00:00') + tz = 'Z'; + break; + } + this.timezone = tz; + } + + return true; + + } + return false; + }, + + //######################################################################## + // pattern for standard and localized AM/PM markers + //######################################################################## + _getPatternAmpm: function() { + var markers = []; + o = this._defaults; + if (o.amNames) + $.merge(markers, o.amNames); + if (o.pmNames) + $.merge(markers, o.pmNames); + markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&') }); + return '(' + markers.join('|') + ')?'; + }, + + //######################################################################## + // figure out position of time elements.. cause js cant do named captures + //######################################################################## + _getFormatPositions: function() { + var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g), + orders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 }; + + if (finds) + for (var i = 0; i < finds.length; i++) + if (orders[finds[i].toString().charAt(0)] == -1) + orders[finds[i].toString().charAt(0)] = i + 1; + + return orders; + }, + + //######################################################################## + // generate and inject html for timepicker into ui datepicker + //######################################################################## + _injectTimePicker: function() { + var $dp = this.inst.dpDiv, + o = this._defaults, + tp_inst = this, + // Added by Peter Medeiros: + // - Figure out what the hour/minute/second max should be based on the step values. + // - Example: if stepMinute is 15, then minMax is 45. + hourMax = parseInt((o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)) ,10), + minMax = parseInt((o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)) ,10), + secMax = parseInt((o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)) ,10), + millisecMax = parseInt((o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)) ,10), + dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, ''); + + // Prevent displaying twice + //if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) { + if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) { + var noDisplay = ' style="display:none;"', + html = '
    ' + + '
    ' + o.timeText + '
    ' + + '
    ' + + '
    ' + o.hourText + '
    ', + hourGridSize = 0, + minuteGridSize = 0, + secondGridSize = 0, + millisecGridSize = 0, + size; + + // Hours + html += '
    '; + if (o.showHour && o.hourGrid > 0) { + html += '
    '; + + for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) { + hourGridSize++; + var tmph = (o.ampm && h > 12) ? h-12 : h; + if (tmph < 10) tmph = '0' + tmph; + if (o.ampm) { + if (h == 0) tmph = 12 +'a'; + else if (h < 12) tmph += 'a'; + else tmph += 'p'; + } + html += ''; + } + + html += '
    ' + tmph + '
    '; + } + html += '
    '; + + // Minutes + html += '
    ' + o.minuteText + '
    '+ + '
    '; + + if (o.showMinute && o.minuteGrid > 0) { + html += '
    '; + + for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) { + minuteGridSize++; + html += ''; + } + + html += '
    ' + ((m < 10) ? '0' : '') + m + '
    '; + } + html += '
    '; + + // Seconds + html += '
    ' + o.secondText + '
    '+ + '
    '; + + if (o.showSecond && o.secondGrid > 0) { + html += '
    '; + + for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) { + secondGridSize++; + html += ''; + } + + html += '
    ' + ((s < 10) ? '0' : '') + s + '
    '; + } + html += '
    '; + + // Milliseconds + html += '
    ' + o.millisecText + '
    '+ + '
    '; + + if (o.showMillisec && o.millisecGrid > 0) { + html += '
    '; + + for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) { + millisecGridSize++; + html += ''; + } + + html += '
    ' + ((l < 10) ? '0' : '') + l + '
    '; + } + html += '
    '; + + // Timezone + html += '
    ' + o.timezoneText + '
    '; + html += '
    '; + + html += '
    '; + $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend( + '
    ' + + '
    ' + o.timeOnlyTitle + '
    ' + + '
    '); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({ + orientation: "horizontal", + value: this.hour, + min: o.hourMin, + max: hourMax, + step: o.stepHour, + slide: function(event, ui) { + tp_inst.hour_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + + // Updated by Peter Medeiros: + // - Pass in Event and UI instance into slide function + this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({ + orientation: "horizontal", + value: this.minute, + min: o.minuteMin, + max: minMax, + step: o.stepMinute, + slide: function(event, ui) { + tp_inst.minute_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({ + orientation: "horizontal", + value: this.second, + min: o.secondMin, + max: secMax, + step: o.stepSecond, + slide: function(event, ui) { + tp_inst.second_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({ + orientation: "horizontal", + value: this.millisec, + min: o.millisecMin, + max: millisecMax, + step: o.stepMillisec, + slide: function(event, ui) { + tp_inst.millisec_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function(val, idx) { + return $("
    */ + } +.fc-daygrid-event { /* make root-level, because will be dragged-and-dropped outside of a component root */ + position: relative; /* for z-indexes assigned later */ + white-space: nowrap; + border-radius: 3px; /* dot event needs this to when selected */ + font-size: .85em; + font-size: var(--fc-small-font-size, .85em); +} +/* --- the rectangle ("block") style of event --- */ +.fc-daygrid-block-event .fc-event-time { + font-weight: bold; + } +.fc-daygrid-block-event .fc-event-time, + .fc-daygrid-block-event .fc-event-title { + padding: 1px; + } +/* --- the dot style of event --- */ +.fc-daygrid-dot-event { + display: flex; + align-items: center; + padding: 2px 0 + +} +.fc-daygrid-dot-event .fc-event-title { + flex-grow: 1; + flex-shrink: 1; + min-width: 0; /* important for allowing to shrink all the way */ + overflow: hidden; + font-weight: bold; + } +.fc-daygrid-dot-event:hover, + .fc-daygrid-dot-event.fc-event-mirror { + background: rgba(0, 0, 0, 0.1); + } +.fc-daygrid-dot-event.fc-event-selected:before { + /* expand hit area */ + top: -10px; + bottom: -10px; + } +.fc-daygrid-event-dot { /* the actual dot */ + margin: 0 4px; + box-sizing: content-box; + width: 0; + height: 0; + border: 4px solid #3788d8; + border: calc(var(--fc-daygrid-event-dot-width, 8px) / 2) solid var(--fc-event-border-color, #3788d8); + border-radius: 4px; + border-radius: calc(var(--fc-daygrid-event-dot-width, 8px) / 2); +} +/* --- spacing between time and title --- */ +.fc-direction-ltr .fc-daygrid-event .fc-event-time { + margin-right: 3px; + } +.fc-direction-rtl .fc-daygrid-event .fc-event-time { + margin-left: 3px; + } + + +/* +A VERTICAL event +*/ + +.fc-v-event { /* allowed to be top-level */ + display: block; + border: 1px solid #3788d8; + border: 1px solid var(--fc-event-border-color, #3788d8); + background-color: #3788d8; + background-color: var(--fc-event-bg-color, #3788d8) + +} + +.fc-v-event .fc-event-main { + color: #fff; + color: var(--fc-event-text-color, #fff); + height: 100%; + } + +.fc-v-event .fc-event-main-frame { + height: 100%; + display: flex; + flex-direction: column; + } + +.fc-v-event .fc-event-time { + flex-grow: 0; + flex-shrink: 0; + max-height: 100%; + overflow: hidden; + } + +.fc-v-event .fc-event-title-container { /* a container for the sticky cushion */ + flex-grow: 1; + flex-shrink: 1; + min-height: 0; /* important for allowing to shrink all the way */ + } + +.fc-v-event .fc-event-title { /* will have fc-sticky on it */ + top: 0; + bottom: 0; + max-height: 100%; /* clip overflow */ + overflow: hidden; + } + +.fc-v-event:not(.fc-event-start) { + border-top-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; + } + +.fc-v-event:not(.fc-event-end) { + border-bottom-width: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + +.fc-v-event.fc-event-selected:before { + /* expand hit area */ + left: -10px; + right: -10px; + } + +.fc-v-event { + + /* resizer (mouse AND touch) */ + +} + +.fc-v-event .fc-event-resizer-start { + cursor: n-resize; + } + +.fc-v-event .fc-event-resizer-end { + cursor: s-resize; + } + +.fc-v-event { + + /* resizer for MOUSE */ + +} + +.fc-v-event:not(.fc-event-selected) .fc-event-resizer { + height: 8px; + height: var(--fc-event-resizer-thickness, 8px); + left: 0; + right: 0; + } + +.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start { + top: -4px; + top: calc(var(--fc-event-resizer-thickness, 8px) / -2); + } + +.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end { + bottom: -4px; + bottom: calc(var(--fc-event-resizer-thickness, 8px) / -2); + } + +.fc-v-event { + + /* resizer for TOUCH (when event is "selected") */ + +} + +.fc-v-event.fc-event-selected .fc-event-resizer { + left: 50%; + margin-left: -4px; + margin-left: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2); + } + +.fc-v-event.fc-event-selected .fc-event-resizer-start { + top: -4px; + top: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2); + } + +.fc-v-event.fc-event-selected .fc-event-resizer-end { + bottom: -4px; + bottom: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2); + } +.fc .fc-timegrid .fc-daygrid-body { /* the all-day daygrid within the timegrid view */ + z-index: 2; /* put above the timegrid-body so that more-popover is above everything. TODO: better solution */ + } +.fc .fc-timegrid-divider { + padding: 0 0 2px; /* browsers get confused when you set height. use padding instead */ + } +.fc .fc-timegrid-body { + position: relative; + z-index: 1; /* scope the z-indexes of slots and cols */ + min-height: 100%; /* fill height always, even when slat table doesn't grow */ + } +.fc .fc-timegrid-axis-chunk { /* for advanced ScrollGrid */ + position: relative /* offset parent for now-indicator-container */ + + } +.fc .fc-timegrid-axis-chunk > table { + position: relative; + z-index: 1; /* above the now-indicator-container */ + } +.fc .fc-timegrid-slots { + position: relative; + z-index: 1; + } +.fc .fc-timegrid-slot { /* a */ + height: 1.5em; + border-bottom: 0 /* each cell owns its top border */ + } +.fc .fc-timegrid-slot:empty:before { + content: '\00a0'; /* make sure there's at least an empty space to create height for height syncing */ + } +.fc .fc-timegrid-slot-minor { + border-top-style: dotted; + } +.fc .fc-timegrid-slot-label-cushion { + display: inline-block; + white-space: nowrap; + } +.fc .fc-timegrid-slot-label { + vertical-align: middle; /* vertical align the slots */ + } +.fc { + + + /* slots AND axis cells (top-left corner of view including the "all-day" text) */ + +} +.fc .fc-timegrid-axis-cushion, + .fc .fc-timegrid-slot-label-cushion { + padding: 0 4px; + } +.fc { + + + /* axis cells (top-left corner of view including the "all-day" text) */ + /* vertical align is more complicated, uses flexbox */ + +} +.fc .fc-timegrid-axis-frame-liquid { + height: 100%; /* will need liquid-hack in FF */ + } +.fc .fc-timegrid-axis-frame { + overflow: hidden; + display: flex; + align-items: center; /* vertical align */ + justify-content: flex-end; /* horizontal align. matches text-align below */ + } +.fc .fc-timegrid-axis-cushion { + max-width: 60px; /* limits the width of the "all-day" text */ + flex-shrink: 0; /* allows text to expand how it normally would, regardless of constrained width */ + } +.fc-direction-ltr .fc-timegrid-slot-label-frame { + text-align: right; + } +.fc-direction-rtl .fc-timegrid-slot-label-frame { + text-align: left; + } +.fc-liquid-hack .fc-timegrid-axis-frame-liquid { + height: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + } +.fc .fc-timegrid-col.fc-day-today { + background-color: rgba(255, 220, 40, 0.15); + background-color: var(--fc-today-bg-color, rgba(255, 220, 40, 0.15)); + } +.fc .fc-timegrid-col-frame { + min-height: 100%; /* liquid-hack is below */ + position: relative; + } +.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame { + height: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + } +.fc-media-screen .fc-timegrid-cols { + position: absolute; /* no z-index. children will decide and go above slots */ + top: 0; + left: 0; + right: 0; + bottom: 0 + } +.fc-media-screen .fc-timegrid-cols > table { + height: 100%; + } +.fc-media-screen .fc-timegrid-col-bg, + .fc-media-screen .fc-timegrid-col-events, + .fc-media-screen .fc-timegrid-now-indicator-container { + position: absolute; + top: 0; + left: 0; + right: 0; + } +.fc { + + /* bg */ + +} +.fc .fc-timegrid-col-bg { + z-index: 2; /* TODO: kill */ + } +.fc .fc-timegrid-col-bg .fc-non-business { z-index: 1 } +.fc .fc-timegrid-col-bg .fc-bg-event { z-index: 2 } +.fc .fc-timegrid-col-bg .fc-highlight { z-index: 3 } +.fc .fc-timegrid-bg-harness { + position: absolute; /* top/bottom will be set by JS */ + left: 0; + right: 0; + } +.fc { + + /* fg events */ + /* (the mirror segs are put into a separate container with same classname, */ + /* and they must be after the normal seg container to appear at a higher z-index) */ + +} +.fc .fc-timegrid-col-events { + z-index: 3; + /* child event segs have z-indexes that are scoped within this div */ + } +.fc { + + /* now indicator */ + +} +.fc .fc-timegrid-now-indicator-container { + bottom: 0; + overflow: hidden; /* don't let overflow of lines/arrows cause unnecessary scrolling */ + /* z-index is set on the individual elements */ + } +.fc-direction-ltr .fc-timegrid-col-events { + margin: 0 2.5% 0 2px; + } +.fc-direction-rtl .fc-timegrid-col-events { + margin: 0 2px 0 2.5%; + } +.fc-timegrid-event-harness { + position: absolute /* top/left/right/bottom will all be set by JS */ +} +.fc-timegrid-event-harness > .fc-timegrid-event { + position: absolute; /* absolute WITHIN the harness */ + top: 0; /* for when not yet positioned */ + bottom: 0; /* " */ + left: 0; + right: 0; + } +.fc-timegrid-event-harness-inset .fc-timegrid-event, +.fc-timegrid-event.fc-event-mirror, +.fc-timegrid-more-link { + box-shadow: 0px 0px 0px 1px #fff; + box-shadow: 0px 0px 0px 1px var(--fc-page-bg-color, #fff); +} +.fc-timegrid-event, +.fc-timegrid-more-link { /* events need to be root */ + font-size: .85em; + font-size: var(--fc-small-font-size, .85em); + border-radius: 3px; +} +.fc-timegrid-event { /* events need to be root */ + margin-bottom: 1px /* give some space from bottom */ +} +.fc-timegrid-event .fc-event-main { + padding: 1px 1px 0; + } +.fc-timegrid-event .fc-event-time { + white-space: nowrap; + font-size: .85em; + font-size: var(--fc-small-font-size, .85em); + margin-bottom: 1px; + } +.fc-timegrid-event-short .fc-event-main-frame { + flex-direction: row; + overflow: hidden; + } +.fc-timegrid-event-short .fc-event-time:after { + content: '\00a0-\00a0'; /* dash surrounded by non-breaking spaces */ + } +.fc-timegrid-event-short .fc-event-title { + font-size: .85em; + font-size: var(--fc-small-font-size, .85em) + } +.fc-timegrid-more-link { /* does NOT inherit from fc-timegrid-event */ + position: absolute; + z-index: 9999; /* hack */ + color: inherit; + color: var(--fc-more-link-text-color, inherit); + background: #d0d0d0; + background: var(--fc-more-link-bg-color, #d0d0d0); + cursor: pointer; + margin-bottom: 1px; /* match space below fc-timegrid-event */ +} +.fc-timegrid-more-link-inner { /* has fc-sticky */ + padding: 3px 2px; + top: 0; +} +.fc-direction-ltr .fc-timegrid-more-link { + right: 0; + } +.fc-direction-rtl .fc-timegrid-more-link { + left: 0; + } +.fc { + + /* line */ + +} +.fc .fc-timegrid-now-indicator-line { + position: absolute; + z-index: 4; + left: 0; + right: 0; + border-style: solid; + border-color: red; + border-color: var(--fc-now-indicator-color, red); + border-width: 1px 0 0; + } +.fc { + + /* arrow */ + +} +.fc .fc-timegrid-now-indicator-arrow { + position: absolute; + z-index: 4; + margin-top: -5px; /* vertically center on top coordinate */ + border-style: solid; + border-color: red; + border-color: var(--fc-now-indicator-color, red); + } +.fc-direction-ltr .fc-timegrid-now-indicator-arrow { + left: 0; + + /* triangle pointing right. TODO: mixin */ + border-width: 5px 0 5px 6px; + border-top-color: transparent; + border-bottom-color: transparent; + } +.fc-direction-rtl .fc-timegrid-now-indicator-arrow { + right: 0; + + /* triangle pointing left. TODO: mixin */ + border-width: 5px 6px 5px 0; + border-top-color: transparent; + border-bottom-color: transparent; + } + + +:root { + --fc-list-event-dot-width: 10px; + --fc-list-event-hover-bg-color: #f5f5f5; +} +.fc-theme-standard .fc-list { + border: 1px solid #ddd; + border: 1px solid var(--fc-border-color, #ddd); + } +.fc { + + /* message when no events */ + +} +.fc .fc-list-empty { + background-color: rgba(208, 208, 208, 0.3); + background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); + height: 100%; + display: flex; + justify-content: center; + align-items: center; /* vertically aligns fc-list-empty-inner */ + } +.fc .fc-list-empty-cushion { + margin: 5em 0; + } +.fc { + + /* table within the scroller */ + /* ---------------------------------------------------------------------------------------------------- */ + +} +.fc .fc-list-table { + width: 100%; + border-style: hidden; /* kill outer border on theme */ + } +.fc .fc-list-table tr > * { + border-left: 0; + border-right: 0; + } +.fc .fc-list-sticky .fc-list-day > * { /* the cells */ + position: sticky; + top: 0; + background: #fff; + background: var(--fc-page-bg-color, #fff); /* for when headers are styled to be transparent and sticky */ + } +.fc { + + /* only exists for aria reasons, hide for non-screen-readers */ + +} +.fc .fc-list-table thead { + position: absolute; + left: -10000px; + } +.fc { + + /* the table's border-style:hidden gets confused by hidden thead. force-hide top border of first cell */ + +} +.fc .fc-list-table tbody > tr:first-child th { + border-top: 0; + } +.fc .fc-list-table th { + padding: 0; /* uses an inner-wrapper instead... */ + } +.fc .fc-list-table td, + .fc .fc-list-day-cushion { + padding: 8px 14px; + } +.fc { + + + /* date heading rows */ + /* ---------------------------------------------------------------------------------------------------- */ + +} +.fc .fc-list-day-cushion:after { + content: ""; + clear: both; + display: table; /* clear floating */ + } +.fc-theme-standard .fc-list-day-cushion { + background-color: rgba(208, 208, 208, 0.3); + background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); + } +.fc-direction-ltr .fc-list-day-text, +.fc-direction-rtl .fc-list-day-side-text { + float: left; +} +.fc-direction-ltr .fc-list-day-side-text, +.fc-direction-rtl .fc-list-day-text { + float: right; +} +/* make the dot closer to the event title */ +.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0 } +.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 } +.fc .fc-list-event.fc-event-forced-url { + cursor: pointer; /* whole row will seem clickable */ + } +.fc .fc-list-event:hover td { + background-color: #f5f5f5; + background-color: var(--fc-list-event-hover-bg-color, #f5f5f5); + } +.fc { + + /* shrink certain cols */ + +} +.fc .fc-list-event-graphic, + .fc .fc-list-event-time { + white-space: nowrap; + width: 1px; + } +.fc .fc-list-event-dot { + display: inline-block; + box-sizing: content-box; + width: 0; + height: 0; + border: 5px solid #3788d8; + border: calc(var(--fc-list-event-dot-width, 10px) / 2) solid var(--fc-event-border-color, #3788d8); + border-radius: 5px; + border-radius: calc(var(--fc-list-event-dot-width, 10px) / 2); + } +.fc { + + /* reset styling */ + +} +.fc .fc-list-event-title a { + color: inherit; + text-decoration: none; + } +.fc { + + /* underline link when hovering over any part of row */ + +} +.fc .fc-list-event.fc-event-forced-url:hover a { + text-decoration: underline; + } + + + + .fc-theme-bootstrap a:not([href]) { + color: inherit; /* natural color for navlinks */ + } + + + + .fc-theme-bootstrap5 a:not([href]) { + color: inherit; + text-decoration: inherit; + } + +.fc-theme-bootstrap5 .fc-list, + .fc-theme-bootstrap5 .fc-scrollgrid, + .fc-theme-bootstrap5 td, + .fc-theme-bootstrap5 th { + border: 1px solid var(--bs-gray-400); + } + +.fc-theme-bootstrap5 { + + /* HACK: reapply core styles after highe-precedence border statement above */ +} + +.fc-theme-bootstrap5 .fc-scrollgrid { + border-right-width: 0; + border-bottom-width: 0; + } + +.fc-theme-bootstrap5-shaded { + background-color: var(--bs-gray-200); +} + + + + .fc .fc-event, + .fc .fc-scrollgrid table tr { + -moz-column-break-inside: avoid; + break-inside: avoid; + } + +.fc-media-print { + display: block; /* undo flexbox. FF doesn't know how to flow */ + max-width: 100% /* width will be hardcoded too */ +} + +.fc-media-print .fc-timegrid-slots, + .fc-media-print .fc-timegrid-axis-chunk, + .fc-media-print .fc-timeline-slots, + .fc-media-print .fc-non-business, + .fc-media-print .fc-bg-event { + display: none; + } + +.fc-media-print .fc-toolbar button, + .fc-media-print .fc-h-event, + .fc-media-print .fc-v-event { + color: #000 !important; + background: #fff !important; + } + +.fc-media-print .fc-event, + .fc-media-print .fc-event-main { /* often controls the text-color */ + color: #000 !important; + } + +.fc-media-print .fc-timegrid-event { + margin: 0.5em 0; + } + + + + .fc .fc-timeline-body { + min-height: 100%; + position: relative; + z-index: 1; /* scope slots, bg, etc */ + } +/* +vertical slots in both the header AND the body +*/ +.fc .fc-timeline-slots { + position: absolute; + z-index: 1; + top: 0; + bottom: 0 + } +.fc .fc-timeline-slots > table { + height: 100%; + } +.fc { + + /* border for both header AND body cells */ + +} +.fc .fc-timeline-slot-minor { + border-style: dotted; + } +.fc { + + /* header cells (aka "label") */ + +} +.fc .fc-timeline-slot-frame { + display: flex; + align-items: center; /* vertical align */ + justify-content: center; /* horizontal align */ + } +.fc .fc-timeline-header-row-chrono { /* a row of times */ + } +.fc .fc-timeline-header-row-chrono .fc-timeline-slot-frame { + justify-content: flex-start; /* horizontal align left or right */ + } +.fc .fc-timeline-header-row:last-child { /* guaranteed NOT to have sticky elements */ + } +.fc .fc-timeline-header-row:last-child .fc-timeline-slot-frame { + /* so text doesn't bleed out and cause extra scroll */ + /* (won't work with sticky elements) */ + overflow: hidden; + } +.fc .fc-timeline-slot-cushion { + padding: 4px 5px; /* TODO: unify with fc-col-header? */ + white-space: nowrap; + } +.fc { + + /* NOTE: how does the top row of cells get horizontally centered? */ + /* for the non-chrono-row, the fc-sticky system looks for text-align center, */ + /* and it's a fluke that the default browser stylesheet already does this for */ + /* TODO: have StickyScrolling look at natural left coord to detect centeredness. */ + +} +/* only owns one side, so can do dotted */ +.fc-direction-ltr .fc-timeline-slot { border-right: 0 !important } +.fc-direction-rtl .fc-timeline-slot { border-left: 0 !important } +.fc .fc-timeline-now-indicator-container { + position: absolute; + z-index: 4; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 0; + } +.fc .fc-timeline-now-indicator-arrow, + .fc .fc-timeline-now-indicator-line { + position: absolute; + top: 0; + border-style: solid; + border-color: red; + border-color: var(--fc-now-indicator-color, red); + } +.fc .fc-timeline-now-indicator-arrow { + margin: 0 -6px; /* 5, then one more to counteract scroller's negative margins */ + + /* triangle pointing down. TODO: mixin */ + border-width: 6px 5px 0 5px; + border-left-color: transparent; + border-right-color: transparent; + } +.fc .fc-timeline-now-indicator-line { + margin: 0 -1px; /* counteract scroller's negative margins */ + bottom: 0; + border-width: 0 0 0 1px; + } +.fc { + + /* container */ + +} +.fc .fc-timeline-events { + position: relative; + z-index: 3; + width: 0; /* for event positioning. will end up on correct side based on dir */ + } +.fc { + + /* harness */ + +} +.fc .fc-timeline-event-harness, + .fc .fc-timeline-more-link { + position: absolute; + top: 0; /* for when when top can't be computed yet */ + /* JS will set tht left/right */ + } +/* z-index, scoped within fc-timeline-events */ +.fc-timeline-event { z-index: 1 } +.fc-timeline-event.fc-event-mirror { z-index: 2 } +.fc-timeline-event { + position: relative; /* contains things. TODO: make part of fc-h-event and fc-v-event */ + display: flex; /* for v-aligning start/end arrows and making fc-event-main stretch all the way */ + align-items: center; + border-radius: 0; + padding: 2px 1px; + margin-bottom: 1px; + font-size: .85em; + font-size: var(--fc-small-font-size, .85em) + + /* time and title spacing */ + /* ---------------------------------------------------------------------------------------------------- */ +} +.fc-timeline-event .fc-event-main { + flex-grow: 1; + flex-shrink: 1; + min-width: 0; /* important for allowing to shrink all the way */ + } +.fc-timeline-event .fc-event-time { + font-weight: bold; + } +.fc-timeline-event .fc-event-time, + .fc-timeline-event .fc-event-title { + white-space: nowrap; + padding: 0 2px; + } +/* move 1px away from slot line */ +.fc-direction-ltr .fc-timeline-event.fc-event-end, + .fc-direction-ltr .fc-timeline-more-link { + margin-right: 1px; + } +.fc-direction-rtl .fc-timeline-event.fc-event-end, + .fc-direction-rtl .fc-timeline-more-link { + margin-left: 1px; + } +/* make event beefier when overlap not allowed */ +.fc-timeline-overlap-disabled .fc-timeline-event { + padding-top: 5px; + padding-bottom: 5px; + margin-bottom: 0; +} +/* arrows indicating the event continues into past/future */ +/* ---------------------------------------------------------------------------------------------------- */ +/* part of the flexbox flow */ +.fc-timeline-event:not(.fc-event-start):before, +.fc-timeline-event:not(.fc-event-end):after { + content: ""; + flex-grow: 0; + flex-shrink: 0; + opacity: .5; + + /* triangle. TODO: mixin */ + width: 0; + height: 0; + margin: 0 1px; + border: 5px solid #000; /* TODO: var */ + border-top-color: transparent; + border-bottom-color: transparent; +} +/* pointing left */ +.fc-direction-ltr .fc-timeline-event:not(.fc-event-start):before, +.fc-direction-rtl .fc-timeline-event:not(.fc-event-end):after { + border-left: 0; +} +/* pointing right */ +.fc-direction-ltr .fc-timeline-event:not(.fc-event-end):after, +.fc-direction-rtl .fc-timeline-event:not(.fc-event-start):before { + border-right: 0; +} +/* +more events indicator */ +/* ---------------------------------------------------------------------------------------------------- */ +.fc-timeline-more-link { + font-size: .85em; + font-size: var(--fc-small-font-size, .85em); + color: inherit; + color: var(--fc-more-link-text-color, inherit); + background: #d0d0d0; + background: var(--fc-more-link-bg-color, #d0d0d0); + padding: 1px; + cursor: pointer; +} +.fc-timeline-more-link-inner { /* has fc-sticky */ + display: inline-block; + left: 0; + right: 0; + padding: 2px; +} +.fc .fc-timeline-bg { /* a container for bg content */ + position: absolute; + z-index: 2; + top: 0; + bottom: 0; + width: 0; + left: 0; /* will take precedence when LTR */ + right: 0; /* will take precedence when RTL */ /* TODO: kill */ + } +.fc .fc-timeline-bg .fc-non-business { z-index: 1 } +.fc .fc-timeline-bg .fc-bg-event { z-index: 2 } +.fc .fc-timeline-bg .fc-highlight { z-index: 3 } +.fc .fc-timeline-bg-harness { + position: absolute; + top: 0; + bottom: 0; + } + + + + + .fc .fc-resource-timeline-divider { + width: 3px; /* important to have width to shrink this cell. no cross-browser problems */ + cursor: col-resize; + } + +.fc .fc-resource-group { + /* make it look less like a */ + font-weight: inherit; + text-align: inherit; + } + +.fc { + + + /* will match horizontal groups in the datagrid AND group lanes in the timeline area */ + +} + +.fc .fc-resource-timeline .fc-resource-group:not([rowspan]) { + background: rgba(208, 208, 208, 0.3); + background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); + } + +.fc .fc-timeline-lane-frame { + position: relative; /* contains the fc-timeline-bg container, which liquidly expands */ + /* the height is explicitly set by row-height-sync */ + } + +.fc .fc-timeline-overlap-enabled .fc-timeline-lane-frame .fc-timeline-events { /* has height set on it */ + box-sizing: content-box; /* padding no longer part of height */ + padding-bottom: 10px; /* give extra spacing underneath for selecting */ + } + +/* hack to make bg expand to lane's full height in resource-timeline with expandRows (#6134) */ +.fc-timeline-body-expandrows td.fc-timeline-lane { + position: relative; + } +.fc-timeline-body-expandrows .fc-timeline-lane-frame { + position: static; + } +/* the "frame" */ +.fc-datagrid-cell-frame-liquid { + height: 100%; /* needs liquid hack */ +} +.fc-liquid-hack .fc-datagrid-cell-frame-liquid { + height: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + } +.fc { + + /* the "frame" in a HEADER */ + /* needs to position the column resizer */ + /* needs to vertically center content */ + +} +.fc .fc-datagrid-header .fc-datagrid-cell-frame { + position: relative; /* for resizer */ + display: flex; + justify-content: flex-start; /* horizontal align (natural left/right) */ + align-items: center; /* vertical align */ + } +.fc { + + /* the column resizer (only in HEADER) */ + +} +.fc .fc-datagrid-cell-resizer { + position: absolute; + z-index: 1; + top: 0; + bottom: 0; + width: 5px; + cursor: col-resize; + } +.fc { + + /* the cushion */ + +} +.fc .fc-datagrid-cell-cushion { + padding: 8px; + white-space: nowrap; + overflow: hidden; /* problem for col resizer :( */ + } +.fc { + + /* expander icons */ + +} +.fc .fc-datagrid-expander { + cursor: pointer; + opacity: 0.65 + + } +.fc .fc-datagrid-expander .fc-icon { /* the expander and spacers before the expander */ + display: inline-block; + width: 1em; /* ensure constant width, esp for empty icons */ + } +.fc .fc-datagrid-expander-placeholder { + cursor: auto; + } +.fc .fc-resource-timeline-flat .fc-datagrid-expander-placeholder { + display: none; + } +.fc-direction-ltr .fc-datagrid-cell-resizer { right: -3px } +.fc-direction-rtl .fc-datagrid-cell-resizer { left: -3px } +.fc-direction-ltr .fc-datagrid-expander { margin-right: 3px } +.fc-direction-rtl .fc-datagrid-expander { margin-left: 3px } + diff --git a/html/sternwarte/kalender/lib/main.js b/html/sternwarte/kalender/lib/main.js new file mode 100644 index 0000000..b32c912 --- /dev/null +++ b/html/sternwarte/kalender/lib/main.js @@ -0,0 +1,20332 @@ +/*! +FullCalendar Scheduler v5.11.3 +Docs & License: https://fullcalendar.io/scheduler +(c) 2022 Adam Shaw +*/ +var FullCalendar = (function (exports) { + 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || from); + } + + var n,u,i$1,t,o,r$1={},f$1=[],e$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function c$1(n,l){for(var u in l)n[u]=l[u];return n}function s(n){var l=n.parentNode;l&&l.removeChild(n);}function a$1(n,l,u){var i,t,o,r=arguments,f={};for(o in l)"key"==o?i=l[o]:"ref"==o?t=l[o]:f[o]=l[o];if(arguments.length>3)for(u=[u],o=3;o0?v$1(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(_=A[h])||_&&k.key==_.key&&k.type===_.type)A[h]=void 0;else for(p=0;p3;)e.pop()();if(e[1]>>1,1),t.i.removeChild(n);}}),N(a$1(T,{context:t.context},n.__v),t.l)):t.l&&t.componentWillUnmount();}function I(n,t){return a$1(j,{__v:n,i:t})}(F.prototype=new p).__e=function(n){var t=this,e=U(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),M(t,n,r)):u();};e?e(o):o();}},F.prototype.render=function(n){this.u=null,this.o=new Map;var t=w$1(n.children);n.revealOrder&&"b"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},F.prototype.componentDidUpdate=F.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){M(n,e,t);});};var W="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,P=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,V=function(n){return ("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(n)};p.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(n){Object.defineProperty(p.prototype,n,{configurable:!0,get:function(){return this["UNSAFE_"+n]},set:function(t){Object.defineProperty(this,n,{configurable:!0,writable:!0,value:t});}});});var H=n.event;function Z(){}function Y(){return this.cancelBubble}function $(){return this.defaultPrevented}n.event=function(n){return H&&(n=H(n)),n.persist=Z,n.isPropagationStopped=Y,n.isDefaultPrevented=$,n.nativeEvent=n};var G={configurable:!0,get:function(){return this.class}},J=n.vnode;n.vnode=function(n){var t=n.type,e=n.props,r=e;if("string"==typeof t){for(var u in r={},e){var o=e[u];"value"===u&&"defaultValue"in e&&null==o||("defaultValue"===u&&"value"in e&&null==e.value?u="value":"download"===u&&!0===o?o="":/ondoubleclick/i.test(u)?u="ondblclick":/^onchange(textarea|input)/i.test(u+t)&&!V(e.type)?u="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(u)?u=u.toLowerCase():P.test(u)?u=u.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===o&&(o=void 0),r[u]=o);}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=w$1(e.children).forEach(function(n){n.props.selected=-1!=r.value.indexOf(n.props.value);})),"select"==t&&null!=r.defaultValue&&(r.value=w$1(e.children).forEach(function(n){n.props.selected=r.multiple?-1!=r.defaultValue.indexOf(n.props.value):r.defaultValue==n.props.value;})),n.props=r;}t&&e.class!=e.className&&(G.enumerable="className"in e,null!=e.className&&(r.class=e.className),Object.defineProperty(r,"className",G)),n.$$typeof=W,J&&J(n);};var K=n.__r;n.__r=function(n){K&&K(n);};"object"==typeof performance&&"function"==typeof performance.now?performance.now.bind(performance):function(){return Date.now()}; + + var globalObj = typeof globalThis !== 'undefined' ? globalThis : window; // // TODO: streamline when killing IE11 support + if (globalObj.FullCalendarVDom) { + console.warn('FullCalendar VDOM already loaded'); + } + else { + globalObj.FullCalendarVDom = { + Component: p, + createElement: a$1, + render: N, + createRef: h, + Fragment: y, + createContext: createContext$1, + createPortal: I, + flushSync: flushSync$1, + unmountComponentAtNode: unmountComponentAtNode$1, + }; + } + // HACKS... + // TODO: lock version + // TODO: link gh issues + function flushSync$1(runBeforeFlush) { + runBeforeFlush(); + var oldDebounceRendering = n.debounceRendering; // orig + var callbackQ = []; + function execCallbackSync(callback) { + callbackQ.push(callback); + } + n.debounceRendering = execCallbackSync; + N(a$1(FakeComponent, {}), document.createElement('div')); + while (callbackQ.length) { + callbackQ.shift()(); + } + n.debounceRendering = oldDebounceRendering; + } + var FakeComponent = /** @class */ (function (_super) { + __extends(FakeComponent, _super); + function FakeComponent() { + return _super !== null && _super.apply(this, arguments) || this; + } + FakeComponent.prototype.render = function () { return a$1('div', {}); }; + FakeComponent.prototype.componentDidMount = function () { this.setState({}); }; + return FakeComponent; + }(p)); + function createContext$1(defaultValue) { + var ContextType = q(defaultValue); + var origProvider = ContextType.Provider; + ContextType.Provider = function () { + var _this = this; + var isNew = !this.getChildContext; + var children = origProvider.apply(this, arguments); // eslint-disable-line prefer-rest-params + if (isNew) { + var subs_1 = []; + this.shouldComponentUpdate = function (_props) { + if (_this.props.value !== _props.value) { + subs_1.forEach(function (c) { + c.context = _props.value; + c.forceUpdate(); + }); + } + }; + this.sub = function (c) { + subs_1.push(c); + var old = c.componentWillUnmount; + c.componentWillUnmount = function () { + subs_1.splice(subs_1.indexOf(c), 1); + old && old.call(c); + }; + }; + } + return children; + }; + return ContextType; + } + function unmountComponentAtNode$1(node) { + N(null, node); + } + + // no public types yet. when there are, export from: + // import {} from './api-type-deps' + var EventSourceApi = /** @class */ (function () { + function EventSourceApi(context, internalEventSource) { + this.context = context; + this.internalEventSource = internalEventSource; + } + EventSourceApi.prototype.remove = function () { + this.context.dispatch({ + type: 'REMOVE_EVENT_SOURCE', + sourceId: this.internalEventSource.sourceId, + }); + }; + EventSourceApi.prototype.refetch = function () { + this.context.dispatch({ + type: 'FETCH_EVENT_SOURCES', + sourceIds: [this.internalEventSource.sourceId], + isRefetch: true, + }); + }; + Object.defineProperty(EventSourceApi.prototype, "id", { + get: function () { + return this.internalEventSource.publicId; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventSourceApi.prototype, "url", { + get: function () { + return this.internalEventSource.meta.url; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventSourceApi.prototype, "format", { + get: function () { + return this.internalEventSource.meta.format; // TODO: bad. not guaranteed + }, + enumerable: false, + configurable: true + }); + return EventSourceApi; + }()); + + function removeElement(el) { + if (el.parentNode) { + el.parentNode.removeChild(el); + } + } + // Querying + // ---------------------------------------------------------------------------------------------------------------- + function elementClosest(el, selector) { + if (el.closest) { + return el.closest(selector); + // really bad fallback for IE + // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest + } + if (!document.documentElement.contains(el)) { + return null; + } + do { + if (elementMatches(el, selector)) { + return el; + } + el = (el.parentElement || el.parentNode); + } while (el !== null && el.nodeType === 1); + return null; + } + function elementMatches(el, selector) { + var method = el.matches || el.matchesSelector || el.msMatchesSelector; + return method.call(el, selector); + } + // accepts multiple subject els + // returns a real array. good for methods like forEach + // TODO: accept the document + function findElements(container, selector) { + var containers = container instanceof HTMLElement ? [container] : container; + var allMatches = []; + for (var i = 0; i < containers.length; i += 1) { + var matches = containers[i].querySelectorAll(selector); + for (var j = 0; j < matches.length; j += 1) { + allMatches.push(matches[j]); + } + } + return allMatches; + } + // accepts multiple subject els + // only queries direct child elements // TODO: rename to findDirectChildren! + function findDirectChildren(parent, selector) { + var parents = parent instanceof HTMLElement ? [parent] : parent; + var allMatches = []; + for (var i = 0; i < parents.length; i += 1) { + var childNodes = parents[i].children; // only ever elements + for (var j = 0; j < childNodes.length; j += 1) { + var childNode = childNodes[j]; + if (!selector || elementMatches(childNode, selector)) { + allMatches.push(childNode); + } + } + } + return allMatches; + } + // Style + // ---------------------------------------------------------------------------------------------------------------- + var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i; + function applyStyle(el, props) { + for (var propName in props) { + applyStyleProp(el, propName, props[propName]); + } + } + function applyStyleProp(el, name, val) { + if (val == null) { + el.style[name] = ''; + } + else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) { + el.style[name] = val + "px"; + } + else { + el.style[name] = val; + } + } + // Event Handling + // ---------------------------------------------------------------------------------------------------------------- + // if intercepting bubbled events at the document/window/body level, + // and want to see originating element (the 'target'), use this util instead + // of `ev.target` because it goes within web-component boundaries. + function getEventTargetViaRoot(ev) { + var _a, _b; + return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target; + } + // Shadow DOM consuderations + // ---------------------------------------------------------------------------------------------------------------- + function getElRoot(el) { + return el.getRootNode ? el.getRootNode() : document; + } + // Unique ID for DOM attribute + var guid$1 = 0; + function getUniqueDomId() { + guid$1 += 1; + return 'fc-dom-' + guid$1; + } + + // Stops a mouse/touch event from doing it's native browser action + function preventDefault(ev) { + ev.preventDefault(); + } + // Event Delegation + // ---------------------------------------------------------------------------------------------------------------- + function buildDelegationHandler(selector, handler) { + return function (ev) { + var matchedChild = elementClosest(ev.target, selector); + if (matchedChild) { + handler.call(matchedChild, ev, matchedChild); + } + }; + } + function listenBySelector(container, eventType, selector, handler) { + var attachedHandler = buildDelegationHandler(selector, handler); + container.addEventListener(eventType, attachedHandler); + return function () { + container.removeEventListener(eventType, attachedHandler); + }; + } + function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) { + var currentMatchedChild; + return listenBySelector(container, 'mouseover', selector, function (mouseOverEv, matchedChild) { + if (matchedChild !== currentMatchedChild) { + currentMatchedChild = matchedChild; + onMouseEnter(mouseOverEv, matchedChild); + var realOnMouseLeave_1 = function (mouseLeaveEv) { + currentMatchedChild = null; + onMouseLeave(mouseLeaveEv, matchedChild); + matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1); + }; + // listen to the next mouseleave, and then unattach + matchedChild.addEventListener('mouseleave', realOnMouseLeave_1); + } + }); + } + // Animation + // ---------------------------------------------------------------------------------------------------------------- + var transitionEventNames = [ + 'webkitTransitionEnd', + 'otransitionend', + 'oTransitionEnd', + 'msTransitionEnd', + 'transitionend', + ]; + // triggered only when the next single subsequent transition finishes + function whenTransitionDone(el, callback) { + var realCallback = function (ev) { + callback(ev); + transitionEventNames.forEach(function (eventName) { + el.removeEventListener(eventName, realCallback); + }); + }; + transitionEventNames.forEach(function (eventName) { + el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes + }); + } + // ARIA workarounds + // ---------------------------------------------------------------------------------------------------------------- + function createAriaClickAttrs(handler) { + return __assign({ onClick: handler }, createAriaKeyboardAttrs(handler)); + } + function createAriaKeyboardAttrs(handler) { + return { + tabIndex: 0, + onKeyDown: function (ev) { + if (ev.key === 'Enter' || ev.key === ' ') { + handler(ev); + ev.preventDefault(); // if space, don't scroll down page + } + }, + }; + } + + var guidNumber = 0; + function guid() { + guidNumber += 1; + return String(guidNumber); + } + /* FullCalendar-specific DOM Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + // Make the mouse cursor express that an event is not allowed in the current area + function disableCursor() { + document.body.classList.add('fc-not-allowed'); + } + // Returns the mouse cursor to its original look + function enableCursor() { + document.body.classList.remove('fc-not-allowed'); + } + /* Selection + ----------------------------------------------------------------------------------------------------------------------*/ + function preventSelection(el) { + el.classList.add('fc-unselectable'); + el.addEventListener('selectstart', preventDefault); + } + function allowSelection(el) { + el.classList.remove('fc-unselectable'); + el.removeEventListener('selectstart', preventDefault); + } + /* Context Menu + ----------------------------------------------------------------------------------------------------------------------*/ + function preventContextMenu(el) { + el.addEventListener('contextmenu', preventDefault); + } + function allowContextMenu(el) { + el.removeEventListener('contextmenu', preventDefault); + } + function parseFieldSpecs(input) { + var specs = []; + var tokens = []; + var i; + var token; + if (typeof input === 'string') { + tokens = input.split(/\s*,\s*/); + } + else if (typeof input === 'function') { + tokens = [input]; + } + else if (Array.isArray(input)) { + tokens = input; + } + for (i = 0; i < tokens.length; i += 1) { + token = tokens[i]; + if (typeof token === 'string') { + specs.push(token.charAt(0) === '-' ? + { field: token.substring(1), order: -1 } : + { field: token, order: 1 }); + } + else if (typeof token === 'function') { + specs.push({ func: token }); + } + } + return specs; + } + function compareByFieldSpecs(obj0, obj1, fieldSpecs) { + var i; + var cmp; + for (i = 0; i < fieldSpecs.length; i += 1) { + cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]); + if (cmp) { + return cmp; + } + } + return 0; + } + function compareByFieldSpec(obj0, obj1, fieldSpec) { + if (fieldSpec.func) { + return fieldSpec.func(obj0, obj1); + } + return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) + * (fieldSpec.order || 1); + } + function flexibleCompare(a, b) { + if (!a && !b) { + return 0; + } + if (b == null) { + return -1; + } + if (a == null) { + return 1; + } + if (typeof a === 'string' || typeof b === 'string') { + return String(a).localeCompare(String(b)); + } + return a - b; + } + /* String Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function padStart(val, len) { + var s = String(val); + return '000'.substr(0, len - s.length) + s; + } + function formatWithOrdinals(formatter, args, fallbackText) { + if (typeof formatter === 'function') { + return formatter.apply(void 0, args); + } + if (typeof formatter === 'string') { // non-blank string + return args.reduce(function (str, arg, index) { return (str.replace('$' + index, arg || '')); }, formatter); + } + return fallbackText; + } + /* Number Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function compareNumbers(a, b) { + return a - b; + } + function isInt(n) { + return n % 1 === 0; + } + /* FC-specific DOM dimension stuff + ----------------------------------------------------------------------------------------------------------------------*/ + function computeSmallestCellWidth(cellEl) { + var allWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-frame'); + var contentWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-cushion'); + if (!allWidthEl) { + throw new Error('needs fc-scrollgrid-shrink-frame className'); // TODO: use const + } + if (!contentWidthEl) { + throw new Error('needs fc-scrollgrid-shrink-cushion className'); + } + return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + // the cell padding+border + contentWidthEl.getBoundingClientRect().width; + } + + var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; + // Adding + function addWeeks(m, n) { + var a = dateToUtcArray(m); + a[2] += n * 7; + return arrayToUtcDate(a); + } + function addDays(m, n) { + var a = dateToUtcArray(m); + a[2] += n; + return arrayToUtcDate(a); + } + function addMs(m, n) { + var a = dateToUtcArray(m); + a[6] += n; + return arrayToUtcDate(a); + } + // Diffing (all return floats) + // TODO: why not use ranges? + function diffWeeks(m0, m1) { + return diffDays(m0, m1) / 7; + } + function diffDays(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24); + } + function diffHours(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60); + } + function diffMinutes(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60); + } + function diffSeconds(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / 1000; + } + function diffDayAndTime(m0, m1) { + var m0day = startOfDay(m0); + var m1day = startOfDay(m1); + return { + years: 0, + months: 0, + days: Math.round(diffDays(m0day, m1day)), + milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf()), + }; + } + // Diffing Whole Units + function diffWholeWeeks(m0, m1) { + var d = diffWholeDays(m0, m1); + if (d !== null && d % 7 === 0) { + return d / 7; + } + return null; + } + function diffWholeDays(m0, m1) { + if (timeAsMs(m0) === timeAsMs(m1)) { + return Math.round(diffDays(m0, m1)); + } + return null; + } + // Start-Of + function startOfDay(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + ]); + } + function startOfHour(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours(), + ]); + } + function startOfMinute(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours(), + m.getUTCMinutes(), + ]); + } + function startOfSecond(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours(), + m.getUTCMinutes(), + m.getUTCSeconds(), + ]); + } + // Week Computation + function weekOfYear(marker, dow, doy) { + var y = marker.getUTCFullYear(); + var w = weekOfGivenYear(marker, y, dow, doy); + if (w < 1) { + return weekOfGivenYear(marker, y - 1, dow, doy); + } + var nextW = weekOfGivenYear(marker, y + 1, dow, doy); + if (nextW >= 1) { + return Math.min(w, nextW); + } + return w; + } + function weekOfGivenYear(marker, year, dow, doy) { + var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); + var dayStart = startOfDay(marker); + var days = Math.round(diffDays(firstWeekStart, dayStart)); + return Math.floor(days / 7) + 1; // zero-indexed + } + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + // first-week day -- which january is always in the first week (4 for iso, 1 for other) + var fwd = 7 + dow - doy; + // first-week day local weekday -- which local weekday is fwd + var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; + return -fwdlw + fwd - 1; + } + // Array Conversion + function dateToLocalArray(date) { + return [ + date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + date.getMilliseconds(), + ]; + } + function arrayToLocalDate(a) { + return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month + a[3] || 0, a[4] || 0, a[5] || 0); + } + function dateToUtcArray(date) { + return [ + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + date.getUTCMilliseconds(), + ]; + } + function arrayToUtcDate(a) { + // according to web standards (and Safari), a month index is required. + // massage if only given a year. + if (a.length === 1) { + a = a.concat([0]); + } + return new Date(Date.UTC.apply(Date, a)); + } + // Other Utils + function isValidDate$1(m) { + return !isNaN(m.valueOf()); + } + function timeAsMs(m) { + return m.getUTCHours() * 1000 * 60 * 60 + + m.getUTCMinutes() * 1000 * 60 + + m.getUTCSeconds() * 1000 + + m.getUTCMilliseconds(); + } + + function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { + return { + instanceId: guid(), + defId: defId, + range: range, + forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, + forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo, + }; + } + + var hasOwnProperty = Object.prototype.hasOwnProperty; + // Merges an array of objects into a single object. + // The second argument allows for an array of property names who's object values will be merged together. + function mergeProps(propObjs, complexPropsMap) { + var dest = {}; + if (complexPropsMap) { + for (var name_1 in complexPropsMap) { + var complexObjs = []; + // collect the trailing object values, stopping when a non-object is discovered + for (var i = propObjs.length - 1; i >= 0; i -= 1) { + var val = propObjs[i][name_1]; + if (typeof val === 'object' && val) { // non-null object + complexObjs.unshift(val); + } + else if (val !== undefined) { + dest[name_1] = val; // if there were no objects, this value will be used + break; + } + } + // if the trailing values were objects, use the merged value + if (complexObjs.length) { + dest[name_1] = mergeProps(complexObjs); + } + } + } + // copy values into the destination, going from last to first + for (var i = propObjs.length - 1; i >= 0; i -= 1) { + var props = propObjs[i]; + for (var name_2 in props) { + if (!(name_2 in dest)) { // if already assigned by previous props or complex props, don't reassign + dest[name_2] = props[name_2]; + } + } + } + return dest; + } + function filterHash(hash, func) { + var filtered = {}; + for (var key in hash) { + if (func(hash[key], key)) { + filtered[key] = hash[key]; + } + } + return filtered; + } + function mapHash(hash, func) { + var newHash = {}; + for (var key in hash) { + newHash[key] = func(hash[key], key); + } + return newHash; + } + function arrayToHash(a) { + var hash = {}; + for (var _i = 0, a_1 = a; _i < a_1.length; _i++) { + var item = a_1[_i]; + hash[item] = true; + } + return hash; + } + function buildHashFromArray(a, func) { + var hash = {}; + for (var i = 0; i < a.length; i += 1) { + var tuple = func(a[i], i); + hash[tuple[0]] = tuple[1]; + } + return hash; + } + function hashValuesToArray(obj) { + var a = []; + for (var key in obj) { + a.push(obj[key]); + } + return a; + } + function isPropsEqual(obj0, obj1) { + if (obj0 === obj1) { + return true; + } + for (var key in obj0) { + if (hasOwnProperty.call(obj0, key)) { + if (!(key in obj1)) { + return false; + } + } + } + for (var key in obj1) { + if (hasOwnProperty.call(obj1, key)) { + if (obj0[key] !== obj1[key]) { + return false; + } + } + } + return true; + } + function getUnequalProps(obj0, obj1) { + var keys = []; + for (var key in obj0) { + if (hasOwnProperty.call(obj0, key)) { + if (!(key in obj1)) { + keys.push(key); + } + } + } + for (var key in obj1) { + if (hasOwnProperty.call(obj1, key)) { + if (obj0[key] !== obj1[key]) { + keys.push(key); + } + } + } + return keys; + } + function compareObjs(oldProps, newProps, equalityFuncs) { + if (equalityFuncs === void 0) { equalityFuncs = {}; } + if (oldProps === newProps) { + return true; + } + for (var key in newProps) { + if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ; + else { + return false; + } + } + // check for props that were omitted in the new + for (var key in oldProps) { + if (!(key in newProps)) { + return false; + } + } + return true; + } + /* + assumed "true" equality for handler names like "onReceiveSomething" + */ + function isObjValsEqual(val0, val1, comparator) { + if (val0 === val1 || comparator === true) { + return true; + } + if (comparator) { + return comparator(val0, val1); + } + return false; + } + function collectFromHash(hash, startIndex, endIndex, step) { + if (startIndex === void 0) { startIndex = 0; } + if (step === void 0) { step = 1; } + var res = []; + if (endIndex == null) { + endIndex = Object.keys(hash).length; + } + for (var i = startIndex; i < endIndex; i += step) { + var val = hash[i]; + if (val !== undefined) { // will disregard undefined for sparse arrays + res.push(val); + } + } + return res; + } + + function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) { + for (var i = 0; i < recurringTypes.length; i += 1) { + var parsed = recurringTypes[i].parse(refined, dateEnv); + if (parsed) { + var allDay = refined.allDay; + if (allDay == null) { + allDay = defaultAllDay; + if (allDay == null) { + allDay = parsed.allDayGuess; + if (allDay == null) { + allDay = false; + } + } + } + return { + allDay: allDay, + duration: parsed.duration, + typeData: parsed.typeData, + typeId: i, + }; + } + } + return null; + } + function expandRecurring(eventStore, framingRange, context) { + var dateEnv = context.dateEnv, pluginHooks = context.pluginHooks, options = context.options; + var defs = eventStore.defs, instances = eventStore.instances; + // remove existing recurring instances + // TODO: bad. always expand events as a second step + instances = filterHash(instances, function (instance) { return !defs[instance.defId].recurringDef; }); + for (var defId in defs) { + var def = defs[defId]; + if (def.recurringDef) { + var duration = def.recurringDef.duration; + if (!duration) { + duration = def.allDay ? + options.defaultAllDayEventDuration : + options.defaultTimedEventDuration; + } + var starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes); + for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) { + var start = starts_1[_i]; + var instance = createEventInstance(defId, { + start: start, + end: dateEnv.add(start, duration), + }); + instances[instance.instanceId] = instance; + } + } + } + return { defs: defs, instances: instances }; + } + /* + Event MUST have a recurringDef + */ + function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { + var typeDef = recurringTypes[eventDef.recurringDef.typeId]; + var markers = typeDef.expand(eventDef.recurringDef.typeData, { + start: dateEnv.subtract(framingRange.start, duration), + end: framingRange.end, + }, dateEnv); + // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to + if (eventDef.allDay) { + markers = markers.map(startOfDay); + } + return markers; + } + + var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds']; + var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; + // Parsing and Creation + function createDuration(input, unit) { + var _a; + if (typeof input === 'string') { + return parseString(input); + } + if (typeof input === 'object' && input) { // non-null object + return parseObject(input); + } + if (typeof input === 'number') { + return parseObject((_a = {}, _a[unit || 'milliseconds'] = input, _a)); + } + return null; + } + function parseString(s) { + var m = PARSE_RE.exec(s); + if (m) { + var sign = m[1] ? -1 : 1; + return { + years: 0, + months: 0, + days: sign * (m[2] ? parseInt(m[2], 10) : 0), + milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours + (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes + (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds + (m[6] ? parseInt(m[6], 10) : 0) // ms + ), + }; + } + return null; + } + function parseObject(obj) { + var duration = { + years: obj.years || obj.year || 0, + months: obj.months || obj.month || 0, + days: obj.days || obj.day || 0, + milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours + (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes + (obj.seconds || obj.second || 0) * 1000 + // seconds + (obj.milliseconds || obj.millisecond || obj.ms || 0), // ms + }; + var weeks = obj.weeks || obj.week; + if (weeks) { + duration.days += weeks * 7; + duration.specifiedWeeks = true; + } + return duration; + } + // Equality + function durationsEqual(d0, d1) { + return d0.years === d1.years && + d0.months === d1.months && + d0.days === d1.days && + d0.milliseconds === d1.milliseconds; + } + function asCleanDays(dur) { + if (!dur.years && !dur.months && !dur.milliseconds) { + return dur.days; + } + return 0; + } + // Simple Math + function addDurations(d0, d1) { + return { + years: d0.years + d1.years, + months: d0.months + d1.months, + days: d0.days + d1.days, + milliseconds: d0.milliseconds + d1.milliseconds, + }; + } + function subtractDurations(d1, d0) { + return { + years: d1.years - d0.years, + months: d1.months - d0.months, + days: d1.days - d0.days, + milliseconds: d1.milliseconds - d0.milliseconds, + }; + } + function multiplyDuration(d, n) { + return { + years: d.years * n, + months: d.months * n, + days: d.days * n, + milliseconds: d.milliseconds * n, + }; + } + // Conversions + // "Rough" because they are based on average-case Gregorian months/years + function asRoughYears(dur) { + return asRoughDays(dur) / 365; + } + function asRoughMonths(dur) { + return asRoughDays(dur) / 30; + } + function asRoughDays(dur) { + return asRoughMs(dur) / 864e5; + } + function asRoughMinutes(dur) { + return asRoughMs(dur) / (1000 * 60); + } + function asRoughSeconds(dur) { + return asRoughMs(dur) / 1000; + } + function asRoughMs(dur) { + return dur.years * (365 * 864e5) + + dur.months * (30 * 864e5) + + dur.days * 864e5 + + dur.milliseconds; + } + // Advanced Math + function wholeDivideDurations(numerator, denominator) { + var res = null; + for (var i = 0; i < INTERNAL_UNITS.length; i += 1) { + var unit = INTERNAL_UNITS[i]; + if (denominator[unit]) { + var localRes = numerator[unit] / denominator[unit]; + if (!isInt(localRes) || (res !== null && res !== localRes)) { + return null; + } + res = localRes; + } + else if (numerator[unit]) { + // needs to divide by something but can't! + return null; + } + } + return res; + } + function greatestDurationDenominator(dur) { + var ms = dur.milliseconds; + if (ms) { + if (ms % 1000 !== 0) { + return { unit: 'millisecond', value: ms }; + } + if (ms % (1000 * 60) !== 0) { + return { unit: 'second', value: ms / 1000 }; + } + if (ms % (1000 * 60 * 60) !== 0) { + return { unit: 'minute', value: ms / (1000 * 60) }; + } + if (ms) { + return { unit: 'hour', value: ms / (1000 * 60 * 60) }; + } + } + if (dur.days) { + if (dur.specifiedWeeks && dur.days % 7 === 0) { + return { unit: 'week', value: dur.days / 7 }; + } + return { unit: 'day', value: dur.days }; + } + if (dur.months) { + return { unit: 'month', value: dur.months }; + } + if (dur.years) { + return { unit: 'year', value: dur.years }; + } + return { unit: 'millisecond', value: 0 }; + } + + // timeZoneOffset is in minutes + function buildIsoString(marker, timeZoneOffset, stripZeroTime) { + if (stripZeroTime === void 0) { stripZeroTime = false; } + var s = marker.toISOString(); + s = s.replace('.000', ''); + if (stripZeroTime) { + s = s.replace('T00:00:00Z', ''); + } + if (s.length > 10) { // time part wasn't stripped, can add timezone info + if (timeZoneOffset == null) { + s = s.replace('Z', ''); + } + else if (timeZoneOffset !== 0) { + s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); + } + // otherwise, its UTC-0 and we want to keep the Z + } + return s; + } + // formats the date, but with no time part + // TODO: somehow merge with buildIsoString and stripZeroTime + // TODO: rename. omit "string" + function formatDayString(marker) { + return marker.toISOString().replace(/T.*$/, ''); + } + // TODO: use Date::toISOString and use everything after the T? + function formatIsoTimeString(marker) { + return padStart(marker.getUTCHours(), 2) + ':' + + padStart(marker.getUTCMinutes(), 2) + ':' + + padStart(marker.getUTCSeconds(), 2); + } + function formatTimeZoneOffset(minutes, doIso) { + if (doIso === void 0) { doIso = false; } + var sign = minutes < 0 ? '-' : '+'; + var abs = Math.abs(minutes); + var hours = Math.floor(abs / 60); + var mins = Math.round(abs % 60); + if (doIso) { + return sign + padStart(hours, 2) + ":" + padStart(mins, 2); + } + return "GMT" + sign + hours + (mins ? ":" + padStart(mins, 2) : ''); + } + + // TODO: new util arrayify? + function removeExact(array, exactVal) { + var removeCnt = 0; + var i = 0; + while (i < array.length) { + if (array[i] === exactVal) { + array.splice(i, 1); + removeCnt += 1; + } + else { + i += 1; + } + } + return removeCnt; + } + function isArraysEqual(a0, a1, equalityFunc) { + if (a0 === a1) { + return true; + } + var len = a0.length; + var i; + if (len !== a1.length) { // not array? or not same length? + return false; + } + for (i = 0; i < len; i += 1) { + if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) { + return false; + } + } + return true; + } + + function memoize(workerFunc, resEquality, teardownFunc) { + var currentArgs; + var currentRes; + return function () { + var newArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + newArgs[_i] = arguments[_i]; + } + if (!currentArgs) { + currentRes = workerFunc.apply(this, newArgs); + } + else if (!isArraysEqual(currentArgs, newArgs)) { + if (teardownFunc) { + teardownFunc(currentRes); + } + var res = workerFunc.apply(this, newArgs); + if (!resEquality || !resEquality(res, currentRes)) { + currentRes = res; + } + } + currentArgs = newArgs; + return currentRes; + }; + } + function memoizeObjArg(workerFunc, resEquality, teardownFunc) { + var _this = this; + var currentArg; + var currentRes; + return function (newArg) { + if (!currentArg) { + currentRes = workerFunc.call(_this, newArg); + } + else if (!isPropsEqual(currentArg, newArg)) { + if (teardownFunc) { + teardownFunc(currentRes); + } + var res = workerFunc.call(_this, newArg); + if (!resEquality || !resEquality(res, currentRes)) { + currentRes = res; + } + } + currentArg = newArg; + return currentRes; + }; + } + function memoizeArraylike(// used at all? + workerFunc, resEquality, teardownFunc) { + var _this = this; + var currentArgSets = []; + var currentResults = []; + return function (newArgSets) { + var currentLen = currentArgSets.length; + var newLen = newArgSets.length; + var i = 0; + for (; i < currentLen; i += 1) { + if (!newArgSets[i]) { // one of the old sets no longer exists + if (teardownFunc) { + teardownFunc(currentResults[i]); + } + } + else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) { + if (teardownFunc) { + teardownFunc(currentResults[i]); + } + var res = workerFunc.apply(_this, newArgSets[i]); + if (!resEquality || !resEquality(res, currentResults[i])) { + currentResults[i] = res; + } + } + } + for (; i < newLen; i += 1) { + currentResults[i] = workerFunc.apply(_this, newArgSets[i]); + } + currentArgSets = newArgSets; + currentResults.splice(newLen); // remove excess + return currentResults; + }; + } + function memoizeHashlike(workerFunc, resEquality, teardownFunc) { + var _this = this; + var currentArgHash = {}; + var currentResHash = {}; + return function (newArgHash) { + var newResHash = {}; + for (var key in newArgHash) { + if (!currentResHash[key]) { + newResHash[key] = workerFunc.apply(_this, newArgHash[key]); + } + else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) { + if (teardownFunc) { + teardownFunc(currentResHash[key]); + } + var res = workerFunc.apply(_this, newArgHash[key]); + newResHash[key] = (resEquality && resEquality(res, currentResHash[key])) + ? currentResHash[key] + : res; + } + else { + newResHash[key] = currentResHash[key]; + } + } + currentArgHash = newArgHash; + currentResHash = newResHash; + return newResHash; + }; + } + + var EXTENDED_SETTINGS_AND_SEVERITIES = { + week: 3, + separator: 0, + omitZeroMinute: 0, + meridiem: 0, + omitCommas: 0, + }; + var STANDARD_DATE_PROP_SEVERITIES = { + timeZoneName: 7, + era: 6, + year: 5, + month: 4, + day: 2, + weekday: 2, + hour: 1, + minute: 1, + second: 1, + }; + var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too + var COMMA_RE = /,/g; // we need re for globalness + var MULTI_SPACE_RE = /\s+/g; + var LTR_RE = /\u200e/g; // control character + var UTC_RE = /UTC|GMT/; + var NativeFormatter = /** @class */ (function () { + function NativeFormatter(formatSettings) { + var standardDateProps = {}; + var extendedSettings = {}; + var severity = 0; + for (var name_1 in formatSettings) { + if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) { + extendedSettings[name_1] = formatSettings[name_1]; + severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity); + } + else { + standardDateProps[name_1] = formatSettings[name_1]; + if (name_1 in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity + severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity); + } + } + } + this.standardDateProps = standardDateProps; + this.extendedSettings = extendedSettings; + this.severity = severity; + this.buildFormattingFunc = memoize(buildFormattingFunc); + } + NativeFormatter.prototype.format = function (date, context) { + return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); + }; + NativeFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { + var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings; + var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem); + if (!diffSeverity) { + return this.format(start, context); + } + var biggestUnitForPartial = diffSeverity; + if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time + (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && + (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && + (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) { + biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time + } + var full0 = this.format(start, context); + var full1 = this.format(end, context); + if (full0 === full1) { + return full0; + } + var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); + var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); + var partial0 = partialFormattingFunc(start); + var partial1 = partialFormattingFunc(end); + var insertion = findCommonInsertion(full0, partial0, full1, partial1); + var separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || ''; + if (insertion) { + return insertion.before + partial0 + separator + partial1 + insertion.after; + } + return full0 + separator + full1; + }; + NativeFormatter.prototype.getLargestUnit = function () { + switch (this.severity) { + case 7: + case 6: + case 5: + return 'year'; + case 4: + return 'month'; + case 3: + return 'week'; + case 2: + return 'day'; + default: + return 'time'; // really? + } + }; + return NativeFormatter; + }()); + function buildFormattingFunc(standardDateProps, extendedSettings, context) { + var standardDatePropCnt = Object.keys(standardDateProps).length; + if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') { + return function (date) { return (formatTimeZoneOffset(date.timeZoneOffset)); }; + } + if (standardDatePropCnt === 0 && extendedSettings.week) { + return function (date) { return (formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week)); }; + } + return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); + } + function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { + standardDateProps = __assign({}, standardDateProps); // copy + extendedSettings = __assign({}, extendedSettings); // copy + sanitizeSettings(standardDateProps, extendedSettings); + standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers + var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); + var zeroFormat; // needed? + if (extendedSettings.omitZeroMinute) { + var zeroProps = __assign({}, standardDateProps); + delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings + zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); + } + return function (date) { + var marker = date.marker; + var format; + if (zeroFormat && !marker.getUTCMinutes()) { + format = zeroFormat; + } + else { + format = normalFormat; + } + var s = format.format(marker); + return postProcess(s, date, standardDateProps, extendedSettings, context); + }; + } + function sanitizeSettings(standardDateProps, extendedSettings) { + // deal with a browser inconsistency where formatting the timezone + // requires that the hour/minute be present. + if (standardDateProps.timeZoneName) { + if (!standardDateProps.hour) { + standardDateProps.hour = '2-digit'; + } + if (!standardDateProps.minute) { + standardDateProps.minute = '2-digit'; + } + } + // only support short timezone names + if (standardDateProps.timeZoneName === 'long') { + standardDateProps.timeZoneName = 'short'; + } + // if requesting to display seconds, MUST display minutes + if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { + delete extendedSettings.omitZeroMinute; + } + } + function postProcess(s, date, standardDateProps, extendedSettings, context) { + s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes + if (standardDateProps.timeZoneName === 'short') { + s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ? + 'UTC' : // important to normalize for IE, which does "GMT" + formatTimeZoneOffset(date.timeZoneOffset)); + } + if (extendedSettings.omitCommas) { + s = s.replace(COMMA_RE, '').trim(); + } + if (extendedSettings.omitZeroMinute) { + s = s.replace(':00', ''); // zeroFormat doesn't always achieve this + } + // ^ do anything that might create adjacent spaces before this point, + // because MERIDIEM_RE likes to eat up loading spaces + if (extendedSettings.meridiem === false) { + s = s.replace(MERIDIEM_RE, '').trim(); + } + else if (extendedSettings.meridiem === 'narrow') { // a/p + s = s.replace(MERIDIEM_RE, function (m0, m1) { return m1.toLocaleLowerCase(); }); + } + else if (extendedSettings.meridiem === 'short') { // am/pm + s = s.replace(MERIDIEM_RE, function (m0, m1) { return m1.toLocaleLowerCase() + "m"; }); + } + else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase + s = s.replace(MERIDIEM_RE, function (m0) { return m0.toLocaleLowerCase(); }); + } + s = s.replace(MULTI_SPACE_RE, ' '); + s = s.trim(); + return s; + } + function injectTzoStr(s, tzoStr) { + var replaced = false; + s = s.replace(UTC_RE, function () { + replaced = true; + return tzoStr; + }); + // IE11 doesn't include UTC/GMT in the original string, so append to end + if (!replaced) { + s += " " + tzoStr; + } + return s; + } + function formatWeekNumber(num, weekText, weekTextLong, locale, display) { + var parts = []; + if (display === 'long') { + parts.push(weekTextLong); + } + else if (display === 'short' || display === 'narrow') { + parts.push(weekText); + } + if (display === 'long' || display === 'short') { + parts.push(' '); + } + parts.push(locale.simpleNumberFormat.format(num)); + if (locale.options.direction === 'rtl') { // TODO: use control characters instead? + parts.reverse(); + } + return parts.join(''); + } + // Range Formatting Utils + // 0 = exactly the same + // 1 = different by time + // and bigger + function computeMarkerDiffSeverity(d0, d1, ca) { + if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { + return 5; + } + if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { + return 4; + } + if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { + return 2; + } + if (timeAsMs(d0) !== timeAsMs(d1)) { + return 1; + } + return 0; + } + function computePartialFormattingOptions(options, biggestUnit) { + var partialOptions = {}; + for (var name_2 in options) { + if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone) + STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) { + partialOptions[name_2] = options[name_2]; + } + } + return partialOptions; + } + function findCommonInsertion(full0, partial0, full1, partial1) { + var i0 = 0; + while (i0 < full0.length) { + var found0 = full0.indexOf(partial0, i0); + if (found0 === -1) { + break; + } + var before0 = full0.substr(0, found0); + i0 = found0 + partial0.length; + var after0 = full0.substr(i0); + var i1 = 0; + while (i1 < full1.length) { + var found1 = full1.indexOf(partial1, i1); + if (found1 === -1) { + break; + } + var before1 = full1.substr(0, found1); + i1 = found1 + partial1.length; + var after1 = full1.substr(i1); + if (before0 === before1 && after0 === after1) { + return { + before: before0, + after: after0, + }; + } + } + } + return null; + } + + function expandZonedMarker(dateInfo, calendarSystem) { + var a = calendarSystem.markerToArray(dateInfo.marker); + return { + marker: dateInfo.marker, + timeZoneOffset: dateInfo.timeZoneOffset, + array: a, + year: a[0], + month: a[1], + day: a[2], + hour: a[3], + minute: a[4], + second: a[5], + millisecond: a[6], + }; + } + + function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) { + var startInfo = expandZonedMarker(start, context.calendarSystem); + var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null; + return { + date: startInfo, + start: startInfo, + end: endInfo, + timeZone: context.timeZone, + localeCodes: context.locale.codes, + defaultSeparator: betterDefaultSeparator || context.defaultSeparator, + }; + } + + /* + TODO: fix the terminology of "formatter" vs "formatting func" + */ + /* + At the time of instantiation, this object does not know which cmd-formatting system it will use. + It receives this at the time of formatting, as a setting. + */ + var CmdFormatter = /** @class */ (function () { + function CmdFormatter(cmdStr) { + this.cmdStr = cmdStr; + } + CmdFormatter.prototype.format = function (date, context, betterDefaultSeparator) { + return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); + }; + CmdFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { + return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); + }; + return CmdFormatter; + }()); + + var FuncFormatter = /** @class */ (function () { + function FuncFormatter(func) { + this.func = func; + } + FuncFormatter.prototype.format = function (date, context, betterDefaultSeparator) { + return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); + }; + FuncFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { + return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); + }; + return FuncFormatter; + }()); + + function createFormatter(input) { + if (typeof input === 'object' && input) { // non-null object + return new NativeFormatter(input); + } + if (typeof input === 'string') { + return new CmdFormatter(input); + } + if (typeof input === 'function') { + return new FuncFormatter(input); + } + return null; + } + + // base options + // ------------ + var BASE_OPTION_REFINERS = { + navLinkDayClick: identity, + navLinkWeekClick: identity, + duration: createDuration, + bootstrapFontAwesome: identity, + buttonIcons: identity, + customButtons: identity, + defaultAllDayEventDuration: createDuration, + defaultTimedEventDuration: createDuration, + nextDayThreshold: createDuration, + scrollTime: createDuration, + scrollTimeReset: Boolean, + slotMinTime: createDuration, + slotMaxTime: createDuration, + dayPopoverFormat: createFormatter, + slotDuration: createDuration, + snapDuration: createDuration, + headerToolbar: identity, + footerToolbar: identity, + defaultRangeSeparator: String, + titleRangeSeparator: String, + forceEventDuration: Boolean, + dayHeaders: Boolean, + dayHeaderFormat: createFormatter, + dayHeaderClassNames: identity, + dayHeaderContent: identity, + dayHeaderDidMount: identity, + dayHeaderWillUnmount: identity, + dayCellClassNames: identity, + dayCellContent: identity, + dayCellDidMount: identity, + dayCellWillUnmount: identity, + initialView: String, + aspectRatio: Number, + weekends: Boolean, + weekNumberCalculation: identity, + weekNumbers: Boolean, + weekNumberClassNames: identity, + weekNumberContent: identity, + weekNumberDidMount: identity, + weekNumberWillUnmount: identity, + editable: Boolean, + viewClassNames: identity, + viewDidMount: identity, + viewWillUnmount: identity, + nowIndicator: Boolean, + nowIndicatorClassNames: identity, + nowIndicatorContent: identity, + nowIndicatorDidMount: identity, + nowIndicatorWillUnmount: identity, + showNonCurrentDates: Boolean, + lazyFetching: Boolean, + startParam: String, + endParam: String, + timeZoneParam: String, + timeZone: String, + locales: identity, + locale: identity, + themeSystem: String, + dragRevertDuration: Number, + dragScroll: Boolean, + allDayMaintainDuration: Boolean, + unselectAuto: Boolean, + dropAccept: identity, + eventOrder: parseFieldSpecs, + eventOrderStrict: Boolean, + handleWindowResize: Boolean, + windowResizeDelay: Number, + longPressDelay: Number, + eventDragMinDistance: Number, + expandRows: Boolean, + height: identity, + contentHeight: identity, + direction: String, + weekNumberFormat: createFormatter, + eventResizableFromStart: Boolean, + displayEventTime: Boolean, + displayEventEnd: Boolean, + weekText: String, + weekTextLong: String, + progressiveEventRendering: Boolean, + businessHours: identity, + initialDate: identity, + now: identity, + eventDataTransform: identity, + stickyHeaderDates: identity, + stickyFooterScrollbar: identity, + viewHeight: identity, + defaultAllDay: Boolean, + eventSourceFailure: identity, + eventSourceSuccess: identity, + eventDisplay: String, + eventStartEditable: Boolean, + eventDurationEditable: Boolean, + eventOverlap: identity, + eventConstraint: identity, + eventAllow: identity, + eventBackgroundColor: String, + eventBorderColor: String, + eventTextColor: String, + eventColor: String, + eventClassNames: identity, + eventContent: identity, + eventDidMount: identity, + eventWillUnmount: identity, + selectConstraint: identity, + selectOverlap: identity, + selectAllow: identity, + droppable: Boolean, + unselectCancel: String, + slotLabelFormat: identity, + slotLaneClassNames: identity, + slotLaneContent: identity, + slotLaneDidMount: identity, + slotLaneWillUnmount: identity, + slotLabelClassNames: identity, + slotLabelContent: identity, + slotLabelDidMount: identity, + slotLabelWillUnmount: identity, + dayMaxEvents: identity, + dayMaxEventRows: identity, + dayMinWidth: Number, + slotLabelInterval: createDuration, + allDayText: String, + allDayClassNames: identity, + allDayContent: identity, + allDayDidMount: identity, + allDayWillUnmount: identity, + slotMinWidth: Number, + navLinks: Boolean, + eventTimeFormat: createFormatter, + rerenderDelay: Number, + moreLinkText: identity, + moreLinkHint: identity, + selectMinDistance: Number, + selectable: Boolean, + selectLongPressDelay: Number, + eventLongPressDelay: Number, + selectMirror: Boolean, + eventMaxStack: Number, + eventMinHeight: Number, + eventMinWidth: Number, + eventShortHeight: Number, + slotEventOverlap: Boolean, + plugins: identity, + firstDay: Number, + dayCount: Number, + dateAlignment: String, + dateIncrement: createDuration, + hiddenDays: identity, + monthMode: Boolean, + fixedWeekCount: Boolean, + validRange: identity, + visibleRange: identity, + titleFormat: identity, + eventInteractive: Boolean, + // only used by list-view, but languages define the value, so we need it in base options + noEventsText: String, + viewHint: identity, + navLinkHint: identity, + closeHint: String, + timeHint: String, + eventHint: String, + moreLinkClick: identity, + moreLinkClassNames: identity, + moreLinkContent: identity, + moreLinkDidMount: identity, + moreLinkWillUnmount: identity, + }; + // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results. + // raw values. + var BASE_OPTION_DEFAULTS = { + eventDisplay: 'auto', + defaultRangeSeparator: ' - ', + titleRangeSeparator: ' \u2013 ', + defaultTimedEventDuration: '01:00:00', + defaultAllDayEventDuration: { day: 1 }, + forceEventDuration: false, + nextDayThreshold: '00:00:00', + dayHeaders: true, + initialView: '', + aspectRatio: 1.35, + headerToolbar: { + start: 'title', + center: '', + end: 'today prev,next', + }, + weekends: true, + weekNumbers: false, + weekNumberCalculation: 'local', + editable: false, + nowIndicator: false, + scrollTime: '06:00:00', + scrollTimeReset: true, + slotMinTime: '00:00:00', + slotMaxTime: '24:00:00', + showNonCurrentDates: true, + lazyFetching: true, + startParam: 'start', + endParam: 'end', + timeZoneParam: 'timeZone', + timeZone: 'local', + locales: [], + locale: '', + themeSystem: 'standard', + dragRevertDuration: 500, + dragScroll: true, + allDayMaintainDuration: false, + unselectAuto: true, + dropAccept: '*', + eventOrder: 'start,-duration,allDay,title', + dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' }, + handleWindowResize: true, + windowResizeDelay: 100, + longPressDelay: 1000, + eventDragMinDistance: 5, + expandRows: false, + navLinks: false, + selectable: false, + eventMinHeight: 15, + eventMinWidth: 30, + eventShortHeight: 30, + }; + // calendar listeners + // ------------------ + var CALENDAR_LISTENER_REFINERS = { + datesSet: identity, + eventsSet: identity, + eventAdd: identity, + eventChange: identity, + eventRemove: identity, + windowResize: identity, + eventClick: identity, + eventMouseEnter: identity, + eventMouseLeave: identity, + select: identity, + unselect: identity, + loading: identity, + // internal + _unmount: identity, + _beforeprint: identity, + _afterprint: identity, + _noEventDrop: identity, + _noEventResize: identity, + _resize: identity, + _scrollRequest: identity, + }; + // calendar-specific options + // ------------------------- + var CALENDAR_OPTION_REFINERS = { + buttonText: identity, + buttonHints: identity, + views: identity, + plugins: identity, + initialEvents: identity, + events: identity, + eventSources: identity, + }; + var COMPLEX_OPTION_COMPARATORS = { + headerToolbar: isMaybeObjectsEqual, + footerToolbar: isMaybeObjectsEqual, + buttonText: isMaybeObjectsEqual, + buttonHints: isMaybeObjectsEqual, + buttonIcons: isMaybeObjectsEqual, + dateIncrement: isMaybeObjectsEqual, + }; + function isMaybeObjectsEqual(a, b) { + if (typeof a === 'object' && typeof b === 'object' && a && b) { // both non-null objects + return isPropsEqual(a, b); + } + return a === b; + } + // view-specific options + // --------------------- + var VIEW_OPTION_REFINERS = { + type: String, + component: identity, + buttonText: String, + buttonTextKey: String, + dateProfileGeneratorClass: identity, + usesMinMaxTime: Boolean, + classNames: identity, + content: identity, + didMount: identity, + willUnmount: identity, + }; + // util funcs + // ---------------------------------------------------------------------------------------------------- + function mergeRawOptions(optionSets) { + return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS); + } + function refineProps(input, refiners) { + var refined = {}; + var extra = {}; + for (var propName in refiners) { + if (propName in input) { + refined[propName] = refiners[propName](input[propName]); + } + } + for (var propName in input) { + if (!(propName in refiners)) { + extra[propName] = input[propName]; + } + } + return { refined: refined, extra: extra }; + } + function identity(raw) { + return raw; + } + + function parseEvents(rawEvents, eventSource, context, allowOpenRange) { + var eventStore = createEmptyEventStore(); + var eventRefiners = buildEventRefiners(context); + for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { + var rawEvent = rawEvents_1[_i]; + var tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners); + if (tuple) { + eventTupleToStore(tuple, eventStore); + } + } + return eventStore; + } + function eventTupleToStore(tuple, eventStore) { + if (eventStore === void 0) { eventStore = createEmptyEventStore(); } + eventStore.defs[tuple.def.defId] = tuple.def; + if (tuple.instance) { + eventStore.instances[tuple.instance.instanceId] = tuple.instance; + } + return eventStore; + } + // retrieves events that have the same groupId as the instance specified by `instanceId` + // or they are the same as the instance. + // why might instanceId not be in the store? an event from another calendar? + function getRelevantEvents(eventStore, instanceId) { + var instance = eventStore.instances[instanceId]; + if (instance) { + var def_1 = eventStore.defs[instance.defId]; + // get events/instances with same group + var newStore = filterEventStoreDefs(eventStore, function (lookDef) { return isEventDefsGrouped(def_1, lookDef); }); + // add the original + // TODO: wish we could use eventTupleToStore or something like it + newStore.defs[def_1.defId] = def_1; + newStore.instances[instance.instanceId] = instance; + return newStore; + } + return createEmptyEventStore(); + } + function isEventDefsGrouped(def0, def1) { + return Boolean(def0.groupId && def0.groupId === def1.groupId); + } + function createEmptyEventStore() { + return { defs: {}, instances: {} }; + } + function mergeEventStores(store0, store1) { + return { + defs: __assign(__assign({}, store0.defs), store1.defs), + instances: __assign(__assign({}, store0.instances), store1.instances), + }; + } + function filterEventStoreDefs(eventStore, filterFunc) { + var defs = filterHash(eventStore.defs, filterFunc); + var instances = filterHash(eventStore.instances, function (instance) { return (defs[instance.defId] // still exists? + ); }); + return { defs: defs, instances: instances }; + } + function excludeSubEventStore(master, sub) { + var defs = master.defs, instances = master.instances; + var filteredDefs = {}; + var filteredInstances = {}; + for (var defId in defs) { + if (!sub.defs[defId]) { // not explicitly excluded + filteredDefs[defId] = defs[defId]; + } + } + for (var instanceId in instances) { + if (!sub.instances[instanceId] && // not explicitly excluded + filteredDefs[instances[instanceId].defId] // def wasn't filtered away + ) { + filteredInstances[instanceId] = instances[instanceId]; + } + } + return { + defs: filteredDefs, + instances: filteredInstances, + }; + } + + function normalizeConstraint(input, context) { + if (Array.isArray(input)) { + return parseEvents(input, null, context, true); // allowOpenRange=true + } + if (typeof input === 'object' && input) { // non-null object + return parseEvents([input], null, context, true); // allowOpenRange=true + } + if (input != null) { + return String(input); + } + return null; + } + + function parseClassNames(raw) { + if (Array.isArray(raw)) { + return raw; + } + if (typeof raw === 'string') { + return raw.split(/\s+/); + } + return []; + } + + // TODO: better called "EventSettings" or "EventConfig" + // TODO: move this file into structs + // TODO: separate constraint/overlap/allow, because selection uses only that, not other props + var EVENT_UI_REFINERS = { + display: String, + editable: Boolean, + startEditable: Boolean, + durationEditable: Boolean, + constraint: identity, + overlap: identity, + allow: identity, + className: parseClassNames, + classNames: parseClassNames, + color: String, + backgroundColor: String, + borderColor: String, + textColor: String, + }; + var EMPTY_EVENT_UI = { + display: null, + startEditable: null, + durationEditable: null, + constraints: [], + overlap: null, + allows: [], + backgroundColor: '', + borderColor: '', + textColor: '', + classNames: [], + }; + function createEventUi(refined, context) { + var constraint = normalizeConstraint(refined.constraint, context); + return { + display: refined.display || null, + startEditable: refined.startEditable != null ? refined.startEditable : refined.editable, + durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable, + constraints: constraint != null ? [constraint] : [], + overlap: refined.overlap != null ? refined.overlap : null, + allows: refined.allow != null ? [refined.allow] : [], + backgroundColor: refined.backgroundColor || refined.color || '', + borderColor: refined.borderColor || refined.color || '', + textColor: refined.textColor || '', + classNames: (refined.className || []).concat(refined.classNames || []), // join singular and plural + }; + } + // TODO: prevent against problems with <2 args! + function combineEventUis(uis) { + return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); + } + function combineTwoEventUis(item0, item1) { + return { + display: item1.display != null ? item1.display : item0.display, + startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, + durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, + constraints: item0.constraints.concat(item1.constraints), + overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap, + allows: item0.allows.concat(item1.allows), + backgroundColor: item1.backgroundColor || item0.backgroundColor, + borderColor: item1.borderColor || item0.borderColor, + textColor: item1.textColor || item0.textColor, + classNames: item0.classNames.concat(item1.classNames), + }; + } + + var EVENT_NON_DATE_REFINERS = { + id: String, + groupId: String, + title: String, + url: String, + interactive: Boolean, + }; + var EVENT_DATE_REFINERS = { + start: identity, + end: identity, + date: identity, + allDay: Boolean, + }; + var EVENT_REFINERS$1 = __assign(__assign(__assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity }); + function parseEvent(raw, eventSource, context, allowOpenRange, refiners) { + if (refiners === void 0) { refiners = buildEventRefiners(context); } + var _a = refineEventDef(raw, context, refiners), refined = _a.refined, extra = _a.extra; + var defaultAllDay = computeIsDefaultAllDay(eventSource, context); + var recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes); + if (recurringRes) { + var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context); + def.recurringDef = { + typeId: recurringRes.typeId, + typeData: recurringRes.typeData, + duration: recurringRes.duration, + }; + return { def: def, instance: null }; + } + var singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange); + if (singleRes) { + var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context); + var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); + return { def: def, instance: instance }; + } + return null; + } + function refineEventDef(raw, context, refiners) { + if (refiners === void 0) { refiners = buildEventRefiners(context); } + return refineProps(raw, refiners); + } + function buildEventRefiners(context) { + return __assign(__assign(__assign({}, EVENT_UI_REFINERS), EVENT_REFINERS$1), context.pluginHooks.eventRefiners); + } + /* + Will NOT populate extendedProps with the leftover properties. + Will NOT populate date-related props. + */ + function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) { + var def = { + title: refined.title || '', + groupId: refined.groupId || '', + publicId: refined.id || '', + url: refined.url || '', + recurringDef: null, + defId: guid(), + sourceId: sourceId, + allDay: allDay, + hasEnd: hasEnd, + interactive: refined.interactive, + ui: createEventUi(refined, context), + extendedProps: __assign(__assign({}, (refined.extendedProps || {})), extra), + }; + for (var _i = 0, _a = context.pluginHooks.eventDefMemberAdders; _i < _a.length; _i++) { + var memberAdder = _a[_i]; + __assign(def, memberAdder(refined)); + } + // help out EventApi from having user modify props + Object.freeze(def.ui.classNames); + Object.freeze(def.extendedProps); + return def; + } + function parseSingle(refined, defaultAllDay, context, allowOpenRange) { + var allDay = refined.allDay; + var startMeta; + var startMarker = null; + var hasEnd = false; + var endMeta; + var endMarker = null; + var startInput = refined.start != null ? refined.start : refined.date; + startMeta = context.dateEnv.createMarkerMeta(startInput); + if (startMeta) { + startMarker = startMeta.marker; + } + else if (!allowOpenRange) { + return null; + } + if (refined.end != null) { + endMeta = context.dateEnv.createMarkerMeta(refined.end); + } + if (allDay == null) { + if (defaultAllDay != null) { + allDay = defaultAllDay; + } + else { + // fall back to the date props LAST + allDay = (!startMeta || startMeta.isTimeUnspecified) && + (!endMeta || endMeta.isTimeUnspecified); + } + } + if (allDay && startMarker) { + startMarker = startOfDay(startMarker); + } + if (endMeta) { + endMarker = endMeta.marker; + if (allDay) { + endMarker = startOfDay(endMarker); + } + if (startMarker && endMarker <= startMarker) { + endMarker = null; + } + } + if (endMarker) { + hasEnd = true; + } + else if (!allowOpenRange) { + hasEnd = context.options.forceEventDuration || false; + endMarker = context.dateEnv.add(startMarker, allDay ? + context.options.defaultAllDayEventDuration : + context.options.defaultTimedEventDuration); + } + return { + allDay: allDay, + hasEnd: hasEnd, + range: { start: startMarker, end: endMarker }, + forcedStartTzo: startMeta ? startMeta.forcedTzo : null, + forcedEndTzo: endMeta ? endMeta.forcedTzo : null, + }; + } + function computeIsDefaultAllDay(eventSource, context) { + var res = null; + if (eventSource) { + res = eventSource.defaultAllDay; + } + if (res == null) { + res = context.options.defaultAllDay; + } + return res; + } + + /* Date stuff that doesn't belong in datelib core + ----------------------------------------------------------------------------------------------------------------------*/ + // given a timed range, computes an all-day range that has the same exact duration, + // but whose start time is aligned with the start of the day. + function computeAlignedDayRange(timedRange) { + var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; + var start = startOfDay(timedRange.start); + var end = addDays(start, dayCnt); + return { start: start, end: end }; + } + // given a timed range, computes an all-day range based on how for the end date bleeds into the next day + // TODO: give nextDayThreshold a default arg + function computeVisibleDayRange(timedRange, nextDayThreshold) { + if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); } + var startDay = null; + var endDay = null; + if (timedRange.end) { + endDay = startOfDay(timedRange.end); + var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay` + // If the end time is actually inclusively part of the next day and is equal to or + // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. + // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. + if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { + endDay = addDays(endDay, 1); + } + } + if (timedRange.start) { + startDay = startOfDay(timedRange.start); // the beginning of the day the range starts + // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day. + if (endDay && endDay <= startDay) { + endDay = addDays(startDay, 1); + } + } + return { start: startDay, end: endDay }; + } + // spans from one day into another? + function isMultiDayRange(range) { + var visibleRange = computeVisibleDayRange(range); + return diffDays(visibleRange.start, visibleRange.end) > 1; + } + function diffDates(date0, date1, dateEnv, largeUnit) { + if (largeUnit === 'year') { + return createDuration(dateEnv.diffWholeYears(date0, date1), 'year'); + } + if (largeUnit === 'month') { + return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month'); + } + return diffDayAndTime(date0, date1); // returns a duration + } + + function parseRange(input, dateEnv) { + var start = null; + var end = null; + if (input.start) { + start = dateEnv.createMarker(input.start); + } + if (input.end) { + end = dateEnv.createMarker(input.end); + } + if (!start && !end) { + return null; + } + if (start && end && end < start) { + return null; + } + return { start: start, end: end }; + } + // SIDE-EFFECT: will mutate ranges. + // Will return a new array result. + function invertRanges(ranges, constraintRange) { + var invertedRanges = []; + var start = constraintRange.start; // the end of the previous range. the start of the new range + var i; + var dateRange; + // ranges need to be in order. required for our date-walking algorithm + ranges.sort(compareRanges); + for (i = 0; i < ranges.length; i += 1) { + dateRange = ranges[i]; + // add the span of time before the event (if there is any) + if (dateRange.start > start) { // compare millisecond time (skip any ambig logic) + invertedRanges.push({ start: start, end: dateRange.start }); + } + if (dateRange.end > start) { + start = dateRange.end; + } + } + // add the span of time after the last event (if there is any) + if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic) + invertedRanges.push({ start: start, end: constraintRange.end }); + } + return invertedRanges; + } + function compareRanges(range0, range1) { + return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first + } + function intersectRanges(range0, range1) { + var start = range0.start, end = range0.end; + var newRange = null; + if (range1.start !== null) { + if (start === null) { + start = range1.start; + } + else { + start = new Date(Math.max(start.valueOf(), range1.start.valueOf())); + } + } + if (range1.end != null) { + if (end === null) { + end = range1.end; + } + else { + end = new Date(Math.min(end.valueOf(), range1.end.valueOf())); + } + } + if (start === null || end === null || start < end) { + newRange = { start: start, end: end }; + } + return newRange; + } + function rangesEqual(range0, range1) { + return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && + (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf()); + } + function rangesIntersect(range0, range1) { + return (range0.end === null || range1.start === null || range0.end > range1.start) && + (range0.start === null || range1.end === null || range0.start < range1.end); + } + function rangeContainsRange(outerRange, innerRange) { + return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) && + (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end)); + } + function rangeContainsMarker(range, date) { + return (range.start === null || date >= range.start) && + (range.end === null || date < range.end); + } + // If the given date is not within the given range, move it inside. + // (If it's past the end, make it one millisecond before the end). + function constrainMarkerToRange(date, range) { + if (range.start != null && date < range.start) { + return range.start; + } + if (range.end != null && date >= range.end) { + return new Date(range.end.valueOf() - 1); + } + return date; + } + + /* + Specifying nextDayThreshold signals that all-day ranges should be sliced. + */ + function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { + var inverseBgByGroupId = {}; + var inverseBgByDefId = {}; + var defByGroupId = {}; + var bgRanges = []; + var fgRanges = []; + var eventUis = compileEventUis(eventStore.defs, eventUiBases); + for (var defId in eventStore.defs) { + var def = eventStore.defs[defId]; + var ui = eventUis[def.defId]; + if (ui.display === 'inverse-background') { + if (def.groupId) { + inverseBgByGroupId[def.groupId] = []; + if (!defByGroupId[def.groupId]) { + defByGroupId[def.groupId] = def; + } + } + else { + inverseBgByDefId[defId] = []; + } + } + } + for (var instanceId in eventStore.instances) { + var instance = eventStore.instances[instanceId]; + var def = eventStore.defs[instance.defId]; + var ui = eventUis[def.defId]; + var origRange = instance.range; + var normalRange = (!def.allDay && nextDayThreshold) ? + computeVisibleDayRange(origRange, nextDayThreshold) : + origRange; + var slicedRange = intersectRanges(normalRange, framingRange); + if (slicedRange) { + if (ui.display === 'inverse-background') { + if (def.groupId) { + inverseBgByGroupId[def.groupId].push(slicedRange); + } + else { + inverseBgByDefId[instance.defId].push(slicedRange); + } + } + else if (ui.display !== 'none') { + (ui.display === 'background' ? bgRanges : fgRanges).push({ + def: def, + ui: ui, + instance: instance, + range: slicedRange, + isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), + isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf(), + }); + } + } + } + for (var groupId in inverseBgByGroupId) { // BY GROUP + var ranges = inverseBgByGroupId[groupId]; + var invertedRanges = invertRanges(ranges, framingRange); + for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) { + var invertedRange = invertedRanges_1[_i]; + var def = defByGroupId[groupId]; + var ui = eventUis[def.defId]; + bgRanges.push({ + def: def, + ui: ui, + instance: null, + range: invertedRange, + isStart: false, + isEnd: false, + }); + } + } + for (var defId in inverseBgByDefId) { + var ranges = inverseBgByDefId[defId]; + var invertedRanges = invertRanges(ranges, framingRange); + for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) { + var invertedRange = invertedRanges_2[_a]; + bgRanges.push({ + def: eventStore.defs[defId], + ui: eventUis[defId], + instance: null, + range: invertedRange, + isStart: false, + isEnd: false, + }); + } + } + return { bg: bgRanges, fg: fgRanges }; + } + function hasBgRendering(def) { + return def.ui.display === 'background' || def.ui.display === 'inverse-background'; + } + function setElSeg(el, seg) { + el.fcSeg = seg; + } + function getElSeg(el) { + return el.fcSeg || + el.parentNode.fcSeg || // for the harness + null; + } + // event ui computation + function compileEventUis(eventDefs, eventUiBases) { + return mapHash(eventDefs, function (eventDef) { return compileEventUi(eventDef, eventUiBases); }); + } + function compileEventUi(eventDef, eventUiBases) { + var uis = []; + if (eventUiBases['']) { + uis.push(eventUiBases['']); + } + if (eventUiBases[eventDef.defId]) { + uis.push(eventUiBases[eventDef.defId]); + } + uis.push(eventDef.ui); + return combineEventUis(uis); + } + function sortEventSegs(segs, eventOrderSpecs) { + var objs = segs.map(buildSegCompareObj); + objs.sort(function (obj0, obj1) { return compareByFieldSpecs(obj0, obj1, eventOrderSpecs); }); + return objs.map(function (c) { return c._seg; }); + } + // returns a object with all primitive props that can be compared + function buildSegCompareObj(seg) { + var eventRange = seg.eventRange; + var eventDef = eventRange.def; + var range = eventRange.instance ? eventRange.instance.range : eventRange.range; + var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events + var end = range.end ? range.end.valueOf() : 0; // " + return __assign(__assign(__assign({}, eventDef.extendedProps), eventDef), { id: eventDef.publicId, start: start, + end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg }); + } + function computeSegDraggable(seg, context) { + var pluginHooks = context.pluginHooks; + var transformers = pluginHooks.isDraggableTransformers; + var _a = seg.eventRange, def = _a.def, ui = _a.ui; + var val = ui.startEditable; + for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { + var transformer = transformers_1[_i]; + val = transformer(val, def, ui, context); + } + return val; + } + function computeSegStartResizable(seg, context) { + return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart; + } + function computeSegEndResizable(seg, context) { + return seg.isEnd && seg.eventRange.ui.durationEditable; + } + function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true + defaultDisplayEventEnd, // defaults to true + startOverride, endOverride) { + var dateEnv = context.dateEnv, options = context.options; + var displayEventTime = options.displayEventTime, displayEventEnd = options.displayEventEnd; + var eventDef = seg.eventRange.def; + var eventInstance = seg.eventRange.instance; + if (displayEventTime == null) { + displayEventTime = defaultDisplayEventTime !== false; + } + if (displayEventEnd == null) { + displayEventEnd = defaultDisplayEventEnd !== false; + } + var wholeEventStart = eventInstance.range.start; + var wholeEventEnd = eventInstance.range.end; + var segStart = startOverride || seg.start || seg.eventRange.range.start; + var segEnd = endOverride || seg.end || seg.eventRange.range.end; + var isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf(); + var isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf(); + if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) { + segStart = isStartDay ? wholeEventStart : segStart; + segEnd = isEndDay ? wholeEventEnd : segEnd; + if (displayEventEnd && eventDef.hasEnd) { + return dateEnv.formatRange(segStart, segEnd, timeFormat, { + forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo, + forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo, + }); + } + return dateEnv.format(segStart, timeFormat, { + forcedTzo: startOverride ? null : eventInstance.forcedStartTzo, // nooooo, same + }); + } + return ''; + } + function getSegMeta(seg, todayRange, nowDate) { + var segRange = seg.eventRange.range; + return { + isPast: segRange.end < (nowDate || todayRange.start), + isFuture: segRange.start >= (nowDate || todayRange.end), + isToday: todayRange && rangeContainsMarker(todayRange, segRange.start), + }; + } + function getEventClassNames(props) { + var classNames = ['fc-event']; + if (props.isMirror) { + classNames.push('fc-event-mirror'); + } + if (props.isDraggable) { + classNames.push('fc-event-draggable'); + } + if (props.isStartResizable || props.isEndResizable) { + classNames.push('fc-event-resizable'); + } + if (props.isDragging) { + classNames.push('fc-event-dragging'); + } + if (props.isResizing) { + classNames.push('fc-event-resizing'); + } + if (props.isSelected) { + classNames.push('fc-event-selected'); + } + if (props.isStart) { + classNames.push('fc-event-start'); + } + if (props.isEnd) { + classNames.push('fc-event-end'); + } + if (props.isPast) { + classNames.push('fc-event-past'); + } + if (props.isToday) { + classNames.push('fc-event-today'); + } + if (props.isFuture) { + classNames.push('fc-event-future'); + } + return classNames; + } + function buildEventRangeKey(eventRange) { + return eventRange.instance + ? eventRange.instance.instanceId + : eventRange.def.defId + ":" + eventRange.range.start.toISOString(); + // inverse-background events don't have specific instances. TODO: better solution + } + function getSegAnchorAttrs(seg, context) { + var _a = seg.eventRange, def = _a.def, instance = _a.instance; + var url = def.url; + if (url) { + return { href: url }; + } + var emitter = context.emitter, options = context.options; + var eventInteractive = options.eventInteractive; + if (eventInteractive == null) { + eventInteractive = def.interactive; + if (eventInteractive == null) { + eventInteractive = Boolean(emitter.hasHandlers('eventClick')); + } + } + // mock what happens in EventClicking + if (eventInteractive) { + // only attach keyboard-related handlers because click handler is already done in EventClicking + return createAriaKeyboardAttrs(function (ev) { + emitter.trigger('eventClick', { + el: ev.target, + event: new EventApi(context, def, instance), + jsEvent: ev, + view: context.viewApi, + }); + }); + } + return {}; + } + + var STANDARD_PROPS = { + start: identity, + end: identity, + allDay: Boolean, + }; + function parseDateSpan(raw, dateEnv, defaultDuration) { + var span = parseOpenDateSpan(raw, dateEnv); + var range = span.range; + if (!range.start) { + return null; + } + if (!range.end) { + if (defaultDuration == null) { + return null; + } + range.end = dateEnv.add(range.start, defaultDuration); + } + return span; + } + /* + TODO: somehow combine with parseRange? + Will return null if the start/end props were present but parsed invalidly. + */ + function parseOpenDateSpan(raw, dateEnv) { + var _a = refineProps(raw, STANDARD_PROPS), standardProps = _a.refined, extra = _a.extra; + var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; + var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; + var allDay = standardProps.allDay; + if (allDay == null) { + allDay = (startMeta && startMeta.isTimeUnspecified) && + (!endMeta || endMeta.isTimeUnspecified); + } + return __assign({ range: { + start: startMeta ? startMeta.marker : null, + end: endMeta ? endMeta.marker : null, + }, allDay: allDay }, extra); + } + function isDateSpansEqual(span0, span1) { + return rangesEqual(span0.range, span1.range) && + span0.allDay === span1.allDay && + isSpanPropsEqual(span0, span1); + } + // the NON-DATE-RELATED props + function isSpanPropsEqual(span0, span1) { + for (var propName in span1) { + if (propName !== 'range' && propName !== 'allDay') { + if (span0[propName] !== span1[propName]) { + return false; + } + } + } + // are there any props that span0 has that span1 DOESN'T have? + // both have range/allDay, so no need to special-case. + for (var propName in span0) { + if (!(propName in span1)) { + return false; + } + } + return true; + } + function buildDateSpanApi(span, dateEnv) { + return __assign(__assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay }); + } + function buildRangeApiWithTimeZone(range, dateEnv, omitTime) { + return __assign(__assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone }); + } + function buildRangeApi(range, dateEnv, omitTime) { + return { + start: dateEnv.toDate(range.start), + end: dateEnv.toDate(range.end), + startStr: dateEnv.formatIso(range.start, { omitTime: omitTime }), + endStr: dateEnv.formatIso(range.end, { omitTime: omitTime }), + }; + } + function fabricateEventRange(dateSpan, eventUiBases, context) { + var res = refineEventDef({ editable: false }, context); + var def = parseEventDef(res.refined, res.extra, '', // sourceId + dateSpan.allDay, true, // hasEnd + context); + return { + def: def, + ui: compileEventUi(def, eventUiBases), + instance: createEventInstance(def.defId, dateSpan.range), + range: dateSpan.range, + isStart: true, + isEnd: true, + }; + } + + function triggerDateSelect(selection, pev, context) { + context.emitter.trigger('select', __assign(__assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view })); + } + function triggerDateUnselect(pev, context) { + context.emitter.trigger('unselect', { + jsEvent: pev ? pev.origEvent : null, + view: context.viewApi || context.calendarApi.view, + }); + } + function buildDateSpanApiWithContext(dateSpan, context) { + var props = {}; + for (var _i = 0, _a = context.pluginHooks.dateSpanTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(props, transform(dateSpan, context)); + } + __assign(props, buildDateSpanApi(dateSpan, context.dateEnv)); + return props; + } + // Given an event's allDay status and start date, return what its fallback end date should be. + // TODO: rename to computeDefaultEventEnd + function getDefaultEventEnd(allDay, marker, context) { + var dateEnv = context.dateEnv, options = context.options; + var end = marker; + if (allDay) { + end = startOfDay(end); + end = dateEnv.add(end, options.defaultAllDayEventDuration); + } + else { + end = dateEnv.add(end, options.defaultTimedEventDuration); + } + return end; + } + + // applies the mutation to ALL defs/instances within the event store + function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) { + var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); + var dest = createEmptyEventStore(); + for (var defId in eventStore.defs) { + var def = eventStore.defs[defId]; + dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context); + } + for (var instanceId in eventStore.instances) { + var instance = eventStore.instances[instanceId]; + var def = dest.defs[instance.defId]; // important to grab the newly modified def + dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context); + } + return dest; + } + function applyMutationToEventDef(eventDef, eventConfig, mutation, context) { + var standardProps = mutation.standardProps || {}; + // if hasEnd has not been specified, guess a good value based on deltas. + // if duration will change, there's no way the default duration will persist, + // and thus, we need to mark the event as having a real end + if (standardProps.hasEnd == null && + eventConfig.durationEditable && + (mutation.startDelta || mutation.endDelta)) { + standardProps.hasEnd = true; // TODO: is this mutation okay? + } + var copy = __assign(__assign(__assign({}, eventDef), standardProps), { ui: __assign(__assign({}, eventDef.ui), standardProps.ui) }); + if (mutation.extendedProps) { + copy.extendedProps = __assign(__assign({}, copy.extendedProps), mutation.extendedProps); + } + for (var _i = 0, _a = context.pluginHooks.eventDefMutationAppliers; _i < _a.length; _i++) { + var applier = _a[_i]; + applier(copy, mutation, context); + } + if (!copy.hasEnd && context.options.forceEventDuration) { + copy.hasEnd = true; + } + return copy; + } + function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef + eventConfig, mutation, context) { + var dateEnv = context.dateEnv; + var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; + var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; + var copy = __assign({}, eventInstance); + if (forceAllDay) { + copy.range = computeAlignedDayRange(copy.range); + } + if (mutation.datesDelta && eventConfig.startEditable) { + copy.range = { + start: dateEnv.add(copy.range.start, mutation.datesDelta), + end: dateEnv.add(copy.range.end, mutation.datesDelta), + }; + } + if (mutation.startDelta && eventConfig.durationEditable) { + copy.range = { + start: dateEnv.add(copy.range.start, mutation.startDelta), + end: copy.range.end, + }; + } + if (mutation.endDelta && eventConfig.durationEditable) { + copy.range = { + start: copy.range.start, + end: dateEnv.add(copy.range.end, mutation.endDelta), + }; + } + if (clearEnd) { + copy.range = { + start: copy.range.start, + end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context), + }; + } + // in case event was all-day but the supplied deltas were not + // better util for this? + if (eventDef.allDay) { + copy.range = { + start: startOfDay(copy.range.start), + end: startOfDay(copy.range.end), + }; + } + // handle invalid durations + if (copy.range.end < copy.range.start) { + copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context); + } + return copy; + } + + // no public types yet. when there are, export from: + // import {} from './api-type-deps' + var ViewApi = /** @class */ (function () { + function ViewApi(type, getCurrentData, dateEnv) { + this.type = type; + this.getCurrentData = getCurrentData; + this.dateEnv = dateEnv; + } + Object.defineProperty(ViewApi.prototype, "calendar", { + get: function () { + return this.getCurrentData().calendarApi; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ViewApi.prototype, "title", { + get: function () { + return this.getCurrentData().viewTitle; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ViewApi.prototype, "activeStart", { + get: function () { + return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ViewApi.prototype, "activeEnd", { + get: function () { + return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ViewApi.prototype, "currentStart", { + get: function () { + return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ViewApi.prototype, "currentEnd", { + get: function () { + return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end); + }, + enumerable: false, + configurable: true + }); + ViewApi.prototype.getOption = function (name) { + return this.getCurrentData().options[name]; // are the view-specific options + }; + return ViewApi; + }()); + + var EVENT_SOURCE_REFINERS$1 = { + id: String, + defaultAllDay: Boolean, + url: String, + format: String, + events: identity, + eventDataTransform: identity, + // for any network-related sources + success: identity, + failure: identity, + }; + function parseEventSource(raw, context, refiners) { + if (refiners === void 0) { refiners = buildEventSourceRefiners(context); } + var rawObj; + if (typeof raw === 'string') { + rawObj = { url: raw }; + } + else if (typeof raw === 'function' || Array.isArray(raw)) { + rawObj = { events: raw }; + } + else if (typeof raw === 'object' && raw) { // not null + rawObj = raw; + } + if (rawObj) { + var _a = refineProps(rawObj, refiners), refined = _a.refined, extra = _a.extra; + var metaRes = buildEventSourceMeta(refined, context); + if (metaRes) { + return { + _raw: raw, + isFetching: false, + latestFetchId: '', + fetchRange: null, + defaultAllDay: refined.defaultAllDay, + eventDataTransform: refined.eventDataTransform, + success: refined.success, + failure: refined.failure, + publicId: refined.id || '', + sourceId: guid(), + sourceDefId: metaRes.sourceDefId, + meta: metaRes.meta, + ui: createEventUi(refined, context), + extendedProps: extra, + }; + } + } + return null; + } + function buildEventSourceRefiners(context) { + return __assign(__assign(__assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS$1), context.pluginHooks.eventSourceRefiners); + } + function buildEventSourceMeta(raw, context) { + var defs = context.pluginHooks.eventSourceDefs; + for (var i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence + var def = defs[i]; + var meta = def.parseMeta(raw); + if (meta) { + return { sourceDefId: i, meta: meta }; + } + } + return null; + } + + function reduceCurrentDate(currentDate, action) { + switch (action.type) { + case 'CHANGE_DATE': + return action.dateMarker; + default: + return currentDate; + } + } + function getInitialDate(options, dateEnv) { + var initialDateInput = options.initialDate; + // compute the initial ambig-timezone date + if (initialDateInput != null) { + return dateEnv.createMarker(initialDateInput); + } + return getNow(options.now, dateEnv); // getNow already returns unzoned + } + function getNow(nowInput, dateEnv) { + if (typeof nowInput === 'function') { + nowInput = nowInput(); + } + if (nowInput == null) { + return dateEnv.createNowMarker(); + } + return dateEnv.createMarker(nowInput); + } + + var CalendarApi = /** @class */ (function () { + function CalendarApi() { + } + CalendarApi.prototype.getCurrentData = function () { + return this.currentDataManager.getCurrentData(); + }; + CalendarApi.prototype.dispatch = function (action) { + return this.currentDataManager.dispatch(action); + }; + Object.defineProperty(CalendarApi.prototype, "view", { + get: function () { return this.getCurrentData().viewApi; } // for public API + , + enumerable: false, + configurable: true + }); + CalendarApi.prototype.batchRendering = function (callback) { + callback(); + }; + CalendarApi.prototype.updateSize = function () { + this.trigger('_resize', true); + }; + // Options + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.setOption = function (name, val) { + this.dispatch({ + type: 'SET_OPTION', + optionName: name, + rawOptionValue: val, + }); + }; + CalendarApi.prototype.getOption = function (name) { + return this.currentDataManager.currentCalendarOptionsInput[name]; + }; + CalendarApi.prototype.getAvailableLocaleCodes = function () { + return Object.keys(this.getCurrentData().availableRawLocales); + }; + // Trigger + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.on = function (handlerName, handler) { + var currentDataManager = this.currentDataManager; + if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) { + currentDataManager.emitter.on(handlerName, handler); + } + else { + console.warn("Unknown listener name '" + handlerName + "'"); + } + }; + CalendarApi.prototype.off = function (handlerName, handler) { + this.currentDataManager.emitter.off(handlerName, handler); + }; + // not meant for public use + CalendarApi.prototype.trigger = function (handlerName) { + var _a; + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + (_a = this.currentDataManager.emitter).trigger.apply(_a, __spreadArray([handlerName], args)); + }; + // View + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.changeView = function (viewType, dateOrRange) { + var _this = this; + this.batchRendering(function () { + _this.unselect(); + if (dateOrRange) { + if (dateOrRange.start && dateOrRange.end) { // a range + _this.dispatch({ + type: 'CHANGE_VIEW_TYPE', + viewType: viewType, + }); + _this.dispatch({ + type: 'SET_OPTION', + optionName: 'visibleRange', + rawOptionValue: dateOrRange, + }); + } + else { + var dateEnv = _this.getCurrentData().dateEnv; + _this.dispatch({ + type: 'CHANGE_VIEW_TYPE', + viewType: viewType, + dateMarker: dateEnv.createMarker(dateOrRange), + }); + } + } + else { + _this.dispatch({ + type: 'CHANGE_VIEW_TYPE', + viewType: viewType, + }); + } + }); + }; + // Forces navigation to a view for the given date. + // `viewType` can be a specific view name or a generic one like "week" or "day". + // needs to change + CalendarApi.prototype.zoomTo = function (dateMarker, viewType) { + var state = this.getCurrentData(); + var spec; + viewType = viewType || 'day'; // day is default zoom + spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType); + this.unselect(); + if (spec) { + this.dispatch({ + type: 'CHANGE_VIEW_TYPE', + viewType: spec.type, + dateMarker: dateMarker, + }); + } + else { + this.dispatch({ + type: 'CHANGE_DATE', + dateMarker: dateMarker, + }); + } + }; + // Given a duration singular unit, like "week" or "day", finds a matching view spec. + // Preference is given to views that have corresponding buttons. + CalendarApi.prototype.getUnitViewSpec = function (unit) { + var _a = this.getCurrentData(), viewSpecs = _a.viewSpecs, toolbarConfig = _a.toolbarConfig; + var viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []); + var i; + var spec; + for (var viewType in viewSpecs) { + viewTypes.push(viewType); + } + for (i = 0; i < viewTypes.length; i += 1) { + spec = viewSpecs[viewTypes[i]]; + if (spec) { + if (spec.singleUnit === unit) { + return spec; + } + } + } + return null; + }; + // Current Date + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.prev = function () { + this.unselect(); + this.dispatch({ type: 'PREV' }); + }; + CalendarApi.prototype.next = function () { + this.unselect(); + this.dispatch({ type: 'NEXT' }); + }; + CalendarApi.prototype.prevYear = function () { + var state = this.getCurrentData(); + this.unselect(); + this.dispatch({ + type: 'CHANGE_DATE', + dateMarker: state.dateEnv.addYears(state.currentDate, -1), + }); + }; + CalendarApi.prototype.nextYear = function () { + var state = this.getCurrentData(); + this.unselect(); + this.dispatch({ + type: 'CHANGE_DATE', + dateMarker: state.dateEnv.addYears(state.currentDate, 1), + }); + }; + CalendarApi.prototype.today = function () { + var state = this.getCurrentData(); + this.unselect(); + this.dispatch({ + type: 'CHANGE_DATE', + dateMarker: getNow(state.calendarOptions.now, state.dateEnv), + }); + }; + CalendarApi.prototype.gotoDate = function (zonedDateInput) { + var state = this.getCurrentData(); + this.unselect(); + this.dispatch({ + type: 'CHANGE_DATE', + dateMarker: state.dateEnv.createMarker(zonedDateInput), + }); + }; + CalendarApi.prototype.incrementDate = function (deltaInput) { + var state = this.getCurrentData(); + var delta = createDuration(deltaInput); + if (delta) { // else, warn about invalid input? + this.unselect(); + this.dispatch({ + type: 'CHANGE_DATE', + dateMarker: state.dateEnv.add(state.currentDate, delta), + }); + } + }; + // for external API + CalendarApi.prototype.getDate = function () { + var state = this.getCurrentData(); + return state.dateEnv.toDate(state.currentDate); + }; + // Date Formatting Utils + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.formatDate = function (d, formatter) { + var dateEnv = this.getCurrentData().dateEnv; + return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter)); + }; + // `settings` is for formatter AND isEndExclusive + CalendarApi.prototype.formatRange = function (d0, d1, settings) { + var dateEnv = this.getCurrentData().dateEnv; + return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings); + }; + CalendarApi.prototype.formatIso = function (d, omitTime) { + var dateEnv = this.getCurrentData().dateEnv; + return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime }); + }; + // Date Selection / Event Selection / DayClick + // ----------------------------------------------------------------------------------------------------------------- + // this public method receives start/end dates in any format, with any timezone + // NOTE: args were changed from v3 + CalendarApi.prototype.select = function (dateOrObj, endDate) { + var selectionInput; + if (endDate == null) { + if (dateOrObj.start != null) { + selectionInput = dateOrObj; + } + else { + selectionInput = { + start: dateOrObj, + end: null, + }; + } + } + else { + selectionInput = { + start: dateOrObj, + end: endDate, + }; + } + var state = this.getCurrentData(); + var selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 })); + if (selection) { // throw parse error otherwise? + this.dispatch({ type: 'SELECT_DATES', selection: selection }); + triggerDateSelect(selection, null, state); + } + }; + // public method + CalendarApi.prototype.unselect = function (pev) { + var state = this.getCurrentData(); + if (state.dateSelection) { + this.dispatch({ type: 'UNSELECT_DATES' }); + triggerDateUnselect(pev, state); + } + }; + // Public Events API + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.addEvent = function (eventInput, sourceInput) { + if (eventInput instanceof EventApi) { + var def = eventInput._def; + var instance = eventInput._instance; + var currentData = this.getCurrentData(); + // not already present? don't want to add an old snapshot + if (!currentData.eventStore.defs[def.defId]) { + this.dispatch({ + type: 'ADD_EVENTS', + eventStore: eventTupleToStore({ def: def, instance: instance }), // TODO: better util for two args? + }); + this.triggerEventAdd(eventInput); + } + return eventInput; + } + var state = this.getCurrentData(); + var eventSource; + if (sourceInput instanceof EventSourceApi) { + eventSource = sourceInput.internalEventSource; + } + else if (typeof sourceInput === 'boolean') { + if (sourceInput) { // true. part of the first event source + eventSource = hashValuesToArray(state.eventSources)[0]; + } + } + else if (sourceInput != null) { // an ID. accepts a number too + var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function + if (!sourceApi) { + console.warn("Could not find an event source with ID \"" + sourceInput + "\""); // TODO: test + return null; + } + eventSource = sourceApi.internalEventSource; + } + var tuple = parseEvent(eventInput, eventSource, state, false); + if (tuple) { + var newEventApi = new EventApi(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance); + this.dispatch({ + type: 'ADD_EVENTS', + eventStore: eventTupleToStore(tuple), + }); + this.triggerEventAdd(newEventApi); + return newEventApi; + } + return null; + }; + CalendarApi.prototype.triggerEventAdd = function (eventApi) { + var _this = this; + var emitter = this.getCurrentData().emitter; + emitter.trigger('eventAdd', { + event: eventApi, + relatedEvents: [], + revert: function () { + _this.dispatch({ + type: 'REMOVE_EVENTS', + eventStore: eventApiToStore(eventApi), + }); + }, + }); + }; + // TODO: optimize + CalendarApi.prototype.getEventById = function (id) { + var state = this.getCurrentData(); + var _a = state.eventStore, defs = _a.defs, instances = _a.instances; + id = String(id); + for (var defId in defs) { + var def = defs[defId]; + if (def.publicId === id) { + if (def.recurringDef) { + return new EventApi(state, def, null); + } + for (var instanceId in instances) { + var instance = instances[instanceId]; + if (instance.defId === def.defId) { + return new EventApi(state, def, instance); + } + } + } + } + return null; + }; + CalendarApi.prototype.getEvents = function () { + var currentData = this.getCurrentData(); + return buildEventApis(currentData.eventStore, currentData); + }; + CalendarApi.prototype.removeAllEvents = function () { + this.dispatch({ type: 'REMOVE_ALL_EVENTS' }); + }; + // Public Event Sources API + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.getEventSources = function () { + var state = this.getCurrentData(); + var sourceHash = state.eventSources; + var sourceApis = []; + for (var internalId in sourceHash) { + sourceApis.push(new EventSourceApi(state, sourceHash[internalId])); + } + return sourceApis; + }; + CalendarApi.prototype.getEventSourceById = function (id) { + var state = this.getCurrentData(); + var sourceHash = state.eventSources; + id = String(id); + for (var sourceId in sourceHash) { + if (sourceHash[sourceId].publicId === id) { + return new EventSourceApi(state, sourceHash[sourceId]); + } + } + return null; + }; + CalendarApi.prototype.addEventSource = function (sourceInput) { + var state = this.getCurrentData(); + if (sourceInput instanceof EventSourceApi) { + // not already present? don't want to add an old snapshot + if (!state.eventSources[sourceInput.internalEventSource.sourceId]) { + this.dispatch({ + type: 'ADD_EVENT_SOURCES', + sources: [sourceInput.internalEventSource], + }); + } + return sourceInput; + } + var eventSource = parseEventSource(sourceInput, state); + if (eventSource) { // TODO: error otherwise? + this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] }); + return new EventSourceApi(state, eventSource); + } + return null; + }; + CalendarApi.prototype.removeAllEventSources = function () { + this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' }); + }; + CalendarApi.prototype.refetchEvents = function () { + this.dispatch({ type: 'FETCH_EVENT_SOURCES', isRefetch: true }); + }; + // Scroll + // ----------------------------------------------------------------------------------------------------------------- + CalendarApi.prototype.scrollToTime = function (timeInput) { + var time = createDuration(timeInput); + if (time) { + this.trigger('_scrollRequest', { time: time }); + } + }; + return CalendarApi; + }()); + + var EventApi = /** @class */ (function () { + // instance will be null if expressing a recurring event that has no current instances, + // OR if trying to validate an incoming external event that has no dates assigned + function EventApi(context, def, instance) { + this._context = context; + this._def = def; + this._instance = instance || null; + } + /* + TODO: make event struct more responsible for this + */ + EventApi.prototype.setProp = function (name, val) { + var _a, _b; + if (name in EVENT_DATE_REFINERS) { + console.warn('Could not set date-related prop \'name\'. Use one of the date-related methods instead.'); + // TODO: make proper aliasing system? + } + else if (name === 'id') { + val = EVENT_NON_DATE_REFINERS[name](val); + this.mutate({ + standardProps: { publicId: val }, // hardcoded internal name + }); + } + else if (name in EVENT_NON_DATE_REFINERS) { + val = EVENT_NON_DATE_REFINERS[name](val); + this.mutate({ + standardProps: (_a = {}, _a[name] = val, _a), + }); + } + else if (name in EVENT_UI_REFINERS) { + var ui = EVENT_UI_REFINERS[name](val); + if (name === 'color') { + ui = { backgroundColor: val, borderColor: val }; + } + else if (name === 'editable') { + ui = { startEditable: val, durationEditable: val }; + } + else { + ui = (_b = {}, _b[name] = val, _b); + } + this.mutate({ + standardProps: { ui: ui }, + }); + } + else { + console.warn("Could not set prop '" + name + "'. Use setExtendedProp instead."); + } + }; + EventApi.prototype.setExtendedProp = function (name, val) { + var _a; + this.mutate({ + extendedProps: (_a = {}, _a[name] = val, _a), + }); + }; + EventApi.prototype.setStart = function (startInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._context.dateEnv; + var start = dateEnv.createMarker(startInput); + if (start && this._instance) { // TODO: warning if parsed bad + var instanceRange = this._instance.range; + var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!? + if (options.maintainDuration) { + this.mutate({ datesDelta: startDelta }); + } + else { + this.mutate({ startDelta: startDelta }); + } + } + }; + EventApi.prototype.setEnd = function (endInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._context.dateEnv; + var end; + if (endInput != null) { + end = dateEnv.createMarker(endInput); + if (!end) { + return; // TODO: warning if parsed bad + } + } + if (this._instance) { + if (end) { + var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity); + this.mutate({ endDelta: endDelta }); + } + else { + this.mutate({ standardProps: { hasEnd: false } }); + } + } + }; + EventApi.prototype.setDates = function (startInput, endInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._context.dateEnv; + var standardProps = { allDay: options.allDay }; + var start = dateEnv.createMarker(startInput); + var end; + if (!start) { + return; // TODO: warning if parsed bad + } + if (endInput != null) { + end = dateEnv.createMarker(endInput); + if (!end) { // TODO: warning if parsed bad + return; + } + } + if (this._instance) { + var instanceRange = this._instance.range; + // when computing the diff for an event being converted to all-day, + // compute diff off of the all-day values the way event-mutation does. + if (options.allDay === true) { + instanceRange = computeAlignedDayRange(instanceRange); + } + var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); + if (end) { + var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity); + if (durationsEqual(startDelta, endDelta)) { + this.mutate({ datesDelta: startDelta, standardProps: standardProps }); + } + else { + this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps }); + } + } + else { // means "clear the end" + standardProps.hasEnd = false; + this.mutate({ datesDelta: startDelta, standardProps: standardProps }); + } + } + }; + EventApi.prototype.moveStart = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ startDelta: delta }); + } + }; + EventApi.prototype.moveEnd = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ endDelta: delta }); + } + }; + EventApi.prototype.moveDates = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ datesDelta: delta }); + } + }; + EventApi.prototype.setAllDay = function (allDay, options) { + if (options === void 0) { options = {}; } + var standardProps = { allDay: allDay }; + var maintainDuration = options.maintainDuration; + if (maintainDuration == null) { + maintainDuration = this._context.options.allDayMaintainDuration; + } + if (this._def.allDay !== allDay) { + standardProps.hasEnd = maintainDuration; + } + this.mutate({ standardProps: standardProps }); + }; + EventApi.prototype.formatRange = function (formatInput) { + var dateEnv = this._context.dateEnv; + var instance = this._instance; + var formatter = createFormatter(formatInput); + if (this._def.hasEnd) { + return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { + forcedStartTzo: instance.forcedStartTzo, + forcedEndTzo: instance.forcedEndTzo, + }); + } + return dateEnv.format(instance.range.start, formatter, { + forcedTzo: instance.forcedStartTzo, + }); + }; + EventApi.prototype.mutate = function (mutation) { + var instance = this._instance; + if (instance) { + var def = this._def; + var context_1 = this._context; + var eventStore_1 = context_1.getCurrentData().eventStore; + var relevantEvents = getRelevantEvents(eventStore_1, instance.instanceId); + var eventConfigBase = { + '': { + display: '', + startEditable: true, + durationEditable: true, + constraints: [], + overlap: null, + allows: [], + backgroundColor: '', + borderColor: '', + textColor: '', + classNames: [], + }, + }; + relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context_1); + var oldEvent = new EventApi(context_1, def, instance); // snapshot + this._def = relevantEvents.defs[def.defId]; + this._instance = relevantEvents.instances[instance.instanceId]; + context_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents, + }); + context_1.emitter.trigger('eventChange', { + oldEvent: oldEvent, + event: this, + relatedEvents: buildEventApis(relevantEvents, context_1, instance), + revert: function () { + context_1.dispatch({ + type: 'RESET_EVENTS', + eventStore: eventStore_1, + }); + }, + }); + } + }; + EventApi.prototype.remove = function () { + var context = this._context; + var asStore = eventApiToStore(this); + context.dispatch({ + type: 'REMOVE_EVENTS', + eventStore: asStore, + }); + context.emitter.trigger('eventRemove', { + event: this, + relatedEvents: [], + revert: function () { + context.dispatch({ + type: 'MERGE_EVENTS', + eventStore: asStore, + }); + }, + }); + }; + Object.defineProperty(EventApi.prototype, "source", { + get: function () { + var sourceId = this._def.sourceId; + if (sourceId) { + return new EventSourceApi(this._context, this._context.getCurrentData().eventSources[sourceId]); + } + return null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "start", { + get: function () { + return this._instance ? + this._context.dateEnv.toDate(this._instance.range.start) : + null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "end", { + get: function () { + return (this._instance && this._def.hasEnd) ? + this._context.dateEnv.toDate(this._instance.range.end) : + null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "startStr", { + get: function () { + var instance = this._instance; + if (instance) { + return this._context.dateEnv.formatIso(instance.range.start, { + omitTime: this._def.allDay, + forcedTzo: instance.forcedStartTzo, + }); + } + return ''; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "endStr", { + get: function () { + var instance = this._instance; + if (instance && this._def.hasEnd) { + return this._context.dateEnv.formatIso(instance.range.end, { + omitTime: this._def.allDay, + forcedTzo: instance.forcedEndTzo, + }); + } + return ''; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "id", { + // computable props that all access the def + // TODO: find a TypeScript-compatible way to do this at scale + get: function () { return this._def.publicId; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "groupId", { + get: function () { return this._def.groupId; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "allDay", { + get: function () { return this._def.allDay; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "title", { + get: function () { return this._def.title; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "url", { + get: function () { return this._def.url; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "display", { + get: function () { return this._def.ui.display || 'auto'; } // bad. just normalize the type earlier + , + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "startEditable", { + get: function () { return this._def.ui.startEditable; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "durationEditable", { + get: function () { return this._def.ui.durationEditable; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "constraint", { + get: function () { return this._def.ui.constraints[0] || null; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "overlap", { + get: function () { return this._def.ui.overlap; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "allow", { + get: function () { return this._def.ui.allows[0] || null; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "backgroundColor", { + get: function () { return this._def.ui.backgroundColor; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "borderColor", { + get: function () { return this._def.ui.borderColor; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "textColor", { + get: function () { return this._def.ui.textColor; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "classNames", { + // NOTE: user can't modify these because Object.freeze was called in event-def parsing + get: function () { return this._def.ui.classNames; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "extendedProps", { + get: function () { return this._def.extendedProps; }, + enumerable: false, + configurable: true + }); + EventApi.prototype.toPlainObject = function (settings) { + if (settings === void 0) { settings = {}; } + var def = this._def; + var ui = def.ui; + var _a = this, startStr = _a.startStr, endStr = _a.endStr; + var res = {}; + if (def.title) { + res.title = def.title; + } + if (startStr) { + res.start = startStr; + } + if (endStr) { + res.end = endStr; + } + if (def.publicId) { + res.id = def.publicId; + } + if (def.groupId) { + res.groupId = def.groupId; + } + if (def.url) { + res.url = def.url; + } + if (ui.display && ui.display !== 'auto') { + res.display = ui.display; + } + // TODO: what about recurring-event properties??? + // TODO: include startEditable/durationEditable/constraint/overlap/allow + if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) { + res.color = ui.backgroundColor; + } + else { + if (ui.backgroundColor) { + res.backgroundColor = ui.backgroundColor; + } + if (ui.borderColor) { + res.borderColor = ui.borderColor; + } + } + if (ui.textColor) { + res.textColor = ui.textColor; + } + if (ui.classNames.length) { + res.classNames = ui.classNames; + } + if (Object.keys(def.extendedProps).length) { + if (settings.collapseExtendedProps) { + __assign(res, def.extendedProps); + } + else { + res.extendedProps = def.extendedProps; + } + } + return res; + }; + EventApi.prototype.toJSON = function () { + return this.toPlainObject(); + }; + return EventApi; + }()); + function eventApiToStore(eventApi) { + var _a, _b; + var def = eventApi._def; + var instance = eventApi._instance; + return { + defs: (_a = {}, _a[def.defId] = def, _a), + instances: instance + ? (_b = {}, _b[instance.instanceId] = instance, _b) : {}, + }; + } + function buildEventApis(eventStore, context, excludeInstance) { + var defs = eventStore.defs, instances = eventStore.instances; + var eventApis = []; + var excludeInstanceId = excludeInstance ? excludeInstance.instanceId : ''; + for (var id in instances) { + var instance = instances[id]; + var def = defs[instance.defId]; + if (instance.instanceId !== excludeInstanceId) { + eventApis.push(new EventApi(context, def, instance)); + } + } + return eventApis; + } + + var calendarSystemClassMap = {}; + function registerCalendarSystem(name, theClass) { + calendarSystemClassMap[name] = theClass; + } + function createCalendarSystem(name) { + return new calendarSystemClassMap[name](); + } + var GregorianCalendarSystem = /** @class */ (function () { + function GregorianCalendarSystem() { + } + GregorianCalendarSystem.prototype.getMarkerYear = function (d) { + return d.getUTCFullYear(); + }; + GregorianCalendarSystem.prototype.getMarkerMonth = function (d) { + return d.getUTCMonth(); + }; + GregorianCalendarSystem.prototype.getMarkerDay = function (d) { + return d.getUTCDate(); + }; + GregorianCalendarSystem.prototype.arrayToMarker = function (arr) { + return arrayToUtcDate(arr); + }; + GregorianCalendarSystem.prototype.markerToArray = function (marker) { + return dateToUtcArray(marker); + }; + return GregorianCalendarSystem; + }()); + registerCalendarSystem('gregory', GregorianCalendarSystem); + + var ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; + function parse(str) { + var m = ISO_RE.exec(str); + if (m) { + var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number("0." + m[12]) * 1000 : 0)); + if (isValidDate$1(marker)) { + var timeZoneOffset = null; + if (m[13]) { + timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + + Number(m[18] || 0)); + } + return { + marker: marker, + isTimeUnspecified: !m[6], + timeZoneOffset: timeZoneOffset, + }; + } + } + return null; + } + + var DateEnv = /** @class */ (function () { + function DateEnv(settings) { + var timeZone = this.timeZone = settings.timeZone; + var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC'; + if (settings.namedTimeZoneImpl && isNamedTimeZone) { + this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); + } + this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); + this.calendarSystem = createCalendarSystem(settings.calendarSystem); + this.locale = settings.locale; + this.weekDow = settings.locale.week.dow; + this.weekDoy = settings.locale.week.doy; + if (settings.weekNumberCalculation === 'ISO') { + this.weekDow = 1; + this.weekDoy = 4; + } + if (typeof settings.firstDay === 'number') { + this.weekDow = settings.firstDay; + } + if (typeof settings.weekNumberCalculation === 'function') { + this.weekNumberFunc = settings.weekNumberCalculation; + } + this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText; + this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText; + this.cmdFormatter = settings.cmdFormatter; + this.defaultSeparator = settings.defaultSeparator; + } + // Creating / Parsing + DateEnv.prototype.createMarker = function (input) { + var meta = this.createMarkerMeta(input); + if (meta === null) { + return null; + } + return meta.marker; + }; + DateEnv.prototype.createNowMarker = function () { + if (this.canComputeOffset) { + return this.timestampToMarker(new Date().valueOf()); + } + // if we can't compute the current date val for a timezone, + // better to give the current local date vals than UTC + return arrayToUtcDate(dateToLocalArray(new Date())); + }; + DateEnv.prototype.createMarkerMeta = function (input) { + if (typeof input === 'string') { + return this.parse(input); + } + var marker = null; + if (typeof input === 'number') { + marker = this.timestampToMarker(input); + } + else if (input instanceof Date) { + input = input.valueOf(); + if (!isNaN(input)) { + marker = this.timestampToMarker(input); + } + } + else if (Array.isArray(input)) { + marker = arrayToUtcDate(input); + } + if (marker === null || !isValidDate$1(marker)) { + return null; + } + return { marker: marker, isTimeUnspecified: false, forcedTzo: null }; + }; + DateEnv.prototype.parse = function (s) { + var parts = parse(s); + if (parts === null) { + return null; + } + var marker = parts.marker; + var forcedTzo = null; + if (parts.timeZoneOffset !== null) { + if (this.canComputeOffset) { + marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000); + } + else { + forcedTzo = parts.timeZoneOffset; + } + } + return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo }; + }; + // Accessors + DateEnv.prototype.getYear = function (marker) { + return this.calendarSystem.getMarkerYear(marker); + }; + DateEnv.prototype.getMonth = function (marker) { + return this.calendarSystem.getMarkerMonth(marker); + }; + // Adding / Subtracting + DateEnv.prototype.add = function (marker, dur) { + var a = this.calendarSystem.markerToArray(marker); + a[0] += dur.years; + a[1] += dur.months; + a[2] += dur.days; + a[6] += dur.milliseconds; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.subtract = function (marker, dur) { + var a = this.calendarSystem.markerToArray(marker); + a[0] -= dur.years; + a[1] -= dur.months; + a[2] -= dur.days; + a[6] -= dur.milliseconds; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.addYears = function (marker, n) { + var a = this.calendarSystem.markerToArray(marker); + a[0] += n; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.addMonths = function (marker, n) { + var a = this.calendarSystem.markerToArray(marker); + a[1] += n; + return this.calendarSystem.arrayToMarker(a); + }; + // Diffing Whole Units + DateEnv.prototype.diffWholeYears = function (m0, m1) { + var calendarSystem = this.calendarSystem; + if (timeAsMs(m0) === timeAsMs(m1) && + calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && + calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { + return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); + } + return null; + }; + DateEnv.prototype.diffWholeMonths = function (m0, m1) { + var calendarSystem = this.calendarSystem; + if (timeAsMs(m0) === timeAsMs(m1) && + calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { + return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) + + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; + } + return null; + }; + // Range / Duration + DateEnv.prototype.greatestWholeUnit = function (m0, m1) { + var n = this.diffWholeYears(m0, m1); + if (n !== null) { + return { unit: 'year', value: n }; + } + n = this.diffWholeMonths(m0, m1); + if (n !== null) { + return { unit: 'month', value: n }; + } + n = diffWholeWeeks(m0, m1); + if (n !== null) { + return { unit: 'week', value: n }; + } + n = diffWholeDays(m0, m1); + if (n !== null) { + return { unit: 'day', value: n }; + } + n = diffHours(m0, m1); + if (isInt(n)) { + return { unit: 'hour', value: n }; + } + n = diffMinutes(m0, m1); + if (isInt(n)) { + return { unit: 'minute', value: n }; + } + n = diffSeconds(m0, m1); + if (isInt(n)) { + return { unit: 'second', value: n }; + } + return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() }; + }; + DateEnv.prototype.countDurationsBetween = function (m0, m1, d) { + // TODO: can use greatestWholeUnit + var diff; + if (d.years) { + diff = this.diffWholeYears(m0, m1); + if (diff !== null) { + return diff / asRoughYears(d); + } + } + if (d.months) { + diff = this.diffWholeMonths(m0, m1); + if (diff !== null) { + return diff / asRoughMonths(d); + } + } + if (d.days) { + diff = diffWholeDays(m0, m1); + if (diff !== null) { + return diff / asRoughDays(d); + } + } + return (m1.valueOf() - m0.valueOf()) / asRoughMs(d); + }; + // Start-Of + // these DON'T return zoned-dates. only UTC start-of dates + DateEnv.prototype.startOf = function (m, unit) { + if (unit === 'year') { + return this.startOfYear(m); + } + if (unit === 'month') { + return this.startOfMonth(m); + } + if (unit === 'week') { + return this.startOfWeek(m); + } + if (unit === 'day') { + return startOfDay(m); + } + if (unit === 'hour') { + return startOfHour(m); + } + if (unit === 'minute') { + return startOfMinute(m); + } + if (unit === 'second') { + return startOfSecond(m); + } + return null; + }; + DateEnv.prototype.startOfYear = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m), + ]); + }; + DateEnv.prototype.startOfMonth = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m), + this.calendarSystem.getMarkerMonth(m), + ]); + }; + DateEnv.prototype.startOfWeek = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m), + this.calendarSystem.getMarkerMonth(m), + m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7), + ]); + }; + // Week Number + DateEnv.prototype.computeWeekNumber = function (marker) { + if (this.weekNumberFunc) { + return this.weekNumberFunc(this.toDate(marker)); + } + return weekOfYear(marker, this.weekDow, this.weekDoy); + }; + // TODO: choke on timeZoneName: long + DateEnv.prototype.format = function (marker, formatter, dateOptions) { + if (dateOptions === void 0) { dateOptions = {}; } + return formatter.format({ + marker: marker, + timeZoneOffset: dateOptions.forcedTzo != null ? + dateOptions.forcedTzo : + this.offsetForMarker(marker), + }, this); + }; + DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) { + if (dateOptions === void 0) { dateOptions = {}; } + if (dateOptions.isEndExclusive) { + end = addMs(end, -1); + } + return formatter.formatRange({ + marker: start, + timeZoneOffset: dateOptions.forcedStartTzo != null ? + dateOptions.forcedStartTzo : + this.offsetForMarker(start), + }, { + marker: end, + timeZoneOffset: dateOptions.forcedEndTzo != null ? + dateOptions.forcedEndTzo : + this.offsetForMarker(end), + }, this, dateOptions.defaultSeparator); + }; + /* + DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that, + might as well use buildIsoString or some other util directly + */ + DateEnv.prototype.formatIso = function (marker, extraOptions) { + if (extraOptions === void 0) { extraOptions = {}; } + var timeZoneOffset = null; + if (!extraOptions.omitTimeZoneOffset) { + if (extraOptions.forcedTzo != null) { + timeZoneOffset = extraOptions.forcedTzo; + } + else { + timeZoneOffset = this.offsetForMarker(marker); + } + } + return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); + }; + // TimeZone + DateEnv.prototype.timestampToMarker = function (ms) { + if (this.timeZone === 'local') { + return arrayToUtcDate(dateToLocalArray(new Date(ms))); + } + if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) { + return new Date(ms); + } + return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); + }; + DateEnv.prototype.offsetForMarker = function (m) { + if (this.timeZone === 'local') { + return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset + } + if (this.timeZone === 'UTC') { + return 0; + } + if (this.namedTimeZoneImpl) { + return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)); + } + return null; + }; + // Conversion + DateEnv.prototype.toDate = function (m, forcedTzo) { + if (this.timeZone === 'local') { + return arrayToLocalDate(dateToUtcArray(m)); + } + if (this.timeZone === 'UTC') { + return new Date(m.valueOf()); // make sure it's a copy + } + if (!this.namedTimeZoneImpl) { + return new Date(m.valueOf() - (forcedTzo || 0)); + } + return new Date(m.valueOf() - + this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60); + }; + return DateEnv; + }()); + + var globalLocales = []; + + var MINIMAL_RAW_EN_LOCALE = { + code: 'en', + week: { + dow: 0, + doy: 4, // 4 days need to be within the year to be considered the first week + }, + direction: 'ltr', + buttonText: { + prev: 'prev', + next: 'next', + prevYear: 'prev year', + nextYear: 'next year', + year: 'year', + today: 'today', + month: 'month', + week: 'week', + day: 'day', + list: 'list', + }, + weekText: 'W', + weekTextLong: 'Week', + closeHint: 'Close', + timeHint: 'Time', + eventHint: 'Event', + allDayText: 'all-day', + moreLinkText: 'more', + noEventsText: 'No events to display', + }; + var RAW_EN_LOCALE = __assign(__assign({}, MINIMAL_RAW_EN_LOCALE), { + // Includes things we don't want other locales to inherit, + // things that derive from other translatable strings. + buttonHints: { + prev: 'Previous $0', + next: 'Next $0', + today: function (buttonText, unit) { + return (unit === 'day') + ? 'Today' + : "This " + buttonText; + }, + }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint: function (eventCnt) { + return "Show " + eventCnt + " more event" + (eventCnt === 1 ? '' : 's'); + } }); + function organizeRawLocales(explicitRawLocales) { + var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en'; + var allRawLocales = globalLocales.concat(explicitRawLocales); + var rawLocaleMap = { + en: RAW_EN_LOCALE, + }; + for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) { + var rawLocale = allRawLocales_1[_i]; + rawLocaleMap[rawLocale.code] = rawLocale; + } + return { + map: rawLocaleMap, + defaultCode: defaultCode, + }; + } + function buildLocale(inputSingular, available) { + if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) { + return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); + } + return queryLocale(inputSingular, available); + } + function queryLocale(codeArg, available) { + var codes = [].concat(codeArg || []); // will convert to array + var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; + return parseLocale(codeArg, codes, raw); + } + function queryRawLocale(codes, available) { + for (var i = 0; i < codes.length; i += 1) { + var parts = codes[i].toLocaleLowerCase().split('-'); + for (var j = parts.length; j > 0; j -= 1) { + var simpleId = parts.slice(0, j).join('-'); + if (available[simpleId]) { + return available[simpleId]; + } + } + } + return null; + } + function parseLocale(codeArg, codes, raw) { + var merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']); + delete merged.code; // don't want this part of the options + var week = merged.week; + delete merged.week; + return { + codeArg: codeArg, + codes: codes, + week: week, + simpleNumberFormat: new Intl.NumberFormat(codeArg), + options: merged, + }; + } + + function formatDate(dateInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = buildDateEnv$1(options); + var formatter = createFormatter(options); + var dateMeta = dateEnv.createMarkerMeta(dateInput); + if (!dateMeta) { // TODO: warning? + return ''; + } + return dateEnv.format(dateMeta.marker, formatter, { + forcedTzo: dateMeta.forcedTzo, + }); + } + function formatRange(startInput, endInput, options) { + var dateEnv = buildDateEnv$1(typeof options === 'object' && options ? options : {}); // pass in if non-null object + var formatter = createFormatter(options); + var startMeta = dateEnv.createMarkerMeta(startInput); + var endMeta = dateEnv.createMarkerMeta(endInput); + if (!startMeta || !endMeta) { // TODO: warning? + return ''; + } + return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, { + forcedStartTzo: startMeta.forcedTzo, + forcedEndTzo: endMeta.forcedTzo, + isEndExclusive: options.isEndExclusive, + defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator, + }); + } + // TODO: more DRY and optimized + function buildDateEnv$1(settings) { + var locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere + return new DateEnv(__assign(__assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' }, settings), { locale: locale })); + } + + var DEF_DEFAULTS = { + startTime: '09:00', + endTime: '17:00', + daysOfWeek: [1, 2, 3, 4, 5], + display: 'inverse-background', + classNames: 'fc-non-business', + groupId: '_businessHours', // so multiple defs get grouped + }; + /* + TODO: pass around as EventDefHash!!! + */ + function parseBusinessHours(input, context) { + return parseEvents(refineInputs(input), null, context); + } + function refineInputs(input) { + var rawDefs; + if (input === true) { + rawDefs = [{}]; // will get DEF_DEFAULTS verbatim + } + else if (Array.isArray(input)) { + // if specifying an array, every sub-definition NEEDS a day-of-week + rawDefs = input.filter(function (rawDef) { return rawDef.daysOfWeek; }); + } + else if (typeof input === 'object' && input) { // non-null object + rawDefs = [input]; + } + else { // is probably false + rawDefs = []; + } + rawDefs = rawDefs.map(function (rawDef) { return (__assign(__assign({}, DEF_DEFAULTS), rawDef)); }); + return rawDefs; + } + + function pointInsideRect(point, rect) { + return point.left >= rect.left && + point.left < rect.right && + point.top >= rect.top && + point.top < rect.bottom; + } + // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false + function intersectRects(rect1, rect2) { + var res = { + left: Math.max(rect1.left, rect2.left), + right: Math.min(rect1.right, rect2.right), + top: Math.max(rect1.top, rect2.top), + bottom: Math.min(rect1.bottom, rect2.bottom), + }; + if (res.left < res.right && res.top < res.bottom) { + return res; + } + return false; + } + function translateRect(rect, deltaX, deltaY) { + return { + left: rect.left + deltaX, + right: rect.right + deltaX, + top: rect.top + deltaY, + bottom: rect.bottom + deltaY, + }; + } + // Returns a new point that will have been moved to reside within the given rectangle + function constrainPoint(point, rect) { + return { + left: Math.min(Math.max(point.left, rect.left), rect.right), + top: Math.min(Math.max(point.top, rect.top), rect.bottom), + }; + } + // Returns a point that is the center of the given rectangle + function getRectCenter(rect) { + return { + left: (rect.left + rect.right) / 2, + top: (rect.top + rect.bottom) / 2, + }; + } + // Subtracts point2's coordinates from point1's coordinates, returning a delta + function diffPoints(point1, point2) { + return { + left: point1.left - point2.left, + top: point1.top - point2.top, + }; + } + + var canVGrowWithinCell; + function getCanVGrowWithinCell() { + if (canVGrowWithinCell == null) { + canVGrowWithinCell = computeCanVGrowWithinCell(); + } + return canVGrowWithinCell; + } + function computeCanVGrowWithinCell() { + // for SSR, because this function is call immediately at top-level + // TODO: just make this logic execute top-level, immediately, instead of doing lazily + if (typeof document === 'undefined') { + return true; + } + var el = document.createElement('div'); + el.style.position = 'absolute'; + el.style.top = '0px'; + el.style.left = '0px'; + el.innerHTML = '
    '; + el.querySelector('table').style.height = '100px'; + el.querySelector('div').style.height = '100%'; + document.body.appendChild(el); + var div = el.querySelector('div'); + var possible = div.offsetHeight > 0; + document.body.removeChild(el); + return possible; + } + + var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere + var Splitter = /** @class */ (function () { + function Splitter() { + this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); + this.splitDateSelection = memoize(this._splitDateSpan); + this.splitEventStore = memoize(this._splitEventStore); + this.splitIndividualUi = memoize(this._splitIndividualUi); + this.splitEventDrag = memoize(this._splitInteraction); + this.splitEventResize = memoize(this._splitInteraction); + this.eventUiBuilders = {}; // TODO: typescript protection + } + Splitter.prototype.splitProps = function (props) { + var _this = this; + var keyInfos = this.getKeyInfo(props); + var defKeys = this.getKeysForEventDefs(props.eventStore); + var dateSelections = this.splitDateSelection(props.dateSelection); + var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases* + var eventStores = this.splitEventStore(props.eventStore, defKeys); + var eventDrags = this.splitEventDrag(props.eventDrag); + var eventResizes = this.splitEventResize(props.eventResize); + var splitProps = {}; + this.eventUiBuilders = mapHash(keyInfos, function (info, key) { return _this.eventUiBuilders[key] || memoize(buildEventUiForKey); }); + for (var key in keyInfos) { + var keyInfo = keyInfos[key]; + var eventStore = eventStores[key] || EMPTY_EVENT_STORE; + var buildEventUi = this.eventUiBuilders[key]; + splitProps[key] = { + businessHours: keyInfo.businessHours || props.businessHours, + dateSelection: dateSelections[key] || null, + eventStore: eventStore, + eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]), + eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '', + eventDrag: eventDrags[key] || null, + eventResize: eventResizes[key] || null, + }; + } + return splitProps; + }; + Splitter.prototype._splitDateSpan = function (dateSpan) { + var dateSpans = {}; + if (dateSpan) { + var keys = this.getKeysForDateSpan(dateSpan); + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + dateSpans[key] = dateSpan; + } + } + return dateSpans; + }; + Splitter.prototype._getKeysForEventDefs = function (eventStore) { + var _this = this; + return mapHash(eventStore.defs, function (eventDef) { return _this.getKeysForEventDef(eventDef); }); + }; + Splitter.prototype._splitEventStore = function (eventStore, defKeys) { + var defs = eventStore.defs, instances = eventStore.instances; + var splitStores = {}; + for (var defId in defs) { + for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { + var key = _a[_i]; + if (!splitStores[key]) { + splitStores[key] = createEmptyEventStore(); + } + splitStores[key].defs[defId] = defs[defId]; + } + } + for (var instanceId in instances) { + var instance = instances[instanceId]; + for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) { + var key = _c[_b]; + if (splitStores[key]) { // must have already been created + splitStores[key].instances[instanceId] = instance; + } + } + } + return splitStores; + }; + Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) { + var splitHashes = {}; + for (var defId in eventUiBases) { + if (defId) { // not the '' key + for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { + var key = _a[_i]; + if (!splitHashes[key]) { + splitHashes[key] = {}; + } + splitHashes[key][defId] = eventUiBases[defId]; + } + } + } + return splitHashes; + }; + Splitter.prototype._splitInteraction = function (interaction) { + var splitStates = {}; + if (interaction) { + var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents)); + // can't rely on defKeys because event data is mutated + var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); + var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); + var populate = function (key) { + if (!splitStates[key]) { + splitStates[key] = { + affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE, + mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE, + isEvent: interaction.isEvent, + }; + } + }; + for (var key in affectedStores_1) { + populate(key); + } + for (var key in mutatedStores_1) { + populate(key); + } + } + return splitStates; + }; + return Splitter; + }()); + function buildEventUiForKey(allUi, eventUiForKey, individualUi) { + var baseParts = []; + if (allUi) { + baseParts.push(allUi); + } + if (eventUiForKey) { + baseParts.push(eventUiForKey); + } + var stuff = { + '': combineEventUis(baseParts), + }; + if (individualUi) { + __assign(stuff, individualUi); + } + return stuff; + } + + function getDateMeta(date, todayRange, nowDate, dateProfile) { + return { + dow: date.getUTCDay(), + isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)), + isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)), + isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)), + isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false), + isFuture: Boolean(nowDate ? (date > nowDate) : todayRange ? (date >= todayRange.end) : false), + }; + } + function getDayClassNames(meta, theme) { + var classNames = [ + 'fc-day', + "fc-day-" + DAY_IDS[meta.dow], + ]; + if (meta.isDisabled) { + classNames.push('fc-day-disabled'); + } + else { + if (meta.isToday) { + classNames.push('fc-day-today'); + classNames.push(theme.getClass('today')); + } + if (meta.isPast) { + classNames.push('fc-day-past'); + } + if (meta.isFuture) { + classNames.push('fc-day-future'); + } + if (meta.isOther) { + classNames.push('fc-day-other'); + } + } + return classNames; + } + function getSlotClassNames(meta, theme) { + var classNames = [ + 'fc-slot', + "fc-slot-" + DAY_IDS[meta.dow], + ]; + if (meta.isDisabled) { + classNames.push('fc-slot-disabled'); + } + else { + if (meta.isToday) { + classNames.push('fc-slot-today'); + classNames.push(theme.getClass('today')); + } + if (meta.isPast) { + classNames.push('fc-slot-past'); + } + if (meta.isFuture) { + classNames.push('fc-slot-future'); + } + } + return classNames; + } + + var DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' }); + var WEEK_FORMAT = createFormatter({ week: 'long' }); + function buildNavLinkAttrs(context, dateMarker, viewType, isTabbable) { + if (viewType === void 0) { viewType = 'day'; } + if (isTabbable === void 0) { isTabbable = true; } + var dateEnv = context.dateEnv, options = context.options, calendarApi = context.calendarApi; + var dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT); + if (options.navLinks) { + var zonedDate = dateEnv.toDate(dateMarker); + var handleInteraction = function (ev) { + var customAction = viewType === 'day' ? options.navLinkDayClick : + viewType === 'week' ? options.navLinkWeekClick : null; + if (typeof customAction === 'function') { + customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev); + } + else { + if (typeof customAction === 'string') { + viewType = customAction; + } + calendarApi.zoomTo(dateMarker, viewType); + } + }; + return __assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, (isTabbable + ? createAriaClickAttrs(handleInteraction) + : { onClick: handleInteraction })); + } + return { 'aria-label': dateStr }; + } + + var _isRtlScrollbarOnLeft = null; + function getIsRtlScrollbarOnLeft() { + if (_isRtlScrollbarOnLeft === null) { + _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft(); + } + return _isRtlScrollbarOnLeft; + } + function computeIsRtlScrollbarOnLeft() { + var outerEl = document.createElement('div'); + applyStyle(outerEl, { + position: 'absolute', + top: -1000, + left: 0, + border: 0, + padding: 0, + overflow: 'scroll', + direction: 'rtl', + }); + outerEl.innerHTML = '
    '; + document.body.appendChild(outerEl); + var innerEl = outerEl.firstChild; + var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left; + removeElement(outerEl); + return res; + } + + var _scrollbarWidths; + function getScrollbarWidths() { + if (!_scrollbarWidths) { + _scrollbarWidths = computeScrollbarWidths(); + } + return _scrollbarWidths; + } + function computeScrollbarWidths() { + var el = document.createElement('div'); + el.style.overflow = 'scroll'; + el.style.position = 'absolute'; + el.style.top = '-9999px'; + el.style.left = '-9999px'; + document.body.appendChild(el); + var res = computeScrollbarWidthsForEl(el); + document.body.removeChild(el); + return res; + } + // WARNING: will include border + function computeScrollbarWidthsForEl(el) { + return { + x: el.offsetHeight - el.clientHeight, + y: el.offsetWidth - el.clientWidth, + }; + } + + function computeEdges(el, getPadding) { + if (getPadding === void 0) { getPadding = false; } + var computedStyle = window.getComputedStyle(el); + var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0; + var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0; + var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0; + var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + var badScrollbarWidths = computeScrollbarWidthsForEl(el); // includes border! + var scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight; + var scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom; + var res = { + borderLeft: borderLeft, + borderRight: borderRight, + borderTop: borderTop, + borderBottom: borderBottom, + scrollbarBottom: scrollbarBottom, + scrollbarLeft: 0, + scrollbarRight: 0, + }; + if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side? + res.scrollbarLeft = scrollbarLeftRight; + } + else { + res.scrollbarRight = scrollbarLeftRight; + } + if (getPadding) { + res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0; + res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0; + res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0; + res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0; + } + return res; + } + function computeInnerRect(el, goWithinPadding, doFromWindowViewport) { + if (goWithinPadding === void 0) { goWithinPadding = false; } + var outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el); + var edges = computeEdges(el, goWithinPadding); + var res = { + left: outerRect.left + edges.borderLeft + edges.scrollbarLeft, + right: outerRect.right - edges.borderRight - edges.scrollbarRight, + top: outerRect.top + edges.borderTop, + bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom, + }; + if (goWithinPadding) { + res.left += edges.paddingLeft; + res.right -= edges.paddingRight; + res.top += edges.paddingTop; + res.bottom -= edges.paddingBottom; + } + return res; + } + function computeRect(el) { + var rect = el.getBoundingClientRect(); + return { + left: rect.left + window.pageXOffset, + top: rect.top + window.pageYOffset, + right: rect.right + window.pageXOffset, + bottom: rect.bottom + window.pageYOffset, + }; + } + function computeClippedClientRect(el) { + var clippingParents = getClippingParents(el); + var rect = el.getBoundingClientRect(); + for (var _i = 0, clippingParents_1 = clippingParents; _i < clippingParents_1.length; _i++) { + var clippingParent = clippingParents_1[_i]; + var intersection = intersectRects(rect, clippingParent.getBoundingClientRect()); + if (intersection) { + rect = intersection; + } + else { + return null; + } + } + return rect; + } + function computeHeightAndMargins(el) { + return el.getBoundingClientRect().height + computeVMargins(el); + } + function computeVMargins(el) { + var computed = window.getComputedStyle(el); + return parseInt(computed.marginTop, 10) + + parseInt(computed.marginBottom, 10); + } + // does not return window + function getClippingParents(el) { + var parents = []; + while (el instanceof HTMLElement) { // will stop when gets to document or null + var computedStyle = window.getComputedStyle(el); + if (computedStyle.position === 'fixed') { + break; + } + if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { + parents.push(el); + } + el = el.parentNode; + } + return parents; + } + + // given a function that resolves a result asynchronously. + // the function can either call passed-in success and failure callbacks, + // or it can return a promise. + // if you need to pass additional params to func, bind them first. + function unpromisify(func, success, failure) { + // guard against success/failure callbacks being called more than once + // and guard against a promise AND callback being used together. + var isResolved = false; + var wrappedSuccess = function () { + if (!isResolved) { + isResolved = true; + success.apply(this, arguments); // eslint-disable-line prefer-rest-params + } + }; + var wrappedFailure = function () { + if (!isResolved) { + isResolved = true; + if (failure) { + failure.apply(this, arguments); // eslint-disable-line prefer-rest-params + } + } + }; + var res = func(wrappedSuccess, wrappedFailure); + if (res && typeof res.then === 'function') { + res.then(wrappedSuccess, wrappedFailure); + } + } + + var Emitter = /** @class */ (function () { + function Emitter() { + this.handlers = {}; + this.thisContext = null; + } + Emitter.prototype.setThisContext = function (thisContext) { + this.thisContext = thisContext; + }; + Emitter.prototype.setOptions = function (options) { + this.options = options; + }; + Emitter.prototype.on = function (type, handler) { + addToHash(this.handlers, type, handler); + }; + Emitter.prototype.off = function (type, handler) { + removeFromHash(this.handlers, type, handler); + }; + Emitter.prototype.trigger = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var attachedHandlers = this.handlers[type] || []; + var optionHandler = this.options && this.options[type]; + var handlers = [].concat(optionHandler || [], attachedHandlers); + for (var _a = 0, handlers_1 = handlers; _a < handlers_1.length; _a++) { + var handler = handlers_1[_a]; + handler.apply(this.thisContext, args); + } + }; + Emitter.prototype.hasHandlers = function (type) { + return Boolean((this.handlers[type] && this.handlers[type].length) || + (this.options && this.options[type])); + }; + return Emitter; + }()); + function addToHash(hash, type, handler) { + (hash[type] || (hash[type] = [])) + .push(handler); + } + function removeFromHash(hash, type, handler) { + if (handler) { + if (hash[type]) { + hash[type] = hash[type].filter(function (func) { return func !== handler; }); + } + } + else { + delete hash[type]; // remove all handler funcs for this type + } + } + + /* + Records offset information for a set of elements, relative to an origin element. + Can record the left/right OR the top/bottom OR both. + Provides methods for querying the cache by position. + */ + var PositionCache = /** @class */ (function () { + function PositionCache(originEl, els, isHorizontal, isVertical) { + this.els = els; + var originClientRect = this.originClientRect = originEl.getBoundingClientRect(); // relative to viewport top-left + if (isHorizontal) { + this.buildElHorizontals(originClientRect.left); + } + if (isVertical) { + this.buildElVerticals(originClientRect.top); + } + } + // Populates the left/right internal coordinate arrays + PositionCache.prototype.buildElHorizontals = function (originClientLeft) { + var lefts = []; + var rights = []; + for (var _i = 0, _a = this.els; _i < _a.length; _i++) { + var el = _a[_i]; + var rect = el.getBoundingClientRect(); + lefts.push(rect.left - originClientLeft); + rights.push(rect.right - originClientLeft); + } + this.lefts = lefts; + this.rights = rights; + }; + // Populates the top/bottom internal coordinate arrays + PositionCache.prototype.buildElVerticals = function (originClientTop) { + var tops = []; + var bottoms = []; + for (var _i = 0, _a = this.els; _i < _a.length; _i++) { + var el = _a[_i]; + var rect = el.getBoundingClientRect(); + tops.push(rect.top - originClientTop); + bottoms.push(rect.bottom - originClientTop); + } + this.tops = tops; + this.bottoms = bottoms; + }; + // Given a left offset (from document left), returns the index of the el that it horizontally intersects. + // If no intersection is made, returns undefined. + PositionCache.prototype.leftToIndex = function (leftPosition) { + var _a = this, lefts = _a.lefts, rights = _a.rights; + var len = lefts.length; + var i; + for (i = 0; i < len; i += 1) { + if (leftPosition >= lefts[i] && leftPosition < rights[i]) { + return i; + } + } + return undefined; // TODO: better + }; + // Given a top offset (from document top), returns the index of the el that it vertically intersects. + // If no intersection is made, returns undefined. + PositionCache.prototype.topToIndex = function (topPosition) { + var _a = this, tops = _a.tops, bottoms = _a.bottoms; + var len = tops.length; + var i; + for (i = 0; i < len; i += 1) { + if (topPosition >= tops[i] && topPosition < bottoms[i]) { + return i; + } + } + return undefined; // TODO: better + }; + // Gets the width of the element at the given index + PositionCache.prototype.getWidth = function (leftIndex) { + return this.rights[leftIndex] - this.lefts[leftIndex]; + }; + // Gets the height of the element at the given index + PositionCache.prototype.getHeight = function (topIndex) { + return this.bottoms[topIndex] - this.tops[topIndex]; + }; + return PositionCache; + }()); + + /* eslint max-classes-per-file: "off" */ + /* + An object for getting/setting scroll-related information for an element. + Internally, this is done very differently for window versus DOM element, + so this object serves as a common interface. + */ + var ScrollController = /** @class */ (function () { + function ScrollController() { + } + ScrollController.prototype.getMaxScrollTop = function () { + return this.getScrollHeight() - this.getClientHeight(); + }; + ScrollController.prototype.getMaxScrollLeft = function () { + return this.getScrollWidth() - this.getClientWidth(); + }; + ScrollController.prototype.canScrollVertically = function () { + return this.getMaxScrollTop() > 0; + }; + ScrollController.prototype.canScrollHorizontally = function () { + return this.getMaxScrollLeft() > 0; + }; + ScrollController.prototype.canScrollUp = function () { + return this.getScrollTop() > 0; + }; + ScrollController.prototype.canScrollDown = function () { + return this.getScrollTop() < this.getMaxScrollTop(); + }; + ScrollController.prototype.canScrollLeft = function () { + return this.getScrollLeft() > 0; + }; + ScrollController.prototype.canScrollRight = function () { + return this.getScrollLeft() < this.getMaxScrollLeft(); + }; + return ScrollController; + }()); + var ElementScrollController = /** @class */ (function (_super) { + __extends(ElementScrollController, _super); + function ElementScrollController(el) { + var _this = _super.call(this) || this; + _this.el = el; + return _this; + } + ElementScrollController.prototype.getScrollTop = function () { + return this.el.scrollTop; + }; + ElementScrollController.prototype.getScrollLeft = function () { + return this.el.scrollLeft; + }; + ElementScrollController.prototype.setScrollTop = function (top) { + this.el.scrollTop = top; + }; + ElementScrollController.prototype.setScrollLeft = function (left) { + this.el.scrollLeft = left; + }; + ElementScrollController.prototype.getScrollWidth = function () { + return this.el.scrollWidth; + }; + ElementScrollController.prototype.getScrollHeight = function () { + return this.el.scrollHeight; + }; + ElementScrollController.prototype.getClientHeight = function () { + return this.el.clientHeight; + }; + ElementScrollController.prototype.getClientWidth = function () { + return this.el.clientWidth; + }; + return ElementScrollController; + }(ScrollController)); + var WindowScrollController = /** @class */ (function (_super) { + __extends(WindowScrollController, _super); + function WindowScrollController() { + return _super !== null && _super.apply(this, arguments) || this; + } + WindowScrollController.prototype.getScrollTop = function () { + return window.pageYOffset; + }; + WindowScrollController.prototype.getScrollLeft = function () { + return window.pageXOffset; + }; + WindowScrollController.prototype.setScrollTop = function (n) { + window.scroll(window.pageXOffset, n); + }; + WindowScrollController.prototype.setScrollLeft = function (n) { + window.scroll(n, window.pageYOffset); + }; + WindowScrollController.prototype.getScrollWidth = function () { + return document.documentElement.scrollWidth; + }; + WindowScrollController.prototype.getScrollHeight = function () { + return document.documentElement.scrollHeight; + }; + WindowScrollController.prototype.getClientHeight = function () { + return document.documentElement.clientHeight; + }; + WindowScrollController.prototype.getClientWidth = function () { + return document.documentElement.clientWidth; + }; + return WindowScrollController; + }(ScrollController)); + + var Theme = /** @class */ (function () { + function Theme(calendarOptions) { + if (this.iconOverrideOption) { + this.setIconOverride(calendarOptions[this.iconOverrideOption]); + } + } + Theme.prototype.setIconOverride = function (iconOverrideHash) { + var iconClassesCopy; + var buttonName; + if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object + iconClassesCopy = __assign({}, this.iconClasses); + for (buttonName in iconOverrideHash) { + iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); + } + this.iconClasses = iconClassesCopy; + } + else if (iconOverrideHash === false) { + this.iconClasses = {}; + } + }; + Theme.prototype.applyIconOverridePrefix = function (className) { + var prefix = this.iconOverridePrefix; + if (prefix && className.indexOf(prefix) !== 0) { // if not already present + className = prefix + className; + } + return className; + }; + Theme.prototype.getClass = function (key) { + return this.classes[key] || ''; + }; + Theme.prototype.getIconClass = function (buttonName, isRtl) { + var className; + if (isRtl && this.rtlIconClasses) { + className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName]; + } + else { + className = this.iconClasses[buttonName]; + } + if (className) { + return this.baseIconClass + " " + className; + } + return ''; + }; + Theme.prototype.getCustomButtonIconClass = function (customButtonProps) { + var className; + if (this.iconOverrideCustomButtonOption) { + className = customButtonProps[this.iconOverrideCustomButtonOption]; + if (className) { + return this.baseIconClass + " " + this.applyIconOverridePrefix(className); + } + } + return ''; + }; + return Theme; + }()); + Theme.prototype.classes = {}; + Theme.prototype.iconClasses = {}; + Theme.prototype.baseIconClass = ''; + Theme.prototype.iconOverridePrefix = ''; + + /// + if (typeof FullCalendarVDom === 'undefined') { + throw new Error('Please import the top-level fullcalendar lib before attempting to import a plugin.'); + } + var Component = FullCalendarVDom.Component; + var createElement = FullCalendarVDom.createElement; + var render = FullCalendarVDom.render; + var createRef = FullCalendarVDom.createRef; + var Fragment = FullCalendarVDom.Fragment; + var createContext = FullCalendarVDom.createContext; + var createPortal = FullCalendarVDom.createPortal; + var flushSync = FullCalendarVDom.flushSync; + var unmountComponentAtNode = FullCalendarVDom.unmountComponentAtNode; + /* eslint-enable */ + + var ScrollResponder = /** @class */ (function () { + function ScrollResponder(execFunc, emitter, scrollTime, scrollTimeReset) { + var _this = this; + this.execFunc = execFunc; + this.emitter = emitter; + this.scrollTime = scrollTime; + this.scrollTimeReset = scrollTimeReset; + this.handleScrollRequest = function (request) { + _this.queuedRequest = __assign({}, _this.queuedRequest || {}, request); + _this.drain(); + }; + emitter.on('_scrollRequest', this.handleScrollRequest); + this.fireInitialScroll(); + } + ScrollResponder.prototype.detach = function () { + this.emitter.off('_scrollRequest', this.handleScrollRequest); + }; + ScrollResponder.prototype.update = function (isDatesNew) { + if (isDatesNew && this.scrollTimeReset) { + this.fireInitialScroll(); // will drain + } + else { + this.drain(); + } + }; + ScrollResponder.prototype.fireInitialScroll = function () { + this.handleScrollRequest({ + time: this.scrollTime, + }); + }; + ScrollResponder.prototype.drain = function () { + if (this.queuedRequest && this.execFunc(this.queuedRequest)) { + this.queuedRequest = null; + } + }; + return ScrollResponder; + }()); + + var ViewContextType = createContext({}); // for Components + function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) { + return { + dateEnv: dateEnv, + options: viewOptions, + pluginHooks: pluginHooks, + emitter: emitter, + dispatch: dispatch, + getCurrentData: getCurrentData, + calendarApi: calendarApi, + viewSpec: viewSpec, + viewApi: viewApi, + dateProfileGenerator: dateProfileGenerator, + theme: theme, + isRtl: viewOptions.direction === 'rtl', + addResizeHandler: function (handler) { + emitter.on('_resize', handler); + }, + removeResizeHandler: function (handler) { + emitter.off('_resize', handler); + }, + createScrollResponder: function (execFunc) { + return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset); + }, + registerInteractiveComponent: registerInteractiveComponent, + unregisterInteractiveComponent: unregisterInteractiveComponent, + }; + } + + /* eslint max-classes-per-file: off */ + var PureComponent = /** @class */ (function (_super) { + __extends(PureComponent, _super); + function PureComponent() { + return _super !== null && _super.apply(this, arguments) || this; + } + PureComponent.prototype.shouldComponentUpdate = function (nextProps, nextState) { + if (this.debug) { + // eslint-disable-next-line no-console + console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state)); + } + return !compareObjs(this.props, nextProps, this.propEquality) || + !compareObjs(this.state, nextState, this.stateEquality); + }; + // HACK for freakin' React StrictMode + PureComponent.prototype.safeSetState = function (newState) { + if (!compareObjs(this.state, __assign(__assign({}, this.state), newState), this.stateEquality)) { + this.setState(newState); + } + }; + PureComponent.addPropsEquality = addPropsEquality; + PureComponent.addStateEquality = addStateEquality; + PureComponent.contextType = ViewContextType; + return PureComponent; + }(Component)); + PureComponent.prototype.propEquality = {}; + PureComponent.prototype.stateEquality = {}; + var BaseComponent = /** @class */ (function (_super) { + __extends(BaseComponent, _super); + function BaseComponent() { + return _super !== null && _super.apply(this, arguments) || this; + } + BaseComponent.contextType = ViewContextType; + return BaseComponent; + }(PureComponent)); + function addPropsEquality(propEquality) { + var hash = Object.create(this.prototype.propEquality); + __assign(hash, propEquality); + this.prototype.propEquality = hash; + } + function addStateEquality(stateEquality) { + var hash = Object.create(this.prototype.stateEquality); + __assign(hash, stateEquality); + this.prototype.stateEquality = hash; + } + // use other one + function setRef(ref, current) { + if (typeof ref === 'function') { + ref(current); + } + else if (ref) { + // see https://github.com/facebook/react/issues/13029 + ref.current = current; + } + } + + /* + an INTERACTABLE date component + + PURPOSES: + - hook up to fg, fill, and mirror renderers + - interface for dragging and hits + */ + var DateComponent = /** @class */ (function (_super) { + __extends(DateComponent, _super); + function DateComponent() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.uid = guid(); + return _this; + } + // Hit System + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.prepareHits = function () { + }; + DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { + return null; // this should be abstract + }; + // Pointer Interaction Utils + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.isValidSegDownEl = function (el) { + return !this.props.eventDrag && // HACK + !this.props.eventResize && // HACK + !elementClosest(el, '.fc-event-mirror'); + }; + DateComponent.prototype.isValidDateDownEl = function (el) { + return !elementClosest(el, '.fc-event:not(.fc-bg-event)') && + !elementClosest(el, '.fc-more-link') && // a "more.." link + !elementClosest(el, 'a[data-navlink]') && // a clickable nav link + !elementClosest(el, '.fc-popover'); // hack + }; + return DateComponent; + }(BaseComponent)); + + // TODO: easier way to add new hooks? need to update a million things + function createPlugin(input) { + return { + id: guid(), + deps: input.deps || [], + reducers: input.reducers || [], + isLoadingFuncs: input.isLoadingFuncs || [], + contextInit: [].concat(input.contextInit || []), + eventRefiners: input.eventRefiners || {}, + eventDefMemberAdders: input.eventDefMemberAdders || [], + eventSourceRefiners: input.eventSourceRefiners || {}, + isDraggableTransformers: input.isDraggableTransformers || [], + eventDragMutationMassagers: input.eventDragMutationMassagers || [], + eventDefMutationAppliers: input.eventDefMutationAppliers || [], + dateSelectionTransformers: input.dateSelectionTransformers || [], + datePointTransforms: input.datePointTransforms || [], + dateSpanTransforms: input.dateSpanTransforms || [], + views: input.views || {}, + viewPropsTransformers: input.viewPropsTransformers || [], + isPropsValid: input.isPropsValid || null, + externalDefTransforms: input.externalDefTransforms || [], + viewContainerAppends: input.viewContainerAppends || [], + eventDropTransformers: input.eventDropTransformers || [], + componentInteractions: input.componentInteractions || [], + calendarInteractions: input.calendarInteractions || [], + themeClasses: input.themeClasses || {}, + eventSourceDefs: input.eventSourceDefs || [], + cmdFormatter: input.cmdFormatter, + recurringTypes: input.recurringTypes || [], + namedTimeZonedImpl: input.namedTimeZonedImpl, + initialView: input.initialView || '', + elementDraggingImpl: input.elementDraggingImpl, + optionChangeHandlers: input.optionChangeHandlers || {}, + scrollGridImpl: input.scrollGridImpl || null, + contentTypeHandlers: input.contentTypeHandlers || {}, + listenerRefiners: input.listenerRefiners || {}, + optionRefiners: input.optionRefiners || {}, + propSetHandlers: input.propSetHandlers || {}, + }; + } + function buildPluginHooks(pluginDefs, globalDefs) { + var isAdded = {}; + var hooks = { + reducers: [], + isLoadingFuncs: [], + contextInit: [], + eventRefiners: {}, + eventDefMemberAdders: [], + eventSourceRefiners: {}, + isDraggableTransformers: [], + eventDragMutationMassagers: [], + eventDefMutationAppliers: [], + dateSelectionTransformers: [], + datePointTransforms: [], + dateSpanTransforms: [], + views: {}, + viewPropsTransformers: [], + isPropsValid: null, + externalDefTransforms: [], + viewContainerAppends: [], + eventDropTransformers: [], + componentInteractions: [], + calendarInteractions: [], + themeClasses: {}, + eventSourceDefs: [], + cmdFormatter: null, + recurringTypes: [], + namedTimeZonedImpl: null, + initialView: '', + elementDraggingImpl: null, + optionChangeHandlers: {}, + scrollGridImpl: null, + contentTypeHandlers: {}, + listenerRefiners: {}, + optionRefiners: {}, + propSetHandlers: {}, + }; + function addDefs(defs) { + for (var _i = 0, defs_1 = defs; _i < defs_1.length; _i++) { + var def = defs_1[_i]; + if (!isAdded[def.id]) { + isAdded[def.id] = true; + addDefs(def.deps); + hooks = combineHooks(hooks, def); + } + } + } + if (pluginDefs) { + addDefs(pluginDefs); + } + addDefs(globalDefs); + return hooks; + } + function buildBuildPluginHooks() { + var currentOverrideDefs = []; + var currentGlobalDefs = []; + var currentHooks; + return function (overrideDefs, globalDefs) { + if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) { + currentHooks = buildPluginHooks(overrideDefs, globalDefs); + } + currentOverrideDefs = overrideDefs; + currentGlobalDefs = globalDefs; + return currentHooks; + }; + } + function combineHooks(hooks0, hooks1) { + return { + reducers: hooks0.reducers.concat(hooks1.reducers), + isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs), + contextInit: hooks0.contextInit.concat(hooks1.contextInit), + eventRefiners: __assign(__assign({}, hooks0.eventRefiners), hooks1.eventRefiners), + eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders), + eventSourceRefiners: __assign(__assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners), + isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), + eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), + eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), + dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), + datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), + dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), + views: __assign(__assign({}, hooks0.views), hooks1.views), + viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), + isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, + externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), + viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends), + eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), + calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), + componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), + themeClasses: __assign(__assign({}, hooks0.themeClasses), hooks1.themeClasses), + eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), + cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, + recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), + namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, + initialView: hooks0.initialView || hooks1.initialView, + elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, + optionChangeHandlers: __assign(__assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers), + scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl, + contentTypeHandlers: __assign(__assign({}, hooks0.contentTypeHandlers), hooks1.contentTypeHandlers), + listenerRefiners: __assign(__assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners), + optionRefiners: __assign(__assign({}, hooks0.optionRefiners), hooks1.optionRefiners), + propSetHandlers: __assign(__assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers), + }; + } + + var StandardTheme = /** @class */ (function (_super) { + __extends(StandardTheme, _super); + function StandardTheme() { + return _super !== null && _super.apply(this, arguments) || this; + } + return StandardTheme; + }(Theme)); + StandardTheme.prototype.classes = { + root: 'fc-theme-standard', + tableCellShaded: 'fc-cell-shaded', + buttonGroup: 'fc-button-group', + button: 'fc-button fc-button-primary', + buttonActive: 'fc-button-active', + }; + StandardTheme.prototype.baseIconClass = 'fc-icon'; + StandardTheme.prototype.iconClasses = { + close: 'fc-icon-x', + prev: 'fc-icon-chevron-left', + next: 'fc-icon-chevron-right', + prevYear: 'fc-icon-chevrons-left', + nextYear: 'fc-icon-chevrons-right', + }; + StandardTheme.prototype.rtlIconClasses = { + prev: 'fc-icon-chevron-right', + next: 'fc-icon-chevron-left', + prevYear: 'fc-icon-chevrons-right', + nextYear: 'fc-icon-chevrons-left', + }; + StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly + StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon'; + StandardTheme.prototype.iconOverridePrefix = 'fc-icon-'; + + function compileViewDefs(defaultConfigs, overrideConfigs) { + var hash = {}; + var viewType; + for (viewType in defaultConfigs) { + ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); + } + for (viewType in overrideConfigs) { + ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); + } + return hash; + } + function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) { + if (hash[viewType]) { + return hash[viewType]; + } + var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs); + if (viewDef) { + hash[viewType] = viewDef; + } + return viewDef; + } + function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) { + var defaultConfig = defaultConfigs[viewType]; + var overrideConfig = overrideConfigs[viewType]; + var queryProp = function (name) { return ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] : + ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null)); }; + var theComponent = queryProp('component'); + var superType = queryProp('superType'); + var superDef = null; + if (superType) { + if (superType === viewType) { + throw new Error('Can\'t have a custom view type that references itself'); + } + superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs); + } + if (!theComponent && superDef) { + theComponent = superDef.component; + } + if (!theComponent) { + return null; // don't throw a warning, might be settings for a single-unit view + } + return { + type: viewType, + component: theComponent, + defaults: __assign(__assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})), + overrides: __assign(__assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {})), + }; + } + + /* eslint max-classes-per-file: off */ + // NOTE: in JSX, you should always use this class with arg. otherwise, will default to any??? + var RenderHook = /** @class */ (function (_super) { + __extends(RenderHook, _super); + function RenderHook() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + _this.handleRootEl = function (el) { + setRef(_this.rootElRef, el); + if (_this.props.elRef) { + setRef(_this.props.elRef, el); + } + }; + return _this; + } + RenderHook.prototype.render = function () { + var _this = this; + var props = this.props; + var hookProps = props.hookProps; + return (createElement(MountHook, { hookProps: hookProps, didMount: props.didMount, willUnmount: props.willUnmount, elRef: this.handleRootEl }, function (rootElRef) { return (createElement(ContentHook, { hookProps: hookProps, content: props.content, defaultContent: props.defaultContent, backupElRef: _this.rootElRef }, function (innerElRef, innerContent) { return props.children(rootElRef, normalizeClassNames(props.classNames, hookProps), innerElRef, innerContent); })); })); + }; + return RenderHook; + }(BaseComponent)); + // TODO: rename to be about function, not default. use in above type + // for forcing rerender of components that use the ContentHook + var CustomContentRenderContext = createContext(0); + function ContentHook(props) { + return (createElement(CustomContentRenderContext.Consumer, null, function (renderId) { return (createElement(ContentHookInner, __assign({ renderId: renderId }, props))); })); + } + var ContentHookInner = /** @class */ (function (_super) { + __extends(ContentHookInner, _super); + function ContentHookInner() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.innerElRef = createRef(); + return _this; + } + ContentHookInner.prototype.render = function () { + return this.props.children(this.innerElRef, this.renderInnerContent()); + }; + ContentHookInner.prototype.componentDidMount = function () { + this.updateCustomContent(); + }; + ContentHookInner.prototype.componentDidUpdate = function () { + this.updateCustomContent(); + }; + ContentHookInner.prototype.componentWillUnmount = function () { + if (this.customContentInfo && this.customContentInfo.destroy) { + this.customContentInfo.destroy(); + } + }; + ContentHookInner.prototype.renderInnerContent = function () { + var customContentInfo = this.customContentInfo; // only populated if using non-[p]react node(s) + var innerContent = this.getInnerContent(); + var meta = this.getContentMeta(innerContent); + // initial run, or content-type changing? (from vue -> react for example) + if (!customContentInfo || customContentInfo.contentKey !== meta.contentKey) { + // clearing old value + if (customContentInfo) { + if (customContentInfo.destroy) { + customContentInfo.destroy(); + } + customContentInfo = this.customContentInfo = null; + } + // assigning new value + if (meta.contentKey) { + customContentInfo = this.customContentInfo = __assign({ contentKey: meta.contentKey, contentVal: innerContent[meta.contentKey] }, meta.buildLifecycleFuncs()); + } + // updating + } + else if (customContentInfo) { + customContentInfo.contentVal = innerContent[meta.contentKey]; + } + return customContentInfo + ? [] // signal that something was specified + : innerContent; // assume a [p]react vdom node. use it + }; + ContentHookInner.prototype.getInnerContent = function () { + var props = this.props; + var innerContent = normalizeContent(props.content, props.hookProps); + if (innerContent === undefined) { // use the default + innerContent = normalizeContent(props.defaultContent, props.hookProps); + } + return innerContent == null ? null : innerContent; // convert undefined to null (better for React) + }; + ContentHookInner.prototype.getContentMeta = function (innerContent) { + var contentTypeHandlers = this.context.pluginHooks.contentTypeHandlers; + var contentKey = ''; + var buildLifecycleFuncs = null; + if (innerContent) { // allowed to be null, for convenience to caller + for (var searchKey in contentTypeHandlers) { + if (innerContent[searchKey] !== undefined) { + contentKey = searchKey; + buildLifecycleFuncs = contentTypeHandlers[searchKey]; + break; + } + } + } + return { contentKey: contentKey, buildLifecycleFuncs: buildLifecycleFuncs }; + }; + ContentHookInner.prototype.updateCustomContent = function () { + if (this.customContentInfo) { // for non-[p]react + this.customContentInfo.render(this.innerElRef.current || this.props.backupElRef.current, // the element to render into + this.customContentInfo.contentVal); + } + }; + return ContentHookInner; + }(BaseComponent)); + var MountHook = /** @class */ (function (_super) { + __extends(MountHook, _super); + function MountHook() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handleRootEl = function (rootEl) { + _this.rootEl = rootEl; + if (_this.props.elRef) { + setRef(_this.props.elRef, rootEl); + } + }; + return _this; + } + MountHook.prototype.render = function () { + return this.props.children(this.handleRootEl); + }; + MountHook.prototype.componentDidMount = function () { + var callback = this.props.didMount; + if (callback) { + callback(__assign(__assign({}, this.props.hookProps), { el: this.rootEl })); + } + }; + MountHook.prototype.componentWillUnmount = function () { + var callback = this.props.willUnmount; + if (callback) { + callback(__assign(__assign({}, this.props.hookProps), { el: this.rootEl })); + } + }; + return MountHook; + }(BaseComponent)); + function buildClassNameNormalizer() { + var currentGenerator; + var currentHookProps; + var currentClassNames = []; + return function (generator, hookProps) { + if (!currentHookProps || !isPropsEqual(currentHookProps, hookProps) || generator !== currentGenerator) { + currentGenerator = generator; + currentHookProps = hookProps; + currentClassNames = normalizeClassNames(generator, hookProps); + } + return currentClassNames; + }; + } + function normalizeClassNames(classNames, hookProps) { + if (typeof classNames === 'function') { + classNames = classNames(hookProps); + } + return parseClassNames(classNames); + } + function normalizeContent(input, hookProps) { + if (typeof input === 'function') { + return input(hookProps, createElement); // give the function the vdom-creation func + } + return input; + } + + var ViewRoot = /** @class */ (function (_super) { + __extends(ViewRoot, _super); + function ViewRoot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.normalizeClassNames = buildClassNameNormalizer(); + return _this; + } + ViewRoot.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var options = context.options; + var hookProps = { view: context.viewApi }; + var customClassNames = this.normalizeClassNames(options.viewClassNames, hookProps); + return (createElement(MountHook, { hookProps: hookProps, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, ["fc-" + props.viewSpec.type + "-view", 'fc-view'].concat(customClassNames)); })); + }; + return ViewRoot; + }(BaseComponent)); + + function parseViewConfigs(inputs) { + return mapHash(inputs, parseViewConfig); + } + function parseViewConfig(input) { + var rawOptions = typeof input === 'function' ? + { component: input } : + input; + var component = rawOptions.component; + if (rawOptions.content) { + component = createViewHookComponent(rawOptions); + // TODO: remove content/classNames/didMount/etc from options? + } + return { + superType: rawOptions.type, + component: component, + rawOptions: rawOptions, + }; + } + function createViewHookComponent(options) { + return function (viewProps) { return (createElement(ViewContextType.Consumer, null, function (context) { return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (viewElRef, viewClassNames) { + var hookProps = __assign(__assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }); + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.classNames, content: options.content, didMount: options.didMount, willUnmount: options.willUnmount, elRef: viewElRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("div", { className: viewClassNames.concat(customClassNames).join(' '), ref: rootElRef }, innerContent)); })); + })); })); }; + } + + function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) { + var defaultConfigs = parseViewConfigs(defaultInputs); + var overrideConfigs = parseViewConfigs(optionOverrides.views); + var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); + return mapHash(viewDefs, function (viewDef) { return buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults); }); + } + function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) { + var durationInput = viewDef.overrides.duration || + viewDef.defaults.duration || + dynamicOptionOverrides.duration || + optionOverrides.duration; + var duration = null; + var durationUnit = ''; + var singleUnit = ''; + var singleUnitOverrides = {}; + if (durationInput) { + duration = createDurationCached(durationInput); + if (duration) { // valid? + var denom = greatestDurationDenominator(duration); + durationUnit = denom.unit; + if (denom.value === 1) { + singleUnit = durationUnit; + singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {}; + } + } + } + var queryButtonText = function (optionsSubset) { + var buttonTextMap = optionsSubset.buttonText || {}; + var buttonTextKey = viewDef.defaults.buttonTextKey; + if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { + return buttonTextMap[buttonTextKey]; + } + if (buttonTextMap[viewDef.type] != null) { + return buttonTextMap[viewDef.type]; + } + if (buttonTextMap[singleUnit] != null) { + return buttonTextMap[singleUnit]; + } + return null; + }; + var queryButtonTitle = function (optionsSubset) { + var buttonHints = optionsSubset.buttonHints || {}; + var buttonKey = viewDef.defaults.buttonTextKey; // use same key as text + if (buttonKey != null && buttonHints[buttonKey] != null) { + return buttonHints[buttonKey]; + } + if (buttonHints[viewDef.type] != null) { + return buttonHints[viewDef.type]; + } + if (buttonHints[singleUnit] != null) { + return buttonHints[singleUnit]; + } + return null; + }; + return { + type: viewDef.type, + component: viewDef.component, + duration: duration, + durationUnit: durationUnit, + singleUnit: singleUnit, + optionDefaults: viewDef.defaults, + optionOverrides: __assign(__assign({}, singleUnitOverrides), viewDef.overrides), + buttonTextOverride: queryButtonText(dynamicOptionOverrides) || + queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence + viewDef.overrides.buttonText, + buttonTextDefault: queryButtonText(localeDefaults) || + viewDef.defaults.buttonText || + queryButtonText(BASE_OPTION_DEFAULTS) || + viewDef.type, + // not DRY + buttonTitleOverride: queryButtonTitle(dynamicOptionOverrides) || + queryButtonTitle(optionOverrides) || + viewDef.overrides.buttonHint, + buttonTitleDefault: queryButtonTitle(localeDefaults) || + viewDef.defaults.buttonHint || + queryButtonTitle(BASE_OPTION_DEFAULTS), + // will eventually fall back to buttonText + }; + } + // hack to get memoization working + var durationInputMap = {}; + function createDurationCached(durationInput) { + var json = JSON.stringify(durationInput); + var res = durationInputMap[json]; + if (res === undefined) { + res = createDuration(durationInput); + durationInputMap[json] = res; + } + return res; + } + + var DateProfileGenerator = /** @class */ (function () { + function DateProfileGenerator(props) { + this.props = props; + this.nowDate = getNow(props.nowInput, props.dateEnv); + this.initHiddenDays(); + } + /* Date Range Computation + ------------------------------------------------------------------------------------------------------------------*/ + // Builds a structure with info about what the dates/ranges will be for the "prev" view. + DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate, forceToValid) { + var dateEnv = this.props.dateEnv; + var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month + currentDateProfile.dateIncrement); + return this.build(prevDate, -1, forceToValid); + }; + // Builds a structure with info about what the dates/ranges will be for the "next" view. + DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate, forceToValid) { + var dateEnv = this.props.dateEnv; + var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month + currentDateProfile.dateIncrement); + return this.build(nextDate, 1, forceToValid); + }; + // Builds a structure holding dates/ranges for rendering around the given date. + // Optional direction param indicates whether the date is being incremented/decremented + // from its previous value. decremented = -1, incremented = 1 (default). + DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) { + if (forceToValid === void 0) { forceToValid = true; } + var props = this.props; + var validRange; + var currentInfo; + var isRangeAllDay; + var renderRange; + var activeRange; + var isValid; + validRange = this.buildValidRange(); + validRange = this.trimHiddenDays(validRange); + if (forceToValid) { + currentDate = constrainMarkerToRange(currentDate, validRange); + } + currentInfo = this.buildCurrentRangeInfo(currentDate, direction); + isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); + renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); + renderRange = this.trimHiddenDays(renderRange); + activeRange = renderRange; + if (!props.showNonCurrentDates) { + activeRange = intersectRanges(activeRange, currentInfo.range); + } + activeRange = this.adjustActiveRange(activeRange); + activeRange = intersectRanges(activeRange, validRange); // might return null + // it's invalid if the originally requested date is not contained, + // or if the range is completely outside of the valid range. + isValid = rangesIntersect(currentInfo.range, validRange); + return { + // constraint for where prev/next operations can go and where events can be dragged/resized to. + // an object with optional start and end properties. + validRange: validRange, + // range the view is formally responsible for. + // for example, a month view might have 1st-31st, excluding padded dates + currentRange: currentInfo.range, + // name of largest unit being displayed, like "month" or "week" + currentRangeUnit: currentInfo.unit, + isRangeAllDay: isRangeAllDay, + // dates that display events and accept drag-n-drop + // will be `null` if no dates accept events + activeRange: activeRange, + // date range with a rendered skeleton + // includes not-active days that need some sort of DOM + renderRange: renderRange, + // Duration object that denotes the first visible time of any given day + slotMinTime: props.slotMinTime, + // Duration object that denotes the exclusive visible end time of any given day + slotMaxTime: props.slotMaxTime, + isValid: isValid, + // how far the current date will move for a prev/next operation + dateIncrement: this.buildDateIncrement(currentInfo.duration), + // pass a fallback (might be null) ^ + }; + }; + // Builds an object with optional start/end properties. + // Indicates the minimum/maximum dates to display. + // not responsible for trimming hidden days. + DateProfileGenerator.prototype.buildValidRange = function () { + var input = this.props.validRangeInput; + var simpleInput = typeof input === 'function' + ? input.call(this.props.calendarApi, this.nowDate) + : input; + return this.refineRange(simpleInput) || + { start: null, end: null }; // completely open-ended + }; + // Builds a structure with info about the "current" range, the range that is + // highlighted as being the current month for example. + // See build() for a description of `direction`. + // Guaranteed to have `range` and `unit` properties. `duration` is optional. + DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) { + var props = this.props; + var duration = null; + var unit = null; + var range = null; + var dayCount; + if (props.duration) { + duration = props.duration; + unit = props.durationUnit; + range = this.buildRangeFromDuration(date, direction, duration, unit); + } + else if ((dayCount = this.props.dayCount)) { + unit = 'day'; + range = this.buildRangeFromDayCount(date, direction, dayCount); + } + else if ((range = this.buildCustomVisibleRange(date))) { + unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit; + } + else { + duration = this.getFallbackDuration(); + unit = greatestDurationDenominator(duration).unit; + range = this.buildRangeFromDuration(date, direction, duration, unit); + } + return { duration: duration, unit: unit, range: range }; + }; + DateProfileGenerator.prototype.getFallbackDuration = function () { + return createDuration({ day: 1 }); + }; + // Returns a new activeRange to have time values (un-ambiguate) + // slotMinTime or slotMaxTime causes the range to expand. + DateProfileGenerator.prototype.adjustActiveRange = function (range) { + var _a = this.props, dateEnv = _a.dateEnv, usesMinMaxTime = _a.usesMinMaxTime, slotMinTime = _a.slotMinTime, slotMaxTime = _a.slotMaxTime; + var start = range.start, end = range.end; + if (usesMinMaxTime) { + // expand active range if slotMinTime is negative (why not when positive?) + if (asRoughDays(slotMinTime) < 0) { + start = startOfDay(start); // necessary? + start = dateEnv.add(start, slotMinTime); + } + // expand active range if slotMaxTime is beyond one day (why not when negative?) + if (asRoughDays(slotMaxTime) > 1) { + end = startOfDay(end); // necessary? + end = addDays(end, -1); + end = dateEnv.add(end, slotMaxTime); + } + } + return { start: start, end: end }; + }; + // Builds the "current" range when it is specified as an explicit duration. + // `unit` is the already-computed greatestDurationDenominator unit of duration. + DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) { + var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment; + var start; + var end; + var res; + // compute what the alignment should be + if (!dateAlignment) { + var dateIncrement = this.props.dateIncrement; + if (dateIncrement) { + // use the smaller of the two units + if (asRoughMs(dateIncrement) < asRoughMs(duration)) { + dateAlignment = greatestDurationDenominator(dateIncrement).unit; + } + else { + dateAlignment = unit; + } + } + else { + dateAlignment = unit; + } + } + // if the view displays a single day or smaller + if (asRoughDays(duration) <= 1) { + if (this.isHiddenDay(start)) { + start = this.skipHiddenDays(start, direction); + start = startOfDay(start); + } + } + function computeRes() { + start = dateEnv.startOf(date, dateAlignment); + end = dateEnv.add(start, duration); + res = { start: start, end: end }; + } + computeRes(); + // if range is completely enveloped by hidden days, go past the hidden days + if (!this.trimHiddenDays(res)) { + date = this.skipHiddenDays(date, direction); + computeRes(); + } + return res; + }; + // Builds the "current" range when a dayCount is specified. + DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) { + var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment; + var runningCount = 0; + var start = date; + var end; + if (dateAlignment) { + start = dateEnv.startOf(start, dateAlignment); + } + start = startOfDay(start); + start = this.skipHiddenDays(start, direction); + end = start; + do { + end = addDays(end, 1); + if (!this.isHiddenDay(end)) { + runningCount += 1; + } + } while (runningCount < dayCount); + return { start: start, end: end }; + }; + // Builds a normalized range object for the "visible" range, + // which is a way to define the currentRange and activeRange at the same time. + DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) { + var props = this.props; + var input = props.visibleRangeInput; + var simpleInput = typeof input === 'function' + ? input.call(props.calendarApi, props.dateEnv.toDate(date)) + : input; + var range = this.refineRange(simpleInput); + if (range && (range.start == null || range.end == null)) { + return null; + } + return range; + }; + // Computes the range that will represent the element/cells for *rendering*, + // but which may have voided days/times. + // not responsible for trimming hidden days. + DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { + return currentRange; + }; + // Compute the duration value that should be added/substracted to the current date + // when a prev/next operation happens. + DateProfileGenerator.prototype.buildDateIncrement = function (fallback) { + var dateIncrement = this.props.dateIncrement; + var customAlignment; + if (dateIncrement) { + return dateIncrement; + } + if ((customAlignment = this.props.dateAlignment)) { + return createDuration(1, customAlignment); + } + if (fallback) { + return fallback; + } + return createDuration({ days: 1 }); + }; + DateProfileGenerator.prototype.refineRange = function (rangeInput) { + if (rangeInput) { + var range = parseRange(rangeInput, this.props.dateEnv); + if (range) { + range = computeVisibleDayRange(range); + } + return range; + } + return null; + }; + /* Hidden Days + ------------------------------------------------------------------------------------------------------------------*/ + // Initializes internal variables related to calculating hidden days-of-week + DateProfileGenerator.prototype.initHiddenDays = function () { + var hiddenDays = this.props.hiddenDays || []; // array of day-of-week indices that are hidden + var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) + var dayCnt = 0; + var i; + if (this.props.weekends === false) { + hiddenDays.push(0, 6); // 0=sunday, 6=saturday + } + for (i = 0; i < 7; i += 1) { + if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) { + dayCnt += 1; + } + } + if (!dayCnt) { + throw new Error('invalid hiddenDays'); // all days were hidden? bad. + } + this.isHiddenDayHash = isHiddenDayHash; + }; + // Remove days from the beginning and end of the range that are computed as hidden. + // If the whole range is trimmed off, returns null + DateProfileGenerator.prototype.trimHiddenDays = function (range) { + var start = range.start, end = range.end; + if (start) { + start = this.skipHiddenDays(start); + } + if (end) { + end = this.skipHiddenDays(end, -1, true); + } + if (start == null || end == null || start < end) { + return { start: start, end: end }; + } + return null; + }; + // Is the current day hidden? + // `day` is a day-of-week index (0-6), or a Date (used for UTC) + DateProfileGenerator.prototype.isHiddenDay = function (day) { + if (day instanceof Date) { + day = day.getUTCDay(); + } + return this.isHiddenDayHash[day]; + }; + // Incrementing the current day until it is no longer a hidden day, returning a copy. + // DOES NOT CONSIDER validRange! + // If the initial value of `date` is not a hidden day, don't do anything. + // Pass `isExclusive` as `true` if you are dealing with an end date. + // `inc` defaults to `1` (increment one day forward each time) + DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) { + if (inc === void 0) { inc = 1; } + if (isExclusive === void 0) { isExclusive = false; } + while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { + date = addDays(date, inc); + } + return date; + }; + return DateProfileGenerator; + }()); + + function reduceViewType(viewType, action) { + switch (action.type) { + case 'CHANGE_VIEW_TYPE': + viewType = action.viewType; + } + return viewType; + } + + function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) { + var _a; + switch (action.type) { + case 'SET_OPTION': + return __assign(__assign({}, dynamicOptionOverrides), (_a = {}, _a[action.optionName] = action.rawOptionValue, _a)); + default: + return dynamicOptionOverrides; + } + } + + function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) { + var dp; + switch (action.type) { + case 'CHANGE_VIEW_TYPE': + return dateProfileGenerator.build(action.dateMarker || currentDate); + case 'CHANGE_DATE': + return dateProfileGenerator.build(action.dateMarker); + case 'PREV': + dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate); + if (dp.isValid) { + return dp; + } + break; + case 'NEXT': + dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate); + if (dp.isValid) { + return dp; + } + break; + } + return currentDateProfile; + } + + function initEventSources(calendarOptions, dateProfile, context) { + var activeRange = dateProfile ? dateProfile.activeRange : null; + return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context); + } + function reduceEventSources(eventSources, action, dateProfile, context) { + var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? + switch (action.type) { + case 'ADD_EVENT_SOURCES': // already parsed + return addSources(eventSources, action.sources, activeRange, context); + case 'REMOVE_EVENT_SOURCE': + return removeSource(eventSources, action.sourceId); + case 'PREV': // TODO: how do we track all actions that affect dateProfile :( + case 'NEXT': + case 'CHANGE_DATE': + case 'CHANGE_VIEW_TYPE': + if (dateProfile) { + return fetchDirtySources(eventSources, activeRange, context); + } + return eventSources; + case 'FETCH_EVENT_SOURCES': + return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type? + arrayToHash(action.sourceIds) : + excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context); + case 'RECEIVE_EVENTS': + case 'RECEIVE_EVENT_ERROR': + return receiveResponse$1(eventSources, action.sourceId, action.fetchId, action.fetchRange); + case 'REMOVE_ALL_EVENT_SOURCES': + return {}; + default: + return eventSources; + } + } + function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) { + var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? + return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context); + } + function computeEventSourcesLoading(eventSources) { + for (var sourceId in eventSources) { + if (eventSources[sourceId].isFetching) { + return true; + } + } + return false; + } + function addSources(eventSourceHash, sources, fetchRange, context) { + var hash = {}; + for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) { + var source = sources_1[_i]; + hash[source.sourceId] = source; + } + if (fetchRange) { + hash = fetchDirtySources(hash, fetchRange, context); + } + return __assign(__assign({}, eventSourceHash), hash); + } + function removeSource(eventSourceHash, sourceId) { + return filterHash(eventSourceHash, function (eventSource) { return eventSource.sourceId !== sourceId; }); + } + function fetchDirtySources(sourceHash, fetchRange, context) { + return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) { return isSourceDirty(eventSource, fetchRange, context); }), fetchRange, false, context); + } + function isSourceDirty(eventSource, fetchRange, context) { + if (!doesSourceNeedRange(eventSource, context)) { + return !eventSource.latestFetchId; + } + return !context.options.lazyFetching || + !eventSource.fetchRange || + eventSource.isFetching || // always cancel outdated in-progress fetches + fetchRange.start < eventSource.fetchRange.start || + fetchRange.end > eventSource.fetchRange.end; + } + function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) { + var nextSources = {}; + for (var sourceId in prevSources) { + var source = prevSources[sourceId]; + if (sourceIdHash[sourceId]) { + nextSources[sourceId] = fetchSource$1(source, fetchRange, isRefetch, context); + } + else { + nextSources[sourceId] = source; + } + } + return nextSources; + } + function fetchSource$1(eventSource, fetchRange, isRefetch, context) { + var options = context.options, calendarApi = context.calendarApi; + var sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId]; + var fetchId = guid(); + sourceDef.fetch({ + eventSource: eventSource, + range: fetchRange, + isRefetch: isRefetch, + context: context, + }, function (res) { + var rawEvents = res.rawEvents; + if (options.eventSourceSuccess) { + rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.xhr) || rawEvents; + } + if (eventSource.success) { + rawEvents = eventSource.success.call(calendarApi, rawEvents, res.xhr) || rawEvents; + } + context.dispatch({ + type: 'RECEIVE_EVENTS', + sourceId: eventSource.sourceId, + fetchId: fetchId, + fetchRange: fetchRange, + rawEvents: rawEvents, + }); + }, function (error) { + console.warn(error.message, error); + if (options.eventSourceFailure) { + options.eventSourceFailure.call(calendarApi, error); + } + if (eventSource.failure) { + eventSource.failure(error); + } + context.dispatch({ + type: 'RECEIVE_EVENT_ERROR', + sourceId: eventSource.sourceId, + fetchId: fetchId, + fetchRange: fetchRange, + error: error, + }); + }); + return __assign(__assign({}, eventSource), { isFetching: true, latestFetchId: fetchId }); + } + function receiveResponse$1(sourceHash, sourceId, fetchId, fetchRange) { + var _a; + var eventSource = sourceHash[sourceId]; + if (eventSource && // not already removed + fetchId === eventSource.latestFetchId) { + return __assign(__assign({}, sourceHash), (_a = {}, _a[sourceId] = __assign(__assign({}, eventSource), { isFetching: false, fetchRange: fetchRange }), _a)); + } + return sourceHash; + } + function excludeStaticSources(eventSources, context) { + return filterHash(eventSources, function (eventSource) { return doesSourceNeedRange(eventSource, context); }); + } + function parseInitialSources(rawOptions, context) { + var refiners = buildEventSourceRefiners(context); + var rawSources = [].concat(rawOptions.eventSources || []); + var sources = []; // parsed + if (rawOptions.initialEvents) { + rawSources.unshift(rawOptions.initialEvents); + } + if (rawOptions.events) { + rawSources.unshift(rawOptions.events); + } + for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) { + var rawSource = rawSources_1[_i]; + var source = parseEventSource(rawSource, context, refiners); + if (source) { + sources.push(source); + } + } + return sources; + } + function doesSourceNeedRange(eventSource, context) { + var defs = context.pluginHooks.eventSourceDefs; + return !defs[eventSource.sourceDefId].ignoreRange; + } + + function reduceEventStore(eventStore, action, eventSources, dateProfile, context) { + switch (action.type) { + case 'RECEIVE_EVENTS': // raw + return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context); + case 'ADD_EVENTS': // already parsed, but not expanded + return addEvent(eventStore, action.eventStore, // new ones + dateProfile ? dateProfile.activeRange : null, context); + case 'RESET_EVENTS': + return action.eventStore; + case 'MERGE_EVENTS': // already parsed and expanded + return mergeEventStores(eventStore, action.eventStore); + case 'PREV': // TODO: how do we track all actions that affect dateProfile :( + case 'NEXT': + case 'CHANGE_DATE': + case 'CHANGE_VIEW_TYPE': + if (dateProfile) { + return expandRecurring(eventStore, dateProfile.activeRange, context); + } + return eventStore; + case 'REMOVE_EVENTS': + return excludeSubEventStore(eventStore, action.eventStore); + case 'REMOVE_EVENT_SOURCE': + return excludeEventsBySourceId(eventStore, action.sourceId); + case 'REMOVE_ALL_EVENT_SOURCES': + return filterEventStoreDefs(eventStore, function (eventDef) { return (!eventDef.sourceId // only keep events with no source id + ); }); + case 'REMOVE_ALL_EVENTS': + return createEmptyEventStore(); + default: + return eventStore; + } + } + function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) { + if (eventSource && // not already removed + fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources + ) { + var subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context); + if (fetchRange) { + subset = expandRecurring(subset, fetchRange, context); + } + return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); + } + return eventStore; + } + function transformRawEvents(rawEvents, eventSource, context) { + var calEachTransform = context.options.eventDataTransform; + var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; + if (sourceEachTransform) { + rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); + } + if (calEachTransform) { + rawEvents = transformEachRawEvent(rawEvents, calEachTransform); + } + return rawEvents; + } + function transformEachRawEvent(rawEvents, func) { + var refinedEvents; + if (!func) { + refinedEvents = rawEvents; + } + else { + refinedEvents = []; + for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { + var rawEvent = rawEvents_1[_i]; + var refinedEvent = func(rawEvent); + if (refinedEvent) { + refinedEvents.push(refinedEvent); + } + else if (refinedEvent == null) { + refinedEvents.push(rawEvent); + } // if a different falsy value, do nothing + } + } + return refinedEvents; + } + function addEvent(eventStore, subset, expandRange, context) { + if (expandRange) { + subset = expandRecurring(subset, expandRange, context); + } + return mergeEventStores(eventStore, subset); + } + function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) { + var defs = eventStore.defs; + var instances = mapHash(eventStore.instances, function (instance) { + var def = defs[instance.defId]; + if (def.allDay || def.recurringDef) { + return instance; // isn't dependent on timezone + } + return __assign(__assign({}, instance), { range: { + start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), + end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)), + }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); + }); + return { defs: defs, instances: instances }; + } + function excludeEventsBySourceId(eventStore, sourceId) { + return filterEventStoreDefs(eventStore, function (eventDef) { return eventDef.sourceId !== sourceId; }); + } + // QUESTION: why not just return instances? do a general object-property-exclusion util + function excludeInstances(eventStore, removals) { + return { + defs: eventStore.defs, + instances: filterHash(eventStore.instances, function (instance) { return !removals[instance.instanceId]; }), + }; + } + + function reduceDateSelection(currentSelection, action) { + switch (action.type) { + case 'UNSELECT_DATES': + return null; + case 'SELECT_DATES': + return action.selection; + default: + return currentSelection; + } + } + + function reduceSelectedEvent(currentInstanceId, action) { + switch (action.type) { + case 'UNSELECT_EVENT': + return ''; + case 'SELECT_EVENT': + return action.eventInstanceId; + default: + return currentInstanceId; + } + } + + function reduceEventDrag(currentDrag, action) { + var newDrag; + switch (action.type) { + case 'UNSET_EVENT_DRAG': + return null; + case 'SET_EVENT_DRAG': + newDrag = action.state; + return { + affectedEvents: newDrag.affectedEvents, + mutatedEvents: newDrag.mutatedEvents, + isEvent: newDrag.isEvent, + }; + default: + return currentDrag; + } + } + + function reduceEventResize(currentResize, action) { + var newResize; + switch (action.type) { + case 'UNSET_EVENT_RESIZE': + return null; + case 'SET_EVENT_RESIZE': + newResize = action.state; + return { + affectedEvents: newResize.affectedEvents, + mutatedEvents: newResize.mutatedEvents, + isEvent: newResize.isEvent, + }; + default: + return currentResize; + } + } + + function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { + var header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; + var footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; + return { header: header, footer: footer }; + } + function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { + var sectionWidgets = {}; + var viewsWithButtons = []; + var hasTitle = false; + for (var sectionName in sectionStrHash) { + var sectionStr = sectionStrHash[sectionName]; + var sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi); + sectionWidgets[sectionName] = sectionRes.widgets; + viewsWithButtons.push.apply(viewsWithButtons, sectionRes.viewsWithButtons); + hasTitle = hasTitle || sectionRes.hasTitle; + } + return { sectionWidgets: sectionWidgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; + } + /* + BAD: querying icons and text here. should be done at render time + */ + function parseSection(sectionStr, calendarOptions, // defaults+overrides, then refined + calendarOptionOverrides, // overrides only!, unrefined :( + theme, viewSpecs, calendarApi) { + var isRtl = calendarOptions.direction === 'rtl'; + var calendarCustomButtons = calendarOptions.customButtons || {}; + var calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {}; + var calendarButtonText = calendarOptions.buttonText || {}; + var calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {}; + var calendarButtonHints = calendarOptions.buttonHints || {}; + var sectionSubstrs = sectionStr ? sectionStr.split(' ') : []; + var viewsWithButtons = []; + var hasTitle = false; + var widgets = sectionSubstrs.map(function (buttonGroupStr) { return (buttonGroupStr.split(',').map(function (buttonName) { + if (buttonName === 'title') { + hasTitle = true; + return { buttonName: buttonName }; + } + var customButtonProps; + var viewSpec; + var buttonClick; + var buttonIcon; // only one of these will be set + var buttonText; // " + var buttonHint; + // ^ for the title="" attribute, for accessibility + if ((customButtonProps = calendarCustomButtons[buttonName])) { + buttonClick = function (ev) { + if (customButtonProps.click) { + customButtonProps.click.call(ev.target, ev, ev.target); // TODO: use Calendar this context? + } + }; + (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || + (buttonIcon = theme.getIconClass(buttonName, isRtl)) || + (buttonText = customButtonProps.text); + buttonHint = customButtonProps.hint || customButtonProps.text; + } + else if ((viewSpec = viewSpecs[buttonName])) { + viewsWithButtons.push(buttonName); + buttonClick = function () { + calendarApi.changeView(buttonName); + }; + (buttonText = viewSpec.buttonTextOverride) || + (buttonIcon = theme.getIconClass(buttonName, isRtl)) || + (buttonText = viewSpec.buttonTextDefault); + var textFallback = viewSpec.buttonTextOverride || + viewSpec.buttonTextDefault; + buttonHint = formatWithOrdinals(viewSpec.buttonTitleOverride || + viewSpec.buttonTitleDefault || + calendarOptions.viewHint, [textFallback, buttonName], // view-name = buttonName + textFallback); + } + else if (calendarApi[buttonName]) { // a calendarApi method + buttonClick = function () { + calendarApi[buttonName](); + }; + (buttonText = calendarButtonTextOverrides[buttonName]) || + (buttonIcon = theme.getIconClass(buttonName, isRtl)) || + (buttonText = calendarButtonText[buttonName]); // everything else is considered default + if (buttonName === 'prevYear' || buttonName === 'nextYear') { + var prevOrNext = buttonName === 'prevYear' ? 'prev' : 'next'; + buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || + calendarButtonHints[prevOrNext], [ + calendarButtonText.year || 'year', + 'year', + ], calendarButtonText[buttonName]); + } + else { + buttonHint = function (navUnit) { return formatWithOrdinals(calendarButtonHintOverrides[buttonName] || + calendarButtonHints[buttonName], [ + calendarButtonText[navUnit] || navUnit, + navUnit, + ], calendarButtonText[buttonName]); }; + } + } + return { buttonName: buttonName, buttonClick: buttonClick, buttonIcon: buttonIcon, buttonText: buttonText, buttonHint: buttonHint }; + })); }); + return { widgets: widgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; + } + + var eventSourceDef$3 = { + ignoreRange: true, + parseMeta: function (refined) { + if (Array.isArray(refined.events)) { + return refined.events; + } + return null; + }, + fetch: function (arg, success) { + success({ + rawEvents: arg.eventSource.meta, + }); + }, + }; + var arrayEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef$3], + }); + + var eventSourceDef$2 = { + parseMeta: function (refined) { + if (typeof refined.events === 'function') { + return refined.events; + } + return null; + }, + fetch: function (arg, success, failure) { + var dateEnv = arg.context.dateEnv; + var func = arg.eventSource.meta; + unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), function (rawEvents) { + success({ rawEvents: rawEvents }); // needs an object response + }, failure); + }, + }; + var funcEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef$2], + }); + + function requestJson(method, url, params, successCallback, failureCallback) { + method = method.toUpperCase(); + var body = null; + if (method === 'GET') { + url = injectQueryStringParams(url, params); + } + else { + body = encodeParams(params); + } + var xhr = new XMLHttpRequest(); + xhr.open(method, url, true); + if (method !== 'GET') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + } + xhr.onload = function () { + if (xhr.status >= 200 && xhr.status < 400) { + var parsed = false; + var res = void 0; + try { + res = JSON.parse(xhr.responseText); + parsed = true; + } + catch (err) { + // will handle parsed=false + } + if (parsed) { + successCallback(res, xhr); + } + else { + failureCallback('Failure parsing JSON', xhr); + } + } + else { + failureCallback('Request failed', xhr); + } + }; + xhr.onerror = function () { + failureCallback('Request failed', xhr); + }; + xhr.send(body); + } + function injectQueryStringParams(url, params) { + return url + + (url.indexOf('?') === -1 ? '?' : '&') + + encodeParams(params); + } + function encodeParams(params) { + var parts = []; + for (var key in params) { + parts.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key])); + } + return parts.join('&'); + } + + var JSON_FEED_EVENT_SOURCE_REFINERS = { + method: String, + extraParams: identity, + startParam: String, + endParam: String, + timeZoneParam: String, + }; + + var eventSourceDef$1 = { + parseMeta: function (refined) { + if (refined.url && (refined.format === 'json' || !refined.format)) { + return { + url: refined.url, + format: 'json', + method: (refined.method || 'GET').toUpperCase(), + extraParams: refined.extraParams, + startParam: refined.startParam, + endParam: refined.endParam, + timeZoneParam: refined.timeZoneParam, + }; + } + return null; + }, + fetch: function (arg, success, failure) { + var meta = arg.eventSource.meta; + var requestParams = buildRequestParams$2(meta, arg.range, arg.context); + requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) { + success({ rawEvents: rawEvents, xhr: xhr }); + }, function (errorMessage, xhr) { + failure({ message: errorMessage, xhr: xhr }); + }); + }, + }; + var jsonFeedEventSourcePlugin = createPlugin({ + eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS, + eventSourceDefs: [eventSourceDef$1], + }); + function buildRequestParams$2(meta, range, context) { + var dateEnv = context.dateEnv, options = context.options; + var startParam; + var endParam; + var timeZoneParam; + var customRequestParams; + var params = {}; + startParam = meta.startParam; + if (startParam == null) { + startParam = options.startParam; + } + endParam = meta.endParam; + if (endParam == null) { + endParam = options.endParam; + } + timeZoneParam = meta.timeZoneParam; + if (timeZoneParam == null) { + timeZoneParam = options.timeZoneParam; + } + // retrieve any outbound GET/POST data from the options + if (typeof meta.extraParams === 'function') { + // supplied as a function that returns a key/value object + customRequestParams = meta.extraParams(); + } + else { + // probably supplied as a straight key/value object + customRequestParams = meta.extraParams || {}; + } + __assign(params, customRequestParams); + params[startParam] = dateEnv.formatIso(range.start); + params[endParam] = dateEnv.formatIso(range.end); + if (dateEnv.timeZone !== 'local') { + params[timeZoneParam] = dateEnv.timeZone; + } + return params; + } + + var SIMPLE_RECURRING_REFINERS = { + daysOfWeek: identity, + startTime: createDuration, + endTime: createDuration, + duration: createDuration, + startRecur: identity, + endRecur: identity, + }; + + var recurring = { + parse: function (refined, dateEnv) { + if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) { + var recurringData = { + daysOfWeek: refined.daysOfWeek || null, + startTime: refined.startTime || null, + endTime: refined.endTime || null, + startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null, + endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null, + }; + var duration = void 0; + if (refined.duration) { + duration = refined.duration; + } + if (!duration && refined.startTime && refined.endTime) { + duration = subtractDurations(refined.endTime, refined.startTime); + } + return { + allDayGuess: Boolean(!refined.startTime && !refined.endTime), + duration: duration, + typeData: recurringData, // doesn't need endTime anymore but oh well + }; + } + return null; + }, + expand: function (typeData, framingRange, dateEnv) { + var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); + if (clippedFramingRange) { + return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); + } + return []; + }, + }; + var simpleRecurringEventsPlugin = createPlugin({ + recurringTypes: [recurring], + eventRefiners: SIMPLE_RECURRING_REFINERS, + }); + function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { + var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; + var dayMarker = startOfDay(framingRange.start); + var endMarker = framingRange.end; + var instanceStarts = []; + while (dayMarker < endMarker) { + var instanceStart + // if everyday, or this particular day-of-week + = void 0; + // if everyday, or this particular day-of-week + if (!dowHash || dowHash[dayMarker.getUTCDay()]) { + if (startTime) { + instanceStart = dateEnv.add(dayMarker, startTime); + } + else { + instanceStart = dayMarker; + } + instanceStarts.push(instanceStart); + } + dayMarker = addDays(dayMarker, 1); + } + return instanceStarts; + } + + var changeHandlerPlugin = createPlugin({ + optionChangeHandlers: { + events: function (events, context) { + handleEventSources([events], context); + }, + eventSources: handleEventSources, + }, + }); + /* + BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out + */ + function handleEventSources(inputs, context) { + var unfoundSources = hashValuesToArray(context.getCurrentData().eventSources); + var newInputs = []; + for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { + var input = inputs_1[_i]; + var inputFound = false; + for (var i = 0; i < unfoundSources.length; i += 1) { + if (unfoundSources[i]._raw === input) { + unfoundSources.splice(i, 1); // delete + inputFound = true; + break; + } + } + if (!inputFound) { + newInputs.push(input); + } + } + for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) { + var unfoundSource = unfoundSources_1[_a]; + context.dispatch({ + type: 'REMOVE_EVENT_SOURCE', + sourceId: unfoundSource.sourceId, + }); + } + for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) { + var newInput = newInputs_1[_b]; + context.calendarApi.addEventSource(newInput); + } + } + + function handleDateProfile(dateProfile, context) { + context.emitter.trigger('datesSet', __assign(__assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi })); + } + + function handleEventStore(eventStore, context) { + var emitter = context.emitter; + if (emitter.hasHandlers('eventsSet')) { + emitter.trigger('eventsSet', buildEventApis(eventStore, context)); + } + } + + /* + this array is exposed on the root namespace so that UMD plugins can add to it. + see the rollup-bundles script. + */ + var globalPlugins = [ + arrayEventSourcePlugin, + funcEventSourcePlugin, + jsonFeedEventSourcePlugin, + simpleRecurringEventsPlugin, + changeHandlerPlugin, + createPlugin({ + isLoadingFuncs: [ + function (state) { return computeEventSourcesLoading(state.eventSources); }, + ], + contentTypeHandlers: { + html: buildHtmlRenderer, + domNodes: buildDomNodeRenderer, + }, + propSetHandlers: { + dateProfile: handleDateProfile, + eventStore: handleEventStore, + }, + }), + ]; + function buildHtmlRenderer() { + var currentEl = null; + var currentHtml = ''; + function render(el, html) { + if (el !== currentEl || html !== currentHtml) { + el.innerHTML = html; + } + currentEl = el; + currentHtml = html; + } + function destroy() { + currentEl.innerHTML = ''; + currentEl = null; + currentHtml = ''; + } + return { render: render, destroy: destroy }; + } + function buildDomNodeRenderer() { + var currentEl = null; + var currentDomNodes = []; + function render(el, domNodes) { + var newDomNodes = Array.prototype.slice.call(domNodes); + if (el !== currentEl || !isArraysEqual(currentDomNodes, newDomNodes)) { + // append first, remove second (for scroll resetting) + for (var _i = 0, newDomNodes_1 = newDomNodes; _i < newDomNodes_1.length; _i++) { + var newNode = newDomNodes_1[_i]; + el.appendChild(newNode); + } + destroy(); + } + currentEl = el; + currentDomNodes = newDomNodes; + } + function destroy() { + currentDomNodes.forEach(removeElement); + currentDomNodes = []; + currentEl = null; + } + return { render: render, destroy: destroy }; + } + + var DelayedRunner = /** @class */ (function () { + function DelayedRunner(drainedOption) { + this.drainedOption = drainedOption; + this.isRunning = false; + this.isDirty = false; + this.pauseDepths = {}; + this.timeoutId = 0; + } + DelayedRunner.prototype.request = function (delay) { + this.isDirty = true; + if (!this.isPaused()) { + this.clearTimeout(); + if (delay == null) { + this.tryDrain(); + } + else { + this.timeoutId = setTimeout(// NOT OPTIMAL! TODO: look at debounce + this.tryDrain.bind(this), delay); + } + } + }; + DelayedRunner.prototype.pause = function (scope) { + if (scope === void 0) { scope = ''; } + var pauseDepths = this.pauseDepths; + pauseDepths[scope] = (pauseDepths[scope] || 0) + 1; + this.clearTimeout(); + }; + DelayedRunner.prototype.resume = function (scope, force) { + if (scope === void 0) { scope = ''; } + var pauseDepths = this.pauseDepths; + if (scope in pauseDepths) { + if (force) { + delete pauseDepths[scope]; + } + else { + pauseDepths[scope] -= 1; + var depth = pauseDepths[scope]; + if (depth <= 0) { + delete pauseDepths[scope]; + } + } + this.tryDrain(); + } + }; + DelayedRunner.prototype.isPaused = function () { + return Object.keys(this.pauseDepths).length; + }; + DelayedRunner.prototype.tryDrain = function () { + if (!this.isRunning && !this.isPaused()) { + this.isRunning = true; + while (this.isDirty) { + this.isDirty = false; + this.drained(); // might set isDirty to true again + } + this.isRunning = false; + } + }; + DelayedRunner.prototype.clear = function () { + this.clearTimeout(); + this.isDirty = false; + this.pauseDepths = {}; + }; + DelayedRunner.prototype.clearTimeout = function () { + if (this.timeoutId) { + clearTimeout(this.timeoutId); + this.timeoutId = 0; + } + }; + DelayedRunner.prototype.drained = function () { + if (this.drainedOption) { + this.drainedOption(); + } + }; + return DelayedRunner; + }()); + + var TaskRunner = /** @class */ (function () { + function TaskRunner(runTaskOption, drainedOption) { + this.runTaskOption = runTaskOption; + this.drainedOption = drainedOption; + this.queue = []; + this.delayedRunner = new DelayedRunner(this.drain.bind(this)); + } + TaskRunner.prototype.request = function (task, delay) { + this.queue.push(task); + this.delayedRunner.request(delay); + }; + TaskRunner.prototype.pause = function (scope) { + this.delayedRunner.pause(scope); + }; + TaskRunner.prototype.resume = function (scope, force) { + this.delayedRunner.resume(scope, force); + }; + TaskRunner.prototype.drain = function () { + var queue = this.queue; + while (queue.length) { + var completedTasks = []; + var task = void 0; + while ((task = queue.shift())) { + this.runTask(task); + completedTasks.push(task); + } + this.drained(completedTasks); + } // keep going, in case new tasks were added in the drained handler + }; + TaskRunner.prototype.runTask = function (task) { + if (this.runTaskOption) { + this.runTaskOption(task); + } + }; + TaskRunner.prototype.drained = function (completedTasks) { + if (this.drainedOption) { + this.drainedOption(completedTasks); + } + }; + return TaskRunner; + }()); + + // Computes what the title at the top of the calendarApi should be for this view + function buildTitle(dateProfile, viewOptions, dateEnv) { + var range; + // for views that span a large unit of time, show the proper interval, ignoring stray days before and after + if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { + range = dateProfile.currentRange; + } + else { // for day units or smaller, use the actual day range + range = dateProfile.activeRange; + } + return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), { + isEndExclusive: dateProfile.isRangeAllDay, + defaultSeparator: viewOptions.titleRangeSeparator, + }); + } + // Generates the format string that should be used to generate the title for the current date range. + // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. + function buildTitleFormat(dateProfile) { + var currentRangeUnit = dateProfile.currentRangeUnit; + if (currentRangeUnit === 'year') { + return { year: 'numeric' }; + } + if (currentRangeUnit === 'month') { + return { year: 'numeric', month: 'long' }; // like "September 2014" + } + var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); + if (days !== null && days > 1) { + // multi-day range. shorter, like "Sep 9 - 10 2014" + return { year: 'numeric', month: 'short', day: 'numeric' }; + } + // one day. longer, like "September 9 2014" + return { year: 'numeric', month: 'long', day: 'numeric' }; + } + + // in future refactor, do the redux-style function(state=initial) for initial-state + // also, whatever is happening in constructor, have it happen in action queue too + var CalendarDataManager = /** @class */ (function () { + function CalendarDataManager(props) { + var _this = this; + this.computeOptionsData = memoize(this._computeOptionsData); + this.computeCurrentViewData = memoize(this._computeCurrentViewData); + this.organizeRawLocales = memoize(organizeRawLocales); + this.buildLocale = memoize(buildLocale); + this.buildPluginHooks = buildBuildPluginHooks(); + this.buildDateEnv = memoize(buildDateEnv); + this.buildTheme = memoize(buildTheme); + this.parseToolbars = memoize(parseToolbars); + this.buildViewSpecs = memoize(buildViewSpecs); + this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator); + this.buildViewApi = memoize(buildViewApi); + this.buildViewUiProps = memoizeObjArg(buildViewUiProps); + this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual); + this.buildEventUiBases = memoize(buildEventUiBases); + this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours); + this.buildTitle = memoize(buildTitle); + this.emitter = new Emitter(); + this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this)); + this.currentCalendarOptionsInput = {}; + this.currentCalendarOptionsRefined = {}; + this.currentViewOptionsInput = {}; + this.currentViewOptionsRefined = {}; + this.currentCalendarOptionsRefiners = {}; + this.getCurrentData = function () { return _this.data; }; + this.dispatch = function (action) { + _this.actionRunner.request(action); // protects against recursive calls to _handleAction + }; + this.props = props; + this.actionRunner.pause(); + var dynamicOptionOverrides = {}; + var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); + var currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView; + var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); + // wire things up + // TODO: not DRY + props.calendarApi.currentDataManager = this; + this.emitter.setThisContext(props.calendarApi); + this.emitter.setOptions(currentViewData.options); + var currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv); + var dateProfile = currentViewData.dateProfileGenerator.build(currentDate); + if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) { + currentDate = dateProfile.currentRange.start; + } + var calendarContext = { + dateEnv: optionsData.dateEnv, + options: optionsData.calendarOptions, + pluginHooks: optionsData.pluginHooks, + calendarApi: props.calendarApi, + dispatch: this.dispatch, + emitter: this.emitter, + getCurrentData: this.getCurrentData, + }; + // needs to be after setThisContext + for (var _i = 0, _a = optionsData.pluginHooks.contextInit; _i < _a.length; _i++) { + var callback = _a[_i]; + callback(calendarContext); + } + // NOT DRY + var eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext); + var initialState = { + dynamicOptionOverrides: dynamicOptionOverrides, + currentViewType: currentViewType, + currentDate: currentDate, + dateProfile: dateProfile, + businessHours: this.parseContextBusinessHours(calendarContext), + eventSources: eventSources, + eventUiBases: {}, + eventStore: createEmptyEventStore(), + renderableEventStore: createEmptyEventStore(), + dateSelection: null, + eventSelection: '', + eventDrag: null, + eventResize: null, + selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig, + }; + var contextAndState = __assign(__assign({}, calendarContext), initialState); + for (var _b = 0, _c = optionsData.pluginHooks.reducers; _b < _c.length; _b++) { + var reducer = _c[_b]; + __assign(initialState, reducer(null, null, contextAndState)); + } + if (computeIsLoading(initialState, calendarContext)) { + this.emitter.trigger('loading', true); // NOT DRY + } + this.state = initialState; + this.updateData(); + this.actionRunner.resume(); + } + CalendarDataManager.prototype.resetOptions = function (optionOverrides, append) { + var props = this.props; + props.optionOverrides = append + ? __assign(__assign({}, props.optionOverrides), optionOverrides) : optionOverrides; + this.actionRunner.request({ + type: 'NOTHING', + }); + }; + CalendarDataManager.prototype._handleAction = function (action) { + var _a = this, props = _a.props, state = _a.state, emitter = _a.emitter; + var dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action); + var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); + var currentViewType = reduceViewType(state.currentViewType, action); + var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); + // wire things up + // TODO: not DRY + props.calendarApi.currentDataManager = this; + emitter.setThisContext(props.calendarApi); + emitter.setOptions(currentViewData.options); + var calendarContext = { + dateEnv: optionsData.dateEnv, + options: optionsData.calendarOptions, + pluginHooks: optionsData.pluginHooks, + calendarApi: props.calendarApi, + dispatch: this.dispatch, + emitter: emitter, + getCurrentData: this.getCurrentData, + }; + var currentDate = state.currentDate, dateProfile = state.dateProfile; + if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { // hack + dateProfile = currentViewData.dateProfileGenerator.build(currentDate); + } + currentDate = reduceCurrentDate(currentDate, action); + dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator); + if (action.type === 'PREV' || // TODO: move this logic into DateProfileGenerator + action.type === 'NEXT' || // " + !rangeContainsMarker(dateProfile.currentRange, currentDate)) { + currentDate = dateProfile.currentRange.start; + } + var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext); + var eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext); + var isEventsLoading = computeEventSourcesLoading(eventSources); // BAD. also called in this func in computeIsLoading + var renderableEventStore = (isEventsLoading && !currentViewData.options.progressiveEventRendering) ? + (state.renderableEventStore || eventStore) : // try from previous state + eventStore; + var _b = this.buildViewUiProps(calendarContext), eventUiSingleBase = _b.eventUiSingleBase, selectionConfig = _b.selectionConfig; // will memoize obj + var eventUiBySource = this.buildEventUiBySource(eventSources); + var eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); + var newState = { + dynamicOptionOverrides: dynamicOptionOverrides, + currentViewType: currentViewType, + currentDate: currentDate, + dateProfile: dateProfile, + eventSources: eventSources, + eventStore: eventStore, + renderableEventStore: renderableEventStore, + selectionConfig: selectionConfig, + eventUiBases: eventUiBases, + businessHours: this.parseContextBusinessHours(calendarContext), + dateSelection: reduceDateSelection(state.dateSelection, action), + eventSelection: reduceSelectedEvent(state.eventSelection, action), + eventDrag: reduceEventDrag(state.eventDrag, action), + eventResize: reduceEventResize(state.eventResize, action), + }; + var contextAndState = __assign(__assign({}, calendarContext), newState); + for (var _i = 0, _c = optionsData.pluginHooks.reducers; _i < _c.length; _i++) { + var reducer = _c[_i]; + __assign(newState, reducer(state, action, contextAndState)); // give the OLD state, for old value + } + var wasLoading = computeIsLoading(state, calendarContext); + var isLoading = computeIsLoading(newState, calendarContext); + // TODO: use propSetHandlers in plugin system + if (!wasLoading && isLoading) { + emitter.trigger('loading', true); + } + else if (wasLoading && !isLoading) { + emitter.trigger('loading', false); + } + this.state = newState; + if (props.onAction) { + props.onAction(action); + } + }; + CalendarDataManager.prototype.updateData = function () { + var _a = this, props = _a.props, state = _a.state; + var oldData = this.data; + var optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi); + var currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides); + var data = this.data = __assign(__assign(__assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state); + var changeHandlers = optionsData.pluginHooks.optionChangeHandlers; + var oldCalendarOptions = oldData && oldData.calendarOptions; + var newCalendarOptions = optionsData.calendarOptions; + if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) { + if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) { + // hack + state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data); + state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv); + } + for (var optionName in changeHandlers) { + if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { + changeHandlers[optionName](newCalendarOptions[optionName], data); + } + } + } + if (props.onData) { + props.onData(data); + } + }; + CalendarDataManager.prototype._computeOptionsData = function (optionOverrides, dynamicOptionOverrides, calendarApi) { + // TODO: blacklist options that are handled by optionChangeHandlers + var _a = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, pluginHooks = _a.pluginHooks, localeDefaults = _a.localeDefaults, availableLocaleData = _a.availableLocaleData, extra = _a.extra; + warnUnknownOptions(extra); + var dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator); + var viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults); + var theme = this.buildTheme(refinedOptions, pluginHooks); + var toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi); + return { + calendarOptions: refinedOptions, + pluginHooks: pluginHooks, + dateEnv: dateEnv, + viewSpecs: viewSpecs, + theme: theme, + toolbarConfig: toolbarConfig, + localeDefaults: localeDefaults, + availableRawLocales: availableLocaleData.map, + }; + }; + // always called from behind a memoizer + CalendarDataManager.prototype.processRawCalendarOptions = function (optionOverrides, dynamicOptionOverrides) { + var _a = mergeRawOptions([ + BASE_OPTION_DEFAULTS, + optionOverrides, + dynamicOptionOverrides, + ]), locales = _a.locales, locale = _a.locale; + var availableLocaleData = this.organizeRawLocales(locales); + var availableRawLocales = availableLocaleData.map; + var localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options; + var pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins); + var refiners = this.currentCalendarOptionsRefiners = __assign(__assign(__assign(__assign(__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); + var extra = {}; + var raw = mergeRawOptions([ + BASE_OPTION_DEFAULTS, + localeDefaults, + optionOverrides, + dynamicOptionOverrides, + ]); + var refined = {}; + var currentRaw = this.currentCalendarOptionsInput; + var currentRefined = this.currentCalendarOptionsRefined; + var anyChanges = false; + for (var optionName in raw) { + if (optionName !== 'plugins') { // because plugins is special-cased + if (raw[optionName] === currentRaw[optionName] || + (COMPLEX_OPTION_COMPARATORS[optionName] && + (optionName in currentRaw) && + COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) { + refined[optionName] = currentRefined[optionName]; + } + else if (refiners[optionName]) { + refined[optionName] = refiners[optionName](raw[optionName]); + anyChanges = true; + } + else { + extra[optionName] = currentRaw[optionName]; + } + } + } + if (anyChanges) { + this.currentCalendarOptionsInput = raw; + this.currentCalendarOptionsRefined = refined; + } + return { + rawOptions: this.currentCalendarOptionsInput, + refinedOptions: this.currentCalendarOptionsRefined, + pluginHooks: pluginHooks, + availableLocaleData: availableLocaleData, + localeDefaults: localeDefaults, + extra: extra, + }; + }; + CalendarDataManager.prototype._computeCurrentViewData = function (viewType, optionsData, optionOverrides, dynamicOptionOverrides) { + var viewSpec = optionsData.viewSpecs[viewType]; + if (!viewSpec) { + throw new Error("viewType \"" + viewType + "\" is not available. Please make sure you've loaded all neccessary plugins"); + } + var _a = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, extra = _a.extra; + warnUnknownOptions(extra); + var dateProfileGenerator = this.buildDateProfileGenerator({ + dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass, + duration: viewSpec.duration, + durationUnit: viewSpec.durationUnit, + usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime, + dateEnv: optionsData.dateEnv, + calendarApi: this.props.calendarApi, + slotMinTime: refinedOptions.slotMinTime, + slotMaxTime: refinedOptions.slotMaxTime, + showNonCurrentDates: refinedOptions.showNonCurrentDates, + dayCount: refinedOptions.dayCount, + dateAlignment: refinedOptions.dateAlignment, + dateIncrement: refinedOptions.dateIncrement, + hiddenDays: refinedOptions.hiddenDays, + weekends: refinedOptions.weekends, + nowInput: refinedOptions.now, + validRangeInput: refinedOptions.validRange, + visibleRangeInput: refinedOptions.visibleRange, + monthMode: refinedOptions.monthMode, + fixedWeekCount: refinedOptions.fixedWeekCount, + }); + var viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv); + return { viewSpec: viewSpec, options: refinedOptions, dateProfileGenerator: dateProfileGenerator, viewApi: viewApi }; + }; + CalendarDataManager.prototype.processRawViewOptions = function (viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) { + var raw = mergeRawOptions([ + BASE_OPTION_DEFAULTS, + viewSpec.optionDefaults, + localeDefaults, + optionOverrides, + viewSpec.optionOverrides, + dynamicOptionOverrides, + ]); + var refiners = __assign(__assign(__assign(__assign(__assign(__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); + var refined = {}; + var currentRaw = this.currentViewOptionsInput; + var currentRefined = this.currentViewOptionsRefined; + var anyChanges = false; + var extra = {}; + for (var optionName in raw) { + if (raw[optionName] === currentRaw[optionName] || + (COMPLEX_OPTION_COMPARATORS[optionName] && + COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName]))) { + refined[optionName] = currentRefined[optionName]; + } + else { + if (raw[optionName] === this.currentCalendarOptionsInput[optionName] || + (COMPLEX_OPTION_COMPARATORS[optionName] && + COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName]))) { + if (optionName in this.currentCalendarOptionsRefined) { // might be an "extra" prop + refined[optionName] = this.currentCalendarOptionsRefined[optionName]; + } + } + else if (refiners[optionName]) { + refined[optionName] = refiners[optionName](raw[optionName]); + } + else { + extra[optionName] = raw[optionName]; + } + anyChanges = true; + } + } + if (anyChanges) { + this.currentViewOptionsInput = raw; + this.currentViewOptionsRefined = refined; + } + return { + rawOptions: this.currentViewOptionsInput, + refinedOptions: this.currentViewOptionsRefined, + extra: extra, + }; + }; + return CalendarDataManager; + }()); + function buildDateEnv(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) { + var locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map); + return new DateEnv({ + calendarSystem: 'gregory', + timeZone: timeZone, + namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl, + locale: locale, + weekNumberCalculation: weekNumberCalculation, + firstDay: firstDay, + weekText: weekText, + cmdFormatter: pluginHooks.cmdFormatter, + defaultSeparator: defaultSeparator, + }); + } + function buildTheme(options, pluginHooks) { + var ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme; + return new ThemeClass(options); + } + function buildDateProfileGenerator(props) { + var DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator; + return new DateProfileGeneratorClass(props); + } + function buildViewApi(type, getCurrentData, dateEnv) { + return new ViewApi(type, getCurrentData, dateEnv); + } + function buildEventUiBySource(eventSources) { + return mapHash(eventSources, function (eventSource) { return eventSource.ui; }); + } + function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { + var eventUiBases = { '': eventUiSingleBase }; + for (var defId in eventDefs) { + var def = eventDefs[defId]; + if (def.sourceId && eventUiBySource[def.sourceId]) { + eventUiBases[defId] = eventUiBySource[def.sourceId]; + } + } + return eventUiBases; + } + function buildViewUiProps(calendarContext) { + var options = calendarContext.options; + return { + eventUiSingleBase: createEventUi({ + display: options.eventDisplay, + editable: options.editable, + startEditable: options.eventStartEditable, + durationEditable: options.eventDurationEditable, + constraint: options.eventConstraint, + overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined, + allow: options.eventAllow, + backgroundColor: options.eventBackgroundColor, + borderColor: options.eventBorderColor, + textColor: options.eventTextColor, + color: options.eventColor, + // classNames: options.eventClassNames // render hook will handle this + }, calendarContext), + selectionConfig: createEventUi({ + constraint: options.selectConstraint, + overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined, + allow: options.selectAllow, + }, calendarContext), + }; + } + function computeIsLoading(state, context) { + for (var _i = 0, _a = context.pluginHooks.isLoadingFuncs; _i < _a.length; _i++) { + var isLoadingFunc = _a[_i]; + if (isLoadingFunc(state)) { + return true; + } + } + return false; + } + function parseContextBusinessHours(calendarContext) { + return parseBusinessHours(calendarContext.options.businessHours, calendarContext); + } + function warnUnknownOptions(options, viewName) { + for (var optionName in options) { + console.warn("Unknown option '" + optionName + "'" + + (viewName ? " for view '" + viewName + "'" : '')); + } + } + + // TODO: move this to react plugin? + var CalendarDataProvider = /** @class */ (function (_super) { + __extends(CalendarDataProvider, _super); + function CalendarDataProvider(props) { + var _this = _super.call(this, props) || this; + _this.handleData = function (data) { + if (!_this.dataManager) { // still within initial run, before assignment in constructor + // eslint-disable-next-line react/no-direct-mutation-state + _this.state = data; // can't use setState yet + } + else { + _this.setState(data); + } + }; + _this.dataManager = new CalendarDataManager({ + optionOverrides: props.optionOverrides, + calendarApi: props.calendarApi, + onData: _this.handleData, + }); + return _this; + } + CalendarDataProvider.prototype.render = function () { + return this.props.children(this.state); + }; + CalendarDataProvider.prototype.componentDidUpdate = function (prevProps) { + var newOptionOverrides = this.props.optionOverrides; + if (newOptionOverrides !== prevProps.optionOverrides) { // prevent recursive handleData + this.dataManager.resetOptions(newOptionOverrides); + } + }; + return CalendarDataProvider; + }(Component)); + + // HELPERS + /* + if nextDayThreshold is specified, slicing is done in an all-day fashion. + you can get nextDayThreshold from context.nextDayThreshold + */ + function sliceEvents(props, allDay) { + return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg; + } + + var NamedTimeZoneImpl = /** @class */ (function () { + function NamedTimeZoneImpl(timeZoneName) { + this.timeZoneName = timeZoneName; + } + return NamedTimeZoneImpl; + }()); + + var SegHierarchy = /** @class */ (function () { + function SegHierarchy() { + // settings + this.strictOrder = false; + this.allowReslicing = false; + this.maxCoord = -1; // -1 means no max + this.maxStackCnt = -1; // -1 means no max + this.levelCoords = []; // ordered + this.entriesByLevel = []; // parallel with levelCoords + this.stackCnts = {}; // TODO: use better technique!? + } + SegHierarchy.prototype.addSegs = function (inputs) { + var hiddenEntries = []; + for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { + var input = inputs_1[_i]; + this.insertEntry(input, hiddenEntries); + } + return hiddenEntries; + }; + SegHierarchy.prototype.insertEntry = function (entry, hiddenEntries) { + var insertion = this.findInsertion(entry); + if (this.isInsertionValid(insertion, entry)) { + this.insertEntryAt(entry, insertion); + return 1; + } + return this.handleInvalidInsertion(insertion, entry, hiddenEntries); + }; + SegHierarchy.prototype.isInsertionValid = function (insertion, entry) { + return (this.maxCoord === -1 || insertion.levelCoord + entry.thickness <= this.maxCoord) && + (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt); + }; + // returns number of new entries inserted + SegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { + if (this.allowReslicing && insertion.touchingEntry) { + return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries); + } + hiddenEntries.push(entry); + return 0; + }; + SegHierarchy.prototype.splitEntry = function (entry, barrier, hiddenEntries) { + var partCnt = 0; + var splitHiddenEntries = []; + var entrySpan = entry.span; + var barrierSpan = barrier.span; + if (entrySpan.start < barrierSpan.start) { + partCnt += this.insertEntry({ + index: entry.index, + thickness: entry.thickness, + span: { start: entrySpan.start, end: barrierSpan.start }, + }, splitHiddenEntries); + } + if (entrySpan.end > barrierSpan.end) { + partCnt += this.insertEntry({ + index: entry.index, + thickness: entry.thickness, + span: { start: barrierSpan.end, end: entrySpan.end }, + }, splitHiddenEntries); + } + if (partCnt) { + hiddenEntries.push.apply(hiddenEntries, __spreadArray([{ + index: entry.index, + thickness: entry.thickness, + span: intersectSpans(barrierSpan, entrySpan), // guaranteed to intersect + }], splitHiddenEntries)); + return partCnt; + } + hiddenEntries.push(entry); + return 0; + }; + SegHierarchy.prototype.insertEntryAt = function (entry, insertion) { + var _a = this, entriesByLevel = _a.entriesByLevel, levelCoords = _a.levelCoords; + if (insertion.lateral === -1) { + // create a new level + insertAt(levelCoords, insertion.level, insertion.levelCoord); + insertAt(entriesByLevel, insertion.level, [entry]); + } + else { + // insert into existing level + insertAt(entriesByLevel[insertion.level], insertion.lateral, entry); + } + this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt; + }; + SegHierarchy.prototype.findInsertion = function (newEntry) { + var _a = this, levelCoords = _a.levelCoords, entriesByLevel = _a.entriesByLevel, strictOrder = _a.strictOrder, stackCnts = _a.stackCnts; + var levelCnt = levelCoords.length; + var candidateCoord = 0; + var touchingLevel = -1; + var touchingLateral = -1; + var touchingEntry = null; + var stackCnt = 0; + for (var trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) { + var trackingCoord = levelCoords[trackingLevel]; + // if the current level is past the placed entry, we have found a good empty space and can stop. + // if strictOrder, keep finding more lateral intersections. + if (!strictOrder && trackingCoord >= candidateCoord + newEntry.thickness) { + break; + } + var trackingEntries = entriesByLevel[trackingLevel]; + var trackingEntry = void 0; + var searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); // find first entry after newEntry's end + var lateralIndex = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one + while ( // loop through entries that horizontally intersect + (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list + trackingEntry.span.start < newEntry.span.end // and not entirely past newEntry + ) { + var trackingEntryBottom = trackingCoord + trackingEntry.thickness; + // intersects into the top of the candidate? + if (trackingEntryBottom > candidateCoord) { + candidateCoord = trackingEntryBottom; + touchingEntry = trackingEntry; + touchingLevel = trackingLevel; + touchingLateral = lateralIndex; + } + // butts up against top of candidate? (will happen if just intersected as well) + if (trackingEntryBottom === candidateCoord) { + // accumulate the highest possible stackCnt of the trackingEntries that butt up + stackCnt = Math.max(stackCnt, stackCnts[buildEntryKey(trackingEntry)] + 1); + } + lateralIndex += 1; + } + } + // the destination level will be after touchingEntry's level. find it + var destLevel = 0; + if (touchingEntry) { + destLevel = touchingLevel + 1; + while (destLevel < levelCnt && levelCoords[destLevel] < candidateCoord) { + destLevel += 1; + } + } + // if adding to an existing level, find where to insert + var destLateral = -1; + if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) { + destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0]; + } + return { + touchingLevel: touchingLevel, + touchingLateral: touchingLateral, + touchingEntry: touchingEntry, + stackCnt: stackCnt, + levelCoord: candidateCoord, + level: destLevel, + lateral: destLateral, + }; + }; + // sorted by levelCoord (lowest to highest) + SegHierarchy.prototype.toRects = function () { + var _a = this, entriesByLevel = _a.entriesByLevel, levelCoords = _a.levelCoords; + var levelCnt = entriesByLevel.length; + var rects = []; + for (var level = 0; level < levelCnt; level += 1) { + var entries = entriesByLevel[level]; + var levelCoord = levelCoords[level]; + for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) { + var entry = entries_1[_i]; + rects.push(__assign(__assign({}, entry), { levelCoord: levelCoord })); + } + } + return rects; + }; + return SegHierarchy; + }()); + function getEntrySpanEnd(entry) { + return entry.span.end; + } + function buildEntryKey(entry) { + return entry.index + ':' + entry.span.start; + } + // returns groups with entries sorted by input order + function groupIntersectingEntries(entries) { + var merges = []; + for (var _i = 0, entries_2 = entries; _i < entries_2.length; _i++) { + var entry = entries_2[_i]; + var filteredMerges = []; + var hungryMerge = { + span: entry.span, + entries: [entry], + }; + for (var _a = 0, merges_1 = merges; _a < merges_1.length; _a++) { + var merge = merges_1[_a]; + if (intersectSpans(merge.span, hungryMerge.span)) { + hungryMerge = { + entries: merge.entries.concat(hungryMerge.entries), + span: joinSpans(merge.span, hungryMerge.span), + }; + } + else { + filteredMerges.push(merge); + } + } + filteredMerges.push(hungryMerge); + merges = filteredMerges; + } + return merges; + } + function joinSpans(span0, span1) { + return { + start: Math.min(span0.start, span1.start), + end: Math.max(span0.end, span1.end), + }; + } + function intersectSpans(span0, span1) { + var start = Math.max(span0.start, span1.start); + var end = Math.min(span0.end, span1.end); + if (start < end) { + return { start: start, end: end }; + } + return null; + } + // general util + // --------------------------------------------------------------------------------------------------------------------- + function insertAt(arr, index, item) { + arr.splice(index, 0, item); + } + function binarySearch(a, searchVal, getItemVal) { + var startIndex = 0; + var endIndex = a.length; // exclusive + if (!endIndex || searchVal < getItemVal(a[startIndex])) { // no items OR before first item + return [0, 0]; + } + if (searchVal > getItemVal(a[endIndex - 1])) { // after last item + return [endIndex, 0]; + } + while (startIndex < endIndex) { + var middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2); + var middleVal = getItemVal(a[middleIndex]); + if (searchVal < middleVal) { + endIndex = middleIndex; + } + else if (searchVal > middleVal) { + startIndex = middleIndex + 1; + } + else { // equal! + return [middleIndex, 1]; + } + } + return [startIndex, 0]; + } + + var Interaction = /** @class */ (function () { + function Interaction(settings) { + this.component = settings.component; + this.isHitComboAllowed = settings.isHitComboAllowed || null; + } + Interaction.prototype.destroy = function () { + }; + return Interaction; + }()); + function parseInteractionSettings(component, input) { + return { + component: component, + el: input.el, + useEventCenter: input.useEventCenter != null ? input.useEventCenter : true, + isHitComboAllowed: input.isHitComboAllowed || null, + }; + } + function interactionSettingsToStore(settings) { + var _a; + return _a = {}, + _a[settings.component.uid] = settings, + _a; + } + // global state + var interactionSettingsStore = {}; + + /* + An abstraction for a dragging interaction originating on an event. + Does higher-level things than PointerDragger, such as possibly: + - a "mirror" that moves with the pointer + - a minimum number of pixels or other criteria for a true drag to begin + + subclasses must emit: + - pointerdown + - dragstart + - dragmove + - pointerup + - dragend + */ + var ElementDragging = /** @class */ (function () { + function ElementDragging(el, selector) { + this.emitter = new Emitter(); + } + ElementDragging.prototype.destroy = function () { + }; + ElementDragging.prototype.setMirrorIsVisible = function (bool) { + // optional if subclass doesn't want to support a mirror + }; + ElementDragging.prototype.setMirrorNeedsRevert = function (bool) { + // optional if subclass doesn't want to support a mirror + }; + ElementDragging.prototype.setAutoScrollEnabled = function (bool) { + // optional + }; + return ElementDragging; + }()); + + // TODO: get rid of this in favor of options system, + // tho it's really easy to access this globally rather than pass thru options. + var config = {}; + + /* + Information about what will happen when an external element is dragged-and-dropped + onto a calendar. Contains information for creating an event. + */ + var DRAG_META_REFINERS = { + startTime: createDuration, + duration: createDuration, + create: Boolean, + sourceId: String, + }; + function parseDragMeta(raw) { + var _a = refineProps(raw, DRAG_META_REFINERS), refined = _a.refined, extra = _a.extra; + return { + startTime: refined.startTime || null, + duration: refined.duration || null, + create: refined.create != null ? refined.create : true, + sourceId: refined.sourceId, + leftoverProps: extra, + }; + } + + var ToolbarSection = /** @class */ (function (_super) { + __extends(ToolbarSection, _super); + function ToolbarSection() { + return _super !== null && _super.apply(this, arguments) || this; + } + ToolbarSection.prototype.render = function () { + var _this = this; + var children = this.props.widgetGroups.map(function (widgetGroup) { return _this.renderWidgetGroup(widgetGroup); }); + return createElement.apply(void 0, __spreadArray(['div', { className: 'fc-toolbar-chunk' }], children)); + }; + ToolbarSection.prototype.renderWidgetGroup = function (widgetGroup) { + var props = this.props; + var theme = this.context.theme; + var children = []; + var isOnlyButtons = true; + for (var _i = 0, widgetGroup_1 = widgetGroup; _i < widgetGroup_1.length; _i++) { + var widget = widgetGroup_1[_i]; + var buttonName = widget.buttonName, buttonClick = widget.buttonClick, buttonText = widget.buttonText, buttonIcon = widget.buttonIcon, buttonHint = widget.buttonHint; + if (buttonName === 'title') { + isOnlyButtons = false; + children.push(createElement("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); + } + else { + var isPressed = buttonName === props.activeButton; + var isDisabled = (!props.isTodayEnabled && buttonName === 'today') || + (!props.isPrevEnabled && buttonName === 'prev') || + (!props.isNextEnabled && buttonName === 'next'); + var buttonClasses = ["fc-" + buttonName + "-button", theme.getClass('button')]; + if (isPressed) { + buttonClasses.push(theme.getClass('buttonActive')); + } + children.push(createElement("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? createElement("span", { className: buttonIcon }) : ''))); + } + } + if (children.length > 1) { + var groupClassName = (isOnlyButtons && theme.getClass('buttonGroup')) || ''; + return createElement.apply(void 0, __spreadArray(['div', { className: groupClassName }], children)); + } + return children[0]; + }; + return ToolbarSection; + }(BaseComponent)); + + var Toolbar = /** @class */ (function (_super) { + __extends(Toolbar, _super); + function Toolbar() { + return _super !== null && _super.apply(this, arguments) || this; + } + Toolbar.prototype.render = function () { + var _a = this.props, model = _a.model, extraClassName = _a.extraClassName; + var forceLtr = false; + var startContent; + var endContent; + var sectionWidgets = model.sectionWidgets; + var centerContent = sectionWidgets.center; + if (sectionWidgets.left) { + forceLtr = true; + startContent = sectionWidgets.left; + } + else { + startContent = sectionWidgets.start; + } + if (sectionWidgets.right) { + forceLtr = true; + endContent = sectionWidgets.right; + } + else { + endContent = sectionWidgets.end; + } + var classNames = [ + extraClassName || '', + 'fc-toolbar', + forceLtr ? 'fc-toolbar-ltr' : '', + ]; + return (createElement("div", { className: classNames.join(' ') }, + this.renderSection('start', startContent || []), + this.renderSection('center', centerContent || []), + this.renderSection('end', endContent || []))); + }; + Toolbar.prototype.renderSection = function (key, widgetGroups) { + var props = this.props; + return (createElement(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId })); + }; + return Toolbar; + }(BaseComponent)); + + // TODO: do function component? + var ViewContainer = /** @class */ (function (_super) { + __extends(ViewContainer, _super); + function ViewContainer() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = { + availableWidth: null, + }; + _this.handleEl = function (el) { + _this.el = el; + setRef(_this.props.elRef, el); + _this.updateAvailableWidth(); + }; + _this.handleResize = function () { + _this.updateAvailableWidth(); + }; + return _this; + } + ViewContainer.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state; + var aspectRatio = props.aspectRatio; + var classNames = [ + 'fc-view-harness', + (aspectRatio || props.liquid || props.height) + ? 'fc-view-harness-active' // harness controls the height + : 'fc-view-harness-passive', // let the view do the height + ]; + var height = ''; + var paddingBottom = ''; + if (aspectRatio) { + if (state.availableWidth !== null) { + height = state.availableWidth / aspectRatio; + } + else { + // while waiting to know availableWidth, we can't set height to *zero* + // because will cause lots of unnecessary scrollbars within scrollgrid. + // BETTER: don't start rendering ANYTHING yet until we know container width + // NOTE: why not always use paddingBottom? Causes height oscillation (issue 5606) + paddingBottom = (1 / aspectRatio) * 100 + "%"; + } + } + else { + height = props.height || ''; + } + return (createElement("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height: height, paddingBottom: paddingBottom } }, props.children)); + }; + ViewContainer.prototype.componentDidMount = function () { + this.context.addResizeHandler(this.handleResize); + }; + ViewContainer.prototype.componentWillUnmount = function () { + this.context.removeResizeHandler(this.handleResize); + }; + ViewContainer.prototype.updateAvailableWidth = function () { + if (this.el && // needed. but why? + this.props.aspectRatio // aspectRatio is the only height setting that needs availableWidth + ) { + this.setState({ availableWidth: this.el.offsetWidth }); + } + }; + return ViewContainer; + }(BaseComponent)); + + /* + Detects when the user clicks on an event within a DateComponent + */ + var EventClicking = /** @class */ (function (_super) { + __extends(EventClicking, _super); + function EventClicking(settings) { + var _this = _super.call(this, settings) || this; + _this.handleSegClick = function (ev, segEl) { + var component = _this.component; + var context = component.context; + var seg = getElSeg(segEl); + if (seg && // might be the
    surrounding the more link + component.isValidSegDownEl(ev.target)) { + // our way to simulate a link click for elements that can't be tags + // grab before trigger fired in case trigger trashes DOM thru rerendering + var hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url'); + var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : ''; + context.emitter.trigger('eventClick', { + el: segEl, + event: new EventApi(component.context, seg.eventRange.def, seg.eventRange.instance), + jsEvent: ev, + view: context.viewApi, + }); + if (url && !ev.defaultPrevented) { + window.location.href = url; + } + } + }; + _this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events + _this.handleSegClick); + return _this; + } + return EventClicking; + }(Interaction)); + + /* + Triggers events and adds/removes core classNames when the user's pointer + enters/leaves event-elements of a component. + */ + var EventHovering = /** @class */ (function (_super) { + __extends(EventHovering, _super); + function EventHovering(settings) { + var _this = _super.call(this, settings) || this; + // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it + _this.handleEventElRemove = function (el) { + if (el === _this.currentSegEl) { + _this.handleSegLeave(null, _this.currentSegEl); + } + }; + _this.handleSegEnter = function (ev, segEl) { + if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper + _this.currentSegEl = segEl; + _this.triggerEvent('eventMouseEnter', ev, segEl); + } + }; + _this.handleSegLeave = function (ev, segEl) { + if (_this.currentSegEl) { + _this.currentSegEl = null; + _this.triggerEvent('eventMouseLeave', ev, segEl); + } + }; + _this.removeHoverListeners = listenToHoverBySelector(settings.el, '.fc-event', // on both fg and bg events + _this.handleSegEnter, _this.handleSegLeave); + return _this; + } + EventHovering.prototype.destroy = function () { + this.removeHoverListeners(); + }; + EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) { + var component = this.component; + var context = component.context; + var seg = getElSeg(segEl); + if (!ev || component.isValidSegDownEl(ev.target)) { + context.emitter.trigger(publicEvName, { + el: segEl, + event: new EventApi(context, seg.eventRange.def, seg.eventRange.instance), + jsEvent: ev, + view: context.viewApi, + }); + } + }; + return EventHovering; + }(Interaction)); + + var CalendarContent = /** @class */ (function (_super) { + __extends(CalendarContent, _super); + function CalendarContent() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.buildViewContext = memoize(buildViewContext); + _this.buildViewPropTransformers = memoize(buildViewPropTransformers); + _this.buildToolbarProps = memoize(buildToolbarProps); + _this.headerRef = createRef(); + _this.footerRef = createRef(); + _this.interactionsStore = {}; + // eslint-disable-next-line + _this.state = { + viewLabelId: getUniqueDomId(), + }; + // Component Registration + // ----------------------------------------------------------------------------------------------------------------- + _this.registerInteractiveComponent = function (component, settingsInput) { + var settings = parseInteractionSettings(component, settingsInput); + var DEFAULT_INTERACTIONS = [ + EventClicking, + EventHovering, + ]; + var interactionClasses = DEFAULT_INTERACTIONS.concat(_this.props.pluginHooks.componentInteractions); + var interactions = interactionClasses.map(function (TheInteractionClass) { return new TheInteractionClass(settings); }); + _this.interactionsStore[component.uid] = interactions; + interactionSettingsStore[component.uid] = settings; + }; + _this.unregisterInteractiveComponent = function (component) { + var listeners = _this.interactionsStore[component.uid]; + if (listeners) { + for (var _i = 0, listeners_1 = listeners; _i < listeners_1.length; _i++) { + var listener = listeners_1[_i]; + listener.destroy(); + } + delete _this.interactionsStore[component.uid]; + } + delete interactionSettingsStore[component.uid]; + }; + // Resizing + // ----------------------------------------------------------------------------------------------------------------- + _this.resizeRunner = new DelayedRunner(function () { + _this.props.emitter.trigger('_resize', true); // should window resizes be considered "forced" ? + _this.props.emitter.trigger('windowResize', { view: _this.props.viewApi }); + }); + _this.handleWindowResize = function (ev) { + var options = _this.props.options; + if (options.handleWindowResize && + ev.target === window // avoid jqui events + ) { + _this.resizeRunner.request(options.windowResizeDelay); + } + }; + return _this; + } + /* + renders INSIDE of an outer div + */ + CalendarContent.prototype.render = function () { + var props = this.props; + var toolbarConfig = props.toolbarConfig, options = props.options; + var toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer???? + props.viewTitle); + var viewVGrow = false; + var viewHeight = ''; + var viewAspectRatio; + if (props.isHeightAuto || props.forPrint) { + viewHeight = ''; + } + else if (options.height != null) { + viewVGrow = true; + } + else if (options.contentHeight != null) { + viewHeight = options.contentHeight; + } + else { + viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall + } + var viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent); + var viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle) + ? this.state.viewLabelId + : ''; + return (createElement(ViewContextType.Provider, { value: viewContext }, + toolbarConfig.header && (createElement(Toolbar, __assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))), + createElement(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, + this.renderView(props), + this.buildAppendContent()), + toolbarConfig.footer && (createElement(Toolbar, __assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))))); + }; + CalendarContent.prototype.componentDidMount = function () { + var props = this.props; + this.calendarInteractions = props.pluginHooks.calendarInteractions + .map(function (CalendarInteractionClass) { return new CalendarInteractionClass(props); }); + window.addEventListener('resize', this.handleWindowResize); + var propSetHandlers = props.pluginHooks.propSetHandlers; + for (var propName in propSetHandlers) { + propSetHandlers[propName](props[propName], props); + } + }; + CalendarContent.prototype.componentDidUpdate = function (prevProps) { + var props = this.props; + var propSetHandlers = props.pluginHooks.propSetHandlers; + for (var propName in propSetHandlers) { + if (props[propName] !== prevProps[propName]) { + propSetHandlers[propName](props[propName], props); + } + } + }; + CalendarContent.prototype.componentWillUnmount = function () { + window.removeEventListener('resize', this.handleWindowResize); + this.resizeRunner.clear(); + for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) { + var interaction = _a[_i]; + interaction.destroy(); + } + this.props.emitter.trigger('_unmount'); + }; + CalendarContent.prototype.buildAppendContent = function () { + var props = this.props; + var children = props.pluginHooks.viewContainerAppends.map(function (buildAppendContent) { return buildAppendContent(props); }); + return createElement.apply(void 0, __spreadArray([Fragment, {}], children)); + }; + CalendarContent.prototype.renderView = function (props) { + var pluginHooks = props.pluginHooks; + var viewSpec = props.viewSpec; + var viewProps = { + dateProfile: props.dateProfile, + businessHours: props.businessHours, + eventStore: props.renderableEventStore, + eventUiBases: props.eventUiBases, + dateSelection: props.dateSelection, + eventSelection: props.eventSelection, + eventDrag: props.eventDrag, + eventResize: props.eventResize, + isHeightAuto: props.isHeightAuto, + forPrint: props.forPrint, + }; + var transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers); + for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { + var transformer = transformers_1[_i]; + __assign(viewProps, transformer.transform(viewProps, props)); + } + var ViewComponent = viewSpec.component; + return (createElement(ViewComponent, __assign({}, viewProps))); + }; + return CalendarContent; + }(PureComponent)); + function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) { + // don't force any date-profiles to valid date profiles (the `false`) so that we can tell if it's invalid + var todayInfo = dateProfileGenerator.build(now, undefined, false); // TODO: need `undefined` or else INFINITE LOOP for some reason + var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false); + var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false); + return { + title: title, + activeButton: viewSpec.type, + navUnit: viewSpec.singleUnit, + isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), + isPrevEnabled: prevInfo.isValid, + isNextEnabled: nextInfo.isValid, + }; + } + // Plugin + // ----------------------------------------------------------------------------------------------------------------- + function buildViewPropTransformers(theClasses) { + return theClasses.map(function (TheClass) { return new TheClass(); }); + } + + var CalendarRoot = /** @class */ (function (_super) { + __extends(CalendarRoot, _super); + function CalendarRoot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = { + forPrint: false, + }; + _this.handleBeforePrint = function () { + _this.setState({ forPrint: true }); + }; + _this.handleAfterPrint = function () { + _this.setState({ forPrint: false }); + }; + return _this; + } + CalendarRoot.prototype.render = function () { + var props = this.props; + var options = props.options; + var forPrint = this.state.forPrint; + var isHeightAuto = forPrint || options.height === 'auto' || options.contentHeight === 'auto'; + var height = (!isHeightAuto && options.height != null) ? options.height : ''; + var classNames = [ + 'fc', + forPrint ? 'fc-media-print' : 'fc-media-screen', + "fc-direction-" + options.direction, + props.theme.getClass('root'), + ]; + if (!getCanVGrowWithinCell()) { + classNames.push('fc-liquid-hack'); + } + return props.children(classNames, height, isHeightAuto, forPrint); + }; + CalendarRoot.prototype.componentDidMount = function () { + var emitter = this.props.emitter; + emitter.on('_beforeprint', this.handleBeforePrint); + emitter.on('_afterprint', this.handleAfterPrint); + }; + CalendarRoot.prototype.componentWillUnmount = function () { + var emitter = this.props.emitter; + emitter.off('_beforeprint', this.handleBeforePrint); + emitter.off('_afterprint', this.handleAfterPrint); + }; + return CalendarRoot; + }(BaseComponent)); + + // Computes a default column header formatting string if `colFormat` is not explicitly defined + function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { + // if more than one week row, or if there are a lot of columns with not much space, + // put just the day numbers will be in each cell + if (!datesRepDistinctDays || dayCnt > 10) { + return createFormatter({ weekday: 'short' }); // "Sat" + } + if (dayCnt > 1) { + return createFormatter({ weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }); // "Sat 11/12" + } + return createFormatter({ weekday: 'long' }); // "Saturday" + } + + var CLASS_NAME = 'fc-col-header-cell'; // do the cushion too? no + function renderInner$1(hookProps) { + return hookProps.text; + } + + var TableDateCell = /** @class */ (function (_super) { + __extends(TableDateCell, _super); + function TableDateCell() { + return _super !== null && _super.apply(this, arguments) || this; + } + TableDateCell.prototype.render = function () { + var _a = this.context, dateEnv = _a.dateEnv, options = _a.options, theme = _a.theme, viewApi = _a.viewApi; + var props = this.props; + var date = props.date, dateProfile = props.dateProfile; + var dayMeta = getDateMeta(date, props.todayRange, null, dateProfile); + var classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme)); + var text = dateEnv.format(date, props.dayHeaderFormat); + // if colCnt is 1, we are already in a day-view and don't need a navlink + var navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1) + ? buildNavLinkAttrs(this.context, date) + : {}; + var hookProps = __assign(__assign(__assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraHookProps), { text: text }), dayMeta); + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), "data-date": !dayMeta.isDisabled ? formatDayString(date) : undefined, colSpan: props.colSpan }, props.extraDataAttrs), + createElement("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (createElement("a", __assign({ ref: innerElRef, className: [ + 'fc-col-header-cell-cushion', + props.isSticky ? 'fc-sticky' : '', + ].join(' ') }, navLinkAttrs), innerContent))))); })); + }; + return TableDateCell; + }(BaseComponent)); + + var WEEKDAY_FORMAT = createFormatter({ weekday: 'long' }); + var TableDowCell = /** @class */ (function (_super) { + __extends(TableDowCell, _super); + function TableDowCell() { + return _super !== null && _super.apply(this, arguments) || this; + } + TableDowCell.prototype.render = function () { + var props = this.props; + var _a = this.context, dateEnv = _a.dateEnv, theme = _a.theme, viewApi = _a.viewApi, options = _a.options; + var date = addDays(new Date(259200000), props.dow); // start with Sun, 04 Jan 1970 00:00:00 GMT + var dateMeta = { + dow: props.dow, + isDisabled: false, + isFuture: false, + isPast: false, + isToday: false, + isOther: false, + }; + var classNames = [CLASS_NAME].concat(getDayClassNames(dateMeta, theme), props.extraClassNames || []); + var text = dateEnv.format(date, props.dayHeaderFormat); + var hookProps = __assign(__assign(__assign(__assign({ // TODO: make this public? + date: date }, dateMeta), { view: viewApi }), props.extraHookProps), { text: text }); + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), colSpan: props.colSpan }, props.extraDataAttrs), + createElement("div", { className: "fc-scrollgrid-sync-inner" }, + createElement("a", { "aria-label": dateEnv.format(date, WEEKDAY_FORMAT), className: [ + 'fc-col-header-cell-cushion', + props.isSticky ? 'fc-sticky' : '', + ].join(' '), ref: innerElRef }, innerContent)))); })); + }; + return TableDowCell; + }(BaseComponent)); + + var NowTimer = /** @class */ (function (_super) { + __extends(NowTimer, _super); + function NowTimer(props, context) { + var _this = _super.call(this, props, context) || this; + _this.initialNowDate = getNow(context.options.now, context.dateEnv); + _this.initialNowQueriedMs = new Date().valueOf(); + _this.state = _this.computeTiming().currentState; + return _this; + } + NowTimer.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state; + return props.children(state.nowDate, state.todayRange); + }; + NowTimer.prototype.componentDidMount = function () { + this.setTimeout(); + }; + NowTimer.prototype.componentDidUpdate = function (prevProps) { + if (prevProps.unit !== this.props.unit) { + this.clearTimeout(); + this.setTimeout(); + } + }; + NowTimer.prototype.componentWillUnmount = function () { + this.clearTimeout(); + }; + NowTimer.prototype.computeTiming = function () { + var _a = this, props = _a.props, context = _a.context; + var unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs); + var currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit); + var nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit)); + var waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf(); + // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342) + // ensure no longer than a day + waitMs = Math.min(1000 * 60 * 60 * 24, waitMs); + return { + currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) }, + nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) }, + waitMs: waitMs, + }; + }; + NowTimer.prototype.setTimeout = function () { + var _this = this; + var _a = this.computeTiming(), nextState = _a.nextState, waitMs = _a.waitMs; + this.timeoutId = setTimeout(function () { + _this.setState(nextState, function () { + _this.setTimeout(); + }); + }, waitMs); + }; + NowTimer.prototype.clearTimeout = function () { + if (this.timeoutId) { + clearTimeout(this.timeoutId); + } + }; + NowTimer.contextType = ViewContextType; + return NowTimer; + }(Component)); + function buildDayRange(date) { + var start = startOfDay(date); + var end = addDays(start, 1); + return { start: start, end: end }; + } + + var DayHeader = /** @class */ (function (_super) { + __extends(DayHeader, _super); + function DayHeader() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.createDayHeaderFormatter = memoize(createDayHeaderFormatter); + return _this; + } + DayHeader.prototype.render = function () { + var context = this.context; + var _a = this.props, dates = _a.dates, dateProfile = _a.dateProfile, datesRepDistinctDays = _a.datesRepDistinctDays, renderIntro = _a.renderIntro; + var dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); + return (createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { return (createElement("tr", { role: "row" }, + renderIntro && renderIntro('day'), + dates.map(function (date) { return (datesRepDistinctDays ? (createElement(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat })) : (createElement(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat }))); }))); })); + }; + return DayHeader; + }(BaseComponent)); + function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) { + return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt); + } + + var DaySeriesModel = /** @class */ (function () { + function DaySeriesModel(range, dateProfileGenerator) { + var date = range.start; + var end = range.end; + var indices = []; + var dates = []; + var dayIndex = -1; + while (date < end) { // loop each day from start to end + if (dateProfileGenerator.isHiddenDay(date)) { + indices.push(dayIndex + 0.5); // mark that it's between indices + } + else { + dayIndex += 1; + indices.push(dayIndex); + dates.push(date); + } + date = addDays(date, 1); + } + this.dates = dates; + this.indices = indices; + this.cnt = dates.length; + } + DaySeriesModel.prototype.sliceRange = function (range) { + var firstIndex = this.getDateDayIndex(range.start); // inclusive first index + var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index + var clippedFirstIndex = Math.max(0, firstIndex); + var clippedLastIndex = Math.min(this.cnt - 1, lastIndex); + // deal with in-between indices + clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell + clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell + if (clippedFirstIndex <= clippedLastIndex) { + return { + firstIndex: clippedFirstIndex, + lastIndex: clippedLastIndex, + isStart: firstIndex === clippedFirstIndex, + isEnd: lastIndex === clippedLastIndex, + }; + } + return null; + }; + // Given a date, returns its chronolocial cell-index from the first cell of the grid. + // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. + // If before the first offset, returns a negative number. + // If after the last offset, returns an offset past the last cell offset. + // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. + DaySeriesModel.prototype.getDateDayIndex = function (date) { + var indices = this.indices; + var dayOffset = Math.floor(diffDays(this.dates[0], date)); + if (dayOffset < 0) { + return indices[0] - 1; + } + if (dayOffset >= indices.length) { + return indices[indices.length - 1] + 1; + } + return indices[dayOffset]; + }; + return DaySeriesModel; + }()); + + var DayTableModel = /** @class */ (function () { + function DayTableModel(daySeries, breakOnWeeks) { + var dates = daySeries.dates; + var daysPerRow; + var firstDay; + var rowCnt; + if (breakOnWeeks) { + // count columns until the day-of-week repeats + firstDay = dates[0].getUTCDay(); + for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) { + if (dates[daysPerRow].getUTCDay() === firstDay) { + break; + } + } + rowCnt = Math.ceil(dates.length / daysPerRow); + } + else { + rowCnt = 1; + daysPerRow = dates.length; + } + this.rowCnt = rowCnt; + this.colCnt = daysPerRow; + this.daySeries = daySeries; + this.cells = this.buildCells(); + this.headerDates = this.buildHeaderDates(); + } + DayTableModel.prototype.buildCells = function () { + var rows = []; + for (var row = 0; row < this.rowCnt; row += 1) { + var cells = []; + for (var col = 0; col < this.colCnt; col += 1) { + cells.push(this.buildCell(row, col)); + } + rows.push(cells); + } + return rows; + }; + DayTableModel.prototype.buildCell = function (row, col) { + var date = this.daySeries.dates[row * this.colCnt + col]; + return { + key: date.toISOString(), + date: date, + }; + }; + DayTableModel.prototype.buildHeaderDates = function () { + var dates = []; + for (var col = 0; col < this.colCnt; col += 1) { + dates.push(this.cells[0][col].date); + } + return dates; + }; + DayTableModel.prototype.sliceRange = function (range) { + var colCnt = this.colCnt; + var seriesSeg = this.daySeries.sliceRange(range); + var segs = []; + if (seriesSeg) { + var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex; + var index = firstIndex; + while (index <= lastIndex) { + var row = Math.floor(index / colCnt); + var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); + segs.push({ + row: row, + firstCol: index % colCnt, + lastCol: (nextIndex - 1) % colCnt, + isStart: seriesSeg.isStart && index === firstIndex, + isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex, + }); + index = nextIndex; + } + } + return segs; + }; + return DayTableModel; + }()); + + var Slicer = /** @class */ (function () { + function Slicer() { + this.sliceBusinessHours = memoize(this._sliceBusinessHours); + this.sliceDateSelection = memoize(this._sliceDateSpan); + this.sliceEventStore = memoize(this._sliceEventStore); + this.sliceEventDrag = memoize(this._sliceInteraction); + this.sliceEventResize = memoize(this._sliceInteraction); + this.forceDayIfListItem = false; // hack + } + Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, context) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + var eventUiBases = props.eventUiBases; + var eventSegs = this.sliceEventStore.apply(this, __spreadArray([props.eventStore, eventUiBases, dateProfile, nextDayThreshold], extraArgs)); + return { + dateSelectionSegs: this.sliceDateSelection.apply(this, __spreadArray([props.dateSelection, eventUiBases, context], extraArgs)), + businessHourSegs: this.sliceBusinessHours.apply(this, __spreadArray([props.businessHours, dateProfile, nextDayThreshold, context], extraArgs)), + fgEventSegs: eventSegs.fg, + bgEventSegs: eventSegs.bg, + eventDrag: this.sliceEventDrag.apply(this, __spreadArray([props.eventDrag, eventUiBases, dateProfile, nextDayThreshold], extraArgs)), + eventResize: this.sliceEventResize.apply(this, __spreadArray([props.eventResize, eventUiBases, dateProfile, nextDayThreshold], extraArgs)), + eventSelection: props.eventSelection, + }; // TODO: give interactionSegs? + }; + Slicer.prototype.sliceNowDate = function (// does not memoize + date, context) { + var extraArgs = []; + for (var _i = 2; _i < arguments.length; _i++) { + extraArgs[_i - 2] = arguments[_i]; + } + return this._sliceDateSpan.apply(this, __spreadArray([{ range: { start: date, end: addMs(date, 1) }, allDay: false }, + {}, + context], extraArgs)); + }; + Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, context) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + if (!businessHours) { + return []; + } + return this._sliceEventStore.apply(this, __spreadArray([expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), + {}, + dateProfile, + nextDayThreshold], extraArgs)).bg; + }; + Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + if (eventStore) { + var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); + return { + bg: this.sliceEventRanges(rangeRes.bg, extraArgs), + fg: this.sliceEventRanges(rangeRes.fg, extraArgs), + }; + } + return { bg: [], fg: [] }; + }; + Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + if (!interaction) { + return null; + } + var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); + return { + segs: this.sliceEventRanges(rangeRes.fg, extraArgs), + affectedInstances: interaction.affectedEvents.instances, + isEvent: interaction.isEvent, + }; + }; + Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, context) { + var extraArgs = []; + for (var _i = 3; _i < arguments.length; _i++) { + extraArgs[_i - 3] = arguments[_i]; + } + if (!dateSpan) { + return []; + } + var eventRange = fabricateEventRange(dateSpan, eventUiBases, context); + var segs = this.sliceRange.apply(this, __spreadArray([dateSpan.range], extraArgs)); + for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) { + var seg = segs_1[_a]; + seg.eventRange = eventRange; + } + return segs; + }; + /* + "complete" seg means it has component and eventRange + */ + Slicer.prototype.sliceEventRanges = function (eventRanges, extraArgs) { + var segs = []; + for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { + var eventRange = eventRanges_1[_i]; + segs.push.apply(segs, this.sliceEventRange(eventRange, extraArgs)); + } + return segs; + }; + /* + "complete" seg means it has component and eventRange + */ + Slicer.prototype.sliceEventRange = function (eventRange, extraArgs) { + var dateRange = eventRange.range; + // hack to make multi-day events that are being force-displayed as list-items to take up only one day + if (this.forceDayIfListItem && eventRange.ui.display === 'list-item') { + dateRange = { + start: dateRange.start, + end: addDays(dateRange.start, 1), + }; + } + var segs = this.sliceRange.apply(this, __spreadArray([dateRange], extraArgs)); + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + seg.eventRange = eventRange; + seg.isStart = eventRange.isStart && seg.isStart; + seg.isEnd = eventRange.isEnd && seg.isEnd; + } + return segs; + }; + return Slicer; + }()); + /* + for incorporating slotMinTime/slotMaxTime if appropriate + TODO: should be part of DateProfile! + TimelineDateProfile already does this btw + */ + function computeActiveRange(dateProfile, isComponentAllDay) { + var range = dateProfile.activeRange; + if (isComponentAllDay) { + return range; + } + return { + start: addMs(range.start, dateProfile.slotMinTime.milliseconds), + end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5), // 864e5 = ms in a day + }; + } + + // high-level segmenting-aware tester functions + // ------------------------------------------------------------------------------------------------------------------------ + function isInteractionValid(interaction, dateProfile, context) { + var instances = interaction.mutatedEvents.instances; + for (var instanceId in instances) { + if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) { + return false; + } + } + return isNewPropsValid({ eventDrag: interaction }, context); // HACK: the eventDrag props is used for ALL interactions + } + function isDateSelectionValid(dateSelection, dateProfile, context) { + if (!rangeContainsRange(dateProfile.validRange, dateSelection.range)) { + return false; + } + return isNewPropsValid({ dateSelection: dateSelection }, context); + } + function isNewPropsValid(newProps, context) { + var calendarState = context.getCurrentData(); + var props = __assign({ businessHours: calendarState.businessHours, dateSelection: '', eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps); + return (context.pluginHooks.isPropsValid || isPropsValid)(props, context); + } + function isPropsValid(state, context, dateSpanMeta, filterConfig) { + if (dateSpanMeta === void 0) { dateSpanMeta = {}; } + if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) { + return false; + } + if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) { + return false; + } + return true; + } + // Moving Event Validation + // ------------------------------------------------------------------------------------------------------------------------ + function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) { + var currentState = context.getCurrentData(); + var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions + var subjectEventStore = interaction.mutatedEvents; + var subjectDefs = subjectEventStore.defs; + var subjectInstances = subjectEventStore.instances; + var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? + state.eventUiBases : + { '': currentState.selectionConfig }); + if (filterConfig) { + subjectConfigs = mapHash(subjectConfigs, filterConfig); + } + // exclude the subject events. TODO: exclude defs too? + var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); + var otherDefs = otherEventStore.defs; + var otherInstances = otherEventStore.instances; + var otherConfigs = compileEventUis(otherDefs, state.eventUiBases); + for (var subjectInstanceId in subjectInstances) { + var subjectInstance = subjectInstances[subjectInstanceId]; + var subjectRange = subjectInstance.range; + var subjectConfig = subjectConfigs[subjectInstance.defId]; + var subjectDef = subjectDefs[subjectInstance.defId]; + // constraint + if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) { + return false; + } + // overlap + var eventOverlap = context.options.eventOverlap; + var eventOverlapFunc = typeof eventOverlap === 'function' ? eventOverlap : null; + for (var otherInstanceId in otherInstances) { + var otherInstance = otherInstances[otherInstanceId]; + // intersect! evaluate + if (rangesIntersect(subjectRange, otherInstance.range)) { + var otherOverlap = otherConfigs[otherInstance.defId].overlap; + // consider the other event's overlap. only do this if the subject event is a "real" event + if (otherOverlap === false && interaction.isEvent) { + return false; + } + if (subjectConfig.overlap === false) { + return false; + } + if (eventOverlapFunc && !eventOverlapFunc(new EventApi(context, otherDefs[otherInstance.defId], otherInstance), // still event + new EventApi(context, subjectDef, subjectInstance))) { + return false; + } + } + } + // allow (a function) + var calendarEventStore = currentState.eventStore; // need global-to-calendar, not local to component (splittable)state + for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) { + var subjectAllow = _a[_i]; + var subjectDateSpan = __assign(__assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay }); + var origDef = calendarEventStore.defs[subjectDef.defId]; + var origInstance = calendarEventStore.instances[subjectInstanceId]; + var eventApi = void 0; + if (origDef) { // was previously in the calendar + eventApi = new EventApi(context, origDef, origInstance); + } + else { // was an external event + eventApi = new EventApi(context, subjectDef); // no instance, because had no dates + } + if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) { + return false; + } + } + } + return true; + } + // Date Selection Validation + // ------------------------------------------------------------------------------------------------------------------------ + function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) { + var relevantEventStore = state.eventStore; + var relevantDefs = relevantEventStore.defs; + var relevantInstances = relevantEventStore.instances; + var selection = state.dateSelection; + var selectionRange = selection.range; + var selectionConfig = context.getCurrentData().selectionConfig; + if (filterConfig) { + selectionConfig = filterConfig(selectionConfig); + } + // constraint + if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) { + return false; + } + // overlap + var selectOverlap = context.options.selectOverlap; + var selectOverlapFunc = typeof selectOverlap === 'function' ? selectOverlap : null; + for (var relevantInstanceId in relevantInstances) { + var relevantInstance = relevantInstances[relevantInstanceId]; + // intersect! evaluate + if (rangesIntersect(selectionRange, relevantInstance.range)) { + if (selectionConfig.overlap === false) { + return false; + } + if (selectOverlapFunc && !selectOverlapFunc(new EventApi(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) { + return false; + } + } + } + // allow (a function) + for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) { + var selectionAllow = _a[_i]; + var fullDateSpan = __assign(__assign({}, dateSpanMeta), selection); + if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) { + return false; + } + } + return true; + } + // Constraint Utils + // ------------------------------------------------------------------------------------------------------------------------ + function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) { + for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) { + var constraint = constraints_1[_i]; + if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) { + return false; + } + } + return true; + } + function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours + otherEventStore, // for if constraint is an even group ID + businessHoursUnexpanded, // for if constraint is 'businessHours' + context) { + if (constraint === 'businessHours') { + return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context)); + } + if (typeof constraint === 'string') { // an group ID + return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) { return eventDef.groupId === constraint; })); + } + if (typeof constraint === 'object' && constraint) { // non-null object + return eventStoreToRanges(expandRecurring(constraint, subjectRange, context)); + } + return []; // if it's false + } + // TODO: move to event-store file? + function eventStoreToRanges(eventStore) { + var instances = eventStore.instances; + var ranges = []; + for (var instanceId in instances) { + ranges.push(instances[instanceId].range); + } + return ranges; + } + // TODO: move to geom file? + function anyRangesContainRange(outerRanges, innerRange) { + for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) { + var outerRange = outerRanges_1[_i]; + if (rangeContainsRange(outerRange, innerRange)) { + return true; + } + } + return false; + } + + var VISIBLE_HIDDEN_RE = /^(visible|hidden)$/; + var Scroller = /** @class */ (function (_super) { + __extends(Scroller, _super); + function Scroller() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handleEl = function (el) { + _this.el = el; + setRef(_this.props.elRef, el); + }; + return _this; + } + Scroller.prototype.render = function () { + var props = this.props; + var liquid = props.liquid, liquidIsAbsolute = props.liquidIsAbsolute; + var isAbsolute = liquid && liquidIsAbsolute; + var className = ['fc-scroller']; + if (liquid) { + if (liquidIsAbsolute) { + className.push('fc-scroller-liquid-absolute'); + } + else { + className.push('fc-scroller-liquid'); + } + } + return (createElement("div", { ref: this.handleEl, className: className.join(' '), style: { + overflowX: props.overflowX, + overflowY: props.overflowY, + left: (isAbsolute && -(props.overcomeLeft || 0)) || '', + right: (isAbsolute && -(props.overcomeRight || 0)) || '', + bottom: (isAbsolute && -(props.overcomeBottom || 0)) || '', + marginLeft: (!isAbsolute && -(props.overcomeLeft || 0)) || '', + marginRight: (!isAbsolute && -(props.overcomeRight || 0)) || '', + marginBottom: (!isAbsolute && -(props.overcomeBottom || 0)) || '', + maxHeight: props.maxHeight || '', + } }, props.children)); + }; + Scroller.prototype.needsXScrolling = function () { + if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { + return false; + } + // testing scrollWidth>clientWidth is unreliable cross-browser when pixel heights aren't integers. + // much more reliable to see if children are taller than the scroller, even tho doesn't account for + // inner-child margins and absolute positioning + var el = this.el; + var realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth(); + var children = el.children; + for (var i = 0; i < children.length; i += 1) { + var childEl = children[i]; + if (childEl.getBoundingClientRect().width > realClientWidth) { + return true; + } + } + return false; + }; + Scroller.prototype.needsYScrolling = function () { + if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { + return false; + } + // testing scrollHeight>clientHeight is unreliable cross-browser when pixel heights aren't integers. + // much more reliable to see if children are taller than the scroller, even tho doesn't account for + // inner-child margins and absolute positioning + var el = this.el; + var realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth(); + var children = el.children; + for (var i = 0; i < children.length; i += 1) { + var childEl = children[i]; + if (childEl.getBoundingClientRect().height > realClientHeight) { + return true; + } + } + return false; + }; + Scroller.prototype.getXScrollbarWidth = function () { + if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { + return 0; + } + return this.el.offsetHeight - this.el.clientHeight; // only works because we guarantee no borders. TODO: add to CSS with important? + }; + Scroller.prototype.getYScrollbarWidth = function () { + if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { + return 0; + } + return this.el.offsetWidth - this.el.clientWidth; // only works because we guarantee no borders. TODO: add to CSS with important? + }; + return Scroller; + }(BaseComponent)); + + /* + TODO: somehow infer OtherArgs from masterCallback? + TODO: infer RefType from masterCallback if provided + */ + var RefMap = /** @class */ (function () { + function RefMap(masterCallback) { + var _this = this; + this.masterCallback = masterCallback; + this.currentMap = {}; + this.depths = {}; + this.callbackMap = {}; + this.handleValue = function (val, key) { + var _a = _this, depths = _a.depths, currentMap = _a.currentMap; + var removed = false; + var added = false; + if (val !== null) { + // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore + removed = (key in currentMap); + currentMap[key] = val; + depths[key] = (depths[key] || 0) + 1; + added = true; + } + else { + depths[key] -= 1; + if (!depths[key]) { + delete currentMap[key]; + delete _this.callbackMap[key]; + removed = true; + } + } + if (_this.masterCallback) { + if (removed) { + _this.masterCallback(null, String(key)); + } + if (added) { + _this.masterCallback(val, String(key)); + } + } + }; + } + RefMap.prototype.createRef = function (key) { + var _this = this; + var refCallback = this.callbackMap[key]; + if (!refCallback) { + refCallback = this.callbackMap[key] = function (val) { + _this.handleValue(val, String(key)); + }; + } + return refCallback; + }; + // TODO: check callers that don't care about order. should use getAll instead + // NOTE: this method has become less valuable now that we are encouraged to map order by some other index + // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect" + RefMap.prototype.collect = function (startIndex, endIndex, step) { + return collectFromHash(this.currentMap, startIndex, endIndex, step); + }; + RefMap.prototype.getAll = function () { + return hashValuesToArray(this.currentMap); + }; + return RefMap; + }()); + + function computeShrinkWidth(chunkEls) { + var shrinkCells = findElements(chunkEls, '.fc-scrollgrid-shrink'); + var largestWidth = 0; + for (var _i = 0, shrinkCells_1 = shrinkCells; _i < shrinkCells_1.length; _i++) { + var shrinkCell = shrinkCells_1[_i]; + largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell)); + } + return Math.ceil(largestWidth); // elements work best with integers. round up to ensure contents fits + } + function getSectionHasLiquidHeight(props, sectionConfig) { + return props.liquid && sectionConfig.liquid; // does the section do liquid-height? (need to have whole scrollgrid liquid-height as well) + } + function getAllowYScrolling(props, sectionConfig) { + return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars + getSectionHasLiquidHeight(props, sectionConfig); // if the section is liquid height, it might condense enough to require scrollbars + } + // TODO: ONLY use `arg`. force out internal function to use same API + function renderChunkContent(sectionConfig, chunkConfig, arg, isHeader) { + var expandRows = arg.expandRows; + var content = typeof chunkConfig.content === 'function' ? + chunkConfig.content(arg) : + createElement('table', { + role: 'presentation', + className: [ + chunkConfig.tableClassName, + sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : '', + ].join(' '), + style: { + minWidth: arg.tableMinWidth, + width: arg.clientWidth, + height: expandRows ? arg.clientHeight : '', // css `height` on a
    serves as a min-height + }, + }, arg.tableColGroupNode, createElement(isHeader ? 'thead' : 'tbody', { + role: 'presentation', + }, typeof chunkConfig.rowContent === 'function' + ? chunkConfig.rowContent(arg) + : chunkConfig.rowContent)); + return content; + } + function isColPropsEqual(cols0, cols1) { + return isArraysEqual(cols0, cols1, isPropsEqual); + } + function renderMicroColGroup(cols, shrinkWidth) { + var colNodes = []; + /* + for ColProps with spans, it would have been great to make a single + HOWEVER, Chrome was getting messing up distributing the width to elements makes Chrome behave. + */ + for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) { + var colProps = cols_1[_i]; + var span = colProps.span || 1; + for (var i = 0; i < span; i += 1) { + colNodes.push(createElement("col", { style: { + width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : (colProps.width || ''), + minWidth: colProps.minWidth || '', + } })); + } + } + return createElement.apply(void 0, __spreadArray(['colgroup', {}], colNodes)); + } + function sanitizeShrinkWidth(shrinkWidth) { + /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth + 4 accounts for 2 2-pixel borders. TODO: better solution? */ + return shrinkWidth == null ? 4 : shrinkWidth; + } + function hasShrinkWidth(cols) { + for (var _i = 0, cols_2 = cols; _i < cols_2.length; _i++) { + var col = cols_2[_i]; + if (col.width === 'shrink') { + return true; + } + } + return false; + } + function getScrollGridClassNames(liquid, context) { + var classNames = [ + 'fc-scrollgrid', + context.theme.getClass('table'), + ]; + if (liquid) { + classNames.push('fc-scrollgrid-liquid'); + } + return classNames; + } + function getSectionClassNames(sectionConfig, wholeTableVGrow) { + var classNames = [ + 'fc-scrollgrid-section', + "fc-scrollgrid-section-" + sectionConfig.type, + sectionConfig.className, // used? + ]; + if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) { + classNames.push('fc-scrollgrid-section-liquid'); + } + if (sectionConfig.isSticky) { + classNames.push('fc-scrollgrid-section-sticky'); + } + return classNames; + } + function renderScrollShim(arg) { + return (createElement("div", { className: "fc-scrollgrid-sticky-shim", style: { + width: arg.clientWidth, + minWidth: arg.tableMinWidth, + } })); + } + function getStickyHeaderDates(options) { + var stickyHeaderDates = options.stickyHeaderDates; + if (stickyHeaderDates == null || stickyHeaderDates === 'auto') { + stickyHeaderDates = options.height === 'auto' || options.viewHeight === 'auto'; + } + return stickyHeaderDates; + } + function getStickyFooterScrollbar(options) { + var stickyFooterScrollbar = options.stickyFooterScrollbar; + if (stickyFooterScrollbar == null || stickyFooterScrollbar === 'auto') { + stickyFooterScrollbar = options.height === 'auto' || options.viewHeight === 'auto'; + } + return stickyFooterScrollbar; + } + + var SimpleScrollGrid = /** @class */ (function (_super) { + __extends(SimpleScrollGrid, _super); + function SimpleScrollGrid() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.processCols = memoize(function (a) { return a; }, isColPropsEqual); // so we get same `cols` props every time + // yucky to memoize VNodes, but much more efficient for consumers + _this.renderMicroColGroup = memoize(renderMicroColGroup); + _this.scrollerRefs = new RefMap(); + _this.scrollerElRefs = new RefMap(_this._handleScrollerEl.bind(_this)); + _this.state = { + shrinkWidth: null, + forceYScrollbars: false, + scrollerClientWidths: {}, + scrollerClientHeights: {}, + }; + // TODO: can do a really simple print-view. dont need to join rows + _this.handleSizing = function () { + _this.safeSetState(__assign({ shrinkWidth: _this.computeShrinkWidth() }, _this.computeScrollerDims())); + }; + return _this; + } + SimpleScrollGrid.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var sectionConfigs = props.sections || []; + var cols = this.processCols(props.cols); + var microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth); + var classNames = getScrollGridClassNames(props.liquid, context); + if (props.collapsibleWidth) { + classNames.push('fc-scrollgrid-collapsible'); + } + // TODO: make DRY + var configCnt = sectionConfigs.length; + var configI = 0; + var currentConfig; + var headSectionNodes = []; + var bodySectionNodes = []; + var footSectionNodes = []; + while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { + headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); + configI += 1; + } + while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { + bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false)); + configI += 1; + } + while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { + footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); + configI += 1; + } + // firefox bug: when setting height on table and there is a thead or tfoot, + // the necessary height:100% on the liquid-height body section forces the *whole* table to be taller. (bug #5524) + // use getCanVGrowWithinCell as a way to detect table-stupid firefox. + // if so, use a simpler dom structure, jam everything into a lone tbody. + var isBuggy = !getCanVGrowWithinCell(); + var roleAttrs = { role: 'rowgroup' }; + return createElement('table', { + role: 'grid', + className: classNames.join(' '), + style: { height: props.height }, + }, Boolean(!isBuggy && headSectionNodes.length) && createElement.apply(void 0, __spreadArray(['thead', roleAttrs], headSectionNodes)), Boolean(!isBuggy && bodySectionNodes.length) && createElement.apply(void 0, __spreadArray(['tbody', roleAttrs], bodySectionNodes)), Boolean(!isBuggy && footSectionNodes.length) && createElement.apply(void 0, __spreadArray(['tfoot', roleAttrs], footSectionNodes)), isBuggy && createElement.apply(void 0, __spreadArray(__spreadArray(__spreadArray(['tbody', roleAttrs], headSectionNodes), bodySectionNodes), footSectionNodes))); + }; + SimpleScrollGrid.prototype.renderSection = function (sectionConfig, microColGroupNode, isHeader) { + if ('outerContent' in sectionConfig) { + return (createElement(Fragment, { key: sectionConfig.key }, sectionConfig.outerContent)); + } + return (createElement("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader))); + }; + SimpleScrollGrid.prototype.renderChunkTd = function (sectionConfig, microColGroupNode, chunkConfig, isHeader) { + if ('outerContent' in chunkConfig) { + return chunkConfig.outerContent; + } + var props = this.props; + var _a = this.state, forceYScrollbars = _a.forceYScrollbars, scrollerClientWidths = _a.scrollerClientWidths, scrollerClientHeights = _a.scrollerClientHeights; + var needsYScrolling = getAllowYScrolling(props, sectionConfig); // TODO: do lazily. do in section config? + var isLiquid = getSectionHasLiquidHeight(props, sectionConfig); + // for `!props.liquid` - is WHOLE scrollgrid natural height? + // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars + var overflowY = !props.liquid ? 'visible' : + forceYScrollbars ? 'scroll' : + !needsYScrolling ? 'hidden' : + 'auto'; + var sectionKey = sectionConfig.key; + var content = renderChunkContent(sectionConfig, chunkConfig, { + tableColGroupNode: microColGroupNode, + tableMinWidth: '', + clientWidth: (!props.collapsibleWidth && scrollerClientWidths[sectionKey] !== undefined) ? scrollerClientWidths[sectionKey] : null, + clientHeight: scrollerClientHeights[sectionKey] !== undefined ? scrollerClientHeights[sectionKey] : null, + expandRows: sectionConfig.expandRows, + syncRowHeights: false, + rowSyncHeights: [], + reportRowHeightChange: function () { }, + }, isHeader); + return createElement(isHeader ? 'th' : 'td', { + ref: chunkConfig.elRef, + role: 'presentation', + }, createElement("div", { className: "fc-scroller-harness" + (isLiquid ? ' fc-scroller-harness-liquid' : '') }, + createElement(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness + : true }, content))); + }; + SimpleScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) { + var section = getSectionByKey(this.props.sections, key); + if (section) { + setRef(section.chunk.scrollerElRef, scrollerEl); + } + }; + SimpleScrollGrid.prototype.componentDidMount = function () { + this.handleSizing(); + this.context.addResizeHandler(this.handleSizing); + }; + SimpleScrollGrid.prototype.componentDidUpdate = function () { + // TODO: need better solution when state contains non-sizing things + this.handleSizing(); + }; + SimpleScrollGrid.prototype.componentWillUnmount = function () { + this.context.removeResizeHandler(this.handleSizing); + }; + SimpleScrollGrid.prototype.computeShrinkWidth = function () { + return hasShrinkWidth(this.props.cols) + ? computeShrinkWidth(this.scrollerElRefs.getAll()) + : 0; + }; + SimpleScrollGrid.prototype.computeScrollerDims = function () { + var scrollbarWidth = getScrollbarWidths(); + var _a = this, scrollerRefs = _a.scrollerRefs, scrollerElRefs = _a.scrollerElRefs; + var forceYScrollbars = false; + var scrollerClientWidths = {}; + var scrollerClientHeights = {}; + for (var sectionKey in scrollerRefs.currentMap) { + var scroller = scrollerRefs.currentMap[sectionKey]; + if (scroller && scroller.needsYScrolling()) { + forceYScrollbars = true; + break; + } + } + for (var _i = 0, _b = this.props.sections; _i < _b.length; _i++) { + var section = _b[_i]; + var sectionKey = section.key; + var scrollerEl = scrollerElRefs.currentMap[sectionKey]; + if (scrollerEl) { + var harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders + scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars + ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future + : 0)); + scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height); + } + } + return { forceYScrollbars: forceYScrollbars, scrollerClientWidths: scrollerClientWidths, scrollerClientHeights: scrollerClientHeights }; + }; + return SimpleScrollGrid; + }(BaseComponent)); + SimpleScrollGrid.addStateEquality({ + scrollerClientWidths: isPropsEqual, + scrollerClientHeights: isPropsEqual, + }); + function getSectionByKey(sections, key) { + for (var _i = 0, sections_1 = sections; _i < sections_1.length; _i++) { + var section = sections_1[_i]; + if (section.key === key) { + return section; + } + } + return null; + } + + var EventRoot = /** @class */ (function (_super) { + __extends(EventRoot, _super); + function EventRoot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.elRef = createRef(); + return _this; + } + EventRoot.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var options = context.options; + var seg = props.seg; + var eventRange = seg.eventRange; + var ui = eventRange.ui; + var hookProps = { + event: new EventApi(context, eventRange.def, eventRange.instance), + view: context.viewApi, + timeText: props.timeText, + textColor: ui.textColor, + backgroundColor: ui.backgroundColor, + borderColor: ui.borderColor, + isDraggable: !props.disableDragging && computeSegDraggable(seg, context), + isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context), + isEndResizable: !props.disableResizing && computeSegEndResizable(seg), + isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting), + isStart: Boolean(seg.isStart), + isEnd: Boolean(seg.isEnd), + isPast: Boolean(props.isPast), + isFuture: Boolean(props.isFuture), + isToday: Boolean(props.isToday), + isSelected: Boolean(props.isSelected), + isDragging: Boolean(props.isDragging), + isResizing: Boolean(props.isResizing), + }; + var standardClassNames = getEventClassNames(hookProps).concat(ui.classNames); + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.eventClassNames, content: options.eventContent, defaultContent: props.defaultContent, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount, elRef: this.elRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, standardClassNames.concat(customClassNames), innerElRef, innerContent, hookProps); })); + }; + EventRoot.prototype.componentDidMount = function () { + setElSeg(this.elRef.current, this.props.seg); + }; + /* + need to re-assign seg to the element if seg changes, even if the element is the same + */ + EventRoot.prototype.componentDidUpdate = function (prevProps) { + var seg = this.props.seg; + if (seg !== prevProps.seg) { + setElSeg(this.elRef.current, seg); + } + }; + return EventRoot; + }(BaseComponent)); + + // should not be a purecomponent + var StandardEvent = /** @class */ (function (_super) { + __extends(StandardEvent, _super); + function StandardEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + StandardEvent.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var seg = props.seg; + var timeFormat = context.options.eventTimeFormat || props.defaultTimeFormat; + var timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); + return (createElement(EventRoot, { seg: seg, timeText: timeText, disableDragging: props.disableDragging, disableResizing: props.disableResizing, defaultContent: props.defaultContent || renderInnerContent$6, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("a", __assign({ className: props.extraClassNames.concat(classNames).join(' '), style: { + borderColor: hookProps.borderColor, + backgroundColor: hookProps.backgroundColor, + }, ref: rootElRef }, getSegAnchorAttrs(seg, context)), + createElement("div", { className: "fc-event-main", ref: innerElRef, style: { color: hookProps.textColor } }, innerContent), + hookProps.isStartResizable && + createElement("div", { className: "fc-event-resizer fc-event-resizer-start" }), + hookProps.isEndResizable && + createElement("div", { className: "fc-event-resizer fc-event-resizer-end" }))); })); + }; + return StandardEvent; + }(BaseComponent)); + function renderInnerContent$6(innerProps) { + return (createElement("div", { className: "fc-event-main-frame" }, + innerProps.timeText && (createElement("div", { className: "fc-event-time" }, innerProps.timeText)), + createElement("div", { className: "fc-event-title-container" }, + createElement("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || createElement(Fragment, null, "\u00A0"))))); + } + + var NowIndicatorRoot = function (props) { return (createElement(ViewContextType.Consumer, null, function (context) { + var options = context.options; + var hookProps = { + isAxis: props.isAxis, + date: context.dateEnv.toDate(props.date), + view: context.viewApi, + }; + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.nowIndicatorClassNames, content: options.nowIndicatorContent, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }, props.children)); + })); }; + + var DAY_NUM_FORMAT = createFormatter({ day: 'numeric' }); + var DayCellContent = /** @class */ (function (_super) { + __extends(DayCellContent, _super); + function DayCellContent() { + return _super !== null && _super.apply(this, arguments) || this; + } + DayCellContent.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var options = context.options; + var hookProps = refineDayCellHookProps({ + date: props.date, + dateProfile: props.dateProfile, + todayRange: props.todayRange, + showDayNumber: props.showDayNumber, + extraProps: props.extraHookProps, + viewApi: context.viewApi, + dateEnv: context.dateEnv, + }); + return (createElement(ContentHook, { hookProps: hookProps, content: options.dayCellContent, defaultContent: props.defaultContent }, props.children)); + }; + return DayCellContent; + }(BaseComponent)); + function refineDayCellHookProps(raw) { + var date = raw.date, dateEnv = raw.dateEnv; + var dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile); + return __assign(__assign(__assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraProps); + } + + var DayCellRoot = /** @class */ (function (_super) { + __extends(DayCellRoot, _super); + function DayCellRoot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.refineHookProps = memoizeObjArg(refineDayCellHookProps); + _this.normalizeClassNames = buildClassNameNormalizer(); + return _this; + } + DayCellRoot.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var options = context.options; + var hookProps = this.refineHookProps({ + date: props.date, + dateProfile: props.dateProfile, + todayRange: props.todayRange, + showDayNumber: props.showDayNumber, + extraProps: props.extraHookProps, + viewApi: context.viewApi, + dateEnv: context.dateEnv, + }); + var classNames = getDayClassNames(hookProps, context.theme).concat(hookProps.isDisabled + ? [] // don't use custom classNames if disabled + : this.normalizeClassNames(options.dayCellClassNames, hookProps)); + var dataAttrs = hookProps.isDisabled ? {} : { + 'data-date': formatDayString(props.date), + }; + return (createElement(MountHook, { hookProps: hookProps, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, classNames, dataAttrs, hookProps.isDisabled); })); + }; + return DayCellRoot; + }(BaseComponent)); + + function renderFill(fillType) { + return (createElement("div", { className: "fc-" + fillType })); + } + var BgEvent = function (props) { return (createElement(EventRoot, { defaultContent: renderInnerContent$5, seg: props.seg /* uselesss i think */, timeText: "", disableDragging: true, disableResizing: true, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("div", { ref: rootElRef, className: ['fc-bg-event'].concat(classNames).join(' '), style: { + backgroundColor: hookProps.backgroundColor, + } }, innerContent)); })); }; + function renderInnerContent$5(props) { + var title = props.event.title; + return title && (createElement("div", { className: "fc-event-title" }, props.event.title)); + } + + var WeekNumberRoot = function (props) { return (createElement(ViewContextType.Consumer, null, function (context) { + var dateEnv = context.dateEnv, options = context.options; + var date = props.date; + var format = options.weekNumberFormat || props.defaultFormat; + var num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well? + var text = dateEnv.format(date, format); + var hookProps = { num: num, text: text, date: date }; + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.weekNumberClassNames, content: options.weekNumberContent, defaultContent: renderInner, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }, props.children)); + })); }; + function renderInner(innerProps) { + return innerProps.text; + } + + var PADDING_FROM_VIEWPORT = 10; + var Popover = /** @class */ (function (_super) { + __extends(Popover, _super); + function Popover() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = { + titleId: getUniqueDomId(), + }; + _this.handleRootEl = function (el) { + _this.rootEl = el; + if (_this.props.elRef) { + setRef(_this.props.elRef, el); + } + }; + // Triggered when the user clicks *anywhere* in the document, for the autoHide feature + _this.handleDocumentMouseDown = function (ev) { + // only hide the popover if the click happened outside the popover + var target = getEventTargetViaRoot(ev); + if (!_this.rootEl.contains(target)) { + _this.handleCloseClick(); + } + }; + _this.handleDocumentKeyDown = function (ev) { + if (ev.key === 'Escape') { + _this.handleCloseClick(); + } + }; + _this.handleCloseClick = function () { + var onClose = _this.props.onClose; + if (onClose) { + onClose(); + } + }; + return _this; + } + Popover.prototype.render = function () { + var _a = this.context, theme = _a.theme, options = _a.options; + var _b = this, props = _b.props, state = _b.state; + var classNames = [ + 'fc-popover', + theme.getClass('popover'), + ].concat(props.extraClassNames || []); + return createPortal(createElement("div", __assign({ id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId }, props.extraAttrs, { ref: this.handleRootEl }), + createElement("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, + createElement("span", { className: "fc-popover-title", id: state.titleId }, props.title), + createElement("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), + createElement("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); + }; + Popover.prototype.componentDidMount = function () { + document.addEventListener('mousedown', this.handleDocumentMouseDown); + document.addEventListener('keydown', this.handleDocumentKeyDown); + this.updateSize(); + }; + Popover.prototype.componentWillUnmount = function () { + document.removeEventListener('mousedown', this.handleDocumentMouseDown); + document.removeEventListener('keydown', this.handleDocumentKeyDown); + }; + Popover.prototype.updateSize = function () { + var isRtl = this.context.isRtl; + var _a = this.props, alignmentEl = _a.alignmentEl, alignGridTop = _a.alignGridTop; + var rootEl = this.rootEl; + var alignmentRect = computeClippedClientRect(alignmentEl); + if (alignmentRect) { + var popoverDims = rootEl.getBoundingClientRect(); + // position relative to viewport + var popoverTop = alignGridTop + ? elementClosest(alignmentEl, '.fc-scrollgrid').getBoundingClientRect().top + : alignmentRect.top; + var popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left; + // constrain + popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT); + popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width); + popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT); + var origin_1 = rootEl.offsetParent.getBoundingClientRect(); + applyStyle(rootEl, { + top: popoverTop - origin_1.top, + left: popoverLeft - origin_1.left, + }); + } + }; + return Popover; + }(BaseComponent)); + + var MorePopover = /** @class */ (function (_super) { + __extends(MorePopover, _super); + function MorePopover() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handleRootEl = function (rootEl) { + _this.rootEl = rootEl; + if (rootEl) { + _this.context.registerInteractiveComponent(_this, { + el: rootEl, + useEventCenter: false, + }); + } + else { + _this.context.unregisterInteractiveComponent(_this); + } + }; + return _this; + } + MorePopover.prototype.render = function () { + var _a = this.context, options = _a.options, dateEnv = _a.dateEnv; + var props = this.props; + var startDate = props.startDate, todayRange = props.todayRange, dateProfile = props.dateProfile; + var title = dateEnv.format(startDate, options.dayPopoverFormat); + return (createElement(DayCellRoot, { date: startDate, dateProfile: dateProfile, todayRange: todayRange, elRef: this.handleRootEl }, function (rootElRef, dayClassNames, dataAttrs) { return (createElement(Popover, { elRef: rootElRef, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(dayClassNames), extraAttrs: dataAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, + createElement(DayCellContent, { date: startDate, dateProfile: dateProfile, todayRange: todayRange }, function (innerElRef, innerContent) { return (innerContent && + createElement("div", { className: "fc-more-popover-misc", ref: innerElRef }, innerContent)); }), + props.children)); })); + }; + MorePopover.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { + var _a = this, rootEl = _a.rootEl, props = _a.props; + if (positionLeft >= 0 && positionLeft < elWidth && + positionTop >= 0 && positionTop < elHeight) { + return { + dateProfile: props.dateProfile, + dateSpan: __assign({ allDay: true, range: { + start: props.startDate, + end: props.endDate, + } }, props.extraDateSpan), + dayEl: rootEl, + rect: { + left: 0, + top: 0, + right: elWidth, + bottom: elHeight, + }, + layer: 1, // important when comparing with hits from other components + }; + } + return null; + }; + return MorePopover; + }(DateComponent)); + + var MoreLinkRoot = /** @class */ (function (_super) { + __extends(MoreLinkRoot, _super); + function MoreLinkRoot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.linkElRef = createRef(); + _this.state = { + isPopoverOpen: false, + popoverId: getUniqueDomId(), + }; + _this.handleClick = function (ev) { + var _a = _this, props = _a.props, context = _a.context; + var moreLinkClick = context.options.moreLinkClick; + var date = computeRange(props).start; + function buildPublicSeg(seg) { + var _a = seg.eventRange, def = _a.def, instance = _a.instance, range = _a.range; + return { + event: new EventApi(context, def, instance), + start: context.dateEnv.toDate(range.start), + end: context.dateEnv.toDate(range.end), + isStart: seg.isStart, + isEnd: seg.isEnd, + }; + } + if (typeof moreLinkClick === 'function') { + moreLinkClick = moreLinkClick({ + date: date, + allDay: Boolean(props.allDayDate), + allSegs: props.allSegs.map(buildPublicSeg), + hiddenSegs: props.hiddenSegs.map(buildPublicSeg), + jsEvent: ev, + view: context.viewApi, + }); + } + if (!moreLinkClick || moreLinkClick === 'popover') { + _this.setState({ isPopoverOpen: true }); + } + else if (typeof moreLinkClick === 'string') { // a view name + context.calendarApi.zoomTo(date, moreLinkClick); + } + }; + _this.handlePopoverClose = function () { + _this.setState({ isPopoverOpen: false }); + }; + return _this; + } + MoreLinkRoot.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, state = _a.state; + return (createElement(ViewContextType.Consumer, null, function (context) { + var viewApi = context.viewApi, options = context.options, calendarApi = context.calendarApi; + var moreLinkText = options.moreLinkText; + var moreCnt = props.moreCnt; + var range = computeRange(props); + var text = typeof moreLinkText === 'function' // TODO: eventually use formatWithOrdinals + ? moreLinkText.call(calendarApi, moreCnt) + : "+" + moreCnt + " " + moreLinkText; + var title = formatWithOrdinals(options.moreLinkHint, [moreCnt], text); + var hookProps = { + num: moreCnt, + shortText: "+" + moreCnt, + text: text, + view: viewApi, + }; + return (createElement(Fragment, null, + Boolean(props.moreCnt) && (createElement(RenderHook, { elRef: _this.linkElRef, hookProps: hookProps, classNames: options.moreLinkClassNames, content: options.moreLinkContent, defaultContent: props.defaultContent || renderMoreLinkInner$1, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, ['fc-more-link'].concat(customClassNames), innerElRef, innerContent, _this.handleClick, title, state.isPopoverOpen, state.isPopoverOpen ? state.popoverId : ''); })), + state.isPopoverOpen && (createElement(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: _this.parentEl, alignmentEl: props.alignmentElRef.current, alignGridTop: props.alignGridTop, onClose: _this.handlePopoverClose }, props.popoverContent())))); + })); + }; + MoreLinkRoot.prototype.componentDidMount = function () { + this.updateParentEl(); + }; + MoreLinkRoot.prototype.componentDidUpdate = function () { + this.updateParentEl(); + }; + MoreLinkRoot.prototype.updateParentEl = function () { + if (this.linkElRef.current) { + this.parentEl = elementClosest(this.linkElRef.current, '.fc-view-harness'); + } + }; + return MoreLinkRoot; + }(BaseComponent)); + function renderMoreLinkInner$1(props) { + return props.text; + } + function computeRange(props) { + if (props.allDayDate) { + return { + start: props.allDayDate, + end: addDays(props.allDayDate, 1), + }; + } + var hiddenSegs = props.hiddenSegs; + return { + start: computeEarliestSegStart(hiddenSegs), + end: computeLatestSegEnd(hiddenSegs), + }; + } + function computeEarliestSegStart(segs) { + return segs.reduce(pickEarliestStart).eventRange.range.start; + } + function pickEarliestStart(seg0, seg1) { + return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1; + } + function computeLatestSegEnd(segs) { + return segs.reduce(pickLatestEnd).eventRange.range.end; + } + function pickLatestEnd(seg0, seg1) { + return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1; + } + + // exports + // -------------------------------------------------------------------------------------------------- + var version = '5.11.3'; // important to type it, so .d.ts has generic string + + var Calendar = /** @class */ (function (_super) { + __extends(Calendar, _super); + function Calendar(el, optionOverrides) { + if (optionOverrides === void 0) { optionOverrides = {}; } + var _this = _super.call(this) || this; + _this.isRendering = false; + _this.isRendered = false; + _this.currentClassNames = []; + _this.customContentRenderId = 0; // will affect custom generated classNames? + _this.handleAction = function (action) { + // actions we know we want to render immediately + switch (action.type) { + case 'SET_EVENT_DRAG': + case 'SET_EVENT_RESIZE': + _this.renderRunner.tryDrain(); + } + }; + _this.handleData = function (data) { + _this.currentData = data; + _this.renderRunner.request(data.calendarOptions.rerenderDelay); + }; + _this.handleRenderRequest = function () { + if (_this.isRendering) { + _this.isRendered = true; + var currentData_1 = _this.currentData; + flushSync(function () { + render(createElement(CalendarRoot, { options: currentData_1.calendarOptions, theme: currentData_1.theme, emitter: currentData_1.emitter }, function (classNames, height, isHeightAuto, forPrint) { + _this.setClassNames(classNames); + _this.setHeight(height); + return (createElement(CustomContentRenderContext.Provider, { value: _this.customContentRenderId }, + createElement(CalendarContent, __assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData_1)))); + }), _this.el); + }); + } + else if (_this.isRendered) { + _this.isRendered = false; + unmountComponentAtNode(_this.el); + _this.setClassNames([]); + _this.setHeight(''); + } + }; + _this.el = el; + _this.renderRunner = new DelayedRunner(_this.handleRenderRequest); + new CalendarDataManager({ + optionOverrides: optionOverrides, + calendarApi: _this, + onAction: _this.handleAction, + onData: _this.handleData, + }); + return _this; + } + Object.defineProperty(Calendar.prototype, "view", { + get: function () { return this.currentData.viewApi; } // for public API + , + enumerable: false, + configurable: true + }); + Calendar.prototype.render = function () { + var wasRendering = this.isRendering; + if (!wasRendering) { + this.isRendering = true; + } + else { + this.customContentRenderId += 1; + } + this.renderRunner.request(); + if (wasRendering) { + this.updateSize(); + } + }; + Calendar.prototype.destroy = function () { + if (this.isRendering) { + this.isRendering = false; + this.renderRunner.request(); + } + }; + Calendar.prototype.updateSize = function () { + var _this = this; + flushSync(function () { + _super.prototype.updateSize.call(_this); + }); + }; + Calendar.prototype.batchRendering = function (func) { + this.renderRunner.pause('batchRendering'); + func(); + this.renderRunner.resume('batchRendering'); + }; + Calendar.prototype.pauseRendering = function () { + this.renderRunner.pause('pauseRendering'); + }; + Calendar.prototype.resumeRendering = function () { + this.renderRunner.resume('pauseRendering', true); + }; + Calendar.prototype.resetOptions = function (optionOverrides, append) { + this.currentDataManager.resetOptions(optionOverrides, append); + }; + Calendar.prototype.setClassNames = function (classNames) { + if (!isArraysEqual(classNames, this.currentClassNames)) { + var classList = this.el.classList; + for (var _i = 0, _a = this.currentClassNames; _i < _a.length; _i++) { + var className = _a[_i]; + classList.remove(className); + } + for (var _b = 0, classNames_1 = classNames; _b < classNames_1.length; _b++) { + var className = classNames_1[_b]; + classList.add(className); + } + this.currentClassNames = classNames; + } + }; + Calendar.prototype.setHeight = function (height) { + applyStyleProp(this.el, 'height', height); + }; + return Calendar; + }(CalendarApi)); + + config.touchMouseIgnoreWait = 500; + var ignoreMouseDepth = 0; + var listenerCnt = 0; + var isWindowTouchMoveCancelled = false; + /* + Uses a "pointer" abstraction, which monitors UI events for both mouse and touch. + Tracks when the pointer "drags" on a certain element, meaning down+move+up. + + Also, tracks if there was touch-scrolling. + Also, can prevent touch-scrolling from happening. + Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement. + + emits: + - pointerdown + - pointermove + - pointerup + */ + var PointerDragging = /** @class */ (function () { + function PointerDragging(containerEl) { + var _this = this; + this.subjectEl = null; + // options that can be directly assigned by caller + this.selector = ''; // will cause subjectEl in all emitted events to be this element + this.handleSelector = ''; + this.shouldIgnoreMove = false; + this.shouldWatchScroll = true; // for simulating pointermove on scroll + // internal states + this.isDragging = false; + this.isTouchDragging = false; + this.wasTouchScroll = false; + // Mouse + // ---------------------------------------------------------------------------------------------------- + this.handleMouseDown = function (ev) { + if (!_this.shouldIgnoreMouse() && + isPrimaryMouseButton(ev) && + _this.tryStart(ev)) { + var pev = _this.createEventFromMouse(ev, true); + _this.emitter.trigger('pointerdown', pev); + _this.initScrollWatch(pev); + if (!_this.shouldIgnoreMove) { + document.addEventListener('mousemove', _this.handleMouseMove); + } + document.addEventListener('mouseup', _this.handleMouseUp); + } + }; + this.handleMouseMove = function (ev) { + var pev = _this.createEventFromMouse(ev); + _this.recordCoords(pev); + _this.emitter.trigger('pointermove', pev); + }; + this.handleMouseUp = function (ev) { + document.removeEventListener('mousemove', _this.handleMouseMove); + document.removeEventListener('mouseup', _this.handleMouseUp); + _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev)); + _this.cleanup(); // call last so that pointerup has access to props + }; + // Touch + // ---------------------------------------------------------------------------------------------------- + this.handleTouchStart = function (ev) { + if (_this.tryStart(ev)) { + _this.isTouchDragging = true; + var pev = _this.createEventFromTouch(ev, true); + _this.emitter.trigger('pointerdown', pev); + _this.initScrollWatch(pev); + // unlike mouse, need to attach to target, not document + // https://stackoverflow.com/a/45760014 + var targetEl = ev.target; + if (!_this.shouldIgnoreMove) { + targetEl.addEventListener('touchmove', _this.handleTouchMove); + } + targetEl.addEventListener('touchend', _this.handleTouchEnd); + targetEl.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end + // attach a handler to get called when ANY scroll action happens on the page. + // this was impossible to do with normal on/off because 'scroll' doesn't bubble. + // http://stackoverflow.com/a/32954565/96342 + window.addEventListener('scroll', _this.handleTouchScroll, true); + } + }; + this.handleTouchMove = function (ev) { + var pev = _this.createEventFromTouch(ev); + _this.recordCoords(pev); + _this.emitter.trigger('pointermove', pev); + }; + this.handleTouchEnd = function (ev) { + if (_this.isDragging) { // done to guard against touchend followed by touchcancel + var targetEl = ev.target; + targetEl.removeEventListener('touchmove', _this.handleTouchMove); + targetEl.removeEventListener('touchend', _this.handleTouchEnd); + targetEl.removeEventListener('touchcancel', _this.handleTouchEnd); + window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true + _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev)); + _this.cleanup(); // call last so that pointerup has access to props + _this.isTouchDragging = false; + startIgnoringMouse(); + } + }; + this.handleTouchScroll = function () { + _this.wasTouchScroll = true; + }; + this.handleScroll = function (ev) { + if (!_this.shouldIgnoreMove) { + var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX; + var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY; + _this.emitter.trigger('pointermove', { + origEvent: ev, + isTouch: _this.isTouchDragging, + subjectEl: _this.subjectEl, + pageX: pageX, + pageY: pageY, + deltaX: pageX - _this.origPageX, + deltaY: pageY - _this.origPageY, + }); + } + }; + this.containerEl = containerEl; + this.emitter = new Emitter(); + containerEl.addEventListener('mousedown', this.handleMouseDown); + containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true }); + listenerCreated(); + } + PointerDragging.prototype.destroy = function () { + this.containerEl.removeEventListener('mousedown', this.handleMouseDown); + this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true }); + listenerDestroyed(); + }; + PointerDragging.prototype.tryStart = function (ev) { + var subjectEl = this.querySubjectEl(ev); + var downEl = ev.target; + if (subjectEl && + (!this.handleSelector || elementClosest(downEl, this.handleSelector))) { + this.subjectEl = subjectEl; + this.isDragging = true; // do this first so cancelTouchScroll will work + this.wasTouchScroll = false; + return true; + } + return false; + }; + PointerDragging.prototype.cleanup = function () { + isWindowTouchMoveCancelled = false; + this.isDragging = false; + this.subjectEl = null; + // keep wasTouchScroll around for later access + this.destroyScrollWatch(); + }; + PointerDragging.prototype.querySubjectEl = function (ev) { + if (this.selector) { + return elementClosest(ev.target, this.selector); + } + return this.containerEl; + }; + PointerDragging.prototype.shouldIgnoreMouse = function () { + return ignoreMouseDepth || this.isTouchDragging; + }; + // can be called by user of this class, to cancel touch-based scrolling for the current drag + PointerDragging.prototype.cancelTouchScroll = function () { + if (this.isDragging) { + isWindowTouchMoveCancelled = true; + } + }; + // Scrolling that simulates pointermoves + // ---------------------------------------------------------------------------------------------------- + PointerDragging.prototype.initScrollWatch = function (ev) { + if (this.shouldWatchScroll) { + this.recordCoords(ev); + window.addEventListener('scroll', this.handleScroll, true); // useCapture=true + } + }; + PointerDragging.prototype.recordCoords = function (ev) { + if (this.shouldWatchScroll) { + this.prevPageX = ev.pageX; + this.prevPageY = ev.pageY; + this.prevScrollX = window.pageXOffset; + this.prevScrollY = window.pageYOffset; + } + }; + PointerDragging.prototype.destroyScrollWatch = function () { + if (this.shouldWatchScroll) { + window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true + } + }; + // Event Normalization + // ---------------------------------------------------------------------------------------------------- + PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) { + var deltaX = 0; + var deltaY = 0; + // TODO: repeat code + if (isFirst) { + this.origPageX = ev.pageX; + this.origPageY = ev.pageY; + } + else { + deltaX = ev.pageX - this.origPageX; + deltaY = ev.pageY - this.origPageY; + } + return { + origEvent: ev, + isTouch: false, + subjectEl: this.subjectEl, + pageX: ev.pageX, + pageY: ev.pageY, + deltaX: deltaX, + deltaY: deltaY, + }; + }; + PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) { + var touches = ev.touches; + var pageX; + var pageY; + var deltaX = 0; + var deltaY = 0; + // if touch coords available, prefer, + // because FF would give bad ev.pageX ev.pageY + if (touches && touches.length) { + pageX = touches[0].pageX; + pageY = touches[0].pageY; + } + else { + pageX = ev.pageX; + pageY = ev.pageY; + } + // TODO: repeat code + if (isFirst) { + this.origPageX = pageX; + this.origPageY = pageY; + } + else { + deltaX = pageX - this.origPageX; + deltaY = pageY - this.origPageY; + } + return { + origEvent: ev, + isTouch: true, + subjectEl: this.subjectEl, + pageX: pageX, + pageY: pageY, + deltaX: deltaX, + deltaY: deltaY, + }; + }; + return PointerDragging; + }()); + // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) + function isPrimaryMouseButton(ev) { + return ev.button === 0 && !ev.ctrlKey; + } + // Ignoring fake mouse events generated by touch + // ---------------------------------------------------------------------------------------------------- + function startIgnoringMouse() { + ignoreMouseDepth += 1; + setTimeout(function () { + ignoreMouseDepth -= 1; + }, config.touchMouseIgnoreWait); + } + // We want to attach touchmove as early as possible for Safari + // ---------------------------------------------------------------------------------------------------- + function listenerCreated() { + listenerCnt += 1; + if (listenerCnt === 1) { + window.addEventListener('touchmove', onWindowTouchMove, { passive: false }); + } + } + function listenerDestroyed() { + listenerCnt -= 1; + if (!listenerCnt) { + window.removeEventListener('touchmove', onWindowTouchMove, { passive: false }); + } + } + function onWindowTouchMove(ev) { + if (isWindowTouchMoveCancelled) { + ev.preventDefault(); + } + } + + /* + An effect in which an element follows the movement of a pointer across the screen. + The moving element is a clone of some other element. + Must call start + handleMove + stop. + */ + var ElementMirror = /** @class */ (function () { + function ElementMirror() { + this.isVisible = false; // must be explicitly enabled + this.sourceEl = null; + this.mirrorEl = null; + this.sourceElRect = null; // screen coords relative to viewport + // options that can be set directly by caller + this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues + this.zIndex = 9999; + this.revertDuration = 0; + } + ElementMirror.prototype.start = function (sourceEl, pageX, pageY) { + this.sourceEl = sourceEl; + this.sourceElRect = this.sourceEl.getBoundingClientRect(); + this.origScreenX = pageX - window.pageXOffset; + this.origScreenY = pageY - window.pageYOffset; + this.deltaX = 0; + this.deltaY = 0; + this.updateElPosition(); + }; + ElementMirror.prototype.handleMove = function (pageX, pageY) { + this.deltaX = (pageX - window.pageXOffset) - this.origScreenX; + this.deltaY = (pageY - window.pageYOffset) - this.origScreenY; + this.updateElPosition(); + }; + // can be called before start + ElementMirror.prototype.setIsVisible = function (bool) { + if (bool) { + if (!this.isVisible) { + if (this.mirrorEl) { + this.mirrorEl.style.display = ''; + } + this.isVisible = bool; // needs to happen before updateElPosition + this.updateElPosition(); // because was not updating the position while invisible + } + } + else if (this.isVisible) { + if (this.mirrorEl) { + this.mirrorEl.style.display = 'none'; + } + this.isVisible = bool; + } + }; + // always async + ElementMirror.prototype.stop = function (needsRevertAnimation, callback) { + var _this = this; + var done = function () { + _this.cleanup(); + callback(); + }; + if (needsRevertAnimation && + this.mirrorEl && + this.isVisible && + this.revertDuration && // if 0, transition won't work + (this.deltaX || this.deltaY) // if same coords, transition won't work + ) { + this.doRevertAnimation(done, this.revertDuration); + } + else { + setTimeout(done, 0); + } + }; + ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) { + var mirrorEl = this.mirrorEl; + var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened + mirrorEl.style.transition = + 'top ' + revertDuration + 'ms,' + + 'left ' + revertDuration + 'ms'; + applyStyle(mirrorEl, { + left: finalSourceElRect.left, + top: finalSourceElRect.top, + }); + whenTransitionDone(mirrorEl, function () { + mirrorEl.style.transition = ''; + callback(); + }); + }; + ElementMirror.prototype.cleanup = function () { + if (this.mirrorEl) { + removeElement(this.mirrorEl); + this.mirrorEl = null; + } + this.sourceEl = null; + }; + ElementMirror.prototype.updateElPosition = function () { + if (this.sourceEl && this.isVisible) { + applyStyle(this.getMirrorEl(), { + left: this.sourceElRect.left + this.deltaX, + top: this.sourceElRect.top + this.deltaY, + }); + } + }; + ElementMirror.prototype.getMirrorEl = function () { + var sourceElRect = this.sourceElRect; + var mirrorEl = this.mirrorEl; + if (!mirrorEl) { + mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true + // we don't want long taps or any mouse interaction causing selection/menus. + // would use preventSelection(), but that prevents selectstart, causing problems. + mirrorEl.classList.add('fc-unselectable'); + mirrorEl.classList.add('fc-event-dragging'); + applyStyle(mirrorEl, { + position: 'fixed', + zIndex: this.zIndex, + visibility: '', + boxSizing: 'border-box', + width: sourceElRect.right - sourceElRect.left, + height: sourceElRect.bottom - sourceElRect.top, + right: 'auto', + bottom: 'auto', + margin: 0, + }); + this.parentNode.appendChild(mirrorEl); + } + return mirrorEl; + }; + return ElementMirror; + }()); + + /* + Is a cache for a given element's scroll information (all the info that ScrollController stores) + in addition the "client rectangle" of the element.. the area within the scrollbars. + + The cache can be in one of two modes: + - doesListening:false - ignores when the container is scrolled by someone else + - doesListening:true - watch for scrolling and update the cache + */ + var ScrollGeomCache = /** @class */ (function (_super) { + __extends(ScrollGeomCache, _super); + function ScrollGeomCache(scrollController, doesListening) { + var _this = _super.call(this) || this; + _this.handleScroll = function () { + _this.scrollTop = _this.scrollController.getScrollTop(); + _this.scrollLeft = _this.scrollController.getScrollLeft(); + _this.handleScrollChange(); + }; + _this.scrollController = scrollController; + _this.doesListening = doesListening; + _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop(); + _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft(); + _this.scrollWidth = scrollController.getScrollWidth(); + _this.scrollHeight = scrollController.getScrollHeight(); + _this.clientWidth = scrollController.getClientWidth(); + _this.clientHeight = scrollController.getClientHeight(); + _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values + if (_this.doesListening) { + _this.getEventTarget().addEventListener('scroll', _this.handleScroll); + } + return _this; + } + ScrollGeomCache.prototype.destroy = function () { + if (this.doesListening) { + this.getEventTarget().removeEventListener('scroll', this.handleScroll); + } + }; + ScrollGeomCache.prototype.getScrollTop = function () { + return this.scrollTop; + }; + ScrollGeomCache.prototype.getScrollLeft = function () { + return this.scrollLeft; + }; + ScrollGeomCache.prototype.setScrollTop = function (top) { + this.scrollController.setScrollTop(top); + if (!this.doesListening) { + // we are not relying on the element to normalize out-of-bounds scroll values + // so we need to sanitize ourselves + this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0); + this.handleScrollChange(); + } + }; + ScrollGeomCache.prototype.setScrollLeft = function (top) { + this.scrollController.setScrollLeft(top); + if (!this.doesListening) { + // we are not relying on the element to normalize out-of-bounds scroll values + // so we need to sanitize ourselves + this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0); + this.handleScrollChange(); + } + }; + ScrollGeomCache.prototype.getClientWidth = function () { + return this.clientWidth; + }; + ScrollGeomCache.prototype.getClientHeight = function () { + return this.clientHeight; + }; + ScrollGeomCache.prototype.getScrollWidth = function () { + return this.scrollWidth; + }; + ScrollGeomCache.prototype.getScrollHeight = function () { + return this.scrollHeight; + }; + ScrollGeomCache.prototype.handleScrollChange = function () { + }; + return ScrollGeomCache; + }(ScrollController)); + + var ElementScrollGeomCache = /** @class */ (function (_super) { + __extends(ElementScrollGeomCache, _super); + function ElementScrollGeomCache(el, doesListening) { + return _super.call(this, new ElementScrollController(el), doesListening) || this; + } + ElementScrollGeomCache.prototype.getEventTarget = function () { + return this.scrollController.el; + }; + ElementScrollGeomCache.prototype.computeClientRect = function () { + return computeInnerRect(this.scrollController.el); + }; + return ElementScrollGeomCache; + }(ScrollGeomCache)); + + var WindowScrollGeomCache = /** @class */ (function (_super) { + __extends(WindowScrollGeomCache, _super); + function WindowScrollGeomCache(doesListening) { + return _super.call(this, new WindowScrollController(), doesListening) || this; + } + WindowScrollGeomCache.prototype.getEventTarget = function () { + return window; + }; + WindowScrollGeomCache.prototype.computeClientRect = function () { + return { + left: this.scrollLeft, + right: this.scrollLeft + this.clientWidth, + top: this.scrollTop, + bottom: this.scrollTop + this.clientHeight, + }; + }; + // the window is the only scroll object that changes it's rectangle relative + // to the document's topleft as it scrolls + WindowScrollGeomCache.prototype.handleScrollChange = function () { + this.clientRect = this.computeClientRect(); + }; + return WindowScrollGeomCache; + }(ScrollGeomCache)); + + // If available we are using native "performance" API instead of "Date" + // Read more about it on MDN: + // https://developer.mozilla.org/en-US/docs/Web/API/Performance + var getTime = typeof performance === 'function' ? performance.now : Date.now; + /* + For a pointer interaction, automatically scrolls certain scroll containers when the pointer + approaches the edge. + + The caller must call start + handleMove + stop. + */ + var AutoScroller = /** @class */ (function () { + function AutoScroller() { + var _this = this; + // options that can be set by caller + this.isEnabled = true; + this.scrollQuery = [window, '.fc-scroller']; + this.edgeThreshold = 50; // pixels + this.maxVelocity = 300; // pixels per second + // internal state + this.pointerScreenX = null; + this.pointerScreenY = null; + this.isAnimating = false; + this.scrollCaches = null; + // protect against the initial pointerdown being too close to an edge and starting the scroll + this.everMovedUp = false; + this.everMovedDown = false; + this.everMovedLeft = false; + this.everMovedRight = false; + this.animate = function () { + if (_this.isAnimating) { // wasn't cancelled between animation calls + var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset); + if (edge) { + var now = getTime(); + _this.handleSide(edge, (now - _this.msSinceRequest) / 1000); + _this.requestAnimation(now); + } + else { + _this.isAnimating = false; // will stop animation + } + } + }; + } + AutoScroller.prototype.start = function (pageX, pageY, scrollStartEl) { + if (this.isEnabled) { + this.scrollCaches = this.buildCaches(scrollStartEl); + this.pointerScreenX = null; + this.pointerScreenY = null; + this.everMovedUp = false; + this.everMovedDown = false; + this.everMovedLeft = false; + this.everMovedRight = false; + this.handleMove(pageX, pageY); + } + }; + AutoScroller.prototype.handleMove = function (pageX, pageY) { + if (this.isEnabled) { + var pointerScreenX = pageX - window.pageXOffset; + var pointerScreenY = pageY - window.pageYOffset; + var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY; + var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX; + if (yDelta < 0) { + this.everMovedUp = true; + } + else if (yDelta > 0) { + this.everMovedDown = true; + } + if (xDelta < 0) { + this.everMovedLeft = true; + } + else if (xDelta > 0) { + this.everMovedRight = true; + } + this.pointerScreenX = pointerScreenX; + this.pointerScreenY = pointerScreenY; + if (!this.isAnimating) { + this.isAnimating = true; + this.requestAnimation(getTime()); + } + } + }; + AutoScroller.prototype.stop = function () { + if (this.isEnabled) { + this.isAnimating = false; // will stop animation + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + scrollCache.destroy(); + } + this.scrollCaches = null; + } + }; + AutoScroller.prototype.requestAnimation = function (now) { + this.msSinceRequest = now; + requestAnimationFrame(this.animate); + }; + AutoScroller.prototype.handleSide = function (edge, seconds) { + var scrollCache = edge.scrollCache; + var edgeThreshold = this.edgeThreshold; + var invDistance = edgeThreshold - edge.distance; + var velocity = // the closer to the edge, the faster we scroll + ((invDistance * invDistance) / (edgeThreshold * edgeThreshold)) * // quadratic + this.maxVelocity * seconds; + var sign = 1; + switch (edge.name) { + case 'left': + sign = -1; + // falls through + case 'right': + scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign); + break; + case 'top': + sign = -1; + // falls through + case 'bottom': + scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign); + break; + } + }; + // left/top are relative to document topleft + AutoScroller.prototype.computeBestEdge = function (left, top) { + var edgeThreshold = this.edgeThreshold; + var bestSide = null; + var scrollCaches = this.scrollCaches || []; + for (var _i = 0, scrollCaches_1 = scrollCaches; _i < scrollCaches_1.length; _i++) { + var scrollCache = scrollCaches_1[_i]; + var rect = scrollCache.clientRect; + var leftDist = left - rect.left; + var rightDist = rect.right - left; + var topDist = top - rect.top; + var bottomDist = rect.bottom - top; + // completely within the rect? + if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) { + if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && + (!bestSide || bestSide.distance > topDist)) { + bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist }; + } + if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && + (!bestSide || bestSide.distance > bottomDist)) { + bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist }; + } + if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && + (!bestSide || bestSide.distance > leftDist)) { + bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist }; + } + if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && + (!bestSide || bestSide.distance > rightDist)) { + bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist }; + } + } + } + return bestSide; + }; + AutoScroller.prototype.buildCaches = function (scrollStartEl) { + return this.queryScrollEls(scrollStartEl).map(function (el) { + if (el === window) { + return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls + } + return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls + }); + }; + AutoScroller.prototype.queryScrollEls = function (scrollStartEl) { + var els = []; + for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) { + var query = _a[_i]; + if (typeof query === 'object') { + els.push(query); + } + else { + els.push.apply(els, Array.prototype.slice.call(getElRoot(scrollStartEl).querySelectorAll(query))); + } + } + return els; + }; + return AutoScroller; + }()); + + /* + Monitors dragging on an element. Has a number of high-level features: + - minimum distance required before dragging + - minimum wait time ("delay") before dragging + - a mirror element that follows the pointer + */ + var FeaturefulElementDragging = /** @class */ (function (_super) { + __extends(FeaturefulElementDragging, _super); + function FeaturefulElementDragging(containerEl, selector) { + var _this = _super.call(this, containerEl) || this; + _this.containerEl = containerEl; + // options that can be directly set by caller + // the caller can also set the PointerDragging's options as well + _this.delay = null; + _this.minDistance = 0; + _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag + _this.mirrorNeedsRevert = false; + _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup + _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation + _this.isDelayEnded = false; + _this.isDistanceSurpassed = false; + _this.delayTimeoutId = null; + _this.onPointerDown = function (ev) { + if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going + _this.isInteracting = true; + _this.isDelayEnded = false; + _this.isDistanceSurpassed = false; + preventSelection(document.body); + preventContextMenu(document.body); + // prevent links from being visited if there's an eventual drag. + // also prevents selection in older browsers (maybe?). + // not necessary for touch, besides, browser would complain about passiveness. + if (!ev.isTouch) { + ev.origEvent.preventDefault(); + } + _this.emitter.trigger('pointerdown', ev); + if (_this.isInteracting && // not destroyed via pointerdown handler + !_this.pointer.shouldIgnoreMove) { + // actions related to initiating dragstart+dragmove+dragend... + _this.mirror.setIsVisible(false); // reset. caller must set-visible + _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down + _this.startDelay(ev); + if (!_this.minDistance) { + _this.handleDistanceSurpassed(ev); + } + } + } + }; + _this.onPointerMove = function (ev) { + if (_this.isInteracting) { + _this.emitter.trigger('pointermove', ev); + if (!_this.isDistanceSurpassed) { + var minDistance = _this.minDistance; + var distanceSq = void 0; // current distance from the origin, squared + var deltaX = ev.deltaX, deltaY = ev.deltaY; + distanceSq = deltaX * deltaX + deltaY * deltaY; + if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem + _this.handleDistanceSurpassed(ev); + } + } + if (_this.isDragging) { + // a real pointer move? (not one simulated by scrolling) + if (ev.origEvent.type !== 'scroll') { + _this.mirror.handleMove(ev.pageX, ev.pageY); + _this.autoScroller.handleMove(ev.pageX, ev.pageY); + } + _this.emitter.trigger('dragmove', ev); + } + } + }; + _this.onPointerUp = function (ev) { + if (_this.isInteracting) { + _this.isInteracting = false; + allowSelection(document.body); + allowContextMenu(document.body); + _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert + if (_this.isDragging) { + _this.autoScroller.stop(); + _this.tryStopDrag(ev); // which will stop the mirror + } + if (_this.delayTimeoutId) { + clearTimeout(_this.delayTimeoutId); + _this.delayTimeoutId = null; + } + } + }; + var pointer = _this.pointer = new PointerDragging(containerEl); + pointer.emitter.on('pointerdown', _this.onPointerDown); + pointer.emitter.on('pointermove', _this.onPointerMove); + pointer.emitter.on('pointerup', _this.onPointerUp); + if (selector) { + pointer.selector = selector; + } + _this.mirror = new ElementMirror(); + _this.autoScroller = new AutoScroller(); + return _this; + } + FeaturefulElementDragging.prototype.destroy = function () { + this.pointer.destroy(); + // HACK: simulate a pointer-up to end the current drag + // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire) + this.onPointerUp({}); + }; + FeaturefulElementDragging.prototype.startDelay = function (ev) { + var _this = this; + if (typeof this.delay === 'number') { + this.delayTimeoutId = setTimeout(function () { + _this.delayTimeoutId = null; + _this.handleDelayEnd(ev); + }, this.delay); // not assignable to number! + } + else { + this.handleDelayEnd(ev); + } + }; + FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) { + this.isDelayEnded = true; + this.tryStartDrag(ev); + }; + FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) { + this.isDistanceSurpassed = true; + this.tryStartDrag(ev); + }; + FeaturefulElementDragging.prototype.tryStartDrag = function (ev) { + if (this.isDelayEnded && this.isDistanceSurpassed) { + if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { + this.isDragging = true; + this.mirrorNeedsRevert = false; + this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl); + this.emitter.trigger('dragstart', ev); + if (this.touchScrollAllowed === false) { + this.pointer.cancelTouchScroll(); + } + } + } + }; + FeaturefulElementDragging.prototype.tryStopDrag = function (ev) { + // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events + // that come from the document to fire beforehand. much more convenient this way. + this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev)); + }; + FeaturefulElementDragging.prototype.stopDrag = function (ev) { + this.isDragging = false; + this.emitter.trigger('dragend', ev); + }; + // fill in the implementations... + FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) { + this.pointer.shouldIgnoreMove = bool; + }; + FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) { + this.mirror.setIsVisible(bool); + }; + FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) { + this.mirrorNeedsRevert = bool; + }; + FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) { + this.autoScroller.isEnabled = bool; + }; + return FeaturefulElementDragging; + }(ElementDragging)); + + /* + When this class is instantiated, it records the offset of an element (relative to the document topleft), + and continues to monitor scrolling, updating the cached coordinates if it needs to. + Does not access the DOM after instantiation, so highly performant. + + Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element + and an determine if a given point is inside the combined clipping rectangle. + */ + var OffsetTracker = /** @class */ (function () { + function OffsetTracker(el) { + this.origRect = computeRect(el); + // will work fine for divs that have overflow:hidden + this.scrollCaches = getClippingParents(el).map(function (scrollEl) { return new ElementScrollGeomCache(scrollEl, true); }); + } + OffsetTracker.prototype.destroy = function () { + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + scrollCache.destroy(); + } + }; + OffsetTracker.prototype.computeLeft = function () { + var left = this.origRect.left; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + left += scrollCache.origScrollLeft - scrollCache.getScrollLeft(); + } + return left; + }; + OffsetTracker.prototype.computeTop = function () { + var top = this.origRect.top; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + top += scrollCache.origScrollTop - scrollCache.getScrollTop(); + } + return top; + }; + OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) { + var point = { left: pageX, top: pageY }; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + if (!isIgnoredClipping(scrollCache.getEventTarget()) && + !pointInsideRect(point, scrollCache.clientRect)) { + return false; + } + } + return true; + }; + return OffsetTracker; + }()); + // certain clipping containers should never constrain interactions, like and + // https://github.com/fullcalendar/fullcalendar/issues/3615 + function isIgnoredClipping(node) { + var tagName = node.tagName; + return tagName === 'HTML' || tagName === 'BODY'; + } + + /* + Tracks movement over multiple droppable areas (aka "hits") + that exist in one or more DateComponents. + Relies on an existing draggable. + + emits: + - pointerdown + - dragstart + - hitchange - fires initially, even if not over a hit + - pointerup + - (hitchange - again, to null, if ended over a hit) + - dragend + */ + var HitDragging = /** @class */ (function () { + function HitDragging(dragging, droppableStore) { + var _this = this; + // options that can be set by caller + this.useSubjectCenter = false; + this.requireInitial = true; // if doesn't start out on a hit, won't emit any events + this.initialHit = null; + this.movingHit = null; + this.finalHit = null; // won't ever be populated if shouldIgnoreMove + this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + _this.initialHit = null; + _this.movingHit = null; + _this.finalHit = null; + _this.prepareHits(); + _this.processFirstCoord(ev); + if (_this.initialHit || !_this.requireInitial) { + dragging.setIgnoreMove(false); + // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :( + _this.emitter.trigger('pointerdown', ev); + } + else { + dragging.setIgnoreMove(true); + } + }; + this.handleDragStart = function (ev) { + _this.emitter.trigger('dragstart', ev); + _this.handleMove(ev, true); // force = fire even if initially null + }; + this.handleDragMove = function (ev) { + _this.emitter.trigger('dragmove', ev); + _this.handleMove(ev); + }; + this.handlePointerUp = function (ev) { + _this.releaseHits(); + _this.emitter.trigger('pointerup', ev); + }; + this.handleDragEnd = function (ev) { + if (_this.movingHit) { + _this.emitter.trigger('hitupdate', null, true, ev); + } + _this.finalHit = _this.movingHit; + _this.movingHit = null; + _this.emitter.trigger('dragend', ev); + }; + this.droppableStore = droppableStore; + dragging.emitter.on('pointerdown', this.handlePointerDown); + dragging.emitter.on('dragstart', this.handleDragStart); + dragging.emitter.on('dragmove', this.handleDragMove); + dragging.emitter.on('pointerup', this.handlePointerUp); + dragging.emitter.on('dragend', this.handleDragEnd); + this.dragging = dragging; + this.emitter = new Emitter(); + } + // sets initialHit + // sets coordAdjust + HitDragging.prototype.processFirstCoord = function (ev) { + var origPoint = { left: ev.pageX, top: ev.pageY }; + var adjustedPoint = origPoint; + var subjectEl = ev.subjectEl; + var subjectRect; + if (subjectEl instanceof HTMLElement) { // i.e. not a Document/ShadowRoot + subjectRect = computeRect(subjectEl); + adjustedPoint = constrainPoint(adjustedPoint, subjectRect); + } + var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top); + if (initialHit) { + if (this.useSubjectCenter && subjectRect) { + var slicedSubjectRect = intersectRects(subjectRect, initialHit.rect); + if (slicedSubjectRect) { + adjustedPoint = getRectCenter(slicedSubjectRect); + } + } + this.coordAdjust = diffPoints(adjustedPoint, origPoint); + } + else { + this.coordAdjust = { left: 0, top: 0 }; + } + }; + HitDragging.prototype.handleMove = function (ev, forceHandle) { + var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top); + if (forceHandle || !isHitsEqual(this.movingHit, hit)) { + this.movingHit = hit; + this.emitter.trigger('hitupdate', hit, false, ev); + } + }; + HitDragging.prototype.prepareHits = function () { + this.offsetTrackers = mapHash(this.droppableStore, function (interactionSettings) { + interactionSettings.component.prepareHits(); + return new OffsetTracker(interactionSettings.el); + }); + }; + HitDragging.prototype.releaseHits = function () { + var offsetTrackers = this.offsetTrackers; + for (var id in offsetTrackers) { + offsetTrackers[id].destroy(); + } + this.offsetTrackers = {}; + }; + HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) { + var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers; + var bestHit = null; + for (var id in droppableStore) { + var component = droppableStore[id].component; + var offsetTracker = offsetTrackers[id]; + if (offsetTracker && // wasn't destroyed mid-drag + offsetTracker.isWithinClipping(offsetLeft, offsetTop)) { + var originLeft = offsetTracker.computeLeft(); + var originTop = offsetTracker.computeTop(); + var positionLeft = offsetLeft - originLeft; + var positionTop = offsetTop - originTop; + var origRect = offsetTracker.origRect; + var width = origRect.right - origRect.left; + var height = origRect.bottom - origRect.top; + if ( + // must be within the element's bounds + positionLeft >= 0 && positionLeft < width && + positionTop >= 0 && positionTop < height) { + var hit = component.queryHit(positionLeft, positionTop, width, height); + if (hit && ( + // make sure the hit is within activeRange, meaning it's not a dead cell + rangeContainsRange(hit.dateProfile.activeRange, hit.dateSpan.range)) && + (!bestHit || hit.layer > bestHit.layer)) { + hit.componentId = id; + hit.context = component.context; + // TODO: better way to re-orient rectangle + hit.rect.left += originLeft; + hit.rect.right += originLeft; + hit.rect.top += originTop; + hit.rect.bottom += originTop; + bestHit = hit; + } + } + } + } + return bestHit; + }; + return HitDragging; + }()); + function isHitsEqual(hit0, hit1) { + if (!hit0 && !hit1) { + return true; + } + if (Boolean(hit0) !== Boolean(hit1)) { + return false; + } + return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan); + } + + function buildDatePointApiWithContext(dateSpan, context) { + var props = {}; + for (var _i = 0, _a = context.pluginHooks.datePointTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(props, transform(dateSpan, context)); + } + __assign(props, buildDatePointApi(dateSpan, context.dateEnv)); + return props; + } + function buildDatePointApi(span, dateEnv) { + return { + date: dateEnv.toDate(span.range.start), + dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), + allDay: span.allDay, + }; + } + + /* + Monitors when the user clicks on a specific date/time of a component. + A pointerdown+pointerup on the same "hit" constitutes a click. + */ + var DateClicking = /** @class */ (function (_super) { + __extends(DateClicking, _super); + function DateClicking(settings) { + var _this = _super.call(this, settings) || this; + _this.handlePointerDown = function (pev) { + var dragging = _this.dragging; + var downEl = pev.origEvent.target; + // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired + dragging.setIgnoreMove(!_this.component.isValidDateDownEl(downEl)); + }; + // won't even fire if moving was ignored + _this.handleDragEnd = function (ev) { + var component = _this.component; + var pointer = _this.dragging.pointer; + if (!pointer.wasTouchScroll) { + var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit; + if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) { + var context = component.context; + var arg = __assign(__assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl: initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi || context.calendarApi.view }); + context.emitter.trigger('dateClick', arg); + } + } + }; + // we DO want to watch pointer moves because otherwise finalHit won't get populated + _this.dragging = new FeaturefulElementDragging(settings.el); + _this.dragging.autoScroller.isEnabled = false; + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + DateClicking.prototype.destroy = function () { + this.dragging.destroy(); + }; + return DateClicking; + }(Interaction)); + + /* + Tracks when the user selects a portion of time of a component, + constituted by a drag over date cells, with a possible delay at the beginning of the drag. + */ + var DateSelecting = /** @class */ (function (_super) { + __extends(DateSelecting, _super); + function DateSelecting(settings) { + var _this = _super.call(this, settings) || this; + _this.dragSelection = null; + _this.handlePointerDown = function (ev) { + var _a = _this, component = _a.component, dragging = _a.dragging; + var options = component.context.options; + var canSelect = options.selectable && + component.isValidDateDownEl(ev.origEvent.target); + // don't bother to watch expensive moves if component won't do selection + dragging.setIgnoreMove(!canSelect); + // if touch, require user to hold down + dragging.delay = ev.isTouch ? getComponentTouchDelay$1(component) : null; + }; + _this.handleDragStart = function (ev) { + _this.component.context.calendarApi.unselect(ev); // unselect previous selections + }; + _this.handleHitUpdate = function (hit, isFinal) { + var context = _this.component.context; + var dragSelection = null; + var isInvalid = false; + if (hit) { + var initialHit = _this.hitDragging.initialHit; + var disallowed = hit.componentId === initialHit.componentId + && _this.isHitComboAllowed + && !_this.isHitComboAllowed(initialHit, hit); + if (!disallowed) { + dragSelection = joinHitsIntoSelection(initialHit, hit, context.pluginHooks.dateSelectionTransformers); + } + if (!dragSelection || !isDateSelectionValid(dragSelection, hit.dateProfile, context)) { + isInvalid = true; + dragSelection = null; + } + } + if (dragSelection) { + context.dispatch({ type: 'SELECT_DATES', selection: dragSelection }); + } + else if (!isFinal) { // only unselect if moved away while dragging + context.dispatch({ type: 'UNSELECT_DATES' }); + } + if (!isInvalid) { + enableCursor(); + } + else { + disableCursor(); + } + if (!isFinal) { + _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging + } + }; + _this.handlePointerUp = function (pev) { + if (_this.dragSelection) { + // selection is already rendered, so just need to report selection + triggerDateSelect(_this.dragSelection, pev, _this.component.context); + _this.dragSelection = null; + } + }; + var component = settings.component; + var options = component.context.options; + var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); + dragging.touchScrollAllowed = false; + dragging.minDistance = options.selectMinDistance || 0; + dragging.autoScroller.isEnabled = options.dragScroll; + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('pointerup', _this.handlePointerUp); + return _this; + } + DateSelecting.prototype.destroy = function () { + this.dragging.destroy(); + }; + return DateSelecting; + }(Interaction)); + function getComponentTouchDelay$1(component) { + var options = component.context.options; + var delay = options.selectLongPressDelay; + if (delay == null) { + delay = options.longPressDelay; + } + return delay; + } + function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) { + var dateSpan0 = hit0.dateSpan; + var dateSpan1 = hit1.dateSpan; + var ms = [ + dateSpan0.range.start, + dateSpan0.range.end, + dateSpan1.range.start, + dateSpan1.range.end, + ]; + ms.sort(compareNumbers); + var props = {}; + for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) { + var transformer = dateSelectionTransformers_1[_i]; + var res = transformer(hit0, hit1); + if (res === false) { + return null; + } + if (res) { + __assign(props, res); + } + } + props.range = { start: ms[0], end: ms[3] }; + props.allDay = dateSpan0.allDay; + return props; + } + + var EventDragging = /** @class */ (function (_super) { + __extends(EventDragging, _super); + function EventDragging(settings) { + var _this = _super.call(this, settings) || this; + // internal state + _this.subjectEl = null; + _this.subjectSeg = null; // the seg being selected/dragged + _this.isDragging = false; + _this.eventRange = null; + _this.relevantEvents = null; // the events being dragged + _this.receivingContext = null; + _this.validMutation = null; + _this.mutatedRelevantEvents = null; + _this.handlePointerDown = function (ev) { + var origTarget = ev.origEvent.target; + var _a = _this, component = _a.component, dragging = _a.dragging; + var mirror = dragging.mirror; + var options = component.context.options; + var initialContext = component.context; + _this.subjectEl = ev.subjectEl; + var subjectSeg = _this.subjectSeg = getElSeg(ev.subjectEl); + var eventRange = _this.eventRange = subjectSeg.eventRange; + var eventInstanceId = eventRange.instance.instanceId; + _this.relevantEvents = getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId); + dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance; + dragging.delay = + // only do a touch delay if touch and this event hasn't been selected yet + (ev.isTouch && eventInstanceId !== component.props.eventSelection) ? + getComponentTouchDelay(component) : + null; + if (options.fixedMirrorParent) { + mirror.parentNode = options.fixedMirrorParent; + } + else { + mirror.parentNode = elementClosest(origTarget, '.fc'); + } + mirror.revertDuration = options.dragRevertDuration; + var isValid = component.isValidSegDownEl(origTarget) && + !elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer + dragging.setIgnoreMove(!isValid); + // disable dragging for elements that are resizable (ie, selectable) + // but are not draggable + _this.isDragging = isValid && + ev.subjectEl.classList.contains('fc-event-draggable'); + }; + _this.handleDragStart = function (ev) { + var initialContext = _this.component.context; + var eventRange = _this.eventRange; + var eventInstanceId = eventRange.instance.instanceId; + if (ev.isTouch) { + // need to select a different event? + if (eventInstanceId !== _this.component.props.eventSelection) { + initialContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId }); + } + } + else { + // if now using mouse, but was previous touch interaction, clear selected event + initialContext.dispatch({ type: 'UNSELECT_EVENT' }); + } + if (_this.isDragging) { + initialContext.calendarApi.unselect(ev); // unselect *date* selection + initialContext.emitter.trigger('eventDragStart', { + el: _this.subjectEl, + event: new EventApi(initialContext, eventRange.def, eventRange.instance), + jsEvent: ev.origEvent, + view: initialContext.viewApi, + }); + } + }; + _this.handleHitUpdate = function (hit, isFinal) { + if (!_this.isDragging) { + return; + } + var relevantEvents = _this.relevantEvents; + var initialHit = _this.hitDragging.initialHit; + var initialContext = _this.component.context; + // states based on new hit + var receivingContext = null; + var mutation = null; + var mutatedRelevantEvents = null; + var isInvalid = false; + var interaction = { + affectedEvents: relevantEvents, + mutatedEvents: createEmptyEventStore(), + isEvent: true, + }; + if (hit) { + receivingContext = hit.context; + var receivingOptions = receivingContext.options; + if (initialContext === receivingContext || + (receivingOptions.editable && receivingOptions.droppable)) { + mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers); + if (mutation) { + mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext); + interaction.mutatedEvents = mutatedRelevantEvents; + if (!isInteractionValid(interaction, hit.dateProfile, receivingContext)) { + isInvalid = true; + mutation = null; + mutatedRelevantEvents = null; + interaction.mutatedEvents = createEmptyEventStore(); + } + } + } + else { + receivingContext = null; + } + } + _this.displayDrag(receivingContext, interaction); + if (!isInvalid) { + enableCursor(); + } + else { + disableCursor(); + } + if (!isFinal) { + if (initialContext === receivingContext && // TODO: write test for this + isHitsEqual(initialHit, hit)) { + mutation = null; + } + _this.dragging.setMirrorNeedsRevert(!mutation); + // render the mirror if no already-rendered mirror + // TODO: wish we could somehow wait for dispatch to guarantee render + _this.dragging.setMirrorIsVisible(!hit || !getElRoot(_this.subjectEl).querySelector('.fc-event-mirror')); + // assign states based on new hit + _this.receivingContext = receivingContext; + _this.validMutation = mutation; + _this.mutatedRelevantEvents = mutatedRelevantEvents; + } + }; + _this.handlePointerUp = function () { + if (!_this.isDragging) { + _this.cleanup(); // because handleDragEnd won't fire + } + }; + _this.handleDragEnd = function (ev) { + if (_this.isDragging) { + var initialContext_1 = _this.component.context; + var initialView = initialContext_1.viewApi; + var _a = _this, receivingContext_1 = _a.receivingContext, validMutation = _a.validMutation; + var eventDef = _this.eventRange.def; + var eventInstance = _this.eventRange.instance; + var eventApi = new EventApi(initialContext_1, eventDef, eventInstance); + var relevantEvents_1 = _this.relevantEvents; + var mutatedRelevantEvents_1 = _this.mutatedRelevantEvents; + var finalHit = _this.hitDragging.finalHit; + _this.clearDrag(); // must happen after revert animation + initialContext_1.emitter.trigger('eventDragStop', { + el: _this.subjectEl, + event: eventApi, + jsEvent: ev.origEvent, + view: initialView, + }); + if (validMutation) { + // dropped within same calendar + if (receivingContext_1 === initialContext_1) { + var updatedEventApi = new EventApi(initialContext_1, mutatedRelevantEvents_1.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents_1.instances[eventInstance.instanceId] : null); + initialContext_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: mutatedRelevantEvents_1, + }); + var eventChangeArg = { + oldEvent: eventApi, + event: updatedEventApi, + relatedEvents: buildEventApis(mutatedRelevantEvents_1, initialContext_1, eventInstance), + revert: function () { + initialContext_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents_1, // the pre-change data + }); + }, + }; + var transformed = {}; + for (var _i = 0, _b = initialContext_1.getCurrentData().pluginHooks.eventDropTransformers; _i < _b.length; _i++) { + var transformer = _b[_i]; + __assign(transformed, transformer(validMutation, initialContext_1)); + } + initialContext_1.emitter.trigger('eventDrop', __assign(__assign(__assign({}, eventChangeArg), transformed), { el: ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view: initialView })); + initialContext_1.emitter.trigger('eventChange', eventChangeArg); + // dropped in different calendar + } + else if (receivingContext_1) { + var eventRemoveArg = { + event: eventApi, + relatedEvents: buildEventApis(relevantEvents_1, initialContext_1, eventInstance), + revert: function () { + initialContext_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents_1, + }); + }, + }; + initialContext_1.emitter.trigger('eventLeave', __assign(__assign({}, eventRemoveArg), { draggedEl: ev.subjectEl, view: initialView })); + initialContext_1.dispatch({ + type: 'REMOVE_EVENTS', + eventStore: relevantEvents_1, + }); + initialContext_1.emitter.trigger('eventRemove', eventRemoveArg); + var addedEventDef = mutatedRelevantEvents_1.defs[eventDef.defId]; + var addedEventInstance = mutatedRelevantEvents_1.instances[eventInstance.instanceId]; + var addedEventApi = new EventApi(receivingContext_1, addedEventDef, addedEventInstance); + receivingContext_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: mutatedRelevantEvents_1, + }); + var eventAddArg = { + event: addedEventApi, + relatedEvents: buildEventApis(mutatedRelevantEvents_1, receivingContext_1, addedEventInstance), + revert: function () { + receivingContext_1.dispatch({ + type: 'REMOVE_EVENTS', + eventStore: mutatedRelevantEvents_1, + }); + }, + }; + receivingContext_1.emitter.trigger('eventAdd', eventAddArg); + if (ev.isTouch) { + receivingContext_1.dispatch({ + type: 'SELECT_EVENT', + eventInstanceId: eventInstance.instanceId, + }); + } + receivingContext_1.emitter.trigger('drop', __assign(__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext_1)), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.context.viewApi })); + receivingContext_1.emitter.trigger('eventReceive', __assign(__assign({}, eventAddArg), { draggedEl: ev.subjectEl, view: finalHit.context.viewApi })); + } + } + else { + initialContext_1.emitter.trigger('_noEventDrop'); + } + } + _this.cleanup(); + }; + var component = _this.component; + var options = component.context.options; + var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); + dragging.pointer.selector = EventDragging.SELECTOR; + dragging.touchScrollAllowed = false; + dragging.autoScroller.isEnabled = options.dragScroll; + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsStore); + hitDragging.useSubjectCenter = settings.useEventCenter; + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('pointerup', _this.handlePointerUp); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + EventDragging.prototype.destroy = function () { + this.dragging.destroy(); + }; + // render a drag state on the next receivingCalendar + EventDragging.prototype.displayDrag = function (nextContext, state) { + var initialContext = this.component.context; + var prevContext = this.receivingContext; + // does the previous calendar need to be cleared? + if (prevContext && prevContext !== nextContext) { + // does the initial calendar need to be cleared? + // if so, don't clear all the way. we still need to to hide the affectedEvents + if (prevContext === initialContext) { + prevContext.dispatch({ + type: 'SET_EVENT_DRAG', + state: { + affectedEvents: state.affectedEvents, + mutatedEvents: createEmptyEventStore(), + isEvent: true, + }, + }); + // completely clear the old calendar if it wasn't the initial + } + else { + prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + } + if (nextContext) { + nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state }); + } + }; + EventDragging.prototype.clearDrag = function () { + var initialCalendar = this.component.context; + var receivingContext = this.receivingContext; + if (receivingContext) { + receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + // the initial calendar might have an dummy drag state from displayDrag + if (initialCalendar !== receivingContext) { + initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + }; + EventDragging.prototype.cleanup = function () { + this.subjectSeg = null; + this.isDragging = false; + this.eventRange = null; + this.relevantEvents = null; + this.receivingContext = null; + this.validMutation = null; + this.mutatedRelevantEvents = null; + }; + // TODO: test this in IE11 + // QUESTION: why do we need it on the resizable??? + EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable'; + return EventDragging; + }(Interaction)); + function computeEventMutation(hit0, hit1, massagers) { + var dateSpan0 = hit0.dateSpan; + var dateSpan1 = hit1.dateSpan; + var date0 = dateSpan0.range.start; + var date1 = dateSpan1.range.start; + var standardProps = {}; + if (dateSpan0.allDay !== dateSpan1.allDay) { + standardProps.allDay = dateSpan1.allDay; + standardProps.hasEnd = hit1.context.options.allDayMaintainDuration; + if (dateSpan1.allDay) { + // means date1 is already start-of-day, + // but date0 needs to be converted + date0 = startOfDay(date0); + } + } + var delta = diffDates(date0, date1, hit0.context.dateEnv, hit0.componentId === hit1.componentId ? + hit0.largeUnit : + null); + if (delta.milliseconds) { // has hours/minutes/seconds + standardProps.allDay = false; + } + var mutation = { + datesDelta: delta, + standardProps: standardProps, + }; + for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) { + var massager = massagers_1[_i]; + massager(mutation, hit0, hit1); + } + return mutation; + } + function getComponentTouchDelay(component) { + var options = component.context.options; + var delay = options.eventLongPressDelay; + if (delay == null) { + delay = options.longPressDelay; + } + return delay; + } + + var EventResizing = /** @class */ (function (_super) { + __extends(EventResizing, _super); + function EventResizing(settings) { + var _this = _super.call(this, settings) || this; + // internal state + _this.draggingSegEl = null; + _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg? + _this.eventRange = null; + _this.relevantEvents = null; + _this.validMutation = null; + _this.mutatedRelevantEvents = null; + _this.handlePointerDown = function (ev) { + var component = _this.component; + var segEl = _this.querySegEl(ev); + var seg = getElSeg(segEl); + var eventRange = _this.eventRange = seg.eventRange; + _this.dragging.minDistance = component.context.options.eventDragMinDistance; + // if touch, need to be working with a selected event + _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) || + (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId)); + }; + _this.handleDragStart = function (ev) { + var context = _this.component.context; + var eventRange = _this.eventRange; + _this.relevantEvents = getRelevantEvents(context.getCurrentData().eventStore, _this.eventRange.instance.instanceId); + var segEl = _this.querySegEl(ev); + _this.draggingSegEl = segEl; + _this.draggingSeg = getElSeg(segEl); + context.calendarApi.unselect(); + context.emitter.trigger('eventResizeStart', { + el: segEl, + event: new EventApi(context, eventRange.def, eventRange.instance), + jsEvent: ev.origEvent, + view: context.viewApi, + }); + }; + _this.handleHitUpdate = function (hit, isFinal, ev) { + var context = _this.component.context; + var relevantEvents = _this.relevantEvents; + var initialHit = _this.hitDragging.initialHit; + var eventInstance = _this.eventRange.instance; + var mutation = null; + var mutatedRelevantEvents = null; + var isInvalid = false; + var interaction = { + affectedEvents: relevantEvents, + mutatedEvents: createEmptyEventStore(), + isEvent: true, + }; + if (hit) { + var disallowed = hit.componentId === initialHit.componentId + && _this.isHitComboAllowed + && !_this.isHitComboAllowed(initialHit, hit); + if (!disallowed) { + mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range); + } + } + if (mutation) { + mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context); + interaction.mutatedEvents = mutatedRelevantEvents; + if (!isInteractionValid(interaction, hit.dateProfile, context)) { + isInvalid = true; + mutation = null; + mutatedRelevantEvents = null; + interaction.mutatedEvents = null; + } + } + if (mutatedRelevantEvents) { + context.dispatch({ + type: 'SET_EVENT_RESIZE', + state: interaction, + }); + } + else { + context.dispatch({ type: 'UNSET_EVENT_RESIZE' }); + } + if (!isInvalid) { + enableCursor(); + } + else { + disableCursor(); + } + if (!isFinal) { + if (mutation && isHitsEqual(initialHit, hit)) { + mutation = null; + } + _this.validMutation = mutation; + _this.mutatedRelevantEvents = mutatedRelevantEvents; + } + }; + _this.handleDragEnd = function (ev) { + var context = _this.component.context; + var eventDef = _this.eventRange.def; + var eventInstance = _this.eventRange.instance; + var eventApi = new EventApi(context, eventDef, eventInstance); + var relevantEvents = _this.relevantEvents; + var mutatedRelevantEvents = _this.mutatedRelevantEvents; + context.emitter.trigger('eventResizeStop', { + el: _this.draggingSegEl, + event: eventApi, + jsEvent: ev.origEvent, + view: context.viewApi, + }); + if (_this.validMutation) { + var updatedEventApi = new EventApi(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null); + context.dispatch({ + type: 'MERGE_EVENTS', + eventStore: mutatedRelevantEvents, + }); + var eventChangeArg = { + oldEvent: eventApi, + event: updatedEventApi, + relatedEvents: buildEventApis(mutatedRelevantEvents, context, eventInstance), + revert: function () { + context.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents, // the pre-change events + }); + }, + }; + context.emitter.trigger('eventResize', __assign(__assign({}, eventChangeArg), { el: _this.draggingSegEl, startDelta: _this.validMutation.startDelta || createDuration(0), endDelta: _this.validMutation.endDelta || createDuration(0), jsEvent: ev.origEvent, view: context.viewApi })); + context.emitter.trigger('eventChange', eventChangeArg); + } + else { + context.emitter.trigger('_noEventResize'); + } + // reset all internal state + _this.draggingSeg = null; + _this.relevantEvents = null; + _this.validMutation = null; + // okay to keep eventInstance around. useful to set it in handlePointerDown + }; + var component = settings.component; + var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); + dragging.pointer.selector = '.fc-event-resizer'; + dragging.touchScrollAllowed = false; + dragging.autoScroller.isEnabled = component.context.options.dragScroll; + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + EventResizing.prototype.destroy = function () { + this.dragging.destroy(); + }; + EventResizing.prototype.querySegEl = function (ev) { + return elementClosest(ev.subjectEl, '.fc-event'); + }; + return EventResizing; + }(Interaction)); + function computeMutation(hit0, hit1, isFromStart, instanceRange) { + var dateEnv = hit0.context.dateEnv; + var date0 = hit0.dateSpan.range.start; + var date1 = hit1.dateSpan.range.start; + var delta = diffDates(date0, date1, dateEnv, hit0.largeUnit); + if (isFromStart) { + if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) { + return { startDelta: delta }; + } + } + else if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) { + return { endDelta: delta }; + } + return null; + } + + var UnselectAuto = /** @class */ (function () { + function UnselectAuto(context) { + var _this = this; + this.context = context; + this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system + this.matchesCancel = false; + this.matchesEvent = false; + this.onSelect = function (selectInfo) { + if (selectInfo.jsEvent) { + _this.isRecentPointerDateSelect = true; + } + }; + this.onDocumentPointerDown = function (pev) { + var unselectCancel = _this.context.options.unselectCancel; + var downEl = getEventTargetViaRoot(pev.origEvent); + _this.matchesCancel = !!elementClosest(downEl, unselectCancel); + _this.matchesEvent = !!elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event? + }; + this.onDocumentPointerUp = function (pev) { + var context = _this.context; + var documentPointer = _this.documentPointer; + var calendarState = context.getCurrentData(); + // touch-scrolling should never unfocus any type of selection + if (!documentPointer.wasTouchScroll) { + if (calendarState.dateSelection && // an existing date selection? + !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp? + ) { + var unselectAuto = context.options.unselectAuto; + if (unselectAuto && (!unselectAuto || !_this.matchesCancel)) { + context.calendarApi.unselect(pev); + } + } + if (calendarState.eventSelection && // an existing event selected? + !_this.matchesEvent // interaction DIDN'T start on an event + ) { + context.dispatch({ type: 'UNSELECT_EVENT' }); + } + } + _this.isRecentPointerDateSelect = false; + }; + var documentPointer = this.documentPointer = new PointerDragging(document); + documentPointer.shouldIgnoreMove = true; + documentPointer.shouldWatchScroll = false; + documentPointer.emitter.on('pointerdown', this.onDocumentPointerDown); + documentPointer.emitter.on('pointerup', this.onDocumentPointerUp); + /* + TODO: better way to know about whether there was a selection with the pointer + */ + context.emitter.on('select', this.onSelect); + } + UnselectAuto.prototype.destroy = function () { + this.context.emitter.off('select', this.onSelect); + this.documentPointer.destroy(); + }; + return UnselectAuto; + }()); + + var OPTION_REFINERS$5 = { + fixedMirrorParent: identity, + }; + var LISTENER_REFINERS$1 = { + dateClick: identity, + eventDragStart: identity, + eventDragStop: identity, + eventDrop: identity, + eventResizeStart: identity, + eventResizeStop: identity, + eventResize: identity, + drop: identity, + eventReceive: identity, + eventLeave: identity, + }; + + /* + Given an already instantiated draggable object for one-or-more elements, + Interprets any dragging as an attempt to drag an events that lives outside + of a calendar onto a calendar. + */ + var ExternalElementDragging = /** @class */ (function () { + function ExternalElementDragging(dragging, suppliedDragMeta) { + var _this = this; + this.receivingContext = null; + this.droppableEvent = null; // will exist for all drags, even if create:false + this.suppliedDragMeta = null; + this.dragMeta = null; + this.handleDragStart = function (ev) { + _this.dragMeta = _this.buildDragMeta(ev.subjectEl); + }; + this.handleHitUpdate = function (hit, isFinal, ev) { + var dragging = _this.hitDragging.dragging; + var receivingContext = null; + var droppableEvent = null; + var isInvalid = false; + var interaction = { + affectedEvents: createEmptyEventStore(), + mutatedEvents: createEmptyEventStore(), + isEvent: _this.dragMeta.create, + }; + if (hit) { + receivingContext = hit.context; + if (_this.canDropElOnCalendar(ev.subjectEl, receivingContext)) { + droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingContext); + interaction.mutatedEvents = eventTupleToStore(droppableEvent); + isInvalid = !isInteractionValid(interaction, hit.dateProfile, receivingContext); + if (isInvalid) { + interaction.mutatedEvents = createEmptyEventStore(); + droppableEvent = null; + } + } + } + _this.displayDrag(receivingContext, interaction); + // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?) + // TODO: wish we could somehow wait for dispatch to guarantee render + dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror')); + if (!isInvalid) { + enableCursor(); + } + else { + disableCursor(); + } + if (!isFinal) { + dragging.setMirrorNeedsRevert(!droppableEvent); + _this.receivingContext = receivingContext; + _this.droppableEvent = droppableEvent; + } + }; + this.handleDragEnd = function (pev) { + var _a = _this, receivingContext = _a.receivingContext, droppableEvent = _a.droppableEvent; + _this.clearDrag(); + if (receivingContext && droppableEvent) { + var finalHit = _this.hitDragging.finalHit; + var finalView = finalHit.context.viewApi; + var dragMeta = _this.dragMeta; + receivingContext.emitter.trigger('drop', __assign(__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView })); + if (dragMeta.create) { + var addingEvents_1 = eventTupleToStore(droppableEvent); + receivingContext.dispatch({ + type: 'MERGE_EVENTS', + eventStore: addingEvents_1, + }); + if (pev.isTouch) { + receivingContext.dispatch({ + type: 'SELECT_EVENT', + eventInstanceId: droppableEvent.instance.instanceId, + }); + } + // signal that an external event landed + receivingContext.emitter.trigger('eventReceive', { + event: new EventApi(receivingContext, droppableEvent.def, droppableEvent.instance), + relatedEvents: [], + revert: function () { + receivingContext.dispatch({ + type: 'REMOVE_EVENTS', + eventStore: addingEvents_1, + }); + }, + draggedEl: pev.subjectEl, + view: finalView, + }); + } + } + _this.receivingContext = null; + _this.droppableEvent = null; + }; + var hitDragging = this.hitDragging = new HitDragging(dragging, interactionSettingsStore); + hitDragging.requireInitial = false; // will start outside of a component + hitDragging.emitter.on('dragstart', this.handleDragStart); + hitDragging.emitter.on('hitupdate', this.handleHitUpdate); + hitDragging.emitter.on('dragend', this.handleDragEnd); + this.suppliedDragMeta = suppliedDragMeta; + } + ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) { + if (typeof this.suppliedDragMeta === 'object') { + return parseDragMeta(this.suppliedDragMeta); + } + if (typeof this.suppliedDragMeta === 'function') { + return parseDragMeta(this.suppliedDragMeta(subjectEl)); + } + return getDragMetaFromEl(subjectEl); + }; + ExternalElementDragging.prototype.displayDrag = function (nextContext, state) { + var prevContext = this.receivingContext; + if (prevContext && prevContext !== nextContext) { + prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + if (nextContext) { + nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state }); + } + }; + ExternalElementDragging.prototype.clearDrag = function () { + if (this.receivingContext) { + this.receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + }; + ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingContext) { + var dropAccept = receivingContext.options.dropAccept; + if (typeof dropAccept === 'function') { + return dropAccept.call(receivingContext.calendarApi, el); + } + if (typeof dropAccept === 'string' && dropAccept) { + return Boolean(elementMatches(el, dropAccept)); + } + return true; + }; + return ExternalElementDragging; + }()); + // Utils for computing event store from the DragMeta + // ---------------------------------------------------------------------------------------------------- + function computeEventForDateSpan(dateSpan, dragMeta, context) { + var defProps = __assign({}, dragMeta.leftoverProps); + for (var _i = 0, _a = context.pluginHooks.externalDefTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(defProps, transform(dateSpan, dragMeta)); + } + var _b = refineEventDef(defProps, context), refined = _b.refined, extra = _b.extra; + var def = parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd + context); + var start = dateSpan.range.start; + // only rely on time info if drop zone is all-day, + // otherwise, we already know the time + if (dateSpan.allDay && dragMeta.startTime) { + start = context.dateEnv.add(start, dragMeta.startTime); + } + var end = dragMeta.duration ? + context.dateEnv.add(start, dragMeta.duration) : + getDefaultEventEnd(dateSpan.allDay, start, context); + var instance = createEventInstance(def.defId, { start: start, end: end }); + return { def: def, instance: instance }; + } + // Utils for extracting data from element + // ---------------------------------------------------------------------------------------------------- + function getDragMetaFromEl(el) { + var str = getEmbeddedElData(el, 'event'); + var obj = str ? + JSON.parse(str) : + { create: false }; // if no embedded data, assume no event creation + return parseDragMeta(obj); + } + config.dataAttrPrefix = ''; + function getEmbeddedElData(el, name) { + var prefix = config.dataAttrPrefix; + var prefixedName = (prefix ? prefix + '-' : '') + name; + return el.getAttribute('data-' + prefixedName) || ''; + } + + /* + Makes an element (that is *external* to any calendar) draggable. + Can pass in data that determines how an event will be created when dropped onto a calendar. + Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system. + */ + var ExternalDraggable = /** @class */ (function () { + function ExternalDraggable(el, settings) { + var _this = this; + if (settings === void 0) { settings = {}; } + this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay; + dragging.minDistance = + minDistance != null ? + minDistance : + (ev.isTouch ? 0 : BASE_OPTION_DEFAULTS.eventDragMinDistance); + dragging.delay = + ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv + (longPressDelay != null ? longPressDelay : BASE_OPTION_DEFAULTS.longPressDelay) : + 0; + }; + this.handleDragStart = function (ev) { + if (ev.isTouch && + _this.dragging.delay && + ev.subjectEl.classList.contains('fc-event')) { + _this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected'); + } + }; + this.settings = settings; + var dragging = this.dragging = new FeaturefulElementDragging(el); + dragging.touchScrollAllowed = false; + if (settings.itemSelector != null) { + dragging.pointer.selector = settings.itemSelector; + } + if (settings.appendTo != null) { + dragging.mirror.parentNode = settings.appendTo; // TODO: write tests + } + dragging.emitter.on('pointerdown', this.handlePointerDown); + dragging.emitter.on('dragstart', this.handleDragStart); + new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new + } + ExternalDraggable.prototype.destroy = function () { + this.dragging.destroy(); + }; + return ExternalDraggable; + }()); + + /* + Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements. + The third-party system is responsible for drawing the visuals effects of the drag. + This class simply monitors for pointer movements and fires events. + It also has the ability to hide the moving element (the "mirror") during the drag. + */ + var InferredElementDragging = /** @class */ (function (_super) { + __extends(InferredElementDragging, _super); + function InferredElementDragging(containerEl) { + var _this = _super.call(this, containerEl) || this; + _this.shouldIgnoreMove = false; + _this.mirrorSelector = ''; + _this.currentMirrorEl = null; + _this.handlePointerDown = function (ev) { + _this.emitter.trigger('pointerdown', ev); + if (!_this.shouldIgnoreMove) { + // fire dragstart right away. does not support delay or min-distance + _this.emitter.trigger('dragstart', ev); + } + }; + _this.handlePointerMove = function (ev) { + if (!_this.shouldIgnoreMove) { + _this.emitter.trigger('dragmove', ev); + } + }; + _this.handlePointerUp = function (ev) { + _this.emitter.trigger('pointerup', ev); + if (!_this.shouldIgnoreMove) { + // fire dragend right away. does not support a revert animation + _this.emitter.trigger('dragend', ev); + } + }; + var pointer = _this.pointer = new PointerDragging(containerEl); + pointer.emitter.on('pointerdown', _this.handlePointerDown); + pointer.emitter.on('pointermove', _this.handlePointerMove); + pointer.emitter.on('pointerup', _this.handlePointerUp); + return _this; + } + InferredElementDragging.prototype.destroy = function () { + this.pointer.destroy(); + }; + InferredElementDragging.prototype.setIgnoreMove = function (bool) { + this.shouldIgnoreMove = bool; + }; + InferredElementDragging.prototype.setMirrorIsVisible = function (bool) { + if (bool) { + // restore a previously hidden element. + // use the reference in case the selector class has already been removed. + if (this.currentMirrorEl) { + this.currentMirrorEl.style.visibility = ''; + this.currentMirrorEl = null; + } + } + else { + var mirrorEl = this.mirrorSelector + // TODO: somehow query FullCalendars WITHIN shadow-roots + ? document.querySelector(this.mirrorSelector) + : null; + if (mirrorEl) { + this.currentMirrorEl = mirrorEl; + mirrorEl.style.visibility = 'hidden'; + } + } + }; + return InferredElementDragging; + }(ElementDragging)); + + /* + Bridges third-party drag-n-drop systems with FullCalendar. + Must be instantiated and destroyed by caller. + */ + var ThirdPartyDraggable = /** @class */ (function () { + function ThirdPartyDraggable(containerOrSettings, settings) { + var containerEl = document; + if ( + // wish we could just test instanceof EventTarget, but doesn't work in IE11 + containerOrSettings === document || + containerOrSettings instanceof Element) { + containerEl = containerOrSettings; + settings = settings || {}; + } + else { + settings = (containerOrSettings || {}); + } + var dragging = this.dragging = new InferredElementDragging(containerEl); + if (typeof settings.itemSelector === 'string') { + dragging.pointer.selector = settings.itemSelector; + } + else if (containerEl === document) { + dragging.pointer.selector = '[data-event]'; + } + if (typeof settings.mirrorSelector === 'string') { + dragging.mirrorSelector = settings.mirrorSelector; + } + new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new + } + ThirdPartyDraggable.prototype.destroy = function () { + this.dragging.destroy(); + }; + return ThirdPartyDraggable; + }()); + + var interactionPlugin = createPlugin({ + componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing], + calendarInteractions: [UnselectAuto], + elementDraggingImpl: FeaturefulElementDragging, + optionRefiners: OPTION_REFINERS$5, + listenerRefiners: LISTENER_REFINERS$1, + }); + + /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. + ----------------------------------------------------------------------------------------------------------------------*/ + // It is a manager for a Table subcomponent, which does most of the heavy lifting. + // It is responsible for managing width/height. + var TableView = /** @class */ (function (_super) { + __extends(TableView, _super); + function TableView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.headerElRef = createRef(); + return _this; + } + TableView.prototype.renderSimpleLayout = function (headerRowContent, bodyContent) { + var _a = this, props = _a.props, context = _a.context; + var sections = []; + var stickyHeaderDates = getStickyHeaderDates(context.options); + if (headerRowContent) { + sections.push({ + type: 'header', + key: 'header', + isSticky: stickyHeaderDates, + chunk: { + elRef: this.headerElRef, + tableClassName: 'fc-col-header', + rowContent: headerRowContent, + }, + }); + } + sections.push({ + type: 'body', + key: 'body', + liquid: true, + chunk: { content: bodyContent }, + }); + return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') }, + createElement(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections }))); })); + }; + TableView.prototype.renderHScrollLayout = function (headerRowContent, bodyContent, colCnt, dayMinWidth) { + var ScrollGrid = this.context.pluginHooks.scrollGridImpl; + if (!ScrollGrid) { + throw new Error('No ScrollGrid implementation'); + } + var _a = this, props = _a.props, context = _a.context; + var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); + var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); + var sections = []; + if (headerRowContent) { + sections.push({ + type: 'header', + key: 'header', + isSticky: stickyHeaderDates, + chunks: [{ + key: 'main', + elRef: this.headerElRef, + tableClassName: 'fc-col-header', + rowContent: headerRowContent, + }], + }); + } + sections.push({ + type: 'body', + key: 'body', + liquid: true, + chunks: [{ + key: 'main', + content: bodyContent, + }], + }); + if (stickyFooterScrollbar) { + sections.push({ + type: 'footer', + key: 'footer', + isSticky: true, + chunks: [{ + key: 'main', + content: renderScrollShim, + }], + }); + } + return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') }, + createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections }))); })); + }; + return TableView; + }(DateComponent)); + + function splitSegsByRow(segs, rowCnt) { + var byRow = []; + for (var i = 0; i < rowCnt; i += 1) { + byRow[i] = []; + } + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + byRow[seg.row].push(seg); + } + return byRow; + } + function splitSegsByFirstCol(segs, colCnt) { + var byCol = []; + for (var i = 0; i < colCnt; i += 1) { + byCol[i] = []; + } + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + byCol[seg.firstCol].push(seg); + } + return byCol; + } + function splitInteractionByRow(ui, rowCnt) { + var byRow = []; + if (!ui) { + for (var i = 0; i < rowCnt; i += 1) { + byRow[i] = null; + } + } + else { + for (var i = 0; i < rowCnt; i += 1) { + byRow[i] = { + affectedInstances: ui.affectedInstances, + isEvent: ui.isEvent, + segs: [], + }; + } + for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + byRow[seg.row].segs.push(seg); + } + } + return byRow; + } + + var TableCellTop = /** @class */ (function (_super) { + __extends(TableCellTop, _super); + function TableCellTop() { + return _super !== null && _super.apply(this, arguments) || this; + } + TableCellTop.prototype.render = function () { + var props = this.props; + var navLinkAttrs = buildNavLinkAttrs(this.context, props.date); + return (createElement(DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, defaultContent: renderTopInner }, function (innerElRef, innerContent) { return ((innerContent || props.forceDayTop) && (createElement("div", { className: "fc-daygrid-day-top", ref: innerElRef }, + createElement("a", __assign({ id: props.dayNumberId, className: "fc-daygrid-day-number" }, navLinkAttrs), innerContent || createElement(Fragment, null, "\u00A0"))))); })); + }; + return TableCellTop; + }(BaseComponent)); + function renderTopInner(props) { + return props.dayNumberText; + } + + var DEFAULT_TABLE_EVENT_TIME_FORMAT = createFormatter({ + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true, + meridiem: 'narrow', + }); + function hasListItemDisplay(seg) { + var display = seg.eventRange.ui.display; + return display === 'list-item' || (display === 'auto' && + !seg.eventRange.def.allDay && + seg.firstCol === seg.lastCol && // can't be multi-day + seg.isStart && // " + seg.isEnd // " + ); + } + + var TableBlockEvent = /** @class */ (function (_super) { + __extends(TableBlockEvent, _super); + function TableBlockEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + TableBlockEvent.prototype.render = function () { + var props = this.props; + return (createElement(StandardEvent, __assign({}, props, { extraClassNames: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay }))); + }; + return TableBlockEvent; + }(BaseComponent)); + + var TableListItemEvent = /** @class */ (function (_super) { + __extends(TableListItemEvent, _super); + function TableListItemEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + TableListItemEvent.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var timeFormat = context.options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; + var timeText = buildSegTimeText(props.seg, timeFormat, context, true, props.defaultDisplayEventEnd); + return (createElement(EventRoot, { seg: props.seg, timeText: timeText, defaultContent: renderInnerContent$4, isDragging: props.isDragging, isResizing: false, isDateSelecting: false, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent) { return ( // we don't use styles! + createElement("a", __assign({ className: ['fc-daygrid-event', 'fc-daygrid-dot-event'].concat(classNames).join(' '), ref: rootElRef }, getSegAnchorAttrs(props.seg, context)), innerContent)); })); + }; + return TableListItemEvent; + }(BaseComponent)); + function renderInnerContent$4(innerProps) { + return (createElement(Fragment, null, + createElement("div", { className: "fc-daygrid-event-dot", style: { borderColor: innerProps.borderColor || innerProps.backgroundColor } }), + innerProps.timeText && (createElement("div", { className: "fc-event-time" }, innerProps.timeText)), + createElement("div", { className: "fc-event-title" }, innerProps.event.title || createElement(Fragment, null, "\u00A0")))); + } + + var TableCellMoreLink = /** @class */ (function (_super) { + __extends(TableCellMoreLink, _super); + function TableCellMoreLink() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.compileSegs = memoize(compileSegs); + return _this; + } + TableCellMoreLink.prototype.render = function () { + var props = this.props; + var _a = this.compileSegs(props.singlePlacements), allSegs = _a.allSegs, invisibleSegs = _a.invisibleSegs; + return (createElement(MoreLinkRoot, { dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: function () { + var isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || + (props.eventResize ? props.eventResize.affectedInstances : null) || + {}; + return (createElement(Fragment, null, allSegs.map(function (seg) { + var instanceId = seg.eventRange.instance.instanceId; + return (createElement("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { + visibility: isForcedInvisible[instanceId] ? 'hidden' : '', + } }, hasListItemDisplay(seg) ? (createElement(TableListItemEvent, __assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))) : (createElement(TableBlockEvent, __assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))))); + }))); + } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return (createElement("a", __assign({ ref: rootElRef, className: ['fc-daygrid-more-link'].concat(classNames).join(' '), title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, createAriaClickAttrs(handleClick)), innerContent)); })); + }; + return TableCellMoreLink; + }(BaseComponent)); + function compileSegs(singlePlacements) { + var allSegs = []; + var invisibleSegs = []; + for (var _i = 0, singlePlacements_1 = singlePlacements; _i < singlePlacements_1.length; _i++) { + var placement = singlePlacements_1[_i]; + allSegs.push(placement.seg); + if (!placement.isVisible) { + invisibleSegs.push(placement.seg); + } + } + return { allSegs: allSegs, invisibleSegs: invisibleSegs }; + } + + var DEFAULT_WEEK_NUM_FORMAT$1 = createFormatter({ week: 'narrow' }); + var TableCell = /** @class */ (function (_super) { + __extends(TableCell, _super); + function TableCell() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + _this.state = { + dayNumberId: getUniqueDomId(), + }; + _this.handleRootEl = function (el) { + setRef(_this.rootElRef, el); + setRef(_this.props.elRef, el); + }; + return _this; + } + TableCell.prototype.render = function () { + var _a = this, context = _a.context, props = _a.props, state = _a.state, rootElRef = _a.rootElRef; + var date = props.date, dateProfile = props.dateProfile; + var navLinkAttrs = buildNavLinkAttrs(context, date, 'week'); + return (createElement(DayCellRoot, { date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, elRef: this.handleRootEl }, function (dayElRef, dayClassNames, rootDataAttrs, isDisabled) { return (createElement("td", __assign({ ref: dayElRef, role: "gridcell", className: ['fc-daygrid-day'].concat(dayClassNames, props.extraClassNames || []).join(' ') }, rootDataAttrs, props.extraDataAttrs, (props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {})), + createElement("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef /* different from hook system! RENAME */ }, + props.showWeekNumber && (createElement(WeekNumberRoot, { date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT$1 }, function (weekElRef, weekClassNames, innerElRef, innerContent) { return (createElement("a", __assign({ ref: weekElRef, className: ['fc-daygrid-week-number'].concat(weekClassNames).join(' ') }, navLinkAttrs), innerContent)); })), + !isDisabled && (createElement(TableCellTop, { date: date, dateProfile: dateProfile, showDayNumber: props.showDayNumber, dayNumberId: state.dayNumberId, forceDayTop: props.forceDayTop, todayRange: props.todayRange, extraHookProps: props.extraHookProps })), + createElement("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, + props.fgContent, + createElement("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, + createElement(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))), + createElement("div", { className: "fc-daygrid-day-bg" }, props.bgContent)))); })); + }; + return TableCell; + }(DateComponent)); + + function computeFgSegPlacement(segs, // assumed already sorted + dayMaxEvents, dayMaxEventRows, strictOrder, eventInstanceHeights, maxContentHeight, cells) { + var hierarchy = new DayGridSegHierarchy(); + hierarchy.allowReslicing = true; + hierarchy.strictOrder = strictOrder; + if (dayMaxEvents === true || dayMaxEventRows === true) { + hierarchy.maxCoord = maxContentHeight; + hierarchy.hiddenConsumes = true; + } + else if (typeof dayMaxEvents === 'number') { + hierarchy.maxStackCnt = dayMaxEvents; + } + else if (typeof dayMaxEventRows === 'number') { + hierarchy.maxStackCnt = dayMaxEventRows; + hierarchy.hiddenConsumes = true; + } + // create segInputs only for segs with known heights + var segInputs = []; + var unknownHeightSegs = []; + for (var i = 0; i < segs.length; i += 1) { + var seg = segs[i]; + var instanceId = seg.eventRange.instance.instanceId; + var eventHeight = eventInstanceHeights[instanceId]; + if (eventHeight != null) { + segInputs.push({ + index: i, + thickness: eventHeight, + span: { + start: seg.firstCol, + end: seg.lastCol + 1, + }, + }); + } + else { + unknownHeightSegs.push(seg); + } + } + var hiddenEntries = hierarchy.addSegs(segInputs); + var segRects = hierarchy.toRects(); + var _a = placeRects(segRects, segs, cells), singleColPlacements = _a.singleColPlacements, multiColPlacements = _a.multiColPlacements, leftoverMargins = _a.leftoverMargins; + var moreCnts = []; + var moreMarginTops = []; + // add segs with unknown heights + for (var _i = 0, unknownHeightSegs_1 = unknownHeightSegs; _i < unknownHeightSegs_1.length; _i++) { + var seg = unknownHeightSegs_1[_i]; + multiColPlacements[seg.firstCol].push({ + seg: seg, + isVisible: false, + isAbsolute: true, + absoluteTop: 0, + marginTop: 0, + }); + for (var col = seg.firstCol; col <= seg.lastCol; col += 1) { + singleColPlacements[col].push({ + seg: resliceSeg(seg, col, col + 1, cells), + isVisible: false, + isAbsolute: false, + absoluteTop: 0, + marginTop: 0, + }); + } + } + // add the hidden entries + for (var col = 0; col < cells.length; col += 1) { + moreCnts.push(0); + } + for (var _b = 0, hiddenEntries_1 = hiddenEntries; _b < hiddenEntries_1.length; _b++) { + var hiddenEntry = hiddenEntries_1[_b]; + var seg = segs[hiddenEntry.index]; + var hiddenSpan = hiddenEntry.span; + multiColPlacements[hiddenSpan.start].push({ + seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells), + isVisible: false, + isAbsolute: true, + absoluteTop: 0, + marginTop: 0, + }); + for (var col = hiddenSpan.start; col < hiddenSpan.end; col += 1) { + moreCnts[col] += 1; + singleColPlacements[col].push({ + seg: resliceSeg(seg, col, col + 1, cells), + isVisible: false, + isAbsolute: false, + absoluteTop: 0, + marginTop: 0, + }); + } + } + // deal with leftover margins + for (var col = 0; col < cells.length; col += 1) { + moreMarginTops.push(leftoverMargins[col]); + } + return { singleColPlacements: singleColPlacements, multiColPlacements: multiColPlacements, moreCnts: moreCnts, moreMarginTops: moreMarginTops }; + } + // rects ordered by top coord, then left + function placeRects(allRects, segs, cells) { + var rectsByEachCol = groupRectsByEachCol(allRects, cells.length); + var singleColPlacements = []; + var multiColPlacements = []; + var leftoverMargins = []; + for (var col = 0; col < cells.length; col += 1) { + var rects = rectsByEachCol[col]; + // compute all static segs in singlePlacements + var singlePlacements = []; + var currentHeight = 0; + var currentMarginTop = 0; + for (var _i = 0, rects_1 = rects; _i < rects_1.length; _i++) { + var rect = rects_1[_i]; + var seg = segs[rect.index]; + singlePlacements.push({ + seg: resliceSeg(seg, col, col + 1, cells), + isVisible: true, + isAbsolute: false, + absoluteTop: rect.levelCoord, + marginTop: rect.levelCoord - currentHeight, + }); + currentHeight = rect.levelCoord + rect.thickness; + } + // compute mixed static/absolute segs in multiPlacements + var multiPlacements = []; + currentHeight = 0; + currentMarginTop = 0; + for (var _a = 0, rects_2 = rects; _a < rects_2.length; _a++) { + var rect = rects_2[_a]; + var seg = segs[rect.index]; + var isAbsolute = rect.span.end - rect.span.start > 1; // multi-column? + var isFirstCol = rect.span.start === col; + currentMarginTop += rect.levelCoord - currentHeight; // amount of space since bottom of previous seg + currentHeight = rect.levelCoord + rect.thickness; // height will now be bottom of current seg + if (isAbsolute) { + currentMarginTop += rect.thickness; + if (isFirstCol) { + multiPlacements.push({ + seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), + isVisible: true, + isAbsolute: true, + absoluteTop: rect.levelCoord, + marginTop: 0, + }); + } + } + else if (isFirstCol) { + multiPlacements.push({ + seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), + isVisible: true, + isAbsolute: false, + absoluteTop: rect.levelCoord, + marginTop: currentMarginTop, // claim the margin + }); + currentMarginTop = 0; + } + } + singleColPlacements.push(singlePlacements); + multiColPlacements.push(multiPlacements); + leftoverMargins.push(currentMarginTop); + } + return { singleColPlacements: singleColPlacements, multiColPlacements: multiColPlacements, leftoverMargins: leftoverMargins }; + } + function groupRectsByEachCol(rects, colCnt) { + var rectsByEachCol = []; + for (var col = 0; col < colCnt; col += 1) { + rectsByEachCol.push([]); + } + for (var _i = 0, rects_3 = rects; _i < rects_3.length; _i++) { + var rect = rects_3[_i]; + for (var col = rect.span.start; col < rect.span.end; col += 1) { + rectsByEachCol[col].push(rect); + } + } + return rectsByEachCol; + } + function resliceSeg(seg, spanStart, spanEnd, cells) { + if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) { + return seg; + } + var eventRange = seg.eventRange; + var origRange = eventRange.range; + var slicedRange = intersectRanges(origRange, { + start: cells[spanStart].date, + end: addDays(cells[spanEnd - 1].date, 1), + }); + return __assign(__assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: { + def: eventRange.def, + ui: __assign(__assign({}, eventRange.ui), { durationEditable: false }), + instance: eventRange.instance, + range: slicedRange, + }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }); + } + var DayGridSegHierarchy = /** @class */ (function (_super) { + __extends(DayGridSegHierarchy, _super); + function DayGridSegHierarchy() { + var _this = _super !== null && _super.apply(this, arguments) || this; + // config + _this.hiddenConsumes = false; + // allows us to keep hidden entries in the hierarchy so they take up space + _this.forceHidden = {}; + return _this; + } + DayGridSegHierarchy.prototype.addSegs = function (segInputs) { + var _this = this; + var hiddenSegs = _super.prototype.addSegs.call(this, segInputs); + var entriesByLevel = this.entriesByLevel; + var excludeHidden = function (entry) { return !_this.forceHidden[buildEntryKey(entry)]; }; + // remove the forced-hidden segs + for (var level = 0; level < entriesByLevel.length; level += 1) { + entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden); + } + return hiddenSegs; + }; + DayGridSegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { + var _a = this, entriesByLevel = _a.entriesByLevel, forceHidden = _a.forceHidden; + var touchingEntry = insertion.touchingEntry, touchingLevel = insertion.touchingLevel, touchingLateral = insertion.touchingLateral; + if (this.hiddenConsumes && touchingEntry) { + var touchingEntryId = buildEntryKey(touchingEntry); + // if not already hidden + if (!forceHidden[touchingEntryId]) { + if (this.allowReslicing) { + var placeholderEntry = __assign(__assign({}, touchingEntry), { span: intersectSpans(touchingEntry.span, entry.span) }); + var placeholderEntryId = buildEntryKey(placeholderEntry); + forceHidden[placeholderEntryId] = true; + entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder + this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it + } + else { + forceHidden[touchingEntryId] = true; + hiddenEntries.push(touchingEntry); + } + } + } + return _super.prototype.handleInvalidInsertion.call(this, insertion, entry, hiddenEntries); + }; + return DayGridSegHierarchy; + }(SegHierarchy)); + + var TableRow = /** @class */ (function (_super) { + __extends(TableRow, _super); + function TableRow() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.cellElRefs = new RefMap(); // the ? + createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, + createElement("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), + }); + } + sections.push({ + type: 'body', + key: 'body', + liquid: true, + expandRows: Boolean(context.options.expandRows), + chunk: { + scrollerElRef: this.scrollerElRef, + content: timeContent, + }, + }); + return (createElement(ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return (createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef }, + createElement(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections }))); })); + }; + TimeColsView.prototype.renderHScrollLayout = function (headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) { + var _this = this; + var ScrollGrid = this.context.pluginHooks.scrollGridImpl; + if (!ScrollGrid) { + throw new Error('No ScrollGrid implementation'); + } + var _a = this, context = _a.context, props = _a.props; + var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); + var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); + var sections = []; + if (headerRowContent) { + sections.push({ + type: 'header', + key: 'header', + isSticky: stickyHeaderDates, + syncRowHeights: true, + chunks: [ + { + key: 'axis', + rowContent: function (arg) { return (createElement("tr", { role: "presentation" }, _this.renderHeadAxis('day', arg.rowSyncHeights[0]))); }, + }, + { + key: 'cols', + elRef: this.headerElRef, + tableClassName: 'fc-col-header', + rowContent: headerRowContent, + }, + ], + }); + } + if (allDayContent) { + sections.push({ + type: 'body', + key: 'all-day', + syncRowHeights: true, + chunks: [ + { + key: 'axis', + rowContent: function (contentArg) { return (createElement("tr", { role: "presentation" }, _this.renderTableRowAxis(contentArg.rowSyncHeights[0]))); }, + }, + { + key: 'cols', + content: allDayContent, + }, + ], + }); + sections.push({ + key: 'all-day-divider', + type: 'body', + outerContent: ( // TODO: rename to cellContent so don't need to define ? + createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, + createElement("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), + }); + } + var isNowIndicator = context.options.nowIndicator; + sections.push({ + type: 'body', + key: 'body', + liquid: true, + expandRows: Boolean(context.options.expandRows), + chunks: [ + { + key: 'axis', + content: function (arg) { return ( + // TODO: make this now-indicator arrow more DRY with TimeColsContent + createElement("div", { className: "fc-timegrid-axis-chunk" }, + createElement("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, + arg.tableColGroupNode, + createElement("tbody", null, + createElement(TimeBodyAxis, { slatMetas: slatMetas }))), + createElement("div", { className: "fc-timegrid-now-indicator-container" }, + createElement(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, function (nowDate) { + var nowIndicatorTop = isNowIndicator && + slatCoords && + slatCoords.safeComputeTop(nowDate); // might return void + if (typeof nowIndicatorTop === 'number') { + return (createElement(NowIndicatorRoot, { isAxis: true, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent)); })); + } + return null; + })))); }, + }, + { + key: 'cols', + scrollerElRef: this.scrollerElRef, + content: timeContent, + }, + ], + }); + if (stickyFooterScrollbar) { + sections.push({ + key: 'footer', + type: 'footer', + isSticky: true, + chunks: [ + { + key: 'axis', + content: renderScrollShim, + }, + { + key: 'cols', + content: renderScrollShim, + }, + ], + }); + } + return (createElement(ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return (createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef }, + createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ + { width: 'shrink', cols: [{ width: 'shrink' }] }, + { cols: [{ span: colCnt, minWidth: dayMinWidth }] }, + ], sections: sections }))); })); + }; + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + TimeColsView.prototype.getAllDayMaxEventProps = function () { + var _a = this.context.options, dayMaxEvents = _a.dayMaxEvents, dayMaxEventRows = _a.dayMaxEventRows; + if (dayMaxEvents === true || dayMaxEventRows === true) { // is auto? + dayMaxEvents = undefined; + dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure "auto" goes to a real number + } + return { dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows }; + }; + return TimeColsView; + }(DateComponent)); + function renderAllDayInner$1(hookProps) { + return hookProps.text; + } + + var TimeColsSlatsCoords = /** @class */ (function () { + function TimeColsSlatsCoords(positions, dateProfile, slotDuration) { + this.positions = positions; + this.dateProfile = dateProfile; + this.slotDuration = slotDuration; + } + TimeColsSlatsCoords.prototype.safeComputeTop = function (date) { + var dateProfile = this.dateProfile; + if (rangeContainsMarker(dateProfile.currentRange, date)) { + var startOfDayDate = startOfDay(date); + var timeMs = date.valueOf() - startOfDayDate.valueOf(); + if (timeMs >= asRoughMs(dateProfile.slotMinTime) && + timeMs < asRoughMs(dateProfile.slotMaxTime)) { + return this.computeTimeTop(createDuration(timeMs)); + } + } + return null; + }; + // Computes the top coordinate, relative to the bounds of the grid, of the given date. + // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. + TimeColsSlatsCoords.prototype.computeDateTop = function (when, startOfDayDate) { + if (!startOfDayDate) { + startOfDayDate = startOfDay(when); + } + return this.computeTimeTop(createDuration(when.valueOf() - startOfDayDate.valueOf())); + }; + // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). + // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform. + // Eventually allow computation with arbirary slat dates. + TimeColsSlatsCoords.prototype.computeTimeTop = function (duration) { + var _a = this, positions = _a.positions, dateProfile = _a.dateProfile; + var len = positions.els.length; + // floating-point value of # of slots covered + var slatCoverage = (duration.milliseconds - asRoughMs(dateProfile.slotMinTime)) / asRoughMs(this.slotDuration); + var slatIndex; + var slatRemainder; + // compute a floating-point number for how many slats should be progressed through. + // from 0 to number of slats (inclusive) + // constrained because slotMinTime/slotMaxTime might be customized. + slatCoverage = Math.max(0, slatCoverage); + slatCoverage = Math.min(len, slatCoverage); + // an integer index of the furthest whole slat + // from 0 to number slats (*exclusive*, so len-1) + slatIndex = Math.floor(slatCoverage); + slatIndex = Math.min(slatIndex, len - 1); + // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition. + // could be 1.0 if slatCoverage is covering *all* the slots + slatRemainder = slatCoverage - slatIndex; + return positions.tops[slatIndex] + + positions.getHeight(slatIndex) * slatRemainder; + }; + return TimeColsSlatsCoords; + }()); + + var TimeColsSlatsBody = /** @class */ (function (_super) { + __extends(TimeColsSlatsBody, _super); + function TimeColsSlatsBody() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimeColsSlatsBody.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var options = context.options; + var slatElRefs = props.slatElRefs; + return (createElement("tbody", null, props.slatMetas.map(function (slatMeta, i) { + var hookProps = { + time: slatMeta.time, + date: context.dateEnv.toDate(slatMeta.date), + view: context.viewApi, + }; + var classNames = [ + 'fc-timegrid-slot', + 'fc-timegrid-slot-lane', + slatMeta.isLabeled ? '' : 'fc-timegrid-slot-minor', + ]; + return (createElement("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, + props.axis && (createElement(TimeColsAxisCell, __assign({}, slatMeta))), + createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLaneClassNames, content: options.slotLaneContent, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": slatMeta.isoTimeStr }, innerContent)); }))); + }))); + }; + return TimeColsSlatsBody; + }(BaseComponent)); + + /* + for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. + */ + var TimeColsSlats = /** @class */ (function (_super) { + __extends(TimeColsSlats, _super); + function TimeColsSlats() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + _this.slatElRefs = new RefMap(); + return _this; + } + TimeColsSlats.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + return (createElement("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, + createElement("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { + minWidth: props.tableMinWidth, + width: props.clientWidth, + height: props.minHeight, + } }, + props.tableColGroupNode /* relies on there only being a single for the axis */, + createElement(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas })))); + }; + TimeColsSlats.prototype.componentDidMount = function () { + this.updateSizing(); + }; + TimeColsSlats.prototype.componentDidUpdate = function () { + this.updateSizing(); + }; + TimeColsSlats.prototype.componentWillUnmount = function () { + if (this.props.onCoords) { + this.props.onCoords(null); + } + }; + TimeColsSlats.prototype.updateSizing = function () { + var _a = this, context = _a.context, props = _a.props; + if (props.onCoords && + props.clientWidth !== null // means sizing has stabilized + ) { + var rootEl = this.rootElRef.current; + if (rootEl.offsetHeight) { // not hidden by css + props.onCoords(new TimeColsSlatsCoords(new PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration)); + } + } + }; + return TimeColsSlats; + }(BaseComponent)); + function collectSlatEls(elMap, slatMetas) { + return slatMetas.map(function (slatMeta) { return elMap[slatMeta.key]; }); + } + + function splitSegsByCol(segs, colCnt) { + var segsByCol = []; + var i; + for (i = 0; i < colCnt; i += 1) { + segsByCol.push([]); + } + if (segs) { + for (i = 0; i < segs.length; i += 1) { + segsByCol[segs[i].col].push(segs[i]); + } + } + return segsByCol; + } + function splitInteractionByCol(ui, colCnt) { + var byRow = []; + if (!ui) { + for (var i = 0; i < colCnt; i += 1) { + byRow[i] = null; + } + } + else { + for (var i = 0; i < colCnt; i += 1) { + byRow[i] = { + affectedInstances: ui.affectedInstances, + isEvent: ui.isEvent, + segs: [], + }; + } + for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + byRow[seg.col].segs.push(seg); + } + } + return byRow; + } + + var TimeColMoreLink = /** @class */ (function (_super) { + __extends(TimeColMoreLink, _super); + function TimeColMoreLink() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + return _this; + } + TimeColMoreLink.prototype.render = function () { + var _this = this; + var props = this.props; + return (createElement(MoreLinkRoot, { allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, alignmentElRef: this.rootElRef, defaultContent: renderMoreLinkInner, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: function () { return renderPlainFgSegs(props.hiddenSegs, props); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return (createElement("a", { ref: function (el) { + setRef(rootElRef, el); + setRef(_this.rootElRef, el); + }, className: ['fc-timegrid-more-link'].concat(classNames).join(' '), style: { top: props.top, bottom: props.bottom }, onClick: handleClick, title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, + createElement("div", { ref: innerElRef, className: "fc-timegrid-more-link-inner fc-sticky" }, innerContent))); })); + }; + return TimeColMoreLink; + }(BaseComponent)); + function renderMoreLinkInner(props) { + return props.shortText; + } + + // segInputs assumed sorted + function buildPositioning(segInputs, strictOrder, maxStackCnt) { + var hierarchy = new SegHierarchy(); + if (strictOrder != null) { + hierarchy.strictOrder = strictOrder; + } + if (maxStackCnt != null) { + hierarchy.maxStackCnt = maxStackCnt; + } + var hiddenEntries = hierarchy.addSegs(segInputs); + var hiddenGroups = groupIntersectingEntries(hiddenEntries); + var web = buildWeb(hierarchy); + web = stretchWeb(web, 1); // all levelCoords/thickness will have 0.0-1.0 + var segRects = webToRects(web); + return { segRects: segRects, hiddenGroups: hiddenGroups }; + } + function buildWeb(hierarchy) { + var entriesByLevel = hierarchy.entriesByLevel; + var buildNode = cacheable(function (level, lateral) { return level + ':' + lateral; }, function (level, lateral) { + var siblingRange = findNextLevelSegs(hierarchy, level, lateral); + var nextLevelRes = buildNodes(siblingRange, buildNode); + var entry = entriesByLevel[level][lateral]; + return [ + __assign(__assign({}, entry), { nextLevelNodes: nextLevelRes[0] }), + entry.thickness + nextLevelRes[1], // the pressure builds + ]; + }); + return buildNodes(entriesByLevel.length + ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length } + : null, buildNode)[0]; + } + function buildNodes(siblingRange, buildNode) { + if (!siblingRange) { + return [[], 0]; + } + var level = siblingRange.level, lateralStart = siblingRange.lateralStart, lateralEnd = siblingRange.lateralEnd; + var lateral = lateralStart; + var pairs = []; + while (lateral < lateralEnd) { + pairs.push(buildNode(level, lateral)); + lateral += 1; + } + pairs.sort(cmpDescPressures); + return [ + pairs.map(extractNode), + pairs[0][1], // first item's pressure + ]; + } + function cmpDescPressures(a, b) { + return b[1] - a[1]; + } + function extractNode(a) { + return a[0]; + } + function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) { + var levelCoords = hierarchy.levelCoords, entriesByLevel = hierarchy.entriesByLevel; + var subjectEntry = entriesByLevel[subjectLevel][subjectLateral]; + var afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness; + var levelCnt = levelCoords.length; + var level = subjectLevel; + // skip past levels that are too high up + for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1) + ; // do nothing + for (; level < levelCnt; level += 1) { + var entries = entriesByLevel[level]; + var entry = void 0; + var searchIndex = binarySearch(entries, subjectEntry.span.start, getEntrySpanEnd); + var lateralStart = searchIndex[0] + searchIndex[1]; // if exact match (which doesn't collide), go to next one + var lateralEnd = lateralStart; + while ( // loop through entries that horizontally intersect + (entry = entries[lateralEnd]) && // but not past the whole seg list + entry.span.start < subjectEntry.span.end) { + lateralEnd += 1; + } + if (lateralStart < lateralEnd) { + return { level: level, lateralStart: lateralStart, lateralEnd: lateralEnd }; + } + } + return null; + } + function stretchWeb(topLevelNodes, totalThickness) { + var stretchNode = cacheable(function (node, startCoord, prevThickness) { return buildEntryKey(node); }, function (node, startCoord, prevThickness) { + var nextLevelNodes = node.nextLevelNodes, thickness = node.thickness; + var allThickness = thickness + prevThickness; + var thicknessFraction = thickness / allThickness; + var endCoord; + var newChildren = []; + if (!nextLevelNodes.length) { + endCoord = totalThickness; + } + else { + for (var _i = 0, nextLevelNodes_1 = nextLevelNodes; _i < nextLevelNodes_1.length; _i++) { + var childNode = nextLevelNodes_1[_i]; + if (endCoord === undefined) { + var res = stretchNode(childNode, startCoord, allThickness); + endCoord = res[0]; + newChildren.push(res[1]); + } + else { + var res = stretchNode(childNode, endCoord, 0); + newChildren.push(res[1]); + } + } + } + var newThickness = (endCoord - startCoord) * thicknessFraction; + return [endCoord - newThickness, __assign(__assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })]; + }); + return topLevelNodes.map(function (node) { return stretchNode(node, 0, 0)[1]; }); + } + // not sorted in any particular order + function webToRects(topLevelNodes) { + var rects = []; + var processNode = cacheable(function (node, levelCoord, stackDepth) { return buildEntryKey(node); }, function (node, levelCoord, stackDepth) { + var rect = __assign(__assign({}, node), { levelCoord: levelCoord, + stackDepth: stackDepth, stackForward: 0 }); + rects.push(rect); + return (rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1); + }); + function processNodes(nodes, levelCoord, stackDepth) { + var stackForward = 0; + for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { + var node = nodes_1[_i]; + stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward); + } + return stackForward; + } + processNodes(topLevelNodes, 0, 0); + return rects; // TODO: sort rects by levelCoord to be consistent with toRects? + } + // TODO: move to general util + function cacheable(keyFunc, workFunc) { + var cache = {}; + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var key = keyFunc.apply(void 0, args); + return (key in cache) + ? cache[key] + : (cache[key] = workFunc.apply(void 0, args)); + }; + } + + function computeSegVCoords(segs, colDate, slatCoords, eventMinHeight) { + if (slatCoords === void 0) { slatCoords = null; } + if (eventMinHeight === void 0) { eventMinHeight = 0; } + var vcoords = []; + if (slatCoords) { + for (var i = 0; i < segs.length; i += 1) { + var seg = segs[i]; + var spanStart = slatCoords.computeDateTop(seg.start, colDate); + var spanEnd = Math.max(spanStart + (eventMinHeight || 0), // :( + slatCoords.computeDateTop(seg.end, colDate)); + vcoords.push({ + start: Math.round(spanStart), + end: Math.round(spanEnd), // + }); + } + } + return vcoords; + } + function computeFgSegPlacements$1(segs, segVCoords, // might not have for every seg + eventOrderStrict, eventMaxStack) { + var segInputs = []; + var dumbSegs = []; // segs without coords + for (var i = 0; i < segs.length; i += 1) { + var vcoords = segVCoords[i]; + if (vcoords) { + segInputs.push({ + index: i, + thickness: 1, + span: vcoords, + }); + } + else { + dumbSegs.push(segs[i]); + } + } + var _a = buildPositioning(segInputs, eventOrderStrict, eventMaxStack), segRects = _a.segRects, hiddenGroups = _a.hiddenGroups; + var segPlacements = []; + for (var _i = 0, segRects_1 = segRects; _i < segRects_1.length; _i++) { + var segRect = segRects_1[_i]; + segPlacements.push({ + seg: segs[segRect.index], + rect: segRect, + }); + } + for (var _b = 0, dumbSegs_1 = dumbSegs; _b < dumbSegs_1.length; _b++) { + var dumbSeg = dumbSegs_1[_b]; + segPlacements.push({ seg: dumbSeg, rect: null }); + } + return { segPlacements: segPlacements, hiddenGroups: hiddenGroups }; + } + + var DEFAULT_TIME_FORMAT$2 = createFormatter({ + hour: 'numeric', + minute: '2-digit', + meridiem: false, + }); + var TimeColEvent = /** @class */ (function (_super) { + __extends(TimeColEvent, _super); + function TimeColEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimeColEvent.prototype.render = function () { + var classNames = [ + 'fc-timegrid-event', + 'fc-v-event', + ]; + if (this.props.isShort) { + classNames.push('fc-timegrid-event-short'); + } + return (createElement(StandardEvent, __assign({}, this.props, { defaultTimeFormat: DEFAULT_TIME_FORMAT$2, extraClassNames: classNames }))); + }; + return TimeColEvent; + }(BaseComponent)); + + var TimeColMisc = /** @class */ (function (_super) { + __extends(TimeColMisc, _super); + function TimeColMisc() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimeColMisc.prototype.render = function () { + var props = this.props; + return (createElement(DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (innerElRef, innerContent) { return (innerContent && + createElement("div", { className: "fc-timegrid-col-misc", ref: innerElRef }, innerContent)); })); + }; + return TimeColMisc; + }(BaseComponent)); + + var TimeCol = /** @class */ (function (_super) { + __extends(TimeCol, _super); + function TimeCol() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.sortEventSegs = memoize(sortEventSegs); + return _this; + } + // TODO: memoize event-placement? + TimeCol.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var isSelectMirror = context.options.selectMirror; + var mirrorSegs = (props.eventDrag && props.eventDrag.segs) || + (props.eventResize && props.eventResize.segs) || + (isSelectMirror && props.dateSelectionSegs) || + []; + var interactionAffectedInstances = // TODO: messy way to compute this + (props.eventDrag && props.eventDrag.affectedInstances) || + (props.eventResize && props.eventResize.affectedInstances) || + {}; + var sortedFgSegs = this.sortEventSegs(props.fgEventSegs, context.options.eventOrder); + return (createElement(DayCellRoot, { elRef: props.elRef, date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (rootElRef, classNames, dataAttrs) { return (createElement("td", __assign({ ref: rootElRef, role: "gridcell", className: ['fc-timegrid-col'].concat(classNames, props.extraClassNames || []).join(' ') }, dataAttrs, props.extraDataAttrs), + createElement("div", { className: "fc-timegrid-col-frame" }, + createElement("div", { className: "fc-timegrid-col-bg" }, + _this.renderFillSegs(props.businessHourSegs, 'non-business'), + _this.renderFillSegs(props.bgEventSegs, 'bg-event'), + _this.renderFillSegs(props.dateSelectionSegs, 'highlight')), + createElement("div", { className: "fc-timegrid-col-events" }, _this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), + createElement("div", { className: "fc-timegrid-col-events" }, _this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror))), + createElement("div", { className: "fc-timegrid-now-indicator-container" }, _this.renderNowIndicator(props.nowIndicatorSegs)), + createElement(TimeColMisc, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps })))); })); + }; + TimeCol.prototype.renderFgSegs = function (sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting) { + var props = this.props; + if (props.forPrint) { + return renderPlainFgSegs(sortedFgSegs, props); + } + return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting); + }; + TimeCol.prototype.renderPositionedFgSegs = function (segs, // if not mirror, needs to be sorted + segIsInvisible, isDragging, isResizing, isDateSelecting) { + var _this = this; + var _a = this.context.options, eventMaxStack = _a.eventMaxStack, eventShortHeight = _a.eventShortHeight, eventOrderStrict = _a.eventOrderStrict, eventMinHeight = _a.eventMinHeight; + var _b = this.props, date = _b.date, slatCoords = _b.slatCoords, eventSelection = _b.eventSelection, todayRange = _b.todayRange, nowDate = _b.nowDate; + var isMirror = isDragging || isResizing || isDateSelecting; + var segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); + var _c = computeFgSegPlacements$1(segs, segVCoords, eventOrderStrict, eventMaxStack), segPlacements = _c.segPlacements, hiddenGroups = _c.hiddenGroups; + return (createElement(Fragment, null, + this.renderHiddenGroups(hiddenGroups, segs), + segPlacements.map(function (segPlacement) { + var seg = segPlacement.seg, rect = segPlacement.rect; + var instanceId = seg.eventRange.instance.instanceId; + var isVisible = isMirror || Boolean(!segIsInvisible[instanceId] && rect); + var vStyle = computeSegVStyle(rect && rect.span); + var hStyle = (!isMirror && rect) ? _this.computeSegHStyle(rect) : { left: 0, right: 0 }; + var isInset = Boolean(rect) && rect.stackForward > 0; + var isShort = Boolean(rect) && (rect.span.end - rect.span.start) < eventShortHeight; // look at other places for this problem + return (createElement("div", { className: 'fc-timegrid-event-harness' + + (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: __assign(__assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) }, + createElement(TimeColEvent, __assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, getSegMeta(seg, todayRange, nowDate))))); + }))); + }; + // will already have eventMinHeight applied because segInputs already had it + TimeCol.prototype.renderHiddenGroups = function (hiddenGroups, segs) { + var _a = this.props, extraDateSpan = _a.extraDateSpan, dateProfile = _a.dateProfile, todayRange = _a.todayRange, nowDate = _a.nowDate, eventSelection = _a.eventSelection, eventDrag = _a.eventDrag, eventResize = _a.eventResize; + return (createElement(Fragment, null, hiddenGroups.map(function (hiddenGroup) { + var positionCss = computeSegVStyle(hiddenGroup.span); + var hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs); + return (createElement(TimeColMoreLink, { key: buildIsoString(computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize })); + }))); + }; + TimeCol.prototype.renderFillSegs = function (segs, fillType) { + var _a = this, props = _a.props, context = _a.context; + var segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); // don't assume all populated + var children = segVCoords.map(function (vcoords, i) { + var seg = segs[i]; + return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ? + createElement(BgEvent, __assign({ seg: seg }, getSegMeta(seg, props.todayRange, props.nowDate))) : + renderFill(fillType))); + }); + return createElement(Fragment, null, children); + }; + TimeCol.prototype.renderNowIndicator = function (segs) { + var _a = this.props, slatCoords = _a.slatCoords, date = _a.date; + if (!slatCoords) { + return null; + } + return segs.map(function (seg, i) { return (createElement(NowIndicatorRoot, { isAxis: false, date: date, + // key doesn't matter. will only ever be one + key: i }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-line'].concat(classNames).join(' '), style: { top: slatCoords.computeDateTop(seg.start, date) } }, innerContent)); })); }); + }; + TimeCol.prototype.computeSegHStyle = function (segHCoords) { + var _a = this.context, isRtl = _a.isRtl, options = _a.options; + var shouldOverlap = options.slotEventOverlap; + var nearCoord = segHCoords.levelCoord; // the left side if LTR. the right side if RTL. floating-point + var farCoord = segHCoords.levelCoord + segHCoords.thickness; // the right side if LTR. the left side if RTL. floating-point + var left; // amount of space from left edge, a fraction of the total width + var right; // amount of space from right edge, a fraction of the total width + if (shouldOverlap) { + // double the width, but don't go beyond the maximum forward coordinate (1.0) + farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2); + } + if (isRtl) { + left = 1 - farCoord; + right = nearCoord; + } + else { + left = nearCoord; + right = 1 - farCoord; + } + var props = { + zIndex: segHCoords.stackDepth + 1, + left: left * 100 + '%', + right: right * 100 + '%', + }; + if (shouldOverlap && !segHCoords.stackForward) { + // add padding to the edge so that forward stacked events don't cover the resizer's icon + props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width + } + return props; + }; + return TimeCol; + }(BaseComponent)); + function renderPlainFgSegs(sortedFgSegs, _a) { + var todayRange = _a.todayRange, nowDate = _a.nowDate, eventSelection = _a.eventSelection, eventDrag = _a.eventDrag, eventResize = _a.eventResize; + var hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || + (eventResize ? eventResize.affectedInstances : null) || + {}; + return (createElement(Fragment, null, sortedFgSegs.map(function (seg) { + var instanceId = seg.eventRange.instance.instanceId; + return (createElement("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } }, + createElement(TimeColEvent, __assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, getSegMeta(seg, todayRange, nowDate))))); + }))); + } + function computeSegVStyle(segVCoords) { + if (!segVCoords) { + return { top: '', bottom: '' }; + } + return { + top: segVCoords.start, + bottom: -segVCoords.end, + }; + } + function compileSegsFromEntries(segEntries, allSegs) { + return segEntries.map(function (segEntry) { return allSegs[segEntry.index]; }); + } + + var TimeColsContent = /** @class */ (function (_super) { + __extends(TimeColsContent, _super); + function TimeColsContent() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.splitFgEventSegs = memoize(splitSegsByCol); + _this.splitBgEventSegs = memoize(splitSegsByCol); + _this.splitBusinessHourSegs = memoize(splitSegsByCol); + _this.splitNowIndicatorSegs = memoize(splitSegsByCol); + _this.splitDateSelectionSegs = memoize(splitSegsByCol); + _this.splitEventDrag = memoize(splitInteractionByCol); + _this.splitEventResize = memoize(splitInteractionByCol); + _this.rootElRef = createRef(); + _this.cellElRefs = new RefMap(); + return _this; + } + TimeColsContent.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var nowIndicatorTop = context.options.nowIndicator && + props.slatCoords && + props.slatCoords.safeComputeTop(props.nowDate); // might return void + var colCnt = props.cells.length; + var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt); + var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt); + var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt); + var nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt); + var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt); + var eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); + var eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); + return (createElement("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, + createElement("table", { role: "presentation", style: { + minWidth: props.tableMinWidth, + width: props.clientWidth, + } }, + props.tableColGroupNode, + createElement("tbody", { role: "presentation" }, + createElement("tr", { role: "row" }, + props.axis && (createElement("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, + createElement("div", { className: "fc-timegrid-col-frame" }, + createElement("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && (createElement(NowIndicatorRoot, { isAxis: true, date: props.nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent)); })))))), + props.cells.map(function (cell, i) { return (createElement(TimeCol, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint })); })))))); + }; + TimeColsContent.prototype.componentDidMount = function () { + this.updateCoords(); + }; + TimeColsContent.prototype.componentDidUpdate = function () { + this.updateCoords(); + }; + TimeColsContent.prototype.updateCoords = function () { + var props = this.props; + if (props.onColCoords && + props.clientWidth !== null // means sizing has stabilized + ) { + props.onColCoords(new PositionCache(this.rootElRef.current, collectCellEls$1(this.cellElRefs.currentMap, props.cells), true, // horizontal + false)); + } + }; + return TimeColsContent; + }(BaseComponent)); + function collectCellEls$1(elMap, cells) { + return cells.map(function (cell) { return elMap[cell.key]; }); + } + + /* A component that renders one or more columns of vertical time slots + ----------------------------------------------------------------------------------------------------------------------*/ + var TimeCols = /** @class */ (function (_super) { + __extends(TimeCols, _super); + function TimeCols() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.processSlotOptions = memoize(processSlotOptions); + _this.state = { + slatCoords: null, + }; + _this.handleRootEl = function (el) { + if (el) { + _this.context.registerInteractiveComponent(_this, { + el: el, + isHitComboAllowed: _this.props.isHitComboAllowed, + }); + } + else { + _this.context.unregisterInteractiveComponent(_this); + } + }; + _this.handleScrollRequest = function (request) { + var onScrollTopRequest = _this.props.onScrollTopRequest; + var slatCoords = _this.state.slatCoords; + if (onScrollTopRequest && slatCoords) { + if (request.time) { + var top_1 = slatCoords.computeTimeTop(request.time); + top_1 = Math.ceil(top_1); // zoom can give weird floating-point values. rather scroll a little bit further + if (top_1) { + top_1 += 1; // to overcome top border that slots beyond the first have. looks better + } + onScrollTopRequest(top_1); + } + return true; + } + return false; + }; + _this.handleColCoords = function (colCoords) { + _this.colCoords = colCoords; + }; + _this.handleSlatCoords = function (slatCoords) { + _this.setState({ slatCoords: slatCoords }); + if (_this.props.onSlatCoords) { + _this.props.onSlatCoords(slatCoords); + } + }; + return _this; + } + TimeCols.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state; + return (createElement("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: { + // these props are important to give this wrapper correct dimensions for interactions + // TODO: if we set it here, can we avoid giving to inner tables? + width: props.clientWidth, + minWidth: props.tableMinWidth, + } }, + createElement(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */, onCoords: this.handleSlatCoords }), + createElement(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint }))); + }; + TimeCols.prototype.componentDidMount = function () { + this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); + }; + TimeCols.prototype.componentDidUpdate = function (prevProps) { + this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); + }; + TimeCols.prototype.componentWillUnmount = function () { + this.scrollResponder.detach(); + }; + TimeCols.prototype.queryHit = function (positionLeft, positionTop) { + var _a = this.context, dateEnv = _a.dateEnv, options = _a.options; + var colCoords = this.colCoords; + var dateProfile = this.props.dateProfile; + var slatCoords = this.state.slatCoords; + var _b = this.processSlotOptions(this.props.slotDuration, options.snapDuration), snapDuration = _b.snapDuration, snapsPerSlot = _b.snapsPerSlot; + var colIndex = colCoords.leftToIndex(positionLeft); + var slatIndex = slatCoords.positions.topToIndex(positionTop); + if (colIndex != null && slatIndex != null) { + var cell = this.props.cells[colIndex]; + var slatTop = slatCoords.positions.tops[slatIndex]; + var slatHeight = slatCoords.positions.getHeight(slatIndex); + var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1 + var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat + var snapIndex = slatIndex * snapsPerSlot + localSnapIndex; + var dayDate = this.props.cells[colIndex].date; + var time = addDurations(dateProfile.slotMinTime, multiplyDuration(snapDuration, snapIndex)); + var start = dateEnv.add(dayDate, time); + var end = dateEnv.add(start, snapDuration); + return { + dateProfile: dateProfile, + dateSpan: __assign({ range: { start: start, end: end }, allDay: false }, cell.extraDateSpan), + dayEl: colCoords.els[colIndex], + rect: { + left: colCoords.lefts[colIndex], + right: colCoords.rights[colIndex], + top: slatTop, + bottom: slatTop + slatHeight, + }, + layer: 0, + }; + } + return null; + }; + return TimeCols; + }(DateComponent)); + function processSlotOptions(slotDuration, snapDurationOverride) { + var snapDuration = snapDurationOverride || slotDuration; + var snapsPerSlot = wholeDivideDurations(slotDuration, snapDuration); + if (snapsPerSlot === null) { + snapDuration = slotDuration; + snapsPerSlot = 1; + // TODO: say warning? + } + return { snapDuration: snapDuration, snapsPerSlot: snapsPerSlot }; + } + + var DayTimeColsSlicer = /** @class */ (function (_super) { + __extends(DayTimeColsSlicer, _super); + function DayTimeColsSlicer() { + return _super !== null && _super.apply(this, arguments) || this; + } + DayTimeColsSlicer.prototype.sliceRange = function (range, dayRanges) { + var segs = []; + for (var col = 0; col < dayRanges.length; col += 1) { + var segRange = intersectRanges(range, dayRanges[col]); + if (segRange) { + segs.push({ + start: segRange.start, + end: segRange.end, + isStart: segRange.start.valueOf() === range.start.valueOf(), + isEnd: segRange.end.valueOf() === range.end.valueOf(), + col: col, + }); + } + } + return segs; + }; + return DayTimeColsSlicer; + }(Slicer)); + + var DayTimeCols = /** @class */ (function (_super) { + __extends(DayTimeCols, _super); + function DayTimeCols() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.buildDayRanges = memoize(buildDayRanges); + _this.slicer = new DayTimeColsSlicer(); + _this.timeColsRef = createRef(); + return _this; + } + DayTimeCols.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var dateProfile = props.dateProfile, dayTableModel = props.dayTableModel; + var isNowIndicator = context.options.nowIndicator; + var dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv); + // give it the first row of cells + // TODO: would move this further down hierarchy, but sliceNowDate needs it + return (createElement(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, function (nowDate, todayRange) { return (createElement(TimeCols, __assign({ ref: _this.timeColsRef }, _this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && _this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords }))); })); + }; + return DayTimeCols; + }(DateComponent)); + function buildDayRanges(dayTableModel, dateProfile, dateEnv) { + var ranges = []; + for (var _i = 0, _a = dayTableModel.headerDates; _i < _a.length; _i++) { + var date = _a[_i]; + ranges.push({ + start: dateEnv.add(date, dateProfile.slotMinTime), + end: dateEnv.add(date, dateProfile.slotMaxTime), + }); + } + return ranges; + } + + // potential nice values for the slot-duration and interval-duration + // from largest to smallest + var STOCK_SUB_DURATIONS$1 = [ + { hours: 1 }, + { minutes: 30 }, + { minutes: 15 }, + { seconds: 30 }, + { seconds: 15 }, + ]; + function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) { + var dayStart = new Date(0); + var slatTime = slotMinTime; + var slatIterator = createDuration(0); + var labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration); + var metas = []; + while (asRoughMs(slatTime) < asRoughMs(slotMaxTime)) { + var date = dateEnv.add(dayStart, slatTime); + var isLabeled = wholeDivideDurations(slatIterator, labelInterval) !== null; + metas.push({ + date: date, + time: slatTime, + key: date.toISOString(), + isoTimeStr: formatIsoTimeString(date), + isLabeled: isLabeled, + }); + slatTime = addDurations(slatTime, slotDuration); + slatIterator = addDurations(slatIterator, slotDuration); + } + return metas; + } + // Computes an automatic value for slotLabelInterval + function computeLabelInterval(slotDuration) { + var i; + var labelInterval; + var slotsPerLabel; + // find the smallest stock label interval that results in more than one slots-per-label + for (i = STOCK_SUB_DURATIONS$1.length - 1; i >= 0; i -= 1) { + labelInterval = createDuration(STOCK_SUB_DURATIONS$1[i]); + slotsPerLabel = wholeDivideDurations(labelInterval, slotDuration); + if (slotsPerLabel !== null && slotsPerLabel > 1) { + return labelInterval; + } + } + return slotDuration; // fall back + } + + var DayTimeColsView = /** @class */ (function (_super) { + __extends(DayTimeColsView, _super); + function DayTimeColsView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.buildTimeColsModel = memoize(buildTimeColsModel); + _this.buildSlatMetas = memoize(buildSlatMetas); + return _this; + } + DayTimeColsView.prototype.render = function () { + var _this = this; + var _a = this.context, options = _a.options, dateEnv = _a.dateEnv, dateProfileGenerator = _a.dateProfileGenerator; + var props = this.props; + var dateProfile = props.dateProfile; + var dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator); + var splitProps = this.allDaySplitter.splitProps(props); + var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); + var dayMinWidth = options.dayMinWidth; + var hasAttachedAxis = !dayMinWidth; + var hasDetachedAxis = dayMinWidth; + var headerContent = options.dayHeaders && (createElement(DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null })); + var allDayContent = (options.allDaySlot !== false) && (function (contentArg) { return (createElement(DayTable, __assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, _this.getAllDayMaxEventProps()))); }); + var timeGridContent = function (contentArg) { return (createElement(DayTimeCols, __assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: _this.handleScrollTopRequest }))); }; + return hasDetachedAxis + ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) + : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); + }; + return DayTimeColsView; + }(TimeColsView)); + function buildTimeColsModel(dateProfile, dateProfileGenerator) { + var daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); + return new DayTableModel(daySeries, false); + } + + var OPTION_REFINERS$4 = { + allDaySlot: Boolean, + }; + + var timeGridPlugin = createPlugin({ + initialView: 'timeGridWeek', + optionRefiners: OPTION_REFINERS$4, + views: { + timeGrid: { + component: DayTimeColsView, + usesMinMaxTime: true, + allDaySlot: true, + slotDuration: '00:30:00', + slotEventOverlap: true, // a bad name. confused with overlap/constraint system + }, + timeGridDay: { + type: 'timeGrid', + duration: { days: 1 }, + }, + timeGridWeek: { + type: 'timeGrid', + duration: { weeks: 1 }, + }, + }, + }); + + var ListViewHeaderRow = /** @class */ (function (_super) { + __extends(ListViewHeaderRow, _super); + function ListViewHeaderRow() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = { + textId: getUniqueDomId(), + }; + return _this; + } + ListViewHeaderRow.prototype.render = function () { + var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options, viewApi = _a.viewApi; + var _b = this.props, cellId = _b.cellId, dayDate = _b.dayDate, todayRange = _b.todayRange; + var textId = this.state.textId; + var dayMeta = getDateMeta(dayDate, todayRange); + // will ever be falsy? + var text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''; + // will ever be falsy? also, BAD NAME "alt" + var sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''; + var hookProps = __assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId: textId, + text: text, + sideText: sideText, navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta); + var classNames = ['fc-list-day'].concat(getDayClassNames(dayMeta, theme)); + // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too) + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInnerContent$2, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("tr", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": formatDayString(dayDate) }, + createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, + createElement("div", { className: 'fc-list-day-cushion ' + theme.getClass('tableCellShaded'), ref: innerElRef }, innerContent)))); })); + }; + return ListViewHeaderRow; + }(BaseComponent)); + function renderInnerContent$2(props) { + return (createElement(Fragment, null, + props.text && (createElement("a", __assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)), + props.sideText && ( /* not keyboard tabbable */createElement("a", __assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)))); + } + + var DEFAULT_TIME_FORMAT$1 = createFormatter({ + hour: 'numeric', + minute: '2-digit', + meridiem: 'short', + }); + var ListViewEventRow = /** @class */ (function (_super) { + __extends(ListViewEventRow, _super); + function ListViewEventRow() { + return _super !== null && _super.apply(this, arguments) || this; + } + ListViewEventRow.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var seg = props.seg, timeHeaderId = props.timeHeaderId, eventHeaderId = props.eventHeaderId, dateHeaderId = props.dateHeaderId; + var timeFormat = context.options.eventTimeFormat || DEFAULT_TIME_FORMAT$1; + return (createElement(EventRoot, { seg: seg, timeText: "" // BAD. because of all-day content + , disableDragging: true, disableResizing: true, defaultContent: function () { return renderEventInnerContent(seg, context); } /* weird */, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, isSelected: props.isSelected, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("tr", { className: ['fc-list-event', hookProps.event.url ? 'fc-event-forced-url' : ''].concat(classNames).join(' '), ref: rootElRef }, + buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), + createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, + createElement("span", { className: "fc-list-event-dot", style: { borderColor: hookProps.borderColor || hookProps.backgroundColor } })), + createElement("td", { ref: innerElRef, headers: eventHeaderId + " " + dateHeaderId, className: "fc-list-event-title" }, innerContent))); })); + }; + return ListViewEventRow; + }(BaseComponent)); + function renderEventInnerContent(seg, context) { + var interactiveAttrs = getSegAnchorAttrs(seg, context); + return (createElement("a", __assign({}, interactiveAttrs), seg.eventRange.def.title)); + } + function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { + var options = context.options; + if (options.displayEventTime !== false) { + var eventDef = seg.eventRange.def; + var eventInstance = seg.eventRange.instance; + var doAllDay = false; + var timeText = void 0; + if (eventDef.allDay) { + doAllDay = true; + } + else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead? + if (seg.isStart) { + timeText = buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end); + } + else if (seg.isEnd) { + timeText = buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end); + } + else { + doAllDay = true; + } + } + else { + timeText = buildSegTimeText(seg, timeFormat, context); + } + if (doAllDay) { + var hookProps = { + text: context.options.allDayText, + view: context.viewApi, + }; + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, headers: timeHeaderId + " " + dateHeaderId, className: ['fc-list-event-time'].concat(classNames).join(' ') }, innerContent)); })); + } + return (createElement("td", { className: "fc-list-event-time" }, timeText)); + } + return null; + } + function renderAllDayInner(hookProps) { + return hookProps.text; + } + + /* + Responsible for the scroller, and forwarding event-related actions into the "grid". + */ + var ListView = /** @class */ (function (_super) { + __extends(ListView, _super); + function ListView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.computeDateVars = memoize(computeDateVars); + _this.eventStoreToSegs = memoize(_this._eventStoreToSegs); + _this.state = { + timeHeaderId: getUniqueDomId(), + eventHeaderId: getUniqueDomId(), + dateHeaderIdRoot: getUniqueDomId(), + }; + _this.setRootEl = function (rootEl) { + if (rootEl) { + _this.context.registerInteractiveComponent(_this, { + el: rootEl, + }); + } + else { + _this.context.unregisterInteractiveComponent(_this); + } + }; + return _this; + } + ListView.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var extraClassNames = [ + 'fc-list', + context.theme.getClass('table'), + context.options.stickyHeaderDates !== false ? 'fc-list-sticky' : '', + ]; + var _b = this.computeDateVars(props.dateProfile), dayDates = _b.dayDates, dayRanges = _b.dayRanges; + var eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges); + return (createElement(ViewRoot, { viewSpec: context.viewSpec, elRef: this.setRootEl }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') }, + createElement(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ? + _this.renderSegList(eventSegs, dayDates) : + _this.renderEmptyMessage()))); })); + }; + ListView.prototype.renderEmptyMessage = function () { + var _a = this.context, options = _a.options, viewApi = _a.viewApi; + var hookProps = { + text: options.noEventsText, + view: viewApi, + }; + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.noEventsClassNames, content: options.noEventsContent, defaultContent: renderNoEventsInner, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { className: ['fc-list-empty'].concat(classNames).join(' '), ref: rootElRef }, + createElement("div", { className: "fc-list-empty-cushion", ref: innerElRef }, innerContent))); })); + }; + ListView.prototype.renderSegList = function (allSegs, dayDates) { + var _a = this.context, theme = _a.theme, options = _a.options; + var _b = this.state, timeHeaderId = _b.timeHeaderId, eventHeaderId = _b.eventHeaderId, dateHeaderIdRoot = _b.dateHeaderIdRoot; + var segsByDay = groupSegsByDay(allSegs); // sparse array + return (createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { + var innerNodes = []; + for (var dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { + var daySegs = segsByDay[dayIndex]; + if (daySegs) { // sparse array, so might be undefined + var dayStr = formatDayString(dayDates[dayIndex]); + var dateHeaderId = dateHeaderIdRoot + '-' + dayStr; + // append a day header + innerNodes.push(createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); + daySegs = sortEventSegs(daySegs, options.eventOrder); + for (var _i = 0, daySegs_1 = daySegs; _i < daySegs_1.length; _i++) { + var seg = daySegs_1[_i]; + innerNodes.push(createElement(ListViewEventRow, __assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, getSegMeta(seg, todayRange, nowDate)))); + } + } + } + return (createElement("table", { className: 'fc-list-table ' + theme.getClass('table') }, + createElement("thead", null, + createElement("tr", null, + createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint), + createElement("th", { scope: "col", "aria-hidden": true }), + createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))), + createElement("tbody", null, innerNodes))); + })); + }; + ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) { + return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges); + }; + ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) { + var segs = []; + for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { + var eventRange = eventRanges_1[_i]; + segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges)); + } + return segs; + }; + ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) { + var dateEnv = this.context.dateEnv; + var nextDayThreshold = this.context.options.nextDayThreshold; + var range = eventRange.range; + var allDay = eventRange.def.allDay; + var dayIndex; + var segRange; + var seg; + var segs = []; + for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) { + segRange = intersectRanges(range, dayRanges[dayIndex]); + if (segRange) { + seg = { + component: this, + eventRange: eventRange, + start: segRange.start, + end: segRange.end, + isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), + isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), + dayIndex: dayIndex, + }; + segs.push(seg); + // detect when range won't go fully into the next day, + // and mutate the latest seg to the be the end. + if (!seg.isEnd && !allDay && + dayIndex + 1 < dayRanges.length && + range.end < + dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { + seg.end = range.end; + seg.isEnd = true; + break; + } + } + } + return segs; + }; + return ListView; + }(DateComponent)); + function renderNoEventsInner(hookProps) { + return hookProps.text; + } + function computeDateVars(dateProfile) { + var dayStart = startOfDay(dateProfile.renderRange.start); + var viewEnd = dateProfile.renderRange.end; + var dayDates = []; + var dayRanges = []; + while (dayStart < viewEnd) { + dayDates.push(dayStart); + dayRanges.push({ + start: dayStart, + end: addDays(dayStart, 1), + }); + dayStart = addDays(dayStart, 1); + } + return { dayDates: dayDates, dayRanges: dayRanges }; + } + // Returns a sparse array of arrays, segs grouped by their dayIndex + function groupSegsByDay(segs) { + var segsByDay = []; // sparse array + var i; + var seg; + for (i = 0; i < segs.length; i += 1) { + seg = segs[i]; + (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])) + .push(seg); + } + return segsByDay; + } + + var OPTION_REFINERS$3 = { + listDayFormat: createFalsableFormatter, + listDaySideFormat: createFalsableFormatter, + noEventsClassNames: identity, + noEventsContent: identity, + noEventsDidMount: identity, + noEventsWillUnmount: identity, + // noEventsText is defined in base options + }; + function createFalsableFormatter(input) { + return input === false ? null : createFormatter(input); + } + + var listPlugin = createPlugin({ + optionRefiners: OPTION_REFINERS$3, + views: { + list: { + component: ListView, + buttonTextKey: 'list', + listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016" + }, + listDay: { + type: 'list', + duration: { days: 1 }, + listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar + }, + listWeek: { + type: 'list', + duration: { weeks: 1 }, + listDayFormat: { weekday: 'long' }, + listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' }, + }, + listMonth: { + type: 'list', + duration: { month: 1 }, + listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have + }, + listYear: { + type: 'list', + duration: { year: 1 }, + listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have + }, + }, + }); + + var BootstrapTheme$1 = /** @class */ (function (_super) { + __extends(BootstrapTheme, _super); + function BootstrapTheme() { + return _super !== null && _super.apply(this, arguments) || this; + } + return BootstrapTheme; + }(Theme)); + BootstrapTheme$1.prototype.classes = { + root: 'fc-theme-bootstrap', + table: 'table-bordered', + tableCellShaded: 'table-active', + buttonGroup: 'btn-group', + button: 'btn btn-primary', + buttonActive: 'active', + popover: 'popover', + popoverHeader: 'popover-header', + popoverContent: 'popover-body', + }; + BootstrapTheme$1.prototype.baseIconClass = 'fa'; + BootstrapTheme$1.prototype.iconClasses = { + close: 'fa-times', + prev: 'fa-chevron-left', + next: 'fa-chevron-right', + prevYear: 'fa-angle-double-left', + nextYear: 'fa-angle-double-right', + }; + BootstrapTheme$1.prototype.rtlIconClasses = { + prev: 'fa-chevron-right', + next: 'fa-chevron-left', + prevYear: 'fa-angle-double-right', + nextYear: 'fa-angle-double-left', + }; + BootstrapTheme$1.prototype.iconOverrideOption = 'bootstrapFontAwesome'; // TODO: make TS-friendly. move the option-processing into this plugin + BootstrapTheme$1.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome'; + BootstrapTheme$1.prototype.iconOverridePrefix = 'fa-'; + var plugin$1 = createPlugin({ + themeClasses: { + bootstrap: BootstrapTheme$1, + }, + }); + + var BootstrapTheme = /** @class */ (function (_super) { + __extends(BootstrapTheme, _super); + function BootstrapTheme() { + return _super !== null && _super.apply(this, arguments) || this; + } + return BootstrapTheme; + }(Theme)); + BootstrapTheme.prototype.classes = { + root: 'fc-theme-bootstrap5', + tableCellShaded: 'fc-theme-bootstrap5-shaded', + buttonGroup: 'btn-group', + button: 'btn btn-primary', + buttonActive: 'active', + popover: 'popover', + popoverHeader: 'popover-header', + popoverContent: 'popover-body', + }; + BootstrapTheme.prototype.baseIconClass = 'bi'; + BootstrapTheme.prototype.iconClasses = { + close: 'bi-x-lg', + prev: 'bi-chevron-left', + next: 'bi-chevron-right', + prevYear: 'bi-chevron-double-left', + nextYear: 'bi-chevron-double-right', + }; + BootstrapTheme.prototype.rtlIconClasses = { + prev: 'bi-chevron-right', + next: 'bi-chevron-left', + prevYear: 'bi-chevron-double-right', + nextYear: 'bi-chevron-double-left', + }; + // wtf + BootstrapTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly + BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'icon'; + BootstrapTheme.prototype.iconOverridePrefix = 'bi-'; + var plugin = createPlugin({ + themeClasses: { + bootstrap5: BootstrapTheme, + }, + }); + + // rename this file to options.ts like other packages? + var OPTION_REFINERS$2 = { + googleCalendarApiKey: String, + }; + + var EVENT_SOURCE_REFINERS = { + googleCalendarApiKey: String, + googleCalendarId: String, + googleCalendarApiBase: String, + extraParams: identity, + }; + + // TODO: expose somehow + var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars'; + var eventSourceDef = { + parseMeta: function (refined) { + var googleCalendarId = refined.googleCalendarId; + if (!googleCalendarId && refined.url) { + googleCalendarId = parseGoogleCalendarId(refined.url); + } + if (googleCalendarId) { + return { + googleCalendarId: googleCalendarId, + googleCalendarApiKey: refined.googleCalendarApiKey, + googleCalendarApiBase: refined.googleCalendarApiBase, + extraParams: refined.extraParams, + }; + } + return null; + }, + fetch: function (arg, onSuccess, onFailure) { + var _a = arg.context, dateEnv = _a.dateEnv, options = _a.options; + var meta = arg.eventSource.meta; + var apiKey = meta.googleCalendarApiKey || options.googleCalendarApiKey; + if (!apiKey) { + onFailure({ + message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/', + }); + } + else { + var url = buildUrl(meta); + // TODO: make DRY with json-feed-event-source + var extraParams = meta.extraParams; + var extraParamsObj = typeof extraParams === 'function' ? extraParams() : extraParams; + var requestParams_1 = buildRequestParams$1(arg.range, apiKey, extraParamsObj, dateEnv); + requestJson('GET', url, requestParams_1, function (body, xhr) { + if (body.error) { + onFailure({ + message: 'Google Calendar API: ' + body.error.message, + errors: body.error.errors, + xhr: xhr, + }); + } + else { + onSuccess({ + rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone), + xhr: xhr, + }); + } + }, function (message, xhr) { + onFailure({ message: message, xhr: xhr }); + }); + } + }, + }; + function parseGoogleCalendarId(url) { + var match; + // detect if the ID was specified as a single string. + // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars. + if (/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) { + return url; + } + if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(url)) || + (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(url))) { + return decodeURIComponent(match[1]); + } + return null; + } + function buildUrl(meta) { + var apiBase = meta.googleCalendarApiBase; + if (!apiBase) { + apiBase = API_BASE; + } + return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events'; + } + function buildRequestParams$1(range, apiKey, extraParams, dateEnv) { + var params; + var startStr; + var endStr; + if (dateEnv.canComputeOffset) { + // strings will naturally have offsets, which GCal needs + startStr = dateEnv.formatIso(range.start); + endStr = dateEnv.formatIso(range.end); + } + else { + // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day + // from the UTC day-start to guarantee we're getting all the events + // (start/end will be UTC-coerced dates, so toISOString is okay) + startStr = addDays(range.start, -1).toISOString(); + endStr = addDays(range.end, 1).toISOString(); + } + params = __assign(__assign({}, (extraParams || {})), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 }); + if (dateEnv.timeZone !== 'local') { + params.timeZone = dateEnv.timeZone; + } + return params; + } + function gcalItemsToRawEventDefs(items, gcalTimezone) { + return items.map(function (item) { return gcalItemToRawEventDef(item, gcalTimezone); }); + } + function gcalItemToRawEventDef(item, gcalTimezone) { + var url = item.htmlLink || null; + // make the URLs for each event show times in the correct timezone + if (url && gcalTimezone) { + url = injectQsComponent(url, 'ctz=' + gcalTimezone); + } + return { + id: item.id, + title: item.summary, + start: item.start.dateTime || item.start.date, + end: item.end.dateTime || item.end.date, + url: url, + location: item.location, + description: item.description, + attachments: item.attachments || [], + extendedProps: (item.extendedProperties || {}).shared || {}, + }; + } + // Injects a string like "arg=value" into the querystring of a URL + // TODO: move to a general util file? + function injectQsComponent(url, component) { + // inject it after the querystring but before the fragment + return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) { return (qs ? qs + '&' : '?') + component + hash; }); + } + var googleCalendarPlugin = createPlugin({ + eventSourceDefs: [eventSourceDef], + optionRefiners: OPTION_REFINERS$2, + eventSourceRefiners: EVENT_SOURCE_REFINERS, + }); + + var RELEASE_DATE = '2022-08-23'; // for Scheduler + var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too + var INVALID_LICENSE_URL = 'http://fullcalendar.io/docs/schedulerLicenseKey#invalid'; + var OUTDATED_LICENSE_URL = 'http://fullcalendar.io/docs/schedulerLicenseKey#outdated'; + var PRESET_LICENSE_KEYS = [ + 'GPL-My-Project-Is-Open-Source', + 'CC-Attribution-NonCommercial-NoDerivatives', + ]; + var CSS = { + position: 'absolute', + zIndex: 99999, + bottom: '1px', + left: '1px', + background: '#eee', + borderColor: '#ddd', + borderStyle: 'solid', + borderWidth: '1px 1px 0 0', + padding: '2px 4px', + fontSize: '12px', + borderTopRightRadius: '3px', + }; + function buildLicenseWarning(context) { + var key = context.options.schedulerLicenseKey; + var currentUrl = typeof window !== 'undefined' ? window.location.href : ''; + if (!isImmuneUrl(currentUrl)) { + var status_1 = processLicenseKey(key); + if (status_1 !== 'valid') { + return (createElement("div", { className: "fc-license-message", style: CSS }, (status_1 === 'outdated') ? (createElement(Fragment, null, + 'Your license key is too old to work with this version. ', + createElement("a", { href: OUTDATED_LICENSE_URL }, "More Info"))) : (createElement(Fragment, null, + 'Your license key is invalid. ', + createElement("a", { href: INVALID_LICENSE_URL }, "More Info"))))); + } + } + return null; + } + /* + This decryption is not meant to be bulletproof. Just a way to remind about an upgrade. + */ + function processLicenseKey(key) { + if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) { + return 'valid'; + } + var parts = (key || '').match(/^(\d+)-fcs-(\d+)$/); + if (parts && (parts[1].length === 10)) { + var purchaseDate = new Date(parseInt(parts[2], 10) * 1000); + var releaseDate = new Date(config.mockSchedulerReleaseDate || RELEASE_DATE); + if (isValidDate$1(releaseDate)) { // token won't be replaced in dev mode + var minPurchaseDate = addDays(releaseDate, -UPGRADE_WINDOW); + if (minPurchaseDate < purchaseDate) { + return 'valid'; + } + return 'outdated'; + } + } + return 'invalid'; + } + function isImmuneUrl(url) { + return /\w+:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(url); + } + + var OPTION_REFINERS$1 = { + schedulerLicenseKey: String, + }; + + var premiumCommonPlugin = createPlugin({ + optionRefiners: OPTION_REFINERS$1, + viewContainerAppends: [buildLicenseWarning], + }); + + var WHEEL_EVENT_NAMES = 'wheel mousewheel DomMouseScroll MozMousePixelScroll'.split(' '); + /* + ALSO, with the ability to disable touch + */ + var ScrollListener = /** @class */ (function () { + function ScrollListener(el) { + var _this = this; + this.el = el; + this.emitter = new Emitter(); + this.isScrolling = false; + this.isTouching = false; // user currently has finger down? + this.isRecentlyWheeled = false; + this.isRecentlyScrolled = false; + this.wheelWaiter = new DelayedRunner(this._handleWheelWaited.bind(this)); + this.scrollWaiter = new DelayedRunner(this._handleScrollWaited.bind(this)); + // Handlers + // ---------------------------------------------------------------------------------------------- + this.handleScroll = function () { + _this.startScroll(); + _this.emitter.trigger('scroll', _this.isRecentlyWheeled, _this.isTouching); + _this.isRecentlyScrolled = true; + _this.scrollWaiter.request(500); + }; + // will fire *before* the scroll event is fired (might not cause a scroll) + this.handleWheel = function () { + _this.isRecentlyWheeled = true; + _this.wheelWaiter.request(500); + }; + // will fire *before* the scroll event is fired (might not cause a scroll) + this.handleTouchStart = function () { + _this.isTouching = true; + }; + this.handleTouchEnd = function () { + _this.isTouching = false; + // if the user ended their touch, and the scroll area wasn't moving, + // we consider this to be the end of the scroll. + if (!_this.isRecentlyScrolled) { + _this.endScroll(); // won't fire if already ended + } + }; + el.addEventListener('scroll', this.handleScroll); + el.addEventListener('touchstart', this.handleTouchStart, { passive: true }); + el.addEventListener('touchend', this.handleTouchEnd); + for (var _i = 0, WHEEL_EVENT_NAMES_1 = WHEEL_EVENT_NAMES; _i < WHEEL_EVENT_NAMES_1.length; _i++) { + var eventName = WHEEL_EVENT_NAMES_1[_i]; + el.addEventListener(eventName, this.handleWheel); + } + } + ScrollListener.prototype.destroy = function () { + var el = this.el; + el.removeEventListener('scroll', this.handleScroll); + el.removeEventListener('touchstart', this.handleTouchStart, { passive: true }); + el.removeEventListener('touchend', this.handleTouchEnd); + for (var _i = 0, WHEEL_EVENT_NAMES_2 = WHEEL_EVENT_NAMES; _i < WHEEL_EVENT_NAMES_2.length; _i++) { + var eventName = WHEEL_EVENT_NAMES_2[_i]; + el.removeEventListener(eventName, this.handleWheel); + } + }; + // Start / Stop + // ---------------------------------------------------------------------------------------------- + ScrollListener.prototype.startScroll = function () { + if (!this.isScrolling) { + this.isScrolling = true; + this.emitter.trigger('scrollStart', this.isRecentlyWheeled, this.isTouching); + } + }; + ScrollListener.prototype.endScroll = function () { + if (this.isScrolling) { + this.emitter.trigger('scrollEnd'); + this.isScrolling = false; + this.isRecentlyScrolled = true; + this.isRecentlyWheeled = false; + this.scrollWaiter.clear(); + this.wheelWaiter.clear(); + } + }; + ScrollListener.prototype._handleScrollWaited = function () { + this.isRecentlyScrolled = false; + // only end the scroll if not currently touching. + // if touching, the scrolling will end later, on touchend. + if (!this.isTouching) { + this.endScroll(); // won't fire if already ended + } + }; + ScrollListener.prototype._handleWheelWaited = function () { + this.isRecentlyWheeled = false; + }; + return ScrollListener; + }()); + + // TODO: assume the el has no borders? + function getScrollCanvasOrigin(scrollEl) { + var rect = scrollEl.getBoundingClientRect(); + var edges = computeEdges(scrollEl); // TODO: pass in isRtl? + return { + left: rect.left + edges.borderLeft + edges.scrollbarLeft - getScrollFromLeftEdge(scrollEl), + top: rect.top + edges.borderTop - scrollEl.scrollTop, + }; + } + function getScrollFromLeftEdge(el) { + var scrollLeft = el.scrollLeft; + var computedStyles = window.getComputedStyle(el); // TODO: pass in isRtl instead? + if (computedStyles.direction === 'rtl') { + switch (getRtlScrollSystem()) { + case 'negative': + scrollLeft *= -1; // convert to 'reverse'. fall through... + case 'reverse': // scrollLeft is distance between scrollframe's right edge scrollcanvas's right edge + scrollLeft = el.scrollWidth - scrollLeft - el.clientWidth; + } + } + return scrollLeft; + } + function setScrollFromLeftEdge(el, scrollLeft) { + var computedStyles = window.getComputedStyle(el); // TODO: pass in isRtl instead? + if (computedStyles.direction === 'rtl') { + switch (getRtlScrollSystem()) { + case 'reverse': + scrollLeft = el.scrollWidth - scrollLeft; + break; + case 'negative': + scrollLeft = -(el.scrollWidth - scrollLeft); + break; + } + } + el.scrollLeft = scrollLeft; + } + // Horizontal Scroll System Detection + // ---------------------------------------------------------------------------------------------- + var _rtlScrollSystem; + function getRtlScrollSystem() { + return _rtlScrollSystem || (_rtlScrollSystem = detectRtlScrollSystem()); + } + function detectRtlScrollSystem() { + var el = document.createElement('div'); + el.style.position = 'absolute'; + el.style.top = '-1000px'; + el.style.width = '1px'; + el.style.height = '1px'; + el.style.overflow = 'scroll'; + el.style.direction = 'rtl'; + el.style.fontSize = '100px'; + el.innerHTML = 'A'; + document.body.appendChild(el); + var system; + if (el.scrollLeft > 0) { + system = 'positive'; // scroll is a positive number from the left edge + } + else { + el.scrollLeft = 1; + if (el.scrollLeft > 0) { + system = 'reverse'; // scroll is a positive number from the right edge + } + else { + system = 'negative'; // scroll is a negative number from the right edge + } + } + removeElement(el); + return system; + } + + var IS_MS_EDGE = typeof navigator !== 'undefined' && /Edge/.test(navigator.userAgent); // TODO: what about Chromeum-based Edge? + var STICKY_SELECTOR = '.fc-sticky'; + /* + useful beyond the native position:sticky for these reasons: + - support in IE11 + - nice centering support + + REQUIREMENT: fc-sticky elements, if the fc-sticky className is taken away, should NOT have relative or absolute positioning. + This is because we attach the coords with JS, and the VDOM might take away the fc-sticky class but doesn't know kill the positioning. + + TODO: don't query text-align:center. isn't compatible with flexbox centering. instead, check natural X coord within parent container + */ + var StickyScrolling = /** @class */ (function () { + function StickyScrolling(scrollEl, isRtl) { + var _this = this; + this.scrollEl = scrollEl; + this.isRtl = isRtl; + this.usingRelative = null; + this.updateSize = function () { + var scrollEl = _this.scrollEl; + var els = findElements(scrollEl, STICKY_SELECTOR); + var elGeoms = _this.queryElGeoms(els); + var viewportWidth = scrollEl.clientWidth; + var viewportHeight = scrollEl.clientHeight; + if (_this.usingRelative) { + var elDestinations = _this.computeElDestinations(elGeoms, viewportWidth); // read before prepPositioning + assignRelativePositions(els, elGeoms, elDestinations, viewportWidth, viewportHeight); + } + else { + assignStickyPositions(els, elGeoms, viewportWidth); + } + }; + this.usingRelative = + !getStickySupported() || // IE11 + // https://stackoverflow.com/questions/56835658/in-microsoft-edge-sticky-positioning-doesnt-work-when-combined-with-dir-rtl + (IS_MS_EDGE && isRtl); + if (this.usingRelative) { + this.listener = new ScrollListener(scrollEl); + this.listener.emitter.on('scrollEnd', this.updateSize); + } + } + StickyScrolling.prototype.destroy = function () { + if (this.listener) { + this.listener.destroy(); + } + }; + StickyScrolling.prototype.queryElGeoms = function (els) { + var _a = this, scrollEl = _a.scrollEl, isRtl = _a.isRtl; + var canvasOrigin = getScrollCanvasOrigin(scrollEl); + var elGeoms = []; + for (var _i = 0, els_1 = els; _i < els_1.length; _i++) { + var el = els_1[_i]; + var parentBound = translateRect(computeInnerRect(el.parentNode, true, true), // weird way to call this!!! + -canvasOrigin.left, -canvasOrigin.top); + var elRect = el.getBoundingClientRect(); + var computedStyles = window.getComputedStyle(el); + var textAlign = window.getComputedStyle(el.parentNode).textAlign; // ask the parent + var naturalBound = null; + if (textAlign === 'start') { + textAlign = isRtl ? 'right' : 'left'; + } + else if (textAlign === 'end') { + textAlign = isRtl ? 'left' : 'right'; + } + if (computedStyles.position !== 'sticky') { + naturalBound = translateRect(elRect, -canvasOrigin.left - (parseFloat(computedStyles.left) || 0), // could be 'auto' + -canvasOrigin.top - (parseFloat(computedStyles.top) || 0)); + } + elGeoms.push({ + parentBound: parentBound, + naturalBound: naturalBound, + elWidth: elRect.width, + elHeight: elRect.height, + textAlign: textAlign, + }); + } + return elGeoms; + }; + // only for IE + StickyScrolling.prototype.computeElDestinations = function (elGeoms, viewportWidth) { + var scrollEl = this.scrollEl; + var viewportTop = scrollEl.scrollTop; + var viewportLeft = getScrollFromLeftEdge(scrollEl); + var viewportRight = viewportLeft + viewportWidth; + return elGeoms.map(function (elGeom) { + var elWidth = elGeom.elWidth, elHeight = elGeom.elHeight, parentBound = elGeom.parentBound, naturalBound = elGeom.naturalBound; + var destLeft; // relative to canvas topleft + var destTop; // " + switch (elGeom.textAlign) { + case 'left': + destLeft = viewportLeft; + break; + case 'right': + destLeft = viewportRight - elWidth; + break; + case 'center': + destLeft = (viewportLeft + viewportRight) / 2 - elWidth / 2; /// noooo, use half-width insteadddddddd + break; + } + destLeft = Math.min(destLeft, parentBound.right - elWidth); + destLeft = Math.max(destLeft, parentBound.left); + destTop = viewportTop; + destTop = Math.min(destTop, parentBound.bottom - elHeight); + destTop = Math.max(destTop, naturalBound.top); // better to use natural top for upper bound + return { left: destLeft, top: destTop }; + }); + }; + return StickyScrolling; + }()); + function assignRelativePositions(els, elGeoms, elDestinations, viewportWidth, viewportHeight) { + els.forEach(function (el, i) { + var _a = elGeoms[i], naturalBound = _a.naturalBound, parentBound = _a.parentBound; + var parentWidth = parentBound.right - parentBound.left; + var parentHeight = parentBound.bottom - parentBound.bottom; + var left; + var top; + if (parentWidth > viewportWidth || + parentHeight > viewportHeight) { + left = elDestinations[i].left - naturalBound.left; + top = elDestinations[i].top - naturalBound.top; + } + else { // if parent container can be completely in view, we don't need stickiness + left = ''; + top = ''; + } + applyStyle(el, { + position: 'relative', + left: left, + right: -left, + top: top, + }); + }); + } + function assignStickyPositions(els, elGeoms, viewportWidth) { + els.forEach(function (el, i) { + var _a = elGeoms[i], textAlign = _a.textAlign, elWidth = _a.elWidth, parentBound = _a.parentBound; + var parentWidth = parentBound.right - parentBound.left; + var left; + if (textAlign === 'center' && + parentWidth > viewportWidth) { + left = (viewportWidth - elWidth) / 2; + } + else { // if parent container can be completely in view, we don't need stickiness + left = ''; + } + applyStyle(el, { + left: left, + right: left, + top: 0, + }); + }); + } + var _isStickySupported; + function getStickySupported() { + if (_isStickySupported == null) { + _isStickySupported = computeStickySupported(); + } + return _isStickySupported; + } + function computeStickySupported() { + var el = document.createElement('div'); + el.style.position = 'sticky'; + document.body.appendChild(el); + var val = window.getComputedStyle(el).position; + removeElement(el); + return val === 'sticky'; + } + + var ClippedScroller = /** @class */ (function (_super) { + __extends(ClippedScroller, _super); + function ClippedScroller() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.elRef = createRef(); + _this.state = { + xScrollbarWidth: 0, + yScrollbarWidth: 0, + }; + _this.handleScroller = function (scroller) { + _this.scroller = scroller; + setRef(_this.props.scrollerRef, scroller); + }; + _this.handleSizing = function () { + var props = _this.props; + if (props.overflowY === 'scroll-hidden') { + _this.setState({ yScrollbarWidth: _this.scroller.getYScrollbarWidth() }); + } + if (props.overflowX === 'scroll-hidden') { + _this.setState({ xScrollbarWidth: _this.scroller.getXScrollbarWidth() }); + } + }; + return _this; + } + ClippedScroller.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var isScrollbarOnLeft = context.isRtl && getIsRtlScrollbarOnLeft(); + var overcomeLeft = 0; + var overcomeRight = 0; + var overcomeBottom = 0; + if (props.overflowX === 'scroll-hidden') { + overcomeBottom = state.xScrollbarWidth; + } + if (props.overflowY === 'scroll-hidden') { + if (state.yScrollbarWidth != null) { + if (isScrollbarOnLeft) { + overcomeLeft = state.yScrollbarWidth; + } + else { + overcomeRight = state.yScrollbarWidth; + } + } + } + return (createElement("div", { ref: this.elRef, className: 'fc-scroller-harness' + (props.liquid ? ' fc-scroller-harness-liquid' : '') }, + createElement(Scroller, { ref: this.handleScroller, elRef: this.props.scrollerElRef, overflowX: props.overflowX === 'scroll-hidden' ? 'scroll' : props.overflowX, overflowY: props.overflowY === 'scroll-hidden' ? 'scroll' : props.overflowY, overcomeLeft: overcomeLeft, overcomeRight: overcomeRight, overcomeBottom: overcomeBottom, maxHeight: typeof props.maxHeight === 'number' + ? (props.maxHeight + (props.overflowX === 'scroll-hidden' ? state.xScrollbarWidth : 0)) + : '', liquid: props.liquid, liquidIsAbsolute: true }, props.children))); + }; + ClippedScroller.prototype.componentDidMount = function () { + this.handleSizing(); + this.context.addResizeHandler(this.handleSizing); + }; + ClippedScroller.prototype.componentDidUpdate = function (prevProps) { + if (!isPropsEqual(prevProps, this.props)) { // an external change? + this.handleSizing(); + } + }; + ClippedScroller.prototype.componentWillUnmount = function () { + this.context.removeResizeHandler(this.handleSizing); + }; + ClippedScroller.prototype.needsXScrolling = function () { + return this.scroller.needsXScrolling(); + }; + ClippedScroller.prototype.needsYScrolling = function () { + return this.scroller.needsYScrolling(); + }; + return ClippedScroller; + }(BaseComponent)); + + var ScrollSyncer = /** @class */ (function () { + function ScrollSyncer(isVertical, scrollEls) { + var _this = this; + this.isVertical = isVertical; + this.scrollEls = scrollEls; + this.isPaused = false; + this.scrollListeners = scrollEls.map(function (el) { return _this.bindScroller(el); }); + } + ScrollSyncer.prototype.destroy = function () { + for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { + var scrollListener = _a[_i]; + scrollListener.destroy(); + } + }; + ScrollSyncer.prototype.bindScroller = function (el) { + var _this = this; + var _a = this, scrollEls = _a.scrollEls, isVertical = _a.isVertical; + var scrollListener = new ScrollListener(el); + var onScroll = function (isWheel, isTouch) { + if (!_this.isPaused) { + if (!_this.masterEl || (_this.masterEl !== el && (isWheel || isTouch))) { + _this.assignMaster(el); + } + if (_this.masterEl === el) { // dealing with current + for (var _i = 0, scrollEls_1 = scrollEls; _i < scrollEls_1.length; _i++) { + var otherEl = scrollEls_1[_i]; + if (otherEl !== el) { + if (isVertical) { + otherEl.scrollTop = el.scrollTop; + } + else { + otherEl.scrollLeft = el.scrollLeft; + } + } + } + } + } + }; + var onScrollEnd = function () { + if (_this.masterEl === el) { + _this.masterEl = null; + } + }; + scrollListener.emitter.on('scroll', onScroll); + scrollListener.emitter.on('scrollEnd', onScrollEnd); + return scrollListener; + }; + ScrollSyncer.prototype.assignMaster = function (el) { + this.masterEl = el; + for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { + var scrollListener = _a[_i]; + if (scrollListener.el !== el) { + scrollListener.endScroll(); // to prevent residual scrolls from reclaiming master + } + } + }; + /* + will normalize the scrollLeft value + */ + ScrollSyncer.prototype.forceScrollLeft = function (scrollLeft) { + this.isPaused = true; + for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { + var listener = _a[_i]; + setScrollFromLeftEdge(listener.el, scrollLeft); + } + this.isPaused = false; + }; + ScrollSyncer.prototype.forceScrollTop = function (top) { + this.isPaused = true; + for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { + var listener = _a[_i]; + listener.el.scrollTop = top; + } + this.isPaused = false; + }; + return ScrollSyncer; + }()); + + /* + TODO: make subcomponent + NOTE: doesn't support collapsibleWidth (which is sortof a hack anyway) + */ + var ScrollGrid = /** @class */ (function (_super) { + __extends(ScrollGrid, _super); + function ScrollGrid() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.compileColGroupStats = memoizeArraylike(compileColGroupStat, isColGroupStatsEqual); + _this.renderMicroColGroups = memoizeArraylike(renderMicroColGroup); // yucky to memoize VNodes, but much more efficient for consumers + _this.clippedScrollerRefs = new RefMap(); + // doesn't hold non-scrolling els used just for padding + _this.scrollerElRefs = new RefMap(_this._handleScrollerEl.bind(_this)); + _this.chunkElRefs = new RefMap(_this._handleChunkEl.bind(_this)); + _this.stickyScrollings = []; + _this.scrollSyncersBySection = {}; + _this.scrollSyncersByColumn = {}; + // for row-height-syncing + _this.rowUnstableMap = new Map(); // no need to groom. always self-cancels + _this.rowInnerMaxHeightMap = new Map(); + _this.anyRowHeightsChanged = false; + _this.recentSizingCnt = 0; + _this.state = { + shrinkWidths: [], + forceYScrollbars: false, + forceXScrollbars: false, + scrollerClientWidths: {}, + scrollerClientHeights: {}, + sectionRowMaxHeights: [], + }; + _this.handleSizing = function (isForcedResize, sectionRowMaxHeightsChanged) { + if (!_this.allowSizing()) { + return; + } + if (!sectionRowMaxHeightsChanged) { // something else changed, probably external + _this.anyRowHeightsChanged = true; + } + var otherState = {}; + // if reacting to self-change of sectionRowMaxHeightsChanged, or not stable, don't do anything + if (isForcedResize || (!sectionRowMaxHeightsChanged && !_this.rowUnstableMap.size)) { + otherState.sectionRowMaxHeights = _this.computeSectionRowMaxHeights(); + } + _this.setState(__assign(__assign({ shrinkWidths: _this.computeShrinkWidths() }, _this.computeScrollerDims()), otherState), function () { + if (!_this.rowUnstableMap.size) { + _this.updateStickyScrolling(); // needs to happen AFTER final positioning committed to DOM + } + }); + }; + _this.handleRowHeightChange = function (rowEl, isStable) { + var _a = _this, rowUnstableMap = _a.rowUnstableMap, rowInnerMaxHeightMap = _a.rowInnerMaxHeightMap; + if (!isStable) { + rowUnstableMap.set(rowEl, true); + } + else { + rowUnstableMap.delete(rowEl); + var innerMaxHeight = getRowInnerMaxHeight(rowEl); + if (!rowInnerMaxHeightMap.has(rowEl) || rowInnerMaxHeightMap.get(rowEl) !== innerMaxHeight) { + rowInnerMaxHeightMap.set(rowEl, innerMaxHeight); + _this.anyRowHeightsChanged = true; + } + if (!rowUnstableMap.size && _this.anyRowHeightsChanged) { + _this.anyRowHeightsChanged = false; + _this.setState({ + sectionRowMaxHeights: _this.computeSectionRowMaxHeights(), + }); + } + } + }; + return _this; + } + ScrollGrid.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var shrinkWidths = state.shrinkWidths; + var colGroupStats = this.compileColGroupStats(props.colGroups.map(function (colGroup) { return [colGroup]; })); + var microColGroupNodes = this.renderMicroColGroups(colGroupStats.map(function (stat, i) { return [stat.cols, shrinkWidths[i]]; })); + var classNames = getScrollGridClassNames(props.liquid, context); + var _b = this.getDims(); _b[0]; _b[1]; + // TODO: make DRY + var sectionConfigs = props.sections; + var configCnt = sectionConfigs.length; + var configI = 0; + var currentConfig; + var headSectionNodes = []; + var bodySectionNodes = []; + var footSectionNodes = []; + while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { + headSectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights, true)); + configI += 1; + } + while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { + bodySectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights, false)); + configI += 1; + } + while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { + footSectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights, true)); + configI += 1; + } + var isBuggy = !getCanVGrowWithinCell(); // see NOTE in SimpleScrollGrid + var roleAttrs = { role: 'rowgroup' }; + return createElement('table', { + ref: props.elRef, + role: 'grid', + className: classNames.join(' '), + }, renderMacroColGroup(colGroupStats, shrinkWidths), Boolean(!isBuggy && headSectionNodes.length) && createElement.apply(void 0, __spreadArray(['thead', roleAttrs], headSectionNodes)), Boolean(!isBuggy && bodySectionNodes.length) && createElement.apply(void 0, __spreadArray(['tbody', roleAttrs], bodySectionNodes)), Boolean(!isBuggy && footSectionNodes.length) && createElement.apply(void 0, __spreadArray(['tfoot', roleAttrs], footSectionNodes)), isBuggy && createElement.apply(void 0, __spreadArray(__spreadArray(__spreadArray(['tbody', roleAttrs], headSectionNodes), bodySectionNodes), footSectionNodes))); + }; + ScrollGrid.prototype.renderSection = function (sectionConfig, sectionIndex, colGroupStats, microColGroupNodes, sectionRowMaxHeights, isHeader) { + var _this = this; + if ('outerContent' in sectionConfig) { + return (createElement(Fragment, { key: sectionConfig.key }, sectionConfig.outerContent)); + } + return (createElement("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, sectionConfig.chunks.map(function (chunkConfig, i) { return _this.renderChunk(sectionConfig, sectionIndex, colGroupStats[i], microColGroupNodes[i], chunkConfig, i, (sectionRowMaxHeights[sectionIndex] || [])[i] || [], isHeader); }))); + }; + ScrollGrid.prototype.renderChunk = function (sectionConfig, sectionIndex, colGroupStat, microColGroupNode, chunkConfig, chunkIndex, rowHeights, isHeader) { + if ('outerContent' in chunkConfig) { + return (createElement(Fragment, { key: chunkConfig.key }, chunkConfig.outerContent)); + } + var state = this.state; + var scrollerClientWidths = state.scrollerClientWidths, scrollerClientHeights = state.scrollerClientHeights; + var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; + var index = sectionIndex * chunksPerSection + chunkIndex; + var sideScrollIndex = (!this.context.isRtl || getIsRtlScrollbarOnLeft()) ? chunksPerSection - 1 : 0; + var isVScrollSide = chunkIndex === sideScrollIndex; + var isLastSection = sectionIndex === sectionCnt - 1; + var forceXScrollbars = isLastSection && state.forceXScrollbars; // NOOOO can result in `null` + var forceYScrollbars = isVScrollSide && state.forceYScrollbars; // NOOOO can result in `null` + var allowXScrolling = colGroupStat && colGroupStat.allowXScrolling; // rename? + var allowYScrolling = getAllowYScrolling(this.props, sectionConfig); // rename? do in section func? + var chunkVGrow = getSectionHasLiquidHeight(this.props, sectionConfig); // do in section func? + var expandRows = sectionConfig.expandRows && chunkVGrow; + var tableMinWidth = (colGroupStat && colGroupStat.totalColMinWidth) || ''; + var content = renderChunkContent(sectionConfig, chunkConfig, { + tableColGroupNode: microColGroupNode, + tableMinWidth: tableMinWidth, + clientWidth: scrollerClientWidths[index] !== undefined ? scrollerClientWidths[index] : null, + clientHeight: scrollerClientHeights[index] !== undefined ? scrollerClientHeights[index] : null, + expandRows: expandRows, + syncRowHeights: Boolean(sectionConfig.syncRowHeights), + rowSyncHeights: rowHeights, + reportRowHeightChange: this.handleRowHeightChange, + }, isHeader); + var overflowX = forceXScrollbars ? (isLastSection ? 'scroll' : 'scroll-hidden') : + !allowXScrolling ? 'hidden' : + (isLastSection ? 'auto' : 'scroll-hidden'); + var overflowY = forceYScrollbars ? (isVScrollSide ? 'scroll' : 'scroll-hidden') : + !allowYScrolling ? 'hidden' : + (isVScrollSide ? 'auto' : 'scroll-hidden'); + // it *could* be possible to reduce DOM wrappers by only doing a ClippedScroller when allowXScrolling or allowYScrolling, + // but if these values were to change, the inner components would be unmounted/remounted because of the parent change. + content = (createElement(ClippedScroller, { ref: this.clippedScrollerRefs.createRef(index), scrollerElRef: this.scrollerElRefs.createRef(index), overflowX: overflowX, overflowY: overflowY, liquid: chunkVGrow, maxHeight: sectionConfig.maxHeight }, content)); + return createElement(isHeader ? 'th' : 'td', { + key: chunkConfig.key, + ref: this.chunkElRefs.createRef(index), + role: 'presentation', + }, content); + }; + ScrollGrid.prototype.componentDidMount = function () { + this.getStickyScrolling = memoizeArraylike(initStickyScrolling, null, destroyStickyScrolling); + this.getScrollSyncersBySection = memoizeHashlike(initScrollSyncer.bind(this, true), null, destroyScrollSyncer); + this.getScrollSyncersByColumn = memoizeHashlike(initScrollSyncer.bind(this, false), null, destroyScrollSyncer); + this.updateScrollSyncers(); + this.handleSizing(false); + this.context.addResizeHandler(this.handleSizing); + }; + ScrollGrid.prototype.componentDidUpdate = function (prevProps, prevState) { + this.updateScrollSyncers(); + // TODO: need better solution when state contains non-sizing things + this.handleSizing(false, prevState.sectionRowMaxHeights !== this.state.sectionRowMaxHeights); + }; + ScrollGrid.prototype.componentWillUnmount = function () { + this.context.removeResizeHandler(this.handleSizing); + this.destroyStickyScrolling(); + this.destroyScrollSyncers(); + }; + ScrollGrid.prototype.allowSizing = function () { + var now = new Date(); + if (!this.lastSizingDate || + now.valueOf() > this.lastSizingDate.valueOf() + config.SCROLLGRID_RESIZE_INTERVAL) { + this.lastSizingDate = now; + this.recentSizingCnt = 0; + return true; + } + return (this.recentSizingCnt += 1) <= 10; + }; + ScrollGrid.prototype.computeShrinkWidths = function () { + var _this = this; + var colGroupStats = this.compileColGroupStats(this.props.colGroups.map(function (colGroup) { return [colGroup]; })); + var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; + var cnt = sectionCnt * chunksPerSection; + var shrinkWidths = []; + colGroupStats.forEach(function (colGroupStat, i) { + if (colGroupStat.hasShrinkCol) { + var chunkEls = _this.chunkElRefs.collect(i, cnt, chunksPerSection); // in one col + shrinkWidths[i] = computeShrinkWidth(chunkEls); + } + }); + return shrinkWidths; + }; + // has the side effect of grooming rowInnerMaxHeightMap + // TODO: somehow short-circuit if there are no new height changes + ScrollGrid.prototype.computeSectionRowMaxHeights = function () { + var newHeightMap = new Map(); + var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; + var sectionRowMaxHeights = []; + for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { + var sectionConfig = this.props.sections[sectionI]; + var assignableHeights = []; // chunk, row + if (sectionConfig && sectionConfig.syncRowHeights) { + var rowHeightsByChunk = []; + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { + var index = sectionI * chunksPerSection + chunkI; + var rowHeights = []; + var chunkEl = this.chunkElRefs.currentMap[index]; + if (chunkEl) { + rowHeights = findElements(chunkEl, '.fc-scrollgrid-sync-table tr').map(function (rowEl) { + var max = getRowInnerMaxHeight(rowEl); + newHeightMap.set(rowEl, max); + return max; + }); + } + else { + rowHeights = []; + } + rowHeightsByChunk.push(rowHeights); + } + var rowCnt = rowHeightsByChunk[0].length; + var isEqualRowCnt = true; + for (var chunkI = 1; chunkI < chunksPerSection; chunkI += 1) { + var isOuterContent = sectionConfig.chunks[chunkI] && sectionConfig.chunks[chunkI].outerContent !== undefined; // can be null + if (!isOuterContent && rowHeightsByChunk[chunkI].length !== rowCnt) { // skip outer content + isEqualRowCnt = false; + break; + } + } + if (!isEqualRowCnt) { + var chunkHeightSums = []; + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { + chunkHeightSums.push(sumNumbers(rowHeightsByChunk[chunkI]) + rowHeightsByChunk[chunkI].length); + } + var maxTotalSum = Math.max.apply(Math, chunkHeightSums); + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { + var rowInChunkCnt = rowHeightsByChunk[chunkI].length; + var rowInChunkTotalHeight = maxTotalSum - rowInChunkCnt; // subtract border + // height of non-first row. we do this to avoid rounding, because it's unreliable within a table + var rowInChunkHeightOthers = Math.floor(rowInChunkTotalHeight / rowInChunkCnt); + // whatever is leftover goes to the first row + var rowInChunkHeightFirst = rowInChunkTotalHeight - rowInChunkHeightOthers * (rowInChunkCnt - 1); + var rowInChunkHeights = []; + var row = 0; + if (row < rowInChunkCnt) { + rowInChunkHeights.push(rowInChunkHeightFirst); + row += 1; + } + while (row < rowInChunkCnt) { + rowInChunkHeights.push(rowInChunkHeightOthers); + row += 1; + } + assignableHeights.push(rowInChunkHeights); + } + } + else { + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { + assignableHeights.push([]); + } + for (var row = 0; row < rowCnt; row += 1) { + var rowHeightsAcrossChunks = []; + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { + var h = rowHeightsByChunk[chunkI][row]; + if (h != null) { // protect against outerContent + rowHeightsAcrossChunks.push(h); + } + } + var maxHeight = Math.max.apply(Math, rowHeightsAcrossChunks); + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { + assignableHeights[chunkI].push(maxHeight); + } + } + } + } + sectionRowMaxHeights.push(assignableHeights); + } + this.rowInnerMaxHeightMap = newHeightMap; + return sectionRowMaxHeights; + }; + ScrollGrid.prototype.computeScrollerDims = function () { + var scrollbarWidth = getScrollbarWidths(); + var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; + var sideScrollI = (!this.context.isRtl || getIsRtlScrollbarOnLeft()) ? chunksPerSection - 1 : 0; + var lastSectionI = sectionCnt - 1; + var currentScrollers = this.clippedScrollerRefs.currentMap; + var scrollerEls = this.scrollerElRefs.currentMap; + var forceYScrollbars = false; + var forceXScrollbars = false; + var scrollerClientWidths = {}; + var scrollerClientHeights = {}; + for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { // along edge + var index = sectionI * chunksPerSection + sideScrollI; + var scroller = currentScrollers[index]; + if (scroller && scroller.needsYScrolling()) { + forceYScrollbars = true; + break; + } + } + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { // along last row + var index = lastSectionI * chunksPerSection + chunkI; + var scroller = currentScrollers[index]; + if (scroller && scroller.needsXScrolling()) { + forceXScrollbars = true; + break; + } + } + for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { + for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { + var index = sectionI * chunksPerSection + chunkI; + var scrollerEl = scrollerEls[index]; + if (scrollerEl) { + // TODO: weird way to get this. need harness b/c doesn't include table borders + var harnessEl = scrollerEl.parentNode; + scrollerClientWidths[index] = Math.floor(harnessEl.getBoundingClientRect().width - ((chunkI === sideScrollI && forceYScrollbars) + ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future + : 0)); + scrollerClientHeights[index] = Math.floor(harnessEl.getBoundingClientRect().height - ((sectionI === lastSectionI && forceXScrollbars) + ? scrollbarWidth.x // use global because scroller might not have scrollbars yet but will need them in future + : 0)); + } + } + } + return { forceYScrollbars: forceYScrollbars, forceXScrollbars: forceXScrollbars, scrollerClientWidths: scrollerClientWidths, scrollerClientHeights: scrollerClientHeights }; + }; + ScrollGrid.prototype.updateStickyScrolling = function () { + var isRtl = this.context.isRtl; + var argsByKey = this.scrollerElRefs.getAll().map(function (scrollEl) { return [scrollEl, isRtl]; }); + var stickyScrollings = this.getStickyScrolling(argsByKey); + stickyScrollings.forEach(function (stickyScrolling) { return stickyScrolling.updateSize(); }); + this.stickyScrollings = stickyScrollings; + }; + ScrollGrid.prototype.destroyStickyScrolling = function () { + this.stickyScrollings.forEach(destroyStickyScrolling); + }; + ScrollGrid.prototype.updateScrollSyncers = function () { + var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; + var cnt = sectionCnt * chunksPerSection; + var scrollElsBySection = {}; + var scrollElsByColumn = {}; + var scrollElMap = this.scrollerElRefs.currentMap; + for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { + var startIndex = sectionI * chunksPerSection; + var endIndex = startIndex + chunksPerSection; + scrollElsBySection[sectionI] = collectFromHash(scrollElMap, startIndex, endIndex, 1); // use the filtered + } + for (var col = 0; col < chunksPerSection; col += 1) { + scrollElsByColumn[col] = this.scrollerElRefs.collect(col, cnt, chunksPerSection); // DON'T use the filtered + } + this.scrollSyncersBySection = this.getScrollSyncersBySection(scrollElsBySection); + this.scrollSyncersByColumn = this.getScrollSyncersByColumn(scrollElsByColumn); + }; + ScrollGrid.prototype.destroyScrollSyncers = function () { + mapHash(this.scrollSyncersBySection, destroyScrollSyncer); + mapHash(this.scrollSyncersByColumn, destroyScrollSyncer); + }; + ScrollGrid.prototype.getChunkConfigByIndex = function (index) { + var chunksPerSection = this.getDims()[1]; + var sectionI = Math.floor(index / chunksPerSection); + var chunkI = index % chunksPerSection; + var sectionConfig = this.props.sections[sectionI]; + return sectionConfig && sectionConfig.chunks[chunkI]; + }; + ScrollGrid.prototype.forceScrollLeft = function (col, scrollLeft) { + var scrollSyncer = this.scrollSyncersByColumn[col]; + if (scrollSyncer) { + scrollSyncer.forceScrollLeft(scrollLeft); + } + }; + ScrollGrid.prototype.forceScrollTop = function (sectionI, scrollTop) { + var scrollSyncer = this.scrollSyncersBySection[sectionI]; + if (scrollSyncer) { + scrollSyncer.forceScrollTop(scrollTop); + } + }; + ScrollGrid.prototype._handleChunkEl = function (chunkEl, key) { + var chunkConfig = this.getChunkConfigByIndex(parseInt(key, 10)); + if (chunkConfig) { // null if section disappeared. bad, b/c won't null-set the elRef + setRef(chunkConfig.elRef, chunkEl); + } + }; + ScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) { + var chunkConfig = this.getChunkConfigByIndex(parseInt(key, 10)); + if (chunkConfig) { // null if section disappeared. bad, b/c won't null-set the elRef + setRef(chunkConfig.scrollerElRef, scrollerEl); + } + }; + ScrollGrid.prototype.getDims = function () { + var sectionCnt = this.props.sections.length; + var chunksPerSection = sectionCnt ? this.props.sections[0].chunks.length : 0; + return [sectionCnt, chunksPerSection]; + }; + return ScrollGrid; + }(BaseComponent)); + ScrollGrid.addStateEquality({ + shrinkWidths: isArraysEqual, + scrollerClientWidths: isPropsEqual, + scrollerClientHeights: isPropsEqual, + }); + function sumNumbers(numbers) { + var sum = 0; + for (var _i = 0, numbers_1 = numbers; _i < numbers_1.length; _i++) { + var n = numbers_1[_i]; + sum += n; + } + return sum; + } + function getRowInnerMaxHeight(rowEl) { + var innerHeights = findElements(rowEl, '.fc-scrollgrid-sync-inner').map(getElHeight); + if (innerHeights.length) { + return Math.max.apply(Math, innerHeights); + } + return 0; + } + function getElHeight(el) { + return el.offsetHeight; // better to deal with integers, for rounding, for PureComponent + } + function renderMacroColGroup(colGroupStats, shrinkWidths) { + var children = colGroupStats.map(function (colGroupStat, i) { + var width = colGroupStat.width; + if (width === 'shrink') { + width = colGroupStat.totalColWidth + sanitizeShrinkWidth(shrinkWidths[i]) + 1; // +1 for border :( + } + return ( // eslint-disable-next-line react/jsx-key + createElement("col", { style: { width: width } })); + }); + return createElement.apply(void 0, __spreadArray(['colgroup', {}], children)); + } + function compileColGroupStat(colGroupConfig) { + var totalColWidth = sumColProp(colGroupConfig.cols, 'width'); // excludes "shrink" + var totalColMinWidth = sumColProp(colGroupConfig.cols, 'minWidth'); + var hasShrinkCol = hasShrinkWidth(colGroupConfig.cols); + var allowXScrolling = colGroupConfig.width !== 'shrink' && Boolean(totalColWidth || totalColMinWidth || hasShrinkCol); + return { + hasShrinkCol: hasShrinkCol, + totalColWidth: totalColWidth, + totalColMinWidth: totalColMinWidth, + allowXScrolling: allowXScrolling, + cols: colGroupConfig.cols, + width: colGroupConfig.width, + }; + } + function sumColProp(cols, propName) { + var total = 0; + for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) { + var col = cols_1[_i]; + var val = col[propName]; + if (typeof val === 'number') { + total += val * (col.span || 1); + } + } + return total; + } + var COL_GROUP_STAT_EQUALITY = { + cols: isColPropsEqual, + }; + function isColGroupStatsEqual(stat0, stat1) { + return compareObjs(stat0, stat1, COL_GROUP_STAT_EQUALITY); + } + // for memoizers... + function initScrollSyncer(isVertical) { + var scrollEls = []; + for (var _i = 1; _i < arguments.length; _i++) { + scrollEls[_i - 1] = arguments[_i]; + } + return new ScrollSyncer(isVertical, scrollEls); + } + function destroyScrollSyncer(scrollSyncer) { + scrollSyncer.destroy(); + } + function initStickyScrolling(scrollEl, isRtl) { + return new StickyScrolling(scrollEl, isRtl); + } + function destroyStickyScrolling(stickyScrolling) { + stickyScrolling.destroy(); + } + + var scrollGridPlugin = createPlugin({ + deps: [ + premiumCommonPlugin, + ], + scrollGridImpl: ScrollGrid, + }); + config.SCROLLGRID_RESIZE_INTERVAL = 500; + + config.COLLAPSIBLE_WIDTH_THRESHOLD = 1200; + var contexts = []; + var undoFuncs = []; + var adaptivePlugin = createPlugin({ + deps: [ + premiumCommonPlugin, + ], + contextInit: function (context) { + if (!contexts.length) { + attachGlobalHandlers(); + } + contexts.push(context); + context.calendarApi.on('_unmount', function () { + removeExact(contexts, context); + if (!contexts.length) { + removeGlobalHandlers(); + } + }); + }, + }); + function attachGlobalHandlers() { + window.addEventListener('beforeprint', handleBeforePrint); + window.addEventListener('afterprint', handleAfterPrint); + // // for testing + // let forPrint = false + // document.addEventListener('keypress', (ev) => { + // if (ev.key === 'p') { + // forPrint = !forPrint + // if (forPrint) { + // handleBeforePrint() + // } else { + // handleAfterPrint() + // } + // } + // }) + } + function removeGlobalHandlers() { + window.removeEventListener('beforeprint', handleBeforePrint); + window.removeEventListener('afterprint', handleAfterPrint); + } + function handleBeforePrint() { + var scrollEls = queryScrollerEls(); + var scrollCoords = queryScrollerCoords(scrollEls); + for (var _i = 0, contexts_1 = contexts; _i < contexts_1.length; _i++) { + var context = contexts_1[_i]; + context.emitter.trigger('_beforeprint'); + } + flushSync(function () { + killHorizontalScrolling(scrollEls, scrollCoords); + undoFuncs.push(function () { return restoreScrollerCoords(scrollEls, scrollCoords); }); + undoFuncs.push(freezeScrollgridWidths()); + }); + } + function handleAfterPrint() { + for (var _i = 0, contexts_2 = contexts; _i < contexts_2.length; _i++) { + var context = contexts_2[_i]; + context.emitter.trigger('_afterprint'); + } + flushSync(function () { + while (undoFuncs.length) { + undoFuncs.shift()(); + } + }); + } + // scrollgrid widths + function freezeScrollgridWidths() { + var els = findElements(document.body, '.fc-scrollgrid'); + els.forEach(freezeScrollGridWidth); + return function () { return els.forEach(unfreezeScrollGridWidth); }; + } + function freezeScrollGridWidth(el) { + var elWidth = el.getBoundingClientRect().width; + // along with collapsibleWidth, this is a hack for #5707 + if (!el.classList.contains('fc-scrollgrid-collapsible') || elWidth < config.COLLAPSIBLE_WIDTH_THRESHOLD) { + el.style.width = elWidth + 'px'; + } + } + function unfreezeScrollGridWidth(el) { + el.style.width = ''; + } + // scrollers + // TODO: use scroll normalization!? yes + function queryScrollerEls() { + return findElements(document.body, '.fc-scroller-harness > .fc-scroller'); + } + function queryScrollerCoords(els) { + return els.map(function (el) { + var computedStyle = window.getComputedStyle(el); + return { + scrollLeft: el.scrollLeft, + scrollTop: el.scrollTop, + overflowX: computedStyle.overflowX, + overflowY: computedStyle.overflowY, + marginBottom: computedStyle.marginBottom, + }; + }); + } + function killHorizontalScrolling(els, coords) { + els.forEach(function (el, i) { + el.style.overflowX = 'visible'; // need to clear X/Y to get true overflow + el.style.overflowY = 'visible'; // " + el.style.marginBottom = ''; // for clipping away scrollbar. disable + el.style.left = -coords[i].scrollLeft + 'px'; // simulate scrollLeft! will be position:relative + }); + } + function restoreScrollerCoords(els, coords) { + els.forEach(function (el, i) { + var c = coords[i]; + el.style.overflowX = c.overflowX; + el.style.overflowY = c.overflowY; + el.style.marginBottom = c.marginBottom; + el.style.left = ''; + el.scrollLeft = c.scrollLeft; + el.scrollTop = c.scrollTop; + }); + } + + var MIN_AUTO_LABELS = 18; // more than `12` months but less that `24` hours + var MAX_AUTO_SLOTS_PER_LABEL = 6; // allows 6 10-min slots in an hour + var MAX_AUTO_CELLS = 200; // allows 4-days to have a :30 slot duration + config.MAX_TIMELINE_SLOTS = 1000; + // potential nice values for slot-duration and interval-duration + var STOCK_SUB_DURATIONS = [ + { years: 1 }, + { months: 1 }, + { days: 1 }, + { hours: 1 }, + { minutes: 30 }, + { minutes: 15 }, + { minutes: 10 }, + { minutes: 5 }, + { minutes: 1 }, + { seconds: 30 }, + { seconds: 15 }, + { seconds: 10 }, + { seconds: 5 }, + { seconds: 1 }, + { milliseconds: 500 }, + { milliseconds: 100 }, + { milliseconds: 10 }, + { milliseconds: 1 }, + ]; + function buildTimelineDateProfile(dateProfile, dateEnv, allOptions, dateProfileGenerator) { + var tDateProfile = { + labelInterval: allOptions.slotLabelInterval, + slotDuration: allOptions.slotDuration, + }; + validateLabelAndSlot(tDateProfile, dateProfile, dateEnv); // validate after computed grid duration + ensureLabelInterval(tDateProfile, dateProfile, dateEnv); + ensureSlotDuration(tDateProfile, dateProfile, dateEnv); + var input = allOptions.slotLabelFormat; + var rawFormats = Array.isArray(input) ? input : + (input != null) ? [input] : + computeHeaderFormats(tDateProfile, dateProfile, dateEnv, allOptions); + tDateProfile.headerFormats = rawFormats.map(function (rawFormat) { return createFormatter(rawFormat); }); + tDateProfile.isTimeScale = Boolean(tDateProfile.slotDuration.milliseconds); + var largeUnit = null; + if (!tDateProfile.isTimeScale) { + var slotUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit; + if (/year|month|week/.test(slotUnit)) { + largeUnit = slotUnit; + } + } + tDateProfile.largeUnit = largeUnit; + tDateProfile.emphasizeWeeks = + asCleanDays(tDateProfile.slotDuration) === 1 && + currentRangeAs('weeks', dateProfile, dateEnv) >= 2 && + !allOptions.businessHours; + /* + console.log('label interval =', timelineView.labelInterval.humanize()) + console.log('slot duration =', timelineView.slotDuration.humanize()) + console.log('header formats =', timelineView.headerFormats) + console.log('isTimeScale', timelineView.isTimeScale) + console.log('largeUnit', timelineView.largeUnit) + */ + var rawSnapDuration = allOptions.snapDuration; + var snapDuration; + var snapsPerSlot; + if (rawSnapDuration) { + snapDuration = createDuration(rawSnapDuration); + snapsPerSlot = wholeDivideDurations(tDateProfile.slotDuration, snapDuration); + // ^ TODO: warning if not whole? + } + if (snapsPerSlot == null) { + snapDuration = tDateProfile.slotDuration; + snapsPerSlot = 1; + } + tDateProfile.snapDuration = snapDuration; + tDateProfile.snapsPerSlot = snapsPerSlot; + // more... + var timeWindowMs = asRoughMs(dateProfile.slotMaxTime) - asRoughMs(dateProfile.slotMinTime); + // TODO: why not use normalizeRange!? + var normalizedStart = normalizeDate(dateProfile.renderRange.start, tDateProfile, dateEnv); + var normalizedEnd = normalizeDate(dateProfile.renderRange.end, tDateProfile, dateEnv); + // apply slotMinTime/slotMaxTime + // TODO: View should be responsible. + if (tDateProfile.isTimeScale) { + normalizedStart = dateEnv.add(normalizedStart, dateProfile.slotMinTime); + normalizedEnd = dateEnv.add(addDays(normalizedEnd, -1), dateProfile.slotMaxTime); + } + tDateProfile.timeWindowMs = timeWindowMs; + tDateProfile.normalizedRange = { start: normalizedStart, end: normalizedEnd }; + var slotDates = []; + var date = normalizedStart; + while (date < normalizedEnd) { + if (isValidDate(date, tDateProfile, dateProfile, dateProfileGenerator)) { + slotDates.push(date); + } + date = dateEnv.add(date, tDateProfile.slotDuration); + } + tDateProfile.slotDates = slotDates; + // more... + var snapIndex = -1; + var snapDiff = 0; // index of the diff :( + var snapDiffToIndex = []; + var snapIndexToDiff = []; + date = normalizedStart; + while (date < normalizedEnd) { + if (isValidDate(date, tDateProfile, dateProfile, dateProfileGenerator)) { + snapIndex += 1; + snapDiffToIndex.push(snapIndex); + snapIndexToDiff.push(snapDiff); + } + else { + snapDiffToIndex.push(snapIndex + 0.5); + } + date = dateEnv.add(date, tDateProfile.snapDuration); + snapDiff += 1; + } + tDateProfile.snapDiffToIndex = snapDiffToIndex; + tDateProfile.snapIndexToDiff = snapIndexToDiff; + tDateProfile.snapCnt = snapIndex + 1; // is always one behind + tDateProfile.slotCnt = tDateProfile.snapCnt / tDateProfile.snapsPerSlot; + // more... + tDateProfile.isWeekStarts = buildIsWeekStarts(tDateProfile, dateEnv); + tDateProfile.cellRows = buildCellRows(tDateProfile, dateEnv); + tDateProfile.slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration); + return tDateProfile; + } + /* + snaps to appropriate unit + */ + function normalizeDate(date, tDateProfile, dateEnv) { + var normalDate = date; + if (!tDateProfile.isTimeScale) { + normalDate = startOfDay(normalDate); + if (tDateProfile.largeUnit) { + normalDate = dateEnv.startOf(normalDate, tDateProfile.largeUnit); + } + } + return normalDate; + } + /* + snaps to appropriate unit + */ + function normalizeRange(range, tDateProfile, dateEnv) { + if (!tDateProfile.isTimeScale) { + range = computeVisibleDayRange(range); + if (tDateProfile.largeUnit) { + var dayRange = range; // preserve original result + range = { + start: dateEnv.startOf(range.start, tDateProfile.largeUnit), + end: dateEnv.startOf(range.end, tDateProfile.largeUnit), + }; + // if date is partially through the interval, or is in the same interval as the start, + // make the exclusive end be the *next* interval + if (range.end.valueOf() !== dayRange.end.valueOf() || range.end <= range.start) { + range = { + start: range.start, + end: dateEnv.add(range.end, tDateProfile.slotDuration), + }; + } + } + } + return range; + } + function isValidDate(date, tDateProfile, dateProfile, dateProfileGenerator) { + if (dateProfileGenerator.isHiddenDay(date)) { + return false; + } + if (tDateProfile.isTimeScale) { + // determine if the time is within slotMinTime/slotMaxTime, which may have wacky values + var day = startOfDay(date); + var timeMs = date.valueOf() - day.valueOf(); + var ms = timeMs - asRoughMs(dateProfile.slotMinTime); // milliseconds since slotMinTime + ms = ((ms % 86400000) + 86400000) % 86400000; // make negative values wrap to 24hr clock + return ms < tDateProfile.timeWindowMs; // before the slotMaxTime? + } + return true; + } + function validateLabelAndSlot(tDateProfile, dateProfile, dateEnv) { + var currentRange = dateProfile.currentRange; + // make sure labelInterval doesn't exceed the max number of cells + if (tDateProfile.labelInterval) { + var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.labelInterval); + if (labelCnt > config.MAX_TIMELINE_SLOTS) { + console.warn('slotLabelInterval results in too many cells'); + tDateProfile.labelInterval = null; + } + } + // make sure slotDuration doesn't exceed the maximum number of cells + if (tDateProfile.slotDuration) { + var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.slotDuration); + if (slotCnt > config.MAX_TIMELINE_SLOTS) { + console.warn('slotDuration results in too many cells'); + tDateProfile.slotDuration = null; + } + } + // make sure labelInterval is a multiple of slotDuration + if (tDateProfile.labelInterval && tDateProfile.slotDuration) { + var slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration); + if (slotsPerLabel === null || slotsPerLabel < 1) { + console.warn('slotLabelInterval must be a multiple of slotDuration'); + tDateProfile.slotDuration = null; + } + } + } + function ensureLabelInterval(tDateProfile, dateProfile, dateEnv) { + var currentRange = dateProfile.currentRange; + var labelInterval = tDateProfile.labelInterval; + if (!labelInterval) { + // compute based off the slot duration + // find the largest label interval with an acceptable slots-per-label + var input = void 0; + if (tDateProfile.slotDuration) { + for (var _i = 0, STOCK_SUB_DURATIONS_1 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_1.length; _i++) { + input = STOCK_SUB_DURATIONS_1[_i]; + var tryLabelInterval = createDuration(input); + var slotsPerLabel = wholeDivideDurations(tryLabelInterval, tDateProfile.slotDuration); + if (slotsPerLabel !== null && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) { + labelInterval = tryLabelInterval; + break; + } + } + // use the slot duration as a last resort + if (!labelInterval) { + labelInterval = tDateProfile.slotDuration; + } + // compute based off the view's duration + // find the largest label interval that yields the minimum number of labels + } + else { + for (var _a = 0, STOCK_SUB_DURATIONS_2 = STOCK_SUB_DURATIONS; _a < STOCK_SUB_DURATIONS_2.length; _a++) { + input = STOCK_SUB_DURATIONS_2[_a]; + labelInterval = createDuration(input); + var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, labelInterval); + if (labelCnt >= MIN_AUTO_LABELS) { + break; + } + } + } + tDateProfile.labelInterval = labelInterval; + } + return labelInterval; + } + function ensureSlotDuration(tDateProfile, dateProfile, dateEnv) { + var currentRange = dateProfile.currentRange; + var slotDuration = tDateProfile.slotDuration; + if (!slotDuration) { + var labelInterval = ensureLabelInterval(tDateProfile, dateProfile, dateEnv); // will compute if necessary + // compute based off the label interval + // find the largest slot duration that is different from labelInterval, but still acceptable + for (var _i = 0, STOCK_SUB_DURATIONS_3 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_3.length; _i++) { + var input = STOCK_SUB_DURATIONS_3[_i]; + var trySlotDuration = createDuration(input); + var slotsPerLabel = wholeDivideDurations(labelInterval, trySlotDuration); + if (slotsPerLabel !== null && slotsPerLabel > 1 && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) { + slotDuration = trySlotDuration; + break; + } + } + // only allow the value if it won't exceed the view's # of slots limit + if (slotDuration) { + var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, slotDuration); + if (slotCnt > MAX_AUTO_CELLS) { + slotDuration = null; + } + } + // use the label interval as a last resort + if (!slotDuration) { + slotDuration = labelInterval; + } + tDateProfile.slotDuration = slotDuration; + } + return slotDuration; + } + function computeHeaderFormats(tDateProfile, dateProfile, dateEnv, allOptions) { + var format1; + var format2; + var labelInterval = tDateProfile.labelInterval; + var unit = greatestDurationDenominator(labelInterval).unit; + var weekNumbersVisible = allOptions.weekNumbers; + var format0 = (format1 = (format2 = null)); + // NOTE: weekNumber computation function wont work + if ((unit === 'week') && !weekNumbersVisible) { + unit = 'day'; + } + switch (unit) { + case 'year': + format0 = { year: 'numeric' }; // '2015' + break; + case 'month': + if (currentRangeAs('years', dateProfile, dateEnv) > 1) { + format0 = { year: 'numeric' }; // '2015' + } + format1 = { month: 'short' }; // 'Jan' + break; + case 'week': + if (currentRangeAs('years', dateProfile, dateEnv) > 1) { + format0 = { year: 'numeric' }; // '2015' + } + format1 = { week: 'narrow' }; // 'Wk4' + break; + case 'day': + if (currentRangeAs('years', dateProfile, dateEnv) > 1) { + format0 = { year: 'numeric', month: 'long' }; // 'January 2014' + } + else if (currentRangeAs('months', dateProfile, dateEnv) > 1) { + format0 = { month: 'long' }; // 'January' + } + if (weekNumbersVisible) { + format1 = { week: 'short' }; // 'Wk 4' + } + format2 = { weekday: 'narrow', day: 'numeric' }; // 'Su 9' + break; + case 'hour': + if (weekNumbersVisible) { + format0 = { week: 'short' }; // 'Wk 4' + } + if (currentRangeAs('days', dateProfile, dateEnv) > 1) { + format1 = { weekday: 'short', day: 'numeric', month: 'numeric', omitCommas: true }; // Sat 4/7 + } + format2 = { + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true, + meridiem: 'short', + }; + break; + case 'minute': + // sufficiently large number of different minute cells? + if ((asRoughMinutes(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) { + format0 = { + hour: 'numeric', + meridiem: 'short', + }; + format1 = function (params) { return (':' + padStart(params.date.minute, 2) // ':30' + ); }; + } + else { + format0 = { + hour: 'numeric', + minute: 'numeric', + meridiem: 'short', + }; + } + break; + case 'second': + // sufficiently large number of different second cells? + if ((asRoughSeconds(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) { + format0 = { hour: 'numeric', minute: '2-digit', meridiem: 'lowercase' }; // '8:30 PM' + format1 = function (params) { return (':' + padStart(params.date.second, 2) // ':30' + ); }; + } + else { + format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM' + } + break; + case 'millisecond': + format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM' + format1 = function (params) { return ('.' + padStart(params.millisecond, 3)); }; + break; + } + return [].concat(format0 || [], format1 || [], format2 || []); + } + // Compute the number of the give units in the "current" range. + // Won't go more precise than days. + // Will return `0` if there's not a clean whole interval. + function currentRangeAs(unit, dateProfile, dateEnv) { + var range = dateProfile.currentRange; + var res = null; + if (unit === 'years') { + res = dateEnv.diffWholeYears(range.start, range.end); + } + else if (unit === 'months') { + res = dateEnv.diffWholeMonths(range.start, range.end); + } + else if (unit === 'weeks') { + res = dateEnv.diffWholeMonths(range.start, range.end); + } + else if (unit === 'days') { + res = diffWholeDays(range.start, range.end); + } + return res || 0; + } + function buildIsWeekStarts(tDateProfile, dateEnv) { + var slotDates = tDateProfile.slotDates, emphasizeWeeks = tDateProfile.emphasizeWeeks; + var prevWeekNumber = null; + var isWeekStarts = []; + for (var _i = 0, slotDates_1 = slotDates; _i < slotDates_1.length; _i++) { + var slotDate = slotDates_1[_i]; + var weekNumber = dateEnv.computeWeekNumber(slotDate); + var isWeekStart = emphasizeWeeks && (prevWeekNumber !== null) && (prevWeekNumber !== weekNumber); + prevWeekNumber = weekNumber; + isWeekStarts.push(isWeekStart); + } + return isWeekStarts; + } + function buildCellRows(tDateProfile, dateEnv) { + var slotDates = tDateProfile.slotDates; + var formats = tDateProfile.headerFormats; + var cellRows = formats.map(function () { return []; }); // indexed by row,col + var slotAsDays = asCleanDays(tDateProfile.slotDuration); + var guessedSlotUnit = slotAsDays === 7 ? 'week' : + slotAsDays === 1 ? 'day' : + null; + // specifically for navclicks + var rowUnitsFromFormats = formats.map(function (format) { return (format.getLargestUnit ? format.getLargestUnit() : null); }); + // builds cellRows and slotCells + for (var i = 0; i < slotDates.length; i += 1) { + var date = slotDates[i]; + var isWeekStart = tDateProfile.isWeekStarts[i]; + for (var row = 0; row < formats.length; row += 1) { + var format = formats[row]; + var rowCells = cellRows[row]; + var leadingCell = rowCells[rowCells.length - 1]; + var isLastRow = row === formats.length - 1; + var isSuperRow = formats.length > 1 && !isLastRow; // more than one row and not the last + var newCell = null; + var rowUnit = rowUnitsFromFormats[row] || (isLastRow ? guessedSlotUnit : null); + if (isSuperRow) { + var text = dateEnv.format(date, format); + if (!leadingCell || (leadingCell.text !== text)) { + newCell = buildCellObject(date, text, rowUnit); + } + else { + leadingCell.colspan += 1; + } + } + else if (!leadingCell || + isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval))) { + var text = dateEnv.format(date, format); + newCell = buildCellObject(date, text, rowUnit); + } + else { + leadingCell.colspan += 1; + } + if (newCell) { + newCell.weekStart = isWeekStart; + rowCells.push(newCell); + } + } + } + return cellRows; + } + function buildCellObject(date, text, rowUnit) { + return { date: date, text: text, rowUnit: rowUnit, colspan: 1, isWeekStart: false }; + } + + var TimelineHeaderThInner = /** @class */ (function (_super) { + __extends(TimelineHeaderThInner, _super); + function TimelineHeaderThInner() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineHeaderThInner.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + return (createElement(ContentHook, { hookProps: props.hookProps, content: context.options.slotLabelContent, defaultContent: renderInnerContent$1 }, function (innerElRef, innerContent) { return (createElement("a", __assign({ ref: innerElRef, className: 'fc-timeline-slot-cushion fc-scrollgrid-sync-inner' + (props.isSticky ? ' fc-sticky' : '') }, props.navLinkAttrs), innerContent)); })); + }; + return TimelineHeaderThInner; + }(BaseComponent)); + function renderInnerContent$1(props) { + return props.text; + } + function refineHookProps$2(input) { + return { + level: input.level, + date: input.dateEnv.toDate(input.dateMarker), + view: input.viewApi, + text: input.text, + }; + } + + var TimelineHeaderTh = /** @class */ (function (_super) { + __extends(TimelineHeaderTh, _super); + function TimelineHeaderTh() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.refineHookProps = memoizeObjArg(refineHookProps$2); + _this.normalizeClassNames = buildClassNameNormalizer(); + _this.buildCellNavLinkAttrs = memoize(buildCellNavLinkAttrs); + return _this; + } + TimelineHeaderTh.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var dateEnv = context.dateEnv, options = context.options; + var cell = props.cell, dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; + // the cell.rowUnit is f'd + // giving 'month' for a 3-day view + // workaround: to infer day, do NOT time + var dateMeta = getDateMeta(cell.date, props.todayRange, props.nowDate, dateProfile); + var classNames = ['fc-timeline-slot', 'fc-timeline-slot-label'].concat(cell.rowUnit === 'time' // TODO: so slot classnames for week/month/bigger. see note above about rowUnit + ? getSlotClassNames(dateMeta, context.theme) + : getDayClassNames(dateMeta, context.theme)); + if (cell.isWeekStart) { + classNames.push('fc-timeline-slot-em'); + } + var hookProps = this.refineHookProps({ + level: props.rowLevel, + dateMarker: cell.date, + text: cell.text, + dateEnv: context.dateEnv, + viewApi: context.viewApi, + }); + var customClassNames = this.normalizeClassNames(options.slotLabelClassNames, hookProps); + return (createElement(MountHook, { hookProps: hookProps, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef) { return (createElement("th", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": dateEnv.formatIso(cell.date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }), colSpan: cell.colspan }, + createElement("div", { className: "fc-timeline-slot-frame", style: { height: props.rowInnerHeight } }, + createElement(TimelineHeaderThInner, { hookProps: hookProps, isSticky: props.isSticky, navLinkAttrs: _this.buildCellNavLinkAttrs(context, cell.date, cell.rowUnit) })))); })); + }; + return TimelineHeaderTh; + }(BaseComponent)); + function buildCellNavLinkAttrs(context, cellDate, rowUnit) { + return (rowUnit && rowUnit !== 'time') + ? buildNavLinkAttrs(context, cellDate, rowUnit) + : {}; + } + + var TimelineHeaderRows = /** @class */ (function (_super) { + __extends(TimelineHeaderRows, _super); + function TimelineHeaderRows() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineHeaderRows.prototype.render = function () { + var _a = this.props, dateProfile = _a.dateProfile, tDateProfile = _a.tDateProfile, rowInnerHeights = _a.rowInnerHeights, todayRange = _a.todayRange, nowDate = _a.nowDate; + var cellRows = tDateProfile.cellRows; + return (createElement(Fragment, null, cellRows.map(function (rowCells, rowLevel) { + var isLast = rowLevel === cellRows.length - 1; + var isChrono = tDateProfile.isTimeScale && isLast; // the final row, with times? + var classNames = [ + 'fc-timeline-header-row', + isChrono ? 'fc-timeline-header-row-chrono' : '', + ]; + return ( // eslint-disable-next-line react/no-array-index-key + createElement("tr", { key: rowLevel, className: classNames.join(' ') }, rowCells.map(function (cell) { return (createElement(TimelineHeaderTh, { key: cell.date.toISOString(), cell: cell, rowLevel: rowLevel, dateProfile: dateProfile, tDateProfile: tDateProfile, todayRange: todayRange, nowDate: nowDate, rowInnerHeight: rowInnerHeights && rowInnerHeights[rowLevel], isSticky: !isLast })); }))); + }))); + }; + return TimelineHeaderRows; + }(BaseComponent)); + + var TimelineCoords = /** @class */ (function () { + function TimelineCoords(slatRootEl, // okay to expose? + slatEls, dateProfile, tDateProfile, dateEnv, isRtl) { + this.slatRootEl = slatRootEl; + this.dateProfile = dateProfile; + this.tDateProfile = tDateProfile; + this.dateEnv = dateEnv; + this.isRtl = isRtl; + this.outerCoordCache = new PositionCache(slatRootEl, slatEls, true, // isHorizontal + false); + // for the inner divs within the slats + // used for event rendering and scrollTime, to disregard slat border + this.innerCoordCache = new PositionCache(slatRootEl, findDirectChildren(slatEls, 'div'), true, // isHorizontal + false); + } + TimelineCoords.prototype.isDateInRange = function (date) { + return rangeContainsMarker(this.dateProfile.currentRange, date); + }; + // results range from negative width of area to 0 + TimelineCoords.prototype.dateToCoord = function (date) { + var tDateProfile = this.tDateProfile; + var snapCoverage = this.computeDateSnapCoverage(date); + var slotCoverage = snapCoverage / tDateProfile.snapsPerSlot; + var slotIndex = Math.floor(slotCoverage); + slotIndex = Math.min(slotIndex, tDateProfile.slotCnt - 1); + var partial = slotCoverage - slotIndex; + var _a = this, innerCoordCache = _a.innerCoordCache, outerCoordCache = _a.outerCoordCache; + if (this.isRtl) { + return outerCoordCache.originClientRect.width - (outerCoordCache.rights[slotIndex] - + (innerCoordCache.getWidth(slotIndex) * partial)); + } + return (outerCoordCache.lefts[slotIndex] + + (innerCoordCache.getWidth(slotIndex) * partial)); + }; + TimelineCoords.prototype.rangeToCoords = function (range) { + return { + start: this.dateToCoord(range.start), + end: this.dateToCoord(range.end), + }; + }; + TimelineCoords.prototype.durationToCoord = function (duration) { + var _a = this, dateProfile = _a.dateProfile, tDateProfile = _a.tDateProfile, dateEnv = _a.dateEnv, isRtl = _a.isRtl; + var coord = 0; + if (dateProfile) { + var date = dateEnv.add(dateProfile.activeRange.start, duration); + if (!tDateProfile.isTimeScale) { + date = startOfDay(date); + } + coord = this.dateToCoord(date); + // hack to overcome the left borders of non-first slat + if (!isRtl && coord) { + coord += 1; + } + } + return coord; + }; + TimelineCoords.prototype.coordFromLeft = function (coord) { + if (this.isRtl) { + return this.outerCoordCache.originClientRect.width - coord; + } + return coord; + }; + // returned value is between 0 and the number of snaps + TimelineCoords.prototype.computeDateSnapCoverage = function (date) { + return computeDateSnapCoverage(date, this.tDateProfile, this.dateEnv); + }; + return TimelineCoords; + }()); + // returned value is between 0 and the number of snaps + function computeDateSnapCoverage(date, tDateProfile, dateEnv) { + var snapDiff = dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.snapDuration); + if (snapDiff < 0) { + return 0; + } + if (snapDiff >= tDateProfile.snapDiffToIndex.length) { + return tDateProfile.snapCnt; + } + var snapDiffInt = Math.floor(snapDiff); + var snapCoverage = tDateProfile.snapDiffToIndex[snapDiffInt]; + if (isInt(snapCoverage)) { // not an in-between value + snapCoverage += snapDiff - snapDiffInt; // add the remainder + } + else { + // a fractional value, meaning the date is not visible + // always round up in this case. works for start AND end dates in a range. + snapCoverage = Math.ceil(snapCoverage); + } + return snapCoverage; + } + function coordToCss(hcoord, isRtl) { + if (hcoord === null) { + return { left: '', right: '' }; + } + if (isRtl) { + return { right: hcoord, left: '' }; + } + return { left: hcoord, right: '' }; + } + function coordsToCss(hcoords, isRtl) { + if (!hcoords) { + return { left: '', right: '' }; + } + if (isRtl) { + return { right: hcoords.start, left: -hcoords.end }; + } + return { left: hcoords.start, right: -hcoords.end }; + } + + var TimelineHeader = /** @class */ (function (_super) { + __extends(TimelineHeader, _super); + function TimelineHeader() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + return _this; + } + TimelineHeader.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + // TODO: very repetitive + // TODO: make part of tDateProfile? + var timerUnit = greatestDurationDenominator(props.tDateProfile.slotDuration).unit; + // WORKAROUND: make ignore slatCoords when out of sync with dateProfile + var slatCoords = props.slatCoords && props.slatCoords.dateProfile === props.dateProfile ? props.slatCoords : null; + return (createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement("div", { className: "fc-timeline-header", ref: _this.rootElRef }, + createElement("table", { "aria-hidden": true, className: "fc-scrollgrid-sync-table", style: { minWidth: props.tableMinWidth, width: props.clientWidth } }, + props.tableColGroupNode, + createElement("tbody", null, + createElement(TimelineHeaderRows, { dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, rowInnerHeights: props.rowInnerHeights }))), + context.options.nowIndicator && ( + // need to have a container regardless of whether the current view has a visible now indicator + // because apparently removal of the element resets the scroll for some reasons (issue #5351). + // this issue doesn't happen for the timeline body however ( + createElement("div", { className: "fc-timeline-now-indicator-container" }, (slatCoords && slatCoords.isDateInRange(nowDate)) && (createElement(NowIndicatorRoot, { isAxis: true, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-arrow'].concat(classNames).join(' '), style: coordToCss(slatCoords.dateToCoord(nowDate), context.isRtl) }, innerContent)); })))))); })); + }; + TimelineHeader.prototype.componentDidMount = function () { + this.updateSize(); + }; + TimelineHeader.prototype.componentDidUpdate = function () { + this.updateSize(); + }; + TimelineHeader.prototype.updateSize = function () { + if (this.props.onMaxCushionWidth) { + this.props.onMaxCushionWidth(this.computeMaxCushionWidth()); + } + }; + TimelineHeader.prototype.computeMaxCushionWidth = function () { + return Math.max.apply(Math, findElements(this.rootElRef.current, '.fc-timeline-header-row:last-child .fc-timeline-slot-cushion').map(function (el) { return el.getBoundingClientRect().width; })); + }; + return TimelineHeader; + }(BaseComponent)); + + var TimelineSlatCell = /** @class */ (function (_super) { + __extends(TimelineSlatCell, _super); + function TimelineSlatCell() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineSlatCell.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var dateEnv = context.dateEnv, options = context.options, theme = context.theme; + var date = props.date, tDateProfile = props.tDateProfile, isEm = props.isEm; + var dateMeta = getDateMeta(props.date, props.todayRange, props.nowDate, props.dateProfile); + var classNames = ['fc-timeline-slot', 'fc-timeline-slot-lane']; + var dataAttrs = { 'data-date': dateEnv.formatIso(date, { omitTimeZoneOffset: true, omitTime: !tDateProfile.isTimeScale }) }; + var hookProps = __assign(__assign({ date: dateEnv.toDate(props.date) }, dateMeta), { view: context.viewApi }); + if (isEm) { + classNames.push('fc-timeline-slot-em'); + } + if (tDateProfile.isTimeScale) { + classNames.push(isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, props.date, tDateProfile.labelInterval)) ? + 'fc-timeline-slot-major' : + 'fc-timeline-slot-minor'); + } + classNames.push.apply(classNames, (props.isDay + ? getDayClassNames(dateMeta, theme) + : getSlotClassNames(dateMeta, theme))); + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLaneClassNames, content: options.slotLaneContent, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount, elRef: props.elRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", __assign({ ref: rootElRef, className: classNames.concat(customClassNames).join(' ') }, dataAttrs), + createElement("div", { ref: innerElRef }, innerContent))); })); + }; + return TimelineSlatCell; + }(BaseComponent)); + + var TimelineSlatsBody = /** @class */ (function (_super) { + __extends(TimelineSlatsBody, _super); + function TimelineSlatsBody() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineSlatsBody.prototype.render = function () { + var props = this.props; + var tDateProfile = props.tDateProfile, cellElRefs = props.cellElRefs; + var slotDates = tDateProfile.slotDates, isWeekStarts = tDateProfile.isWeekStarts; + var isDay = !tDateProfile.isTimeScale && !tDateProfile.largeUnit; + return (createElement("tbody", null, + createElement("tr", null, slotDates.map(function (slotDate, i) { + var key = slotDate.toISOString(); + return (createElement(TimelineSlatCell, { key: key, elRef: cellElRefs.createRef(key), date: slotDate, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isEm: isWeekStarts[i], isDay: isDay })); + })))); + }; + return TimelineSlatsBody; + }(BaseComponent)); + + var TimelineSlats = /** @class */ (function (_super) { + __extends(TimelineSlats, _super); + function TimelineSlats() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + _this.cellElRefs = new RefMap(); + _this.handleScrollRequest = function (request) { + var onScrollLeftRequest = _this.props.onScrollLeftRequest; + var coords = _this.coords; + if (onScrollLeftRequest && coords) { + if (request.time) { + var scrollLeft = coords.coordFromLeft(coords.durationToCoord(request.time)); + onScrollLeftRequest(scrollLeft); + } + return true; + } + return null; // best? + }; + return _this; + } + TimelineSlats.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + return (createElement("div", { className: "fc-timeline-slots", ref: this.rootElRef }, + createElement("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { + minWidth: props.tableMinWidth, + width: props.clientWidth, + } }, + props.tableColGroupNode, + createElement(TimelineSlatsBody, { cellElRefs: this.cellElRefs, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange })))); + }; + TimelineSlats.prototype.componentDidMount = function () { + this.updateSizing(); + this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); + }; + TimelineSlats.prototype.componentDidUpdate = function (prevProps) { + this.updateSizing(); + this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); + }; + TimelineSlats.prototype.componentWillUnmount = function () { + this.scrollResponder.detach(); + if (this.props.onCoords) { + this.props.onCoords(null); + } + }; + TimelineSlats.prototype.updateSizing = function () { + var _a = this, props = _a.props, context = _a.context; + if (props.clientWidth !== null && // is sizing stable? + this.scrollResponder + // ^it's possible to have clientWidth immediately after mount (when returning from print view), but w/o scrollResponder + ) { + var rootEl = this.rootElRef.current; + if (rootEl.offsetWidth) { // not hidden by css + this.coords = new TimelineCoords(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.tDateProfile.slotDates), props.dateProfile, props.tDateProfile, context.dateEnv, context.isRtl); + if (props.onCoords) { + props.onCoords(this.coords); + } + this.scrollResponder.update(false); // TODO: wouldn't have to do this if coords were in state + } + } + }; + TimelineSlats.prototype.positionToHit = function (leftPosition) { + var outerCoordCache = this.coords.outerCoordCache; + var _a = this.context, dateEnv = _a.dateEnv, isRtl = _a.isRtl; + var tDateProfile = this.props.tDateProfile; + var slatIndex = outerCoordCache.leftToIndex(leftPosition); + if (slatIndex != null) { + // somewhat similar to what TimeGrid does. consolidate? + var slatWidth = outerCoordCache.getWidth(slatIndex); + var partial = isRtl ? + (outerCoordCache.rights[slatIndex] - leftPosition) / slatWidth : + (leftPosition - outerCoordCache.lefts[slatIndex]) / slatWidth; + var localSnapIndex = Math.floor(partial * tDateProfile.snapsPerSlot); + var start = dateEnv.add(tDateProfile.slotDates[slatIndex], multiplyDuration(tDateProfile.snapDuration, localSnapIndex)); + var end = dateEnv.add(start, tDateProfile.snapDuration); + return { + dateSpan: { + range: { start: start, end: end }, + allDay: !this.props.tDateProfile.isTimeScale, + }, + dayEl: this.cellElRefs.currentMap[slatIndex], + left: outerCoordCache.lefts[slatIndex], + right: outerCoordCache.rights[slatIndex], + }; + } + return null; + }; + return TimelineSlats; + }(BaseComponent)); + function collectCellEls(elMap, slotDates) { + return slotDates.map(function (slotDate) { + var key = slotDate.toISOString(); + return elMap[key]; + }); + } + + function computeSegHCoords(segs, minWidth, timelineCoords) { + var hcoords = []; + if (timelineCoords) { + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + var res = timelineCoords.rangeToCoords(seg); + var start = Math.round(res.start); // for barely-overlapping collisions + var end = Math.round(res.end); // + if (end - start < minWidth) { + end = start + minWidth; + } + hcoords.push({ start: start, end: end }); + } + } + return hcoords; + } + function computeFgSegPlacements(segs, segHCoords, // might not have for every seg + eventInstanceHeights, // might not have for every seg + moreLinkHeights, // might not have for every more-link + strictOrder, maxStackCnt) { + var segInputs = []; + var crudePlacements = []; // when we don't know dims + for (var i = 0; i < segs.length; i += 1) { + var seg = segs[i]; + var instanceId = seg.eventRange.instance.instanceId; + var height = eventInstanceHeights[instanceId]; + var hcoords = segHCoords[i]; + if (height && hcoords) { + segInputs.push({ + index: i, + span: hcoords, + thickness: height, + }); + } + else { + crudePlacements.push({ + seg: seg, + hcoords: hcoords, + top: null, + }); + } + } + var hierarchy = new SegHierarchy(); + if (strictOrder != null) { + hierarchy.strictOrder = strictOrder; + } + if (maxStackCnt != null) { + hierarchy.maxStackCnt = maxStackCnt; + } + var hiddenEntries = hierarchy.addSegs(segInputs); + var hiddenPlacements = hiddenEntries.map(function (entry) { return ({ + seg: segs[entry.index], + hcoords: entry.span, + top: null, + }); }); + var hiddenGroups = groupIntersectingEntries(hiddenEntries); + var moreLinkInputs = []; + var moreLinkCrudePlacements = []; + var extractSeg = function (entry) { return segs[entry.index]; }; + for (var i = 0; i < hiddenGroups.length; i += 1) { + var hiddenGroup = hiddenGroups[i]; + var sortedSegs = hiddenGroup.entries.map(extractSeg); + var height = moreLinkHeights[buildIsoString(computeEarliestSegStart(sortedSegs))]; // not optimal :( + if (height != null) { + // NOTE: the hiddenGroup's spanStart/spanEnd are already computed by rangeToCoords. computed during input. + moreLinkInputs.push({ + index: segs.length + i, + thickness: height, + span: hiddenGroup.span, + }); + } + else { + moreLinkCrudePlacements.push({ + seg: sortedSegs, + hcoords: hiddenGroup.span, + top: null, + }); + } + } + // add more-links into the hierarchy, but don't limit + hierarchy.maxStackCnt = -1; + hierarchy.addSegs(moreLinkInputs); + var visibleRects = hierarchy.toRects(); + var visiblePlacements = []; + var maxHeight = 0; + for (var _i = 0, visibleRects_1 = visibleRects; _i < visibleRects_1.length; _i++) { + var rect = visibleRects_1[_i]; + var segIndex = rect.index; + visiblePlacements.push({ + seg: segIndex < segs.length + ? segs[segIndex] // a real seg + : hiddenGroups[segIndex - segs.length].entries.map(extractSeg), + hcoords: rect.span, + top: rect.levelCoord, + }); + maxHeight = Math.max(maxHeight, rect.levelCoord + rect.thickness); + } + return [ + visiblePlacements.concat(crudePlacements, hiddenPlacements, moreLinkCrudePlacements), + maxHeight, + ]; + } + + var TimelineLaneBg = /** @class */ (function (_super) { + __extends(TimelineLaneBg, _super); + function TimelineLaneBg() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineLaneBg.prototype.render = function () { + var props = this.props; + var highlightSeg = [].concat(props.eventResizeSegs, props.dateSelectionSegs); + return props.timelineCoords && (createElement("div", { className: "fc-timeline-bg" }, + this.renderSegs(props.businessHourSegs || [], props.timelineCoords, 'non-business'), + this.renderSegs(props.bgEventSegs || [], props.timelineCoords, 'bg-event'), + this.renderSegs(highlightSeg, props.timelineCoords, 'highlight'))); + }; + TimelineLaneBg.prototype.renderSegs = function (segs, timelineCoords, fillType) { + var _a = this.props, todayRange = _a.todayRange, nowDate = _a.nowDate; + var isRtl = this.context.isRtl; + var segHCoords = computeSegHCoords(segs, 0, timelineCoords); + var children = segs.map(function (seg, i) { + var hcoords = segHCoords[i]; + var hStyle = coordsToCss(hcoords, isRtl); + return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timeline-bg-harness", style: hStyle }, fillType === 'bg-event' ? + createElement(BgEvent, __assign({ seg: seg }, getSegMeta(seg, todayRange, nowDate))) : + renderFill(fillType))); + }); + return createElement(Fragment, null, children); + }; + return TimelineLaneBg; + }(BaseComponent)); + + var TimelineLaneSlicer = /** @class */ (function (_super) { + __extends(TimelineLaneSlicer, _super); + function TimelineLaneSlicer() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineLaneSlicer.prototype.sliceRange = function (origRange, dateProfile, dateProfileGenerator, tDateProfile, dateEnv) { + var normalRange = normalizeRange(origRange, tDateProfile, dateEnv); + var segs = []; + // protect against when the span is entirely in an invalid date region + if (computeDateSnapCoverage(normalRange.start, tDateProfile, dateEnv) + < computeDateSnapCoverage(normalRange.end, tDateProfile, dateEnv)) { + // intersect the footprint's range with the grid's range + var slicedRange = intersectRanges(normalRange, tDateProfile.normalizedRange); + if (slicedRange) { + segs.push({ + start: slicedRange.start, + end: slicedRange.end, + isStart: slicedRange.start.valueOf() === normalRange.start.valueOf() + && isValidDate(slicedRange.start, tDateProfile, dateProfile, dateProfileGenerator), + isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf() + && isValidDate(addMs(slicedRange.end, -1), tDateProfile, dateProfile, dateProfileGenerator), + }); + } + } + return segs; + }; + return TimelineLaneSlicer; + }(Slicer)); + + var DEFAULT_TIME_FORMAT = createFormatter({ + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true, + meridiem: 'narrow', + }); + var TimelineEvent = /** @class */ (function (_super) { + __extends(TimelineEvent, _super); + function TimelineEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineEvent.prototype.render = function () { + var props = this.props; + return (createElement(StandardEvent, __assign({}, props, { extraClassNames: ['fc-timeline-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TIME_FORMAT, defaultDisplayEventTime: !props.isTimeScale }))); + }; + return TimelineEvent; + }(BaseComponent)); + + var TimelineLaneMoreLink = /** @class */ (function (_super) { + __extends(TimelineLaneMoreLink, _super); + function TimelineLaneMoreLink() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + return _this; + } + TimelineLaneMoreLink.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var hiddenSegs = props.hiddenSegs, elRef = props.elRef, placement = props.placement, resourceId = props.resourceId; + var top = placement.top, hcoords = placement.hcoords; + var isVisible = hcoords && top !== null; + var hStyle = coordsToCss(hcoords, context.isRtl); + var extraDateSpan = resourceId ? { resourceId: resourceId } : {}; + return (createElement(MoreLinkRoot, { allDayDate: null, moreCnt: hiddenSegs.length, allSegs: hiddenSegs, hiddenSegs: hiddenSegs, alignmentElRef: this.rootElRef, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: extraDateSpan, popoverContent: function () { return (createElement(Fragment, null, hiddenSegs.map(function (seg) { + var instanceId = seg.eventRange.instance.instanceId; + return (createElement("div", { key: instanceId, style: { visibility: props.isForcedInvisible[instanceId] ? 'hidden' : '' } }, + createElement(TimelineEvent, __assign({ isTimeScale: props.isTimeScale, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection }, getSegMeta(seg, props.todayRange, props.nowDate))))); + }))); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return (createElement("a", { ref: function (el) { + setRef(rootElRef, el); // for MoreLinkRoot + setRef(elRef, el); // for props props + setRef(_this.rootElRef, el); // for this component + }, className: ['fc-timeline-more-link'].concat(classNames).join(' '), style: __assign({ visibility: isVisible ? '' : 'hidden', top: top || 0 }, hStyle), onClick: handleClick, title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, + createElement("div", { ref: innerElRef, className: "fc-timeline-more-link-inner fc-sticky" }, innerContent))); })); + }; + return TimelineLaneMoreLink; + }(BaseComponent)); + + var TimelineLane = /** @class */ (function (_super) { + __extends(TimelineLane, _super); + function TimelineLane() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.slicer = new TimelineLaneSlicer(); + _this.sortEventSegs = memoize(sortEventSegs); + _this.harnessElRefs = new RefMap(); + _this.moreElRefs = new RefMap(); + _this.innerElRef = createRef(); + // TODO: memoize event positioning + _this.state = { + eventInstanceHeights: {}, + moreLinkHeights: {}, + }; + return _this; + } + TimelineLane.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var options = context.options; + var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; + var slicedProps = this.slicer.sliceProps(props, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't have to pass in the rest of the args... + dateProfile, context.dateProfileGenerator, tDateProfile, context.dateEnv); + var mirrorSegs = (slicedProps.eventDrag ? slicedProps.eventDrag.segs : null) || + (slicedProps.eventResize ? slicedProps.eventResize.segs : null) || + []; + var fgSegs = this.sortEventSegs(slicedProps.fgEventSegs, options.eventOrder); + var fgSegHCoords = computeSegHCoords(fgSegs, options.eventMinWidth, props.timelineCoords); + var _b = computeFgSegPlacements(fgSegs, fgSegHCoords, state.eventInstanceHeights, state.moreLinkHeights, options.eventOrderStrict, options.eventMaxStack), fgPlacements = _b[0], fgHeight = _b[1]; + var isForcedInvisible = // TODO: more convenient + (slicedProps.eventDrag ? slicedProps.eventDrag.affectedInstances : null) || + (slicedProps.eventResize ? slicedProps.eventResize.affectedInstances : null) || + {}; + return (createElement(Fragment, null, + createElement(TimelineLaneBg, { businessHourSegs: slicedProps.businessHourSegs, bgEventSegs: slicedProps.bgEventSegs, timelineCoords: props.timelineCoords, eventResizeSegs: slicedProps.eventResize ? slicedProps.eventResize.segs : [] /* bad new empty array? */, dateSelectionSegs: slicedProps.dateSelectionSegs, nowDate: props.nowDate, todayRange: props.todayRange }), + createElement("div", { className: "fc-timeline-events fc-scrollgrid-sync-inner", ref: this.innerElRef, style: { height: fgHeight } }, + this.renderFgSegs(fgPlacements, isForcedInvisible, false, false, false), + this.renderFgSegs(buildMirrorPlacements(mirrorSegs, props.timelineCoords, fgPlacements), {}, Boolean(slicedProps.eventDrag), Boolean(slicedProps.eventResize), false)))); + }; + TimelineLane.prototype.componentDidMount = function () { + this.updateSize(); + }; + TimelineLane.prototype.componentDidUpdate = function (prevProps, prevState) { + if (prevProps.eventStore !== this.props.eventStore || // external thing changed? + prevProps.timelineCoords !== this.props.timelineCoords || // external thing changed? + prevState.moreLinkHeights !== this.state.moreLinkHeights // HACK. see addStateEquality + ) { + this.updateSize(); + } + }; + TimelineLane.prototype.updateSize = function () { + var props = this.props; + var timelineCoords = props.timelineCoords; + var innerEl = this.innerElRef.current; + if (props.onHeightChange) { + props.onHeightChange(innerEl, false); + } + if (timelineCoords) { + this.setState({ + eventInstanceHeights: mapHash(this.harnessElRefs.currentMap, function (harnessEl) { return (Math.round(harnessEl.getBoundingClientRect().height)); }), + moreLinkHeights: mapHash(this.moreElRefs.currentMap, function (moreEl) { return (Math.round(moreEl.getBoundingClientRect().height)); }), + }, function () { + if (props.onHeightChange) { + props.onHeightChange(innerEl, true); + } + }); + } + // hack + if (props.syncParentMinHeight) { + innerEl.parentElement.style.minHeight = innerEl.style.height; + } + }; + TimelineLane.prototype.renderFgSegs = function (segPlacements, isForcedInvisible, isDragging, isResizing, isDateSelecting) { + var _a = this, harnessElRefs = _a.harnessElRefs, moreElRefs = _a.moreElRefs, props = _a.props, context = _a.context; + var isMirror = isDragging || isResizing || isDateSelecting; + return (createElement(Fragment, null, segPlacements.map(function (segPlacement) { + var seg = segPlacement.seg, hcoords = segPlacement.hcoords, top = segPlacement.top; + if (Array.isArray(seg)) { // a more-link + var isoStr = buildIsoString(computeEarliestSegStart(seg)); + return (createElement(TimelineLaneMoreLink, { key: 'm:' + isoStr /* "m" for "more" */, elRef: moreElRefs.createRef(isoStr), hiddenSegs: seg, placement: segPlacement, dateProfile: props.dateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isTimeScale: props.tDateProfile.isTimeScale, eventSelection: props.eventSelection, resourceId: props.resourceId, isForcedInvisible: isForcedInvisible })); + } + var instanceId = seg.eventRange.instance.instanceId; + var isVisible = isMirror || Boolean(!isForcedInvisible[instanceId] && hcoords && top !== null); + var hStyle = coordsToCss(hcoords, context.isRtl); + return (createElement("div", { key: 'e:' + instanceId /* "e" for "event" */, ref: isMirror ? null : harnessElRefs.createRef(instanceId), className: "fc-timeline-event-harness", style: __assign({ visibility: isVisible ? '' : 'hidden', top: top || 0 }, hStyle) }, + createElement(TimelineEvent, __assign({ isTimeScale: props.tDateProfile.isTimeScale, seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === props.eventSelection /* TODO: bad for mirror? */ }, getSegMeta(seg, props.todayRange, props.nowDate))))); + }))); + }; + return TimelineLane; + }(BaseComponent)); + TimelineLane.addStateEquality({ + eventInstanceHeights: isPropsEqual, + moreLinkHeights: isPropsEqual, + }); + function buildMirrorPlacements(mirrorSegs, timelineCoords, fgPlacements) { + if (!mirrorSegs.length || !timelineCoords) { + return []; + } + var topsByInstanceId = buildAbsoluteTopHash(fgPlacements); // TODO: cache this at first render? + return mirrorSegs.map(function (seg) { return ({ + seg: seg, + hcoords: timelineCoords.rangeToCoords(seg), + top: topsByInstanceId[seg.eventRange.instance.instanceId], + }); }); + } + function buildAbsoluteTopHash(placements) { + var topsByInstanceId = {}; + for (var _i = 0, placements_1 = placements; _i < placements_1.length; _i++) { + var placement = placements_1[_i]; + var seg = placement.seg; + if (!Array.isArray(seg)) { // doesn't represent a more-link + topsByInstanceId[seg.eventRange.instance.instanceId] = placement.top; + } + } + return topsByInstanceId; + } + + var TimelineGrid = /** @class */ (function (_super) { + __extends(TimelineGrid, _super); + function TimelineGrid() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.slatsRef = createRef(); + _this.state = { + coords: null, + }; + _this.handeEl = function (el) { + if (el) { + _this.context.registerInteractiveComponent(_this, { el: el }); + } + else { + _this.context.unregisterInteractiveComponent(_this); + } + }; + _this.handleCoords = function (coords) { + _this.setState({ coords: coords }); + if (_this.props.onSlatCoords) { + _this.props.onSlatCoords(coords); + } + }; + return _this; + } + TimelineGrid.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var options = context.options; + var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; + var timerUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit; + return (createElement("div", { className: "fc-timeline-body", ref: this.handeEl, style: { + minWidth: props.tableMinWidth, + height: props.clientHeight, + width: props.clientWidth, + } }, + createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement(Fragment, null, + createElement(TimelineSlats, { ref: _this.slatsRef, dateProfile: dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, clientWidth: props.clientWidth, tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, onCoords: _this.handleCoords, onScrollLeftRequest: props.onScrollLeftRequest }), + createElement(TimelineLane, { dateProfile: dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, nextDayThreshold: options.nextDayThreshold, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, timelineCoords: state.coords, syncParentMinHeight: true }), + (options.nowIndicator && state.coords && state.coords.isDateInRange(nowDate)) && (createElement("div", { className: "fc-timeline-now-indicator-container" }, + createElement(NowIndicatorRoot, { isAxis: false, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-line'].concat(classNames).join(' '), style: coordToCss(state.coords.dateToCoord(nowDate), context.isRtl) }, innerContent)); }))))); }))); + }; + // Hit System + // ------------------------------------------------------------------------------------------ + TimelineGrid.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { + var slats = this.slatsRef.current; + var slatHit = slats.positionToHit(positionLeft); + if (slatHit) { + return { + dateProfile: this.props.dateProfile, + dateSpan: slatHit.dateSpan, + rect: { + left: slatHit.left, + right: slatHit.right, + top: 0, + bottom: elHeight, + }, + dayEl: slatHit.dayEl, + layer: 0, + }; + } + return null; + }; + return TimelineGrid; + }(DateComponent)); + + var TimelineView = /** @class */ (function (_super) { + __extends(TimelineView, _super); + function TimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.buildTimelineDateProfile = memoize(buildTimelineDateProfile); + _this.scrollGridRef = createRef(); + _this.state = { + slatCoords: null, + slotCushionMaxWidth: null, + }; + _this.handleSlatCoords = function (slatCoords) { + _this.setState({ slatCoords: slatCoords }); + }; + _this.handleScrollLeftRequest = function (scrollLeft) { + var scrollGrid = _this.scrollGridRef.current; + scrollGrid.forceScrollLeft(0, scrollLeft); + }; + _this.handleMaxCushionWidth = function (slotCushionMaxWidth) { + _this.setState({ + slotCushionMaxWidth: Math.ceil(slotCushionMaxWidth), // for less rerendering TODO: DRY + }); + }; + return _this; + } + TimelineView.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var options = context.options; + var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(options); + var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options); + var tDateProfile = this.buildTimelineDateProfile(props.dateProfile, context.dateEnv, options, context.dateProfileGenerator); + var extraClassNames = [ + 'fc-timeline', + options.eventOverlap === false ? 'fc-timeline-overlap-disabled' : '', + ]; + var slotMinWidth = options.slotMinWidth; + var slatCols = buildSlatCols(tDateProfile, slotMinWidth || this.computeFallbackSlotMinWidth(tDateProfile)); + var sections = [ + { + type: 'header', + key: 'header', + isSticky: stickyHeaderDates, + chunks: [{ + key: 'timeline', + content: function (contentArg) { return (createElement(TimelineHeader, { dateProfile: props.dateProfile, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, tDateProfile: tDateProfile, slatCoords: state.slatCoords, onMaxCushionWidth: slotMinWidth ? null : _this.handleMaxCushionWidth })); }, + }], + }, + { + type: 'body', + key: 'body', + liquid: true, + chunks: [{ + key: 'timeline', + content: function (contentArg) { return (createElement(TimelineGrid, __assign({}, props, { clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, tDateProfile: tDateProfile, onSlatCoords: _this.handleSlatCoords, onScrollLeftRequest: _this.handleScrollLeftRequest }))); }, + }], + }, + ]; + if (stickyFooterScrollbar) { + sections.push({ + type: 'footer', + key: 'footer', + isSticky: true, + chunks: [{ + key: 'timeline', + content: renderScrollShim, + }], + }); + } + return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') }, + createElement(ScrollGrid, { ref: _this.scrollGridRef, liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ + { cols: slatCols }, + ], sections: sections }))); })); + }; + TimelineView.prototype.computeFallbackSlotMinWidth = function (tDateProfile) { + return Math.max(30, ((this.state.slotCushionMaxWidth || 0) / tDateProfile.slotsPerLabel)); + }; + return TimelineView; + }(DateComponent)); + function buildSlatCols(tDateProfile, slotMinWidth) { + return [{ + span: tDateProfile.slotCnt, + minWidth: slotMinWidth || 1, // needs to be a non-zero number to trigger horizontal scrollbars!?????? + }]; + } + + var timelinePlugin = createPlugin({ + deps: [ + premiumCommonPlugin, + ], + initialView: 'timelineDay', + views: { + timeline: { + component: TimelineView, + usesMinMaxTime: true, + eventResizableFromStart: true, // how is this consumed for TimelineView tho? + }, + timelineDay: { + type: 'timeline', + duration: { days: 1 }, + }, + timelineWeek: { + type: 'timeline', + duration: { weeks: 1 }, + }, + timelineMonth: { + type: 'timeline', + duration: { months: 1 }, + }, + timelineYear: { + type: 'timeline', + duration: { years: 1 }, + }, + }, + }); + + function massageEventDragMutation(eventMutation, hit0, hit1) { + var resource0 = hit0.dateSpan.resourceId; + var resource1 = hit1.dateSpan.resourceId; + if (resource0 && resource1 && + resource0 !== resource1) { + eventMutation.resourceMutation = { + matchResourceId: resource0, + setResourceId: resource1, + }; + } + } + /* + TODO: all this would be much easier if we were using a hash! + */ + function applyEventDefMutation(eventDef, mutation, context) { + var resourceMutation = mutation.resourceMutation; + if (resourceMutation && computeResourceEditable(eventDef, context)) { + var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId); + if (index !== -1) { + var resourceIds = eventDef.resourceIds.slice(); // copy + resourceIds.splice(index, 1); // remove + if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there + resourceIds.push(resourceMutation.setResourceId); // add + } + eventDef.resourceIds = resourceIds; + } + } + } + /* + HACK + TODO: use EventUi system instead of this + */ + function computeResourceEditable(eventDef, context) { + var resourceEditable = eventDef.resourceEditable; + if (resourceEditable == null) { + var source = eventDef.sourceId && context.getCurrentData().eventSources[eventDef.sourceId]; + if (source) { + resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack + } + if (resourceEditable == null) { + resourceEditable = context.options.eventResourceEditable; + if (resourceEditable == null) { + resourceEditable = context.options.editable; // TODO: use defaults system instead + } + } + } + return resourceEditable; + } + function transformEventDrop(mutation, context) { + var resourceMutation = mutation.resourceMutation; + if (resourceMutation) { + var calendarApi = context.calendarApi; + return { + oldResource: calendarApi.getResourceById(resourceMutation.matchResourceId), + newResource: calendarApi.getResourceById(resourceMutation.setResourceId), + }; + } + return { + oldResource: null, + newResource: null, + }; + } + + var ResourceDataAdder = /** @class */ (function () { + function ResourceDataAdder() { + this.filterResources = memoize(filterResources); + } + ResourceDataAdder.prototype.transform = function (viewProps, calendarProps) { + if (calendarProps.viewSpec.optionDefaults.needsResourceData) { + return { + resourceStore: this.filterResources(calendarProps.resourceStore, calendarProps.options.filterResourcesWithEvents, calendarProps.eventStore, calendarProps.dateProfile.activeRange), + resourceEntityExpansions: calendarProps.resourceEntityExpansions, + }; + } + return null; + }; + return ResourceDataAdder; + }()); + function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) { + if (doFilterResourcesWithEvents) { + var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange); + var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs); + __assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore)); + return filterHash(resourceStore, function (resource, resourceId) { return hasEvents_1[resourceId]; }); + } + return resourceStore; + } + function filterEventInstancesInRange(eventInstances, activeRange) { + return filterHash(eventInstances, function (eventInstance) { return rangesIntersect(eventInstance.range, activeRange); }); + } + function computeHasEvents(eventInstances, eventDefs) { + var hasEvents = {}; + for (var instanceId in eventInstances) { + var instance = eventInstances[instanceId]; + for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) { + var resourceId = _a[_i]; + hasEvents[resourceId] = true; + } + } + return hasEvents; + } + /* + mark resources as having events if any of their ancestors have them + NOTE: resourceStore might not have all the resources that hasEvents{} has keyed + */ + function computeAncestorHasEvents(hasEvents, resourceStore) { + var res = {}; + for (var resourceId in hasEvents) { + var resource = void 0; + while ((resource = resourceStore[resourceId])) { + resourceId = resource.parentId; // now functioning as the parentId + if (resourceId) { + res[resourceId] = true; + } + else { + break; + } + } + } + return res; + } + /* + for making sure events that have editable resources are always draggable in resource views + */ + function transformIsDraggable(val, eventDef, eventUi, context) { + if (!val) { + var state = context.getCurrentData(); + var viewSpec = state.viewSpecs[state.currentViewType]; + if (viewSpec.optionDefaults.needsResourceData) { + if (computeResourceEditable(eventDef, context)) { + return true; + } + } + } + return val; + } + + // for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data) + var ResourceEventConfigAdder = /** @class */ (function () { + function ResourceEventConfigAdder() { + this.buildResourceEventUis = memoize(buildResourceEventUis, isPropsEqual); + this.injectResourceEventUis = memoize(injectResourceEventUis); + } + ResourceEventConfigAdder.prototype.transform = function (viewProps, calendarProps) { + if (!calendarProps.viewSpec.optionDefaults.needsResourceData) { + return { + eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore)), + }; + } + return null; + }; + return ResourceEventConfigAdder; + }()); + function buildResourceEventUis(resourceStore) { + return mapHash(resourceStore, function (resource) { return resource.ui; }); + } + function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) { + return mapHash(eventUiBases, function (eventUi, defId) { + if (defId) { // not the '' key + return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis); + } + return eventUi; + }); + } + function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) { + var parts = []; + // first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts + for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) { + var resourceId = _a[_i]; + if (resourceEventUis[resourceId]) { + parts.unshift(resourceEventUis[resourceId]); + } + } + parts.unshift(origEventUi); + return combineEventUis(parts); + } + + var defs = []; // TODO: use plugin system + function registerResourceSourceDef(def) { + defs.push(def); + } + function getResourceSourceDef(id) { + return defs[id]; + } + function getResourceSourceDefs() { + return defs; + } + + // TODO: make this a plugin-able parser + // TODO: success/failure + var RESOURCE_SOURCE_REFINERS = { + id: String, + // for array. TODO: move to resource-array + resources: identity, + // for json feed. TODO: move to resource-json-feed + url: String, + method: String, + startParam: String, + endParam: String, + timeZoneParam: String, + extraParams: identity, + }; + function parseResourceSource(input) { + var inputObj; + if (typeof input === 'string') { + inputObj = { url: input }; + } + else if (typeof input === 'function' || Array.isArray(input)) { + inputObj = { resources: input }; + } + else if (typeof input === 'object' && input) { // non-null object + inputObj = input; + } + if (inputObj) { + var _a = refineProps(inputObj, RESOURCE_SOURCE_REFINERS), refined = _a.refined, extra = _a.extra; + warnUnknownProps(extra); + var metaRes = buildResourceSourceMeta(refined); + if (metaRes) { + return { + _raw: input, + sourceId: guid(), + sourceDefId: metaRes.sourceDefId, + meta: metaRes.meta, + publicId: refined.id || '', + isFetching: false, + latestFetchId: '', + fetchRange: null, + }; + } + } + return null; + } + function buildResourceSourceMeta(refined) { + var defs = getResourceSourceDefs(); + for (var i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence + var def = defs[i]; + var meta = def.parseMeta(refined); + if (meta) { + return { meta: meta, sourceDefId: i }; + } + } + return null; + } + function warnUnknownProps(props) { + for (var propName in props) { + console.warn("Unknown resource prop '" + propName + "'"); + } + } + + function reduceResourceSource(source, action, context) { + var options = context.options, dateProfile = context.dateProfile; + if (!source || !action) { + return createSource(options.initialResources || options.resources, dateProfile.activeRange, options.refetchResourcesOnNavigate, context); + } + switch (action.type) { + case 'RESET_RESOURCE_SOURCE': + return createSource(action.resourceSourceInput, dateProfile.activeRange, options.refetchResourcesOnNavigate, context); + case 'PREV': // TODO: how do we track all actions that affect dateProfile :( + case 'NEXT': + case 'CHANGE_DATE': + case 'CHANGE_VIEW_TYPE': + return handleRangeChange(source, dateProfile.activeRange, options.refetchResourcesOnNavigate, context); + case 'RECEIVE_RESOURCES': + case 'RECEIVE_RESOURCE_ERROR': + return receiveResponse(source, action.fetchId, action.fetchRange); + case 'REFETCH_RESOURCES': + return fetchSource(source, dateProfile.activeRange, context); + default: + return source; + } + } + function createSource(input, activeRange, refetchResourcesOnNavigate, context) { + if (input) { + var source = parseResourceSource(input); + source = fetchSource(source, refetchResourcesOnNavigate ? activeRange : null, context); + return source; + } + return null; + } + function handleRangeChange(source, activeRange, refetchResourcesOnNavigate, context) { + if (refetchResourcesOnNavigate && + !doesSourceIgnoreRange(source) && + (!source.fetchRange || !rangesEqual(source.fetchRange, activeRange))) { + return fetchSource(source, activeRange, context); + } + return source; + } + function doesSourceIgnoreRange(source) { + return Boolean(getResourceSourceDef(source.sourceDefId).ignoreRange); + } + function fetchSource(source, fetchRange, context) { + var sourceDef = getResourceSourceDef(source.sourceDefId); + var fetchId = guid(); + sourceDef.fetch({ + resourceSource: source, + range: fetchRange, + context: context, + }, function (res) { + context.dispatch({ + type: 'RECEIVE_RESOURCES', + fetchId: fetchId, + fetchRange: fetchRange, + rawResources: res.rawResources, + }); + }, function (error) { + context.dispatch({ + type: 'RECEIVE_RESOURCE_ERROR', + fetchId: fetchId, + fetchRange: fetchRange, + error: error, + }); + }); + return __assign(__assign({}, source), { isFetching: true, latestFetchId: fetchId }); + } + function receiveResponse(source, fetchId, fetchRange) { + if (fetchId === source.latestFetchId) { + return __assign(__assign({}, source), { isFetching: false, fetchRange: fetchRange }); + } + return source; + } + + var PRIVATE_ID_PREFIX = '_fc:'; + var RESOURCE_REFINERS = { + id: String, + parentId: String, + children: identity, + title: String, + businessHours: identity, + extendedProps: identity, + // event-ui + eventEditable: Boolean, + eventStartEditable: Boolean, + eventDurationEditable: Boolean, + eventConstraint: identity, + eventOverlap: Boolean, + eventAllow: identity, + eventClassNames: parseClassNames, + eventBackgroundColor: String, + eventBorderColor: String, + eventTextColor: String, + eventColor: String, + }; + /* + needs a full store so that it can populate children too + */ + function parseResource(raw, parentId, store, context) { + if (parentId === void 0) { parentId = ''; } + var _a = refineProps(raw, RESOURCE_REFINERS), refined = _a.refined, extra = _a.extra; + var resource = { + id: refined.id || (PRIVATE_ID_PREFIX + guid()), + parentId: refined.parentId || parentId, + title: refined.title || '', + businessHours: refined.businessHours ? parseBusinessHours(refined.businessHours, context) : null, + ui: createEventUi({ + editable: refined.eventEditable, + startEditable: refined.eventStartEditable, + durationEditable: refined.eventDurationEditable, + constraint: refined.eventConstraint, + overlap: refined.eventOverlap, + allow: refined.eventAllow, + classNames: refined.eventClassNames, + backgroundColor: refined.eventBackgroundColor, + borderColor: refined.eventBorderColor, + textColor: refined.eventTextColor, + color: refined.eventColor, + }, context), + extendedProps: __assign(__assign({}, extra), refined.extendedProps), + }; + // help out ResourceApi from having user modify props + Object.freeze(resource.ui.classNames); + Object.freeze(resource.extendedProps); + if (store[resource.id]) ; + else { + store[resource.id] = resource; + if (refined.children) { + for (var _i = 0, _b = refined.children; _i < _b.length; _i++) { + var childInput = _b[_i]; + parseResource(childInput, resource.id, store, context); + } + } + } + return resource; + } + /* + TODO: use this in more places + */ + function getPublicId(id) { + if (id.indexOf(PRIVATE_ID_PREFIX) === 0) { + return ''; + } + return id; + } + + function reduceResourceStore(store, action, source, context) { + if (!store || !action) { + return {}; + } + switch (action.type) { + case 'RECEIVE_RESOURCES': + return receiveRawResources(store, action.rawResources, action.fetchId, source, context); + case 'ADD_RESOURCE': + return addResource(store, action.resourceHash); + case 'REMOVE_RESOURCE': + return removeResource(store, action.resourceId); + case 'SET_RESOURCE_PROP': + return setResourceProp(store, action.resourceId, action.propName, action.propValue); + case 'SET_RESOURCE_EXTENDED_PROP': + return setResourceExtendedProp(store, action.resourceId, action.propName, action.propValue); + default: + return store; + } + } + function receiveRawResources(existingStore, inputs, fetchId, source, context) { + if (source.latestFetchId === fetchId) { + var nextStore = {}; + for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { + var input = inputs_1[_i]; + parseResource(input, '', nextStore, context); + } + return nextStore; + } + return existingStore; + } + function addResource(existingStore, additions) { + // TODO: warn about duplicate IDs + return __assign(__assign({}, existingStore), additions); + } + function removeResource(existingStore, resourceId) { + var newStore = __assign({}, existingStore); + delete newStore[resourceId]; + // promote children + for (var childResourceId in newStore) { // a child, *maybe* but probably not + if (newStore[childResourceId].parentId === resourceId) { + newStore[childResourceId] = __assign(__assign({}, newStore[childResourceId]), { parentId: '' }); + } + } + return newStore; + } + function setResourceProp(existingStore, resourceId, name, value) { + var _a, _b; + var existingResource = existingStore[resourceId]; + // TODO: sanitization + if (existingResource) { + return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), (_b = {}, _b[name] = value, _b)), _a)); + } + return existingStore; + } + function setResourceExtendedProp(existingStore, resourceId, name, value) { + var _a, _b; + var existingResource = existingStore[resourceId]; + if (existingResource) { + return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), { extendedProps: __assign(__assign({}, existingResource.extendedProps), (_b = {}, _b[name] = value, _b)) }), _a)); + } + return existingStore; + } + + function reduceResourceEntityExpansions(expansions, action) { + var _a; + if (!expansions || !action) { + return {}; + } + switch (action.type) { + case 'SET_RESOURCE_ENTITY_EXPANDED': + return __assign(__assign({}, expansions), (_a = {}, _a[action.id] = action.isExpanded, _a)); + default: + return expansions; + } + } + + function reduceResources(state, action, context) { + var resourceSource = reduceResourceSource(state && state.resourceSource, action, context); + var resourceStore = reduceResourceStore(state && state.resourceStore, action, resourceSource, context); + var resourceEntityExpansions = reduceResourceEntityExpansions(state && state.resourceEntityExpansions, action); + return { + resourceSource: resourceSource, + resourceStore: resourceStore, + resourceEntityExpansions: resourceEntityExpansions, + }; + } + + var EVENT_REFINERS = { + resourceId: String, + resourceIds: identity, + resourceEditable: Boolean, + }; + function generateEventDefResourceMembers(refined) { + return { + resourceIds: ensureStringArray(refined.resourceIds) + .concat(refined.resourceId ? [refined.resourceId] : []), + resourceEditable: refined.resourceEditable, + }; + } + function ensureStringArray(items) { + return (items || []).map(function (item) { return String(item); }); + } + + function transformDateSelectionJoin(hit0, hit1) { + var resourceId0 = hit0.dateSpan.resourceId; + var resourceId1 = hit1.dateSpan.resourceId; + if (resourceId0 && resourceId1) { + return { resourceId: resourceId0 }; + } + return null; + } + + var ResourceApi = /** @class */ (function () { + function ResourceApi(_context, _resource) { + this._context = _context; + this._resource = _resource; + } + ResourceApi.prototype.setProp = function (name, value) { + var oldResource = this._resource; + this._context.dispatch({ + type: 'SET_RESOURCE_PROP', + resourceId: oldResource.id, + propName: name, + propValue: value, + }); + this.sync(oldResource); + }; + ResourceApi.prototype.setExtendedProp = function (name, value) { + var oldResource = this._resource; + this._context.dispatch({ + type: 'SET_RESOURCE_EXTENDED_PROP', + resourceId: oldResource.id, + propName: name, + propValue: value, + }); + this.sync(oldResource); + }; + ResourceApi.prototype.sync = function (oldResource) { + var context = this._context; + var resourceId = oldResource.id; + // TODO: what if dispatch didn't complete synchronously? + this._resource = context.getCurrentData().resourceStore[resourceId]; + context.emitter.trigger('resourceChange', { + oldResource: new ResourceApi(context, oldResource), + resource: this, + revert: function () { + var _a; + context.dispatch({ + type: 'ADD_RESOURCE', + resourceHash: (_a = {}, + _a[resourceId] = oldResource, + _a), + }); + }, + }); + }; + ResourceApi.prototype.remove = function () { + var context = this._context; + var internalResource = this._resource; + var resourceId = internalResource.id; + context.dispatch({ + type: 'REMOVE_RESOURCE', + resourceId: resourceId, + }); + context.emitter.trigger('resourceRemove', { + resource: this, + revert: function () { + var _a; + context.dispatch({ + type: 'ADD_RESOURCE', + resourceHash: (_a = {}, + _a[resourceId] = internalResource, + _a), + }); + }, + }); + }; + ResourceApi.prototype.getParent = function () { + var context = this._context; + var parentId = this._resource.parentId; + if (parentId) { + return new ResourceApi(context, context.getCurrentData().resourceSource[parentId]); + } + return null; + }; + ResourceApi.prototype.getChildren = function () { + var thisResourceId = this._resource.id; + var context = this._context; + var resourceStore = context.getCurrentData().resourceStore; + var childApis = []; + for (var resourceId in resourceStore) { + if (resourceStore[resourceId].parentId === thisResourceId) { + childApis.push(new ResourceApi(context, resourceStore[resourceId])); + } + } + return childApis; + }; + /* + this is really inefficient! + TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state + */ + ResourceApi.prototype.getEvents = function () { + var thisResourceId = this._resource.id; + var context = this._context; + var _a = context.getCurrentData().eventStore, defs = _a.defs, instances = _a.instances; + var eventApis = []; + for (var instanceId in instances) { + var instance = instances[instanceId]; + var def = defs[instance.defId]; + if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!! + eventApis.push(new EventApi(context, def, instance)); + } + } + return eventApis; + }; + Object.defineProperty(ResourceApi.prototype, "id", { + get: function () { return getPublicId(this._resource.id); }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "title", { + get: function () { return this._resource.title; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "eventConstraint", { + get: function () { return this._resource.ui.constraints[0] || null; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "eventOverlap", { + get: function () { return this._resource.ui.overlap; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "eventAllow", { + get: function () { return this._resource.ui.allows[0] || null; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", { + get: function () { return this._resource.ui.backgroundColor; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "eventBorderColor", { + get: function () { return this._resource.ui.borderColor; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "eventTextColor", { + get: function () { return this._resource.ui.textColor; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "eventClassNames", { + // NOTE: user can't modify these because Object.freeze was called in event-def parsing + get: function () { return this._resource.ui.classNames; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ResourceApi.prototype, "extendedProps", { + get: function () { return this._resource.extendedProps; }, + enumerable: false, + configurable: true + }); + ResourceApi.prototype.toPlainObject = function (settings) { + if (settings === void 0) { settings = {}; } + var internal = this._resource; + var ui = internal.ui; + var publicId = this.id; + var res = {}; + if (publicId) { + res.id = publicId; + } + if (internal.title) { + res.title = internal.title; + } + if (settings.collapseEventColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) { + res.eventColor = ui.backgroundColor; + } + else { + if (ui.backgroundColor) { + res.eventBackgroundColor = ui.backgroundColor; + } + if (ui.borderColor) { + res.eventBorderColor = ui.borderColor; + } + } + if (ui.textColor) { + res.eventTextColor = ui.textColor; + } + if (ui.classNames.length) { + res.eventClassNames = ui.classNames; + } + if (Object.keys(internal.extendedProps).length) { + if (settings.collapseExtendedProps) { + __assign(res, internal.extendedProps); + } + else { + res.extendedProps = internal.extendedProps; + } + } + return res; + }; + ResourceApi.prototype.toJSON = function () { + return this.toPlainObject(); + }; + return ResourceApi; + }()); + function buildResourceApis(resourceStore, context) { + var resourceApis = []; + for (var resourceId in resourceStore) { + resourceApis.push(new ResourceApi(context, resourceStore[resourceId])); + } + return resourceApis; + } + + CalendarApi.prototype.addResource = function (input, scrollTo) { + var _a; + var _this = this; + if (scrollTo === void 0) { scrollTo = true; } + var currentState = this.getCurrentData(); + var resourceHash; + var resource; + if (input instanceof ResourceApi) { + resource = input._resource; + resourceHash = (_a = {}, _a[resource.id] = resource, _a); + } + else { + resourceHash = {}; + resource = parseResource(input, '', resourceHash, currentState); + } + this.dispatch({ + type: 'ADD_RESOURCE', + resourceHash: resourceHash, + }); + if (scrollTo) { + // TODO: wait til dispatch completes somehow + this.trigger('_scrollRequest', { resourceId: resource.id }); + } + var resourceApi = new ResourceApi(currentState, resource); + currentState.emitter.trigger('resourceAdd', { + resource: resourceApi, + revert: function () { + _this.dispatch({ + type: 'REMOVE_RESOURCE', + resourceId: resource.id, + }); + }, + }); + return resourceApi; + }; + CalendarApi.prototype.getResourceById = function (id) { + id = String(id); + var currentState = this.getCurrentData(); // eslint-disable-line react/no-this-in-sfc + if (currentState.resourceStore) { // guard against calendar with no resource functionality + var rawResource = currentState.resourceStore[id]; + if (rawResource) { + return new ResourceApi(currentState, rawResource); + } + } + return null; + }; + CalendarApi.prototype.getResources = function () { + var currentState = this.getCurrentData(); + var resourceStore = currentState.resourceStore; + var resourceApis = []; + if (resourceStore) { // guard against calendar with no resource functionality + for (var resourceId in resourceStore) { + resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId])); + } + } + return resourceApis; + }; + CalendarApi.prototype.getTopLevelResources = function () { + var currentState = this.getCurrentData(); + var resourceStore = currentState.resourceStore; + var resourceApis = []; + if (resourceStore) { // guard against calendar with no resource functionality + for (var resourceId in resourceStore) { + if (!resourceStore[resourceId].parentId) { + resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId])); + } + } + } + return resourceApis; + }; + CalendarApi.prototype.refetchResources = function () { + this.dispatch({ + type: 'REFETCH_RESOURCES', + }); + }; + function transformDatePoint(dateSpan, context) { + return dateSpan.resourceId ? + { resource: context.calendarApi.getResourceById(dateSpan.resourceId) } : + {}; + } + function transformDateSpan(dateSpan, context) { + return dateSpan.resourceId ? + { resource: context.calendarApi.getResourceById(dateSpan.resourceId) } : + {}; + } + + /* + splits things BASED OFF OF which resources they are associated with. + creates a '' entry which is when something has NO resource. + */ + var ResourceSplitter = /** @class */ (function (_super) { + __extends(ResourceSplitter, _super); + function ResourceSplitter() { + return _super !== null && _super.apply(this, arguments) || this; + } + ResourceSplitter.prototype.getKeyInfo = function (props) { + return __assign({ '': {} }, props.resourceStore); + }; + ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) { + return [dateSpan.resourceId || '']; + }; + ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) { + var resourceIds = eventDef.resourceIds; + if (!resourceIds.length) { + return ['']; + } + return resourceIds; + }; + return ResourceSplitter; + }(Splitter)); + + function isPropsValidWithResources(combinedProps, context) { + var splitter = new ResourceSplitter(); + var sets = splitter.splitProps(__assign(__assign({}, combinedProps), { resourceStore: context.getCurrentData().resourceStore })); + for (var resourceId in sets) { + var props = sets[resourceId]; + // merge in event data from the non-resource segment + if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one + props = __assign(__assign({}, props), { eventStore: mergeEventStores(sets[''].eventStore, props.eventStore), eventUiBases: __assign(__assign({}, sets[''].eventUiBases), props.eventUiBases) }); + } + if (!isPropsValid(props, context, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) { + return false; + } + } + return true; + } + function filterConfig(resourceId, config) { + return __assign(__assign({}, config), { constraints: filterConstraints(resourceId, config.constraints) }); + } + function filterConstraints(resourceId, constraints) { + return constraints.map(function (constraint) { + var defs = constraint.defs; + if (defs) { // we are dealing with an EventStore + // if any of the events define constraints to resources that are NOT this resource, + // then this resource is unconditionally prohibited, which is what a `false` value does. + for (var defId in defs) { + var resourceIds = defs[defId].resourceIds; + if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too) + return false; + } + } + } + return constraint; + }); + } + + function transformExternalDef(dateSpan) { + return dateSpan.resourceId ? + { resourceId: dateSpan.resourceId } : + {}; + } + + EventApi.prototype.getResources = function () { + var calendarApi = this._context.calendarApi; + return this._def.resourceIds.map(function (resourceId) { return calendarApi.getResourceById(resourceId); }); + }; + EventApi.prototype.setResources = function (resources) { + var resourceIds = []; + // massage resources -> resourceIds + for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) { + var resource = resources_1[_i]; + var resourceId = null; + if (typeof resource === 'string') { + resourceId = resource; + } + else if (typeof resource === 'number') { + resourceId = String(resource); + } + else if (resource instanceof ResourceApi) { + resourceId = resource.id; // guaranteed to always have an ID. hmmm + } + else { + console.warn('unknown resource type: ' + resource); + } + if (resourceId) { + resourceIds.push(resourceId); + } + } + this.mutate({ + standardProps: { + resourceIds: resourceIds, + }, + }); + }; + + var optionChangeHandlers = { + resources: handleResources, + }; + function handleResources(newSourceInput, context) { + var oldSourceInput = context.getCurrentData().resourceSource._raw; + if (oldSourceInput !== newSourceInput) { + context.dispatch({ + type: 'RESET_RESOURCE_SOURCE', + resourceSourceInput: newSourceInput, + }); + } + } + + var DEFAULT_RESOURCE_ORDER = parseFieldSpecs('id,title'); + function handleResourceStore(resourceStore, calendarData) { + var emitter = calendarData.emitter; + if (emitter.hasHandlers('resourcesSet')) { + emitter.trigger('resourcesSet', buildResourceApis(resourceStore, calendarData)); + } + } + + var OPTION_REFINERS = { + initialResources: identity, + resources: identity, + eventResourceEditable: Boolean, + refetchResourcesOnNavigate: Boolean, + resourceOrder: parseFieldSpecs, + filterResourcesWithEvents: Boolean, + resourceGroupField: String, + resourceAreaWidth: identity, + resourceAreaColumns: identity, + resourcesInitiallyExpanded: Boolean, + datesAboveResources: Boolean, + needsResourceData: Boolean, + resourceAreaHeaderClassNames: identity, + resourceAreaHeaderContent: identity, + resourceAreaHeaderDidMount: identity, + resourceAreaHeaderWillUnmount: identity, + resourceGroupLabelClassNames: identity, + resourceGroupLabelContent: identity, + resourceGroupLabelDidMount: identity, + resourceGroupLabelWillUnmount: identity, + resourceLabelClassNames: identity, + resourceLabelContent: identity, + resourceLabelDidMount: identity, + resourceLabelWillUnmount: identity, + resourceLaneClassNames: identity, + resourceLaneContent: identity, + resourceLaneDidMount: identity, + resourceLaneWillUnmount: identity, + resourceGroupLaneClassNames: identity, + resourceGroupLaneContent: identity, + resourceGroupLaneDidMount: identity, + resourceGroupLaneWillUnmount: identity, + }; + var LISTENER_REFINERS = { + resourcesSet: identity, + resourceAdd: identity, + resourceChange: identity, + resourceRemove: identity, + }; + + registerResourceSourceDef({ + ignoreRange: true, + parseMeta: function (refined) { + if (Array.isArray(refined.resources)) { + return refined.resources; + } + return null; + }, + fetch: function (arg, successCallback) { + successCallback({ + rawResources: arg.resourceSource.meta, + }); + }, + }); + + registerResourceSourceDef({ + parseMeta: function (refined) { + if (typeof refined.resources === 'function') { + return refined.resources; + } + return null; + }, + fetch: function (arg, success, failure) { + var dateEnv = arg.context.dateEnv; + var func = arg.resourceSource.meta; + var publicArg = arg.range ? { + start: dateEnv.toDate(arg.range.start), + end: dateEnv.toDate(arg.range.end), + startStr: dateEnv.formatIso(arg.range.start), + endStr: dateEnv.formatIso(arg.range.end), + timeZone: dateEnv.timeZone, + } : {}; + // TODO: make more dry with EventSourceFunc + // TODO: accept a response? + unpromisify(func.bind(null, publicArg), function (rawResources) { + success({ rawResources: rawResources }); // needs an object response + }, failure); + }, + }); + + registerResourceSourceDef({ + parseMeta: function (refined) { + if (refined.url) { + return { + url: refined.url, + method: (refined.method || 'GET').toUpperCase(), + extraParams: refined.extraParams, + }; + } + return null; + }, + fetch: function (arg, successCallback, failureCallback) { + var meta = arg.resourceSource.meta; + var requestParams = buildRequestParams(meta, arg.range, arg.context); + requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) { + successCallback({ rawResources: rawResources, xhr: xhr }); + }, function (message, xhr) { + failureCallback({ message: message, xhr: xhr }); + }); + }, + }); + // TODO: somehow consolidate with event json feed + function buildRequestParams(meta, range, context) { + var dateEnv = context.dateEnv, options = context.options; + var startParam; + var endParam; + var timeZoneParam; + var customRequestParams; + var params = {}; + if (range) { + startParam = meta.startParam; + if (startParam == null) { + startParam = options.startParam; + } + endParam = meta.endParam; + if (endParam == null) { + endParam = options.endParam; + } + timeZoneParam = meta.timeZoneParam; + if (timeZoneParam == null) { + timeZoneParam = options.timeZoneParam; + } + params[startParam] = dateEnv.formatIso(range.start); + params[endParam] = dateEnv.formatIso(range.end); + if (dateEnv.timeZone !== 'local') { + params[timeZoneParam] = dateEnv.timeZone; + } + } + // retrieve any outbound GET/POST data from the options + if (typeof meta.extraParams === 'function') { + // supplied as a function that returns a key/value object + customRequestParams = meta.extraParams(); + } + else { + // probably supplied as a straight key/value object + customRequestParams = meta.extraParams || {}; + } + __assign(params, customRequestParams); + return params; + } + + // TODO: not used for Spreadsheet. START USING. difficult because of col-specific rendering props + function ResourceLabelRoot(props) { + return (createElement(ViewContextType.Consumer, null, function (context) { + var options = context.options; + var hookProps = { + resource: new ResourceApi(context, props.resource), + date: props.date ? context.dateEnv.toDate(props.date) : null, + view: context.viewApi, + }; + var dataAttrs = { + 'data-resource-id': props.resource.id, + 'data-date': props.date ? formatDayString(props.date) : undefined, + }; + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.resourceLabelClassNames, content: options.resourceLabelContent, defaultContent: renderInnerContent, didMount: options.resourceLabelDidMount, willUnmount: options.resourceLabelWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return props.children(rootElRef, classNames, // TODO: pass in 'fc-resource' ? + dataAttrs, innerElRef, innerContent); })); + })); + } + function renderInnerContent(props) { + return props.resource.title || props.resource.id; + } + + var ResourceCell = /** @class */ (function (_super) { + __extends(ResourceCell, _super); + function ResourceCell() { + return _super !== null && _super.apply(this, arguments) || this; + } + ResourceCell.prototype.render = function () { + var props = this.props; + return (createElement(ResourceLabelRoot, { resource: props.resource, date: props.date }, function (elRef, customClassNames, dataAttrs, innerElRef, innerContent) { return (createElement("th", __assign({ ref: elRef, role: "columnheader", className: ['fc-col-header-cell', 'fc-resource'].concat(customClassNames).join(' '), colSpan: props.colSpan }, dataAttrs), + createElement("div", { className: "fc-scrollgrid-sync-inner" }, + createElement("span", { className: [ + 'fc-col-header-cell-cushion', + props.isSticky ? 'fc-sticky' : '', + ].join(' '), ref: innerElRef }, innerContent)))); })); + }; + return ResourceCell; + }(BaseComponent)); + + var ResourceDayHeader = /** @class */ (function (_super) { + __extends(ResourceDayHeader, _super); + function ResourceDayHeader() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.buildDateFormat = memoize(buildDateFormat); + return _this; + } + ResourceDayHeader.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var dateFormat = this.buildDateFormat(context.options.dayHeaderFormat, props.datesRepDistinctDays, props.dates.length); + return (createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { + if (props.dates.length === 1) { + return _this.renderResourceRow(props.resources, props.dates[0]); + } + if (context.options.datesAboveResources) { + return _this.renderDayAndResourceRows(props.dates, dateFormat, todayRange, props.resources); + } + return _this.renderResourceAndDayRows(props.resources, props.dates, dateFormat, todayRange); + })); + }; + ResourceDayHeader.prototype.renderResourceRow = function (resources, date) { + var resourceCells = resources.map(function (resource) { return (createElement(ResourceCell, { key: resource.id, resource: resource, colSpan: 1, date: date })); }); + return this.buildTr(resourceCells, 'resources'); + }; + ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, dateFormat, todayRange, resources) { + var dateCells = []; + var resourceCells = []; + for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) { + var date = dates_1[_i]; + dateCells.push(this.renderDateCell(date, dateFormat, todayRange, resources.length, null, true)); + for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) { + var resource = resources_1[_a]; + resourceCells.push(createElement(ResourceCell, { key: resource.id + ':' + date.toISOString(), resource: resource, colSpan: 1, date: date })); + } + } + return (createElement(Fragment, null, + this.buildTr(dateCells, 'day'), + this.buildTr(resourceCells, 'resources'))); + }; + ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates, dateFormat, todayRange) { + var resourceCells = []; + var dateCells = []; + for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) { + var resource = resources_2[_i]; + resourceCells.push(createElement(ResourceCell, { key: resource.id, resource: resource, colSpan: dates.length, isSticky: true })); + for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) { + var date = dates_2[_a]; + dateCells.push(this.renderDateCell(date, dateFormat, todayRange, 1, resource)); + } + } + return (createElement(Fragment, null, + this.buildTr(resourceCells, 'resources'), + this.buildTr(dateCells, 'day'))); + }; + // a cell with date text. might have a resource associated with it + ResourceDayHeader.prototype.renderDateCell = function (date, dateFormat, todayRange, colSpan, resource, isSticky) { + var props = this.props; + var keyPostfix = resource ? ":" + resource.id : ''; + var extraHookProps = resource ? { resource: new ResourceApi(this.context, resource) } : {}; + var extraDataAttrs = resource ? { 'data-resource-id': resource.id } : {}; + return props.datesRepDistinctDays ? (createElement(TableDateCell, { key: date.toISOString() + keyPostfix, date: date, dateProfile: props.dateProfile, todayRange: todayRange, colCnt: props.dates.length * props.resources.length, dayHeaderFormat: dateFormat, colSpan: colSpan, isSticky: isSticky, extraHookProps: extraHookProps, extraDataAttrs: extraDataAttrs })) : (createElement(TableDowCell // we can't leverage the pure-componentness becausae the extra* props are new every time :( + , { key: date.getUTCDay() + keyPostfix, dow: date.getUTCDay(), dayHeaderFormat: dateFormat, colSpan: colSpan, isSticky: isSticky, extraHookProps: extraHookProps, extraDataAttrs: extraDataAttrs })); + }; + ResourceDayHeader.prototype.buildTr = function (cells, key) { + var renderIntro = this.props.renderIntro; + if (!cells.length) { + cells = [createElement("td", { key: 0 }, "\u00A0")]; + } + return (createElement("tr", { key: key, role: "row" }, + renderIntro && renderIntro(key), + cells)); + }; + return ResourceDayHeader; + }(BaseComponent)); + function buildDateFormat(dayHeaderFormat, datesRepDistinctDays, dayCnt) { + return dayHeaderFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt); + } + + var ResourceIndex = /** @class */ (function () { + function ResourceIndex(resources) { + var indicesById = {}; + var ids = []; + for (var i = 0; i < resources.length; i += 1) { + var id = resources[i].id; + ids.push(id); + indicesById[id] = i; + } + this.ids = ids; + this.indicesById = indicesById; + this.length = resources.length; + } + return ResourceIndex; + }()); + + var AbstractResourceDayTableModel = /** @class */ (function () { + function AbstractResourceDayTableModel(dayTableModel, resources, context) { + this.dayTableModel = dayTableModel; + this.resources = resources; + this.context = context; + this.resourceIndex = new ResourceIndex(resources); + this.rowCnt = dayTableModel.rowCnt; + this.colCnt = dayTableModel.colCnt * resources.length; + this.cells = this.buildCells(); + } + AbstractResourceDayTableModel.prototype.buildCells = function () { + var _a = this, rowCnt = _a.rowCnt, dayTableModel = _a.dayTableModel, resources = _a.resources; + var rows = []; + for (var row = 0; row < rowCnt; row += 1) { + var rowCells = []; + for (var dateCol = 0; dateCol < dayTableModel.colCnt; dateCol += 1) { + for (var resourceCol = 0; resourceCol < resources.length; resourceCol += 1) { + var resource = resources[resourceCol]; + var extraHookProps = { resource: new ResourceApi(this.context, resource) }; + var extraDataAttrs = { 'data-resource-id': resource.id }; + var extraClassNames = ['fc-resource']; + var extraDateSpan = { resourceId: resource.id }; + var date = dayTableModel.cells[row][dateCol].date; + rowCells[this.computeCol(dateCol, resourceCol)] = { + key: resource.id + ':' + date.toISOString(), + date: date, + extraHookProps: extraHookProps, + extraDataAttrs: extraDataAttrs, + extraClassNames: extraClassNames, + extraDateSpan: extraDateSpan, + }; + } + } + rows.push(rowCells); + } + return rows; + }; + return AbstractResourceDayTableModel; + }()); + + /* + resources over dates + */ + var ResourceDayTableModel = /** @class */ (function (_super) { + __extends(ResourceDayTableModel, _super); + function ResourceDayTableModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + ResourceDayTableModel.prototype.computeCol = function (dateI, resourceI) { + return resourceI * this.dayTableModel.colCnt + dateI; + }; + /* + all date ranges are intact + */ + ResourceDayTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) { + return [ + { + firstCol: this.computeCol(dateStartI, resourceI), + lastCol: this.computeCol(dateEndI, resourceI), + isStart: true, + isEnd: true, + }, + ]; + }; + return ResourceDayTableModel; + }(AbstractResourceDayTableModel)); + + /* + dates over resources + */ + var DayResourceTableModel = /** @class */ (function (_super) { + __extends(DayResourceTableModel, _super); + function DayResourceTableModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + DayResourceTableModel.prototype.computeCol = function (dateI, resourceI) { + return dateI * this.resources.length + resourceI; + }; + /* + every single day is broken up + */ + DayResourceTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) { + var segs = []; + for (var i = dateStartI; i <= dateEndI; i += 1) { + var col = this.computeCol(i, resourceI); + segs.push({ + firstCol: col, + lastCol: col, + isStart: i === dateStartI, + isEnd: i === dateEndI, + }); + } + return segs; + }; + return DayResourceTableModel; + }(AbstractResourceDayTableModel)); + + var NO_SEGS = []; // for memoizing + var VResourceJoiner = /** @class */ (function () { + function VResourceJoiner() { + this.joinDateSelection = memoize(this.joinSegs); + this.joinBusinessHours = memoize(this.joinSegs); + this.joinFgEvents = memoize(this.joinSegs); + this.joinBgEvents = memoize(this.joinSegs); + this.joinEventDrags = memoize(this.joinInteractions); + this.joinEventResizes = memoize(this.joinInteractions); + } + /* + propSets also has a '' key for things with no resource + */ + VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) { + var dateSelectionSets = []; + var businessHoursSets = []; + var fgEventSets = []; + var bgEventSets = []; + var eventDrags = []; + var eventResizes = []; + var eventSelection = ''; + var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + var props = propSets[key]; + dateSelectionSets.push(props.dateSelectionSegs); + businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours + fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs + bgEventSets.push(props.bgEventSegs); + eventDrags.push(props.eventDrag); + eventResizes.push(props.eventResize); + eventSelection = eventSelection || props.eventSelection; + } + return { + dateSelectionSegs: this.joinDateSelection.apply(this, __spreadArray([resourceDayTable], dateSelectionSets)), + businessHourSegs: this.joinBusinessHours.apply(this, __spreadArray([resourceDayTable], businessHoursSets)), + fgEventSegs: this.joinFgEvents.apply(this, __spreadArray([resourceDayTable], fgEventSets)), + bgEventSegs: this.joinBgEvents.apply(this, __spreadArray([resourceDayTable], bgEventSets)), + eventDrag: this.joinEventDrags.apply(this, __spreadArray([resourceDayTable], eventDrags)), + eventResize: this.joinEventResizes.apply(this, __spreadArray([resourceDayTable], eventResizes)), + eventSelection: eventSelection, + }; + }; + VResourceJoiner.prototype.joinSegs = function (resourceDayTable) { + var segGroups = []; + for (var _i = 1; _i < arguments.length; _i++) { + segGroups[_i - 1] = arguments[_i]; + } + var resourceCnt = resourceDayTable.resources.length; + var transformedSegs = []; + for (var i = 0; i < resourceCnt; i += 1) { + for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) { + var seg = _b[_a]; + transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); + } + for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource + var seg = _d[_c]; + transformedSegs.push.apply(// one beyond. the all-resource + transformedSegs, this.transformSeg(seg, resourceDayTable, i)); + } + } + return transformedSegs; + }; + /* + for expanding non-resource segs to all resources. + only for public use. + no memoizing. + */ + VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) { + var resourceCnt = resourceDayTable.resources.length; + var transformedSegs = []; + for (var i = 0; i < resourceCnt; i += 1) { + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); + } + } + return transformedSegs; + }; + VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) { + var interactions = []; + for (var _i = 1; _i < arguments.length; _i++) { + interactions[_i - 1] = arguments[_i]; + } + var resourceCnt = resourceDayTable.resources.length; + var affectedInstances = {}; + var transformedSegs = []; + var anyInteractions = false; + var isEvent = false; + for (var i = 0; i < resourceCnt; i += 1) { + var interaction = interactions[i]; + if (interaction) { + anyInteractions = true; + for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) { + var seg = _b[_a]; + transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); + } + __assign(affectedInstances, interaction.affectedInstances); + isEvent = isEvent || interaction.isEvent; + } + if (interactions[resourceCnt]) { // one beyond. the all-resource + for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) { + var seg = _d[_c]; + transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); + } + } + } + if (anyInteractions) { + return { + affectedInstances: affectedInstances, + segs: transformedSegs, + isEvent: isEvent, + }; + } + return null; + }; + return VResourceJoiner; + }()); + + /* + TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter + */ + var VResourceSplitter = /** @class */ (function (_super) { + __extends(VResourceSplitter, _super); + function VResourceSplitter() { + return _super !== null && _super.apply(this, arguments) || this; + } + VResourceSplitter.prototype.getKeyInfo = function (props) { + var resourceDayTableModel = props.resourceDayTableModel; + var hash = mapHash(resourceDayTableModel.resourceIndex.indicesById, function (i) { return resourceDayTableModel.resources[i]; }); // :( + hash[''] = {}; + return hash; + }; + VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) { + return [dateSpan.resourceId || '']; + }; + VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) { + var resourceIds = eventDef.resourceIds; + if (!resourceIds.length) { + return ['']; + } + return resourceIds; + }; + return VResourceSplitter; + }(Splitter)); + + /* + doesn't accept grouping + */ + function flattenResources(resourceStore, orderSpecs) { + return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true) + .map(function (node) { return node.resource; }); + } + function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) { + var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs); + var flatNodes = []; + flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault); + return flatNodes; + } + function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) { + for (var i = 0; i < complexNodes.length; i += 1) { + var complexNode = complexNodes[i]; + var group = complexNode.group; + if (group) { + if (isVGrouping) { + var firstRowIndex = res.length; + var rowSpanIndex = rowSpans.length; + flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault); + if (firstRowIndex < res.length) { + var firstRow = res[firstRowIndex]; + var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice(); + firstRowSpans[rowSpanIndex] = res.length - firstRowIndex; + } + } + else { + var id = group.spec.field + ':' + group.value; + var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault; + res.push({ id: id, group: group, isExpanded: isExpanded }); + if (isExpanded) { + flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault); + } + } + } + else if (complexNode.resource) { + var id = complexNode.resource.id; + var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault; + res.push({ + id: id, + rowSpans: rowSpans, + depth: depth, + isExpanded: isExpanded, + hasChildren: Boolean(complexNode.children.length), + resource: complexNode.resource, + resourceFields: complexNode.resourceFields, + }); + if (isExpanded) { + flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault); + } + } + } + } + function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) { + var resourceNodes = buildResourceNodes(resourceStore, orderSpecs); + var builtNodes = []; + for (var resourceId in resourceNodes) { + var resourceNode = resourceNodes[resourceId]; + if (!resourceNode.resource.parentId) { + insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs); + } + } + return builtNodes; + } + function buildResourceNodes(resourceStore, orderSpecs) { + var nodeHash = {}; + for (var resourceId in resourceStore) { + var resource = resourceStore[resourceId]; + nodeHash[resourceId] = { + resource: resource, + resourceFields: buildResourceFields(resource), + children: [], + }; + } + for (var resourceId in resourceStore) { + var resource = resourceStore[resourceId]; + if (resource.parentId) { + var parentNode = nodeHash[resource.parentId]; + if (parentNode) { + insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs); + } + } + } + return nodeHash; + } + function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) { + if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) { + var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]); + insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs); + } + else { + insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs); + } + } + function ensureGroupNodes(resourceNode, nodes, groupSpec) { + var groupValue = resourceNode.resourceFields[groupSpec.field]; + var groupNode; + var newGroupIndex; + // find an existing group that matches, or determine the position for a new group + if (groupSpec.order) { + for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex += 1) { + var node = nodes[newGroupIndex]; + if (node.group) { + var cmp = flexibleCompare(groupValue, node.group.value) * groupSpec.order; + if (cmp === 0) { + groupNode = node; + break; + } + else if (cmp < 0) { + break; + } + } + } + } + else { // the groups are unordered + for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex += 1) { + var node = nodes[newGroupIndex]; + if (node.group && groupValue === node.group.value) { + groupNode = node; + break; + } + } + } + if (!groupNode) { + groupNode = { + group: { + value: groupValue, + spec: groupSpec, + }, + children: [], + }; + nodes.splice(newGroupIndex, 0, groupNode); + } + return groupNode; + } + function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) { + var i; + for (i = 0; i < siblings.length; i += 1) { + var cmp = compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs); // TODO: pass in ResourceApi? + if (cmp > 0) { // went 1 past. insert at i + break; + } + } + siblings.splice(i, 0, resourceNode); + } + function buildResourceFields(resource) { + var obj = __assign(__assign(__assign({}, resource.extendedProps), resource.ui), resource); + delete obj.ui; + delete obj.extendedProps; + return obj; + } + function isGroupsEqual(group0, group1) { + return group0.spec === group1.spec && group0.value === group1.value; + } + + var resourceCommonPlugin = createPlugin({ + deps: [ + premiumCommonPlugin, + ], + reducers: [ + reduceResources, + ], + isLoadingFuncs: [ + function (state) { return state.resourceSource && state.resourceSource.isFetching; }, + ], + eventRefiners: EVENT_REFINERS, + eventDefMemberAdders: [generateEventDefResourceMembers], + isDraggableTransformers: [transformIsDraggable], + eventDragMutationMassagers: [massageEventDragMutation], + eventDefMutationAppliers: [applyEventDefMutation], + dateSelectionTransformers: [transformDateSelectionJoin], + datePointTransforms: [transformDatePoint], + dateSpanTransforms: [transformDateSpan], + viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder], + isPropsValid: isPropsValidWithResources, + externalDefTransforms: [transformExternalDef], + eventDropTransformers: [transformEventDrop], + optionChangeHandlers: optionChangeHandlers, + optionRefiners: OPTION_REFINERS, + listenerRefiners: LISTENER_REFINERS, + propSetHandlers: { resourceStore: handleResourceStore }, + }); + + var ResourceDayTableJoiner = /** @class */ (function (_super) { + __extends(ResourceDayTableJoiner, _super); + function ResourceDayTableJoiner() { + return _super !== null && _super.apply(this, arguments) || this; + } + ResourceDayTableJoiner.prototype.transformSeg = function (seg, resourceDayTableModel, resourceI) { + var colRanges = resourceDayTableModel.computeColRanges(seg.firstCol, seg.lastCol, resourceI); + return colRanges.map(function (colRange) { return (__assign(__assign(__assign({}, seg), colRange), { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd })); }); + }; + return ResourceDayTableJoiner; + }(VResourceJoiner)); + + var ResourceDayTable = /** @class */ (function (_super) { + __extends(ResourceDayTable, _super); + function ResourceDayTable() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.splitter = new VResourceSplitter(); + _this.slicers = {}; + _this.joiner = new ResourceDayTableJoiner(); + _this.tableRef = createRef(); + _this.isHitComboAllowed = function (hit0, hit1) { + var allowAcrossResources = _this.props.resourceDayTableModel.dayTableModel.colCnt === 1; + return allowAcrossResources || hit0.dateSpan.resourceId === hit1.dateSpan.resourceId; + }; + return _this; + } + ResourceDayTable.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var resourceDayTableModel = props.resourceDayTableModel, nextDayThreshold = props.nextDayThreshold, dateProfile = props.dateProfile; + var splitProps = this.splitter.splitProps(props); + this.slicers = mapHash(splitProps, function (split, resourceId) { return _this.slicers[resourceId] || new DayTableSlicer(); }); + var slicedProps = mapHash(this.slicers, function (slicer, resourceId) { return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, context, resourceDayTableModel.dayTableModel); }); + return (createElement(Table, __assign({ forPrint: props.forPrint, ref: this.tableRef }, this.joiner.joinProps(slicedProps, resourceDayTableModel), { cells: resourceDayTableModel.cells, dateProfile: dateProfile, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, isHitComboAllowed: this.isHitComboAllowed }))); + }; + return ResourceDayTable; + }(DateComponent)); + + var ResourceDayTableView = /** @class */ (function (_super) { + __extends(ResourceDayTableView, _super); + function ResourceDayTableView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.flattenResources = memoize(flattenResources); + _this.buildResourceDayTableModel = memoize(buildResourceDayTableModel); + _this.headerRef = createRef(); + _this.tableRef = createRef(); + return _this; + } + ResourceDayTableView.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var options = context.options; + var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER; + var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs); + var resourceDayTableModel = this.buildResourceDayTableModel(props.dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context); + var headerContent = options.dayHeaders && (createElement(ResourceDayHeader, { ref: this.headerRef, resources: resources, dateProfile: props.dateProfile, dates: resourceDayTableModel.dayTableModel.headerDates, datesRepDistinctDays: true })); + var bodyContent = function (contentArg) { return (createElement(ResourceDayTable, { ref: _this.tableRef, dateProfile: props.dateProfile, resourceDayTableModel: resourceDayTableModel, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint })); }; + return options.dayMinWidth + ? this.renderHScrollLayout(headerContent, bodyContent, resourceDayTableModel.colCnt, options.dayMinWidth) + : this.renderSimpleLayout(headerContent, bodyContent); + }; + return ResourceDayTableView; + }(TableView)); + function buildResourceDayTableModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) { + var dayTable = buildDayTableModel(dateProfile, dateProfileGenerator); + return datesAboveResources ? + new DayResourceTableModel(dayTable, resources, context) : + new ResourceDayTableModel(dayTable, resources, context); + } + + var resourceDayGridPlugin = createPlugin({ + deps: [ + premiumCommonPlugin, + resourceCommonPlugin, + dayGridPlugin, + ], + initialView: 'resourceDayGridDay', + views: { + resourceDayGrid: { + type: 'dayGrid', + component: ResourceDayTableView, + needsResourceData: true, + }, + resourceDayGridDay: { + type: 'resourceDayGrid', + duration: { days: 1 }, + }, + resourceDayGridWeek: { + type: 'resourceDayGrid', + duration: { weeks: 1 }, + }, + resourceDayGridMonth: { + type: 'resourceDayGrid', + duration: { months: 1 }, + // TODO: wish we didn't have to C&P from dayGrid's file + monthMode: true, + fixedWeekCount: true, + }, + }, + }); + + var ResourceDayTimeColsJoiner = /** @class */ (function (_super) { + __extends(ResourceDayTimeColsJoiner, _super); + function ResourceDayTimeColsJoiner() { + return _super !== null && _super.apply(this, arguments) || this; + } + ResourceDayTimeColsJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) { + return [ + __assign(__assign({}, seg), { col: resourceDayTable.computeCol(seg.col, resourceI) }), + ]; + }; + return ResourceDayTimeColsJoiner; + }(VResourceJoiner)); + + var ResourceDayTimeCols = /** @class */ (function (_super) { + __extends(ResourceDayTimeCols, _super); + function ResourceDayTimeCols() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.buildDayRanges = memoize(buildDayRanges); + _this.splitter = new VResourceSplitter(); + _this.slicers = {}; + _this.joiner = new ResourceDayTimeColsJoiner(); + _this.timeColsRef = createRef(); + _this.isHitComboAllowed = function (hit0, hit1) { + var allowAcrossResources = _this.dayRanges.length === 1; + return allowAcrossResources || hit0.dateSpan.resourceId === hit1.dateSpan.resourceId; + }; + return _this; + } + ResourceDayTimeCols.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var dateEnv = context.dateEnv, options = context.options; + var dateProfile = props.dateProfile, resourceDayTableModel = props.resourceDayTableModel; + var dayRanges = this.dayRanges = this.buildDayRanges(resourceDayTableModel.dayTableModel, dateProfile, dateEnv); + var splitProps = this.splitter.splitProps(props); + this.slicers = mapHash(splitProps, function (split, resourceId) { return _this.slicers[resourceId] || new DayTimeColsSlicer(); }); + var slicedProps = mapHash(this.slicers, function (slicer, resourceId) { return slicer.sliceProps(splitProps[resourceId], dateProfile, null, context, dayRanges); }); + return ( // TODO: would move this further down hierarchy, but sliceNowDate needs it + createElement(NowTimer, { unit: options.nowIndicator ? 'minute' : 'day' }, function (nowDate, todayRange) { return (createElement(TimeCols, __assign({ ref: _this.timeColsRef }, _this.joiner.joinProps(slicedProps, resourceDayTableModel), { dateProfile: dateProfile, axis: props.axis, slotDuration: props.slotDuration, slatMetas: props.slatMetas, cells: resourceDayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: options.nowIndicator && _this.buildNowIndicatorSegs(nowDate), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, forPrint: props.forPrint, onSlatCoords: props.onSlatCoords, isHitComboAllowed: _this.isHitComboAllowed }))); })); + }; + ResourceDayTimeCols.prototype.buildNowIndicatorSegs = function (date) { + var nonResourceSegs = this.slicers[''].sliceNowDate(date, this.context, this.dayRanges); + return this.joiner.expandSegs(this.props.resourceDayTableModel, nonResourceSegs); + }; + return ResourceDayTimeCols; + }(DateComponent)); + + var ResourceDayTimeColsView = /** @class */ (function (_super) { + __extends(ResourceDayTimeColsView, _super); + function ResourceDayTimeColsView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.flattenResources = memoize(flattenResources); + _this.buildResourceTimeColsModel = memoize(buildResourceTimeColsModel); + _this.buildSlatMetas = memoize(buildSlatMetas); + return _this; + } + ResourceDayTimeColsView.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var options = context.options, dateEnv = context.dateEnv; + var dateProfile = props.dateProfile; + var splitProps = this.allDaySplitter.splitProps(props); + var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER; + var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs); + var resourceDayTableModel = this.buildResourceTimeColsModel(dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context); + var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); + var dayMinWidth = options.dayMinWidth; + var hasAttachedAxis = !dayMinWidth; + var hasDetachedAxis = dayMinWidth; + var headerContent = options.dayHeaders && (createElement(ResourceDayHeader, { resources: resources, dates: resourceDayTableModel.dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null })); + var allDayContent = (options.allDaySlot !== false) && (function (contentArg) { return (createElement(ResourceDayTable, __assign({}, splitProps.allDay, { dateProfile: dateProfile, resourceDayTableModel: resourceDayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, _this.getAllDayMaxEventProps()))); }); + var timeGridContent = function (contentArg) { return (createElement(ResourceDayTimeCols, __assign({}, splitProps.timed, { dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, resourceDayTableModel: resourceDayTableModel, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows, forPrint: props.forPrint, onScrollTopRequest: _this.handleScrollTopRequest }))); }; + return hasDetachedAxis + ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, resourceDayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) + : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); + }; + return ResourceDayTimeColsView; + }(TimeColsView)); + function buildResourceTimeColsModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) { + var dayTable = buildTimeColsModel(dateProfile, dateProfileGenerator); + return datesAboveResources ? + new DayResourceTableModel(dayTable, resources, context) : + new ResourceDayTableModel(dayTable, resources, context); + } + + var resourceTimeGridPlugin = createPlugin({ + deps: [ + premiumCommonPlugin, + resourceCommonPlugin, + timeGridPlugin, + ], + initialView: 'resourceTimeGridDay', + views: { + resourceTimeGrid: { + type: 'timeGrid', + component: ResourceDayTimeColsView, + needsResourceData: true, + }, + resourceTimeGridDay: { + type: 'resourceTimeGrid', + duration: { days: 1 }, + }, + resourceTimeGridWeek: { + type: 'resourceTimeGrid', + duration: { weeks: 1 }, + }, + }, + }); + + /* + Renders the DOM responsible for the subrow expander area, + as well as the space before it (used to align expanders of similar depths) + */ + function ExpanderIcon(_a) { + var depth = _a.depth, hasChildren = _a.hasChildren, isExpanded = _a.isExpanded, onExpanderClick = _a.onExpanderClick; + var nodes = []; + for (var i = 0; i < depth; i += 1) { + nodes.push(createElement("span", { className: "fc-icon" })); + } + var iconClassNames = ['fc-icon']; + if (hasChildren) { + if (isExpanded) { + iconClassNames.push('fc-icon-minus-square'); + } + else { + iconClassNames.push('fc-icon-plus-square'); + } + } + nodes.push(createElement("span", { className: 'fc-datagrid-expander' + (hasChildren ? '' : ' fc-datagrid-expander-placeholder'), onClick: onExpanderClick }, + createElement("span", { className: iconClassNames.join(' ') }))); + return createElement.apply(void 0, __spreadArray([Fragment, {}], nodes)); + } + + function refineHookProps$1(raw) { + return { + resource: new ResourceApi(raw.context, raw.resource), + fieldValue: raw.fieldValue, + view: raw.context.viewApi, + }; + } + + var SpreadsheetIndividualCellInner = /** @class */ (function (_super) { + __extends(SpreadsheetIndividualCellInner, _super); + function SpreadsheetIndividualCellInner() { + return _super !== null && _super.apply(this, arguments) || this; + } + SpreadsheetIndividualCellInner.prototype.render = function () { + var props = this.props; + return (createElement(ContentHook, { hookProps: props.hookProps, content: props.colSpec.cellContent, defaultContent: renderResourceInner }, function (innerElRef, innerContent) { return (createElement("span", { className: "fc-datagrid-cell-main", ref: innerElRef }, innerContent)); })); + }; + return SpreadsheetIndividualCellInner; + }(BaseComponent)); + function renderResourceInner(hookProps) { + return hookProps.fieldValue || createElement(Fragment, null, "\u00A0"); + } + + // worth making a PureComponent? (because of innerHeight) + var SpreadsheetIndividualCell = /** @class */ (function (_super) { + __extends(SpreadsheetIndividualCell, _super); + function SpreadsheetIndividualCell() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.refineHookProps = memoizeObjArg(refineHookProps$1); + _this.normalizeClassNames = buildClassNameNormalizer(); + _this.onExpanderClick = function (ev) { + var props = _this.props; + if (props.hasChildren) { + _this.context.dispatch({ + type: 'SET_RESOURCE_ENTITY_EXPANDED', + id: props.resource.id, + isExpanded: !props.isExpanded, + }); + } + }; + return _this; + } + SpreadsheetIndividualCell.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var colSpec = props.colSpec; + var hookProps = this.refineHookProps({ + resource: props.resource, + fieldValue: props.fieldValue, + context: context, + }); + var customClassNames = this.normalizeClassNames(colSpec.cellClassNames, hookProps); + return (createElement(MountHook, { hookProps: hookProps, didMount: colSpec.cellDidMount, willUnmount: colSpec.cellWillUnmount }, function (rootElRef) { return (createElement("td", { ref: rootElRef, role: "gridcell", "data-resource-id": props.resource.id, className: [ + 'fc-datagrid-cell', + 'fc-resource', + ].concat(customClassNames).join(' ') }, + createElement("div", { className: "fc-datagrid-cell-frame", style: { height: props.innerHeight } }, + createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner" }, + colSpec.isMain && (createElement(ExpanderIcon, { depth: props.depth, hasChildren: props.hasChildren, isExpanded: props.isExpanded, onExpanderClick: _this.onExpanderClick })), + createElement(SpreadsheetIndividualCellInner, { hookProps: hookProps, colSpec: colSpec }))))); })); + }; + return SpreadsheetIndividualCell; + }(BaseComponent)); + + // for VERTICAL cell grouping, in spreadsheet area + var SpreadsheetGroupCell = /** @class */ (function (_super) { + __extends(SpreadsheetGroupCell, _super); + function SpreadsheetGroupCell() { + return _super !== null && _super.apply(this, arguments) || this; + } + SpreadsheetGroupCell.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var colSpec = props.colSpec; + var hookProps = { + groupValue: props.fieldValue, + view: context.viewApi, + }; + // a grouped cell. no data that is specific to this specific resource + // `colSpec` is for the group. a GroupSpec :( + return (createElement(RenderHook, { hookProps: hookProps, classNames: colSpec.cellClassNames, content: colSpec.cellContent, defaultContent: renderGroupInner, didMount: colSpec.cellDidMount, willUnmount: colSpec.cellWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return ( + // TODO: make data-attr with group value? + createElement("td", { ref: rootElRef, role: "gridcell", rowSpan: props.rowSpan, className: ['fc-datagrid-cell', 'fc-resource-group'].concat(classNames).join(' ') }, + createElement("div", { className: "fc-datagrid-cell-frame fc-datagrid-cell-frame-liquid" }, + createElement("div", { className: "fc-datagrid-cell-cushion fc-sticky", ref: innerElRef }, innerContent)))); })); + }; + return SpreadsheetGroupCell; + }(BaseComponent)); + function renderGroupInner(hookProps) { + return hookProps.groupValue || createElement(Fragment, null, "\u00A0"); + } + + var SpreadsheetRow = /** @class */ (function (_super) { + __extends(SpreadsheetRow, _super); + function SpreadsheetRow() { + return _super !== null && _super.apply(this, arguments) || this; + } + SpreadsheetRow.prototype.render = function () { + var props = this.props; + var resource = props.resource, rowSpans = props.rowSpans, depth = props.depth; + var resourceFields = buildResourceFields(resource); // slightly inefficient. already done up the call stack + return (createElement("tr", { role: "row" }, props.colSpecs.map(function (colSpec, i) { + var rowSpan = rowSpans[i]; + if (rowSpan === 0) { // not responsible for group-based rows. VRowGroup is + return null; + } + if (rowSpan == null) { + rowSpan = 1; + } + var fieldValue = colSpec.field ? resourceFields[colSpec.field] : + (resource.title || getPublicId(resource.id)); + if (rowSpan > 1) { + return (createElement(SpreadsheetGroupCell, { key: i, colSpec: colSpec, fieldValue: fieldValue, rowSpan: rowSpan })); + } + return (createElement(SpreadsheetIndividualCell, { key: i, colSpec: colSpec, resource: resource, fieldValue: fieldValue, depth: depth, hasChildren: props.hasChildren, isExpanded: props.isExpanded, innerHeight: props.innerHeight })); + }))); + }; + return SpreadsheetRow; + }(BaseComponent)); + SpreadsheetRow.addPropsEquality({ + rowSpans: isArraysEqual, + }); + + // for HORIZONTAL cell grouping, in spreadsheet area + var SpreadsheetGroupRow = /** @class */ (function (_super) { + __extends(SpreadsheetGroupRow, _super); + function SpreadsheetGroupRow() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.innerInnerRef = createRef(); + _this.onExpanderClick = function () { + var props = _this.props; + _this.context.dispatch({ + type: 'SET_RESOURCE_ENTITY_EXPANDED', + id: props.id, + isExpanded: !props.isExpanded, + }); + }; + return _this; + } + SpreadsheetGroupRow.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var hookProps = { groupValue: props.group.value, view: context.viewApi }; + var spec = props.group.spec; + return (createElement("tr", { role: "row" }, + createElement(RenderHook, { hookProps: hookProps, classNames: spec.labelClassNames, content: spec.labelContent, defaultContent: renderCellInner, didMount: spec.labelDidMount, willUnmount: spec.labelWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, + // ARIA TODO: not really a columnheader + // extremely tedious to make this aria-compliant, + // to assign multiple headers to each cell + // https://www.w3.org/WAI/tutorials/tables/multi-level/ + role: "columnheader", scope: "colgroup", colSpan: props.spreadsheetColCnt, className: [ + 'fc-datagrid-cell', + 'fc-resource-group', + context.theme.getClass('tableCellShaded'), + ].concat(classNames).join(' ') }, + createElement("div", { className: "fc-datagrid-cell-frame", style: { height: props.innerHeight } }, + createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner", ref: _this.innerInnerRef }, + createElement(ExpanderIcon, { depth: 0, hasChildren: true, isExpanded: props.isExpanded, onExpanderClick: _this.onExpanderClick }), + createElement("span", { className: "fc-datagrid-cell-main", ref: innerElRef }, innerContent))))); }))); + }; + return SpreadsheetGroupRow; + }(BaseComponent)); + SpreadsheetGroupRow.addPropsEquality({ + group: isGroupsEqual, + }); + function renderCellInner(hookProps) { + return hookProps.groupValue || createElement(Fragment, null, "\u00A0"); + } + + var SPREADSHEET_COL_MIN_WIDTH = 20; + var SpreadsheetHeader = /** @class */ (function (_super) { + __extends(SpreadsheetHeader, _super); + function SpreadsheetHeader() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.resizerElRefs = new RefMap(_this._handleColResizerEl.bind(_this)); + _this.colDraggings = {}; + return _this; + } + SpreadsheetHeader.prototype.render = function () { + var _this = this; + var _a = this.props, colSpecs = _a.colSpecs, superHeaderRendering = _a.superHeaderRendering, rowInnerHeights = _a.rowInnerHeights; + var hookProps = { view: this.context.viewApi }; + var rowNodes = []; + rowInnerHeights = rowInnerHeights.slice(); // copy, because we're gonna pop + if (superHeaderRendering) { + var rowInnerHeight_1 = rowInnerHeights.shift(); + rowNodes.push(createElement("tr", { key: "row-super", role: "row" }, + createElement(RenderHook, { hookProps: hookProps, classNames: superHeaderRendering.headerClassNames, content: superHeaderRendering.headerContent, didMount: superHeaderRendering.headerDidMount, willUnmount: superHeaderRendering.headerWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, role: "columnheader", scope: "colgroup", colSpan: colSpecs.length, className: [ + 'fc-datagrid-cell', + 'fc-datagrid-cell-super', + ].concat(classNames).join(' ') }, + createElement("div", { className: "fc-datagrid-cell-frame", style: { height: rowInnerHeight_1 } }, + createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner", ref: innerElRef }, innerContent)))); }))); + } + var rowInnerHeight = rowInnerHeights.shift(); + rowNodes.push(createElement("tr", { key: "row", role: "row" }, colSpecs.map(function (colSpec, i) { + var isLastCol = i === (colSpecs.length - 1); + // need empty inner div for abs positioning for resizer + return (createElement(RenderHook, { key: i, hookProps: hookProps, classNames: colSpec.headerClassNames, content: colSpec.headerContent, didMount: colSpec.headerDidMount, willUnmount: colSpec.headerWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, role: "columnheader", className: ['fc-datagrid-cell'].concat(classNames).join(' ') }, + createElement("div", { className: "fc-datagrid-cell-frame", style: { height: rowInnerHeight } }, + createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner" }, + colSpec.isMain && (createElement("span", { className: "fc-datagrid-expander fc-datagrid-expander-placeholder" }, + createElement("span", { className: "fc-icon" }))), + createElement("span", { className: "fc-datagrid-cell-main", ref: innerElRef }, innerContent)), + !isLastCol && + createElement("div", { className: "fc-datagrid-cell-resizer", ref: _this.resizerElRefs.createRef(i) })))); })); + }))); + return (createElement(Fragment, null, rowNodes)); + }; + SpreadsheetHeader.prototype._handleColResizerEl = function (resizerEl, index) { + var colDraggings = this.colDraggings; + if (!resizerEl) { + var dragging = colDraggings[index]; + if (dragging) { + dragging.destroy(); + delete colDraggings[index]; + } + } + else { + var dragging = this.initColResizing(resizerEl, parseInt(index, 10)); + if (dragging) { + colDraggings[index] = dragging; + } + } + }; + SpreadsheetHeader.prototype.initColResizing = function (resizerEl, index) { + var _a = this.context, pluginHooks = _a.pluginHooks, isRtl = _a.isRtl; + var onColWidthChange = this.props.onColWidthChange; + var ElementDraggingImpl = pluginHooks.elementDraggingImpl; + if (ElementDraggingImpl) { + var dragging = new ElementDraggingImpl(resizerEl); + var startWidth_1; // of just the single column + var currentWidths_1; // of all columns + dragging.emitter.on('dragstart', function () { + var allCells = findElements(elementClosest(resizerEl, 'tr'), 'th'); + currentWidths_1 = allCells.map(function (cellEl) { return (cellEl.getBoundingClientRect().width); }); + startWidth_1 = currentWidths_1[index]; + }); + dragging.emitter.on('dragmove', function (pev) { + currentWidths_1[index] = Math.max(startWidth_1 + pev.deltaX * (isRtl ? -1 : 1), SPREADSHEET_COL_MIN_WIDTH); + if (onColWidthChange) { + onColWidthChange(currentWidths_1.slice()); // send a copy since currentWidths continues to be mutated + } + }); + dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area + return dragging; + } + return null; + }; + return SpreadsheetHeader; + }(BaseComponent)); + + var ResourceTimelineLaneMisc = /** @class */ (function (_super) { + __extends(ResourceTimelineLaneMisc, _super); + function ResourceTimelineLaneMisc() { + return _super !== null && _super.apply(this, arguments) || this; + } + ResourceTimelineLaneMisc.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var hookProps = { resource: new ResourceApi(context, props.resource) }; // just easier to make directly + return (createElement(ContentHook, { hookProps: hookProps, content: context.options.resourceLaneContent }, function (innerElRef, innerContent) { return (innerContent && // TODO: test how this would interfere with height + createElement("div", { className: "fc-timeline-lane-misc", ref: innerElRef }, innerContent)); })); + }; + return ResourceTimelineLaneMisc; + }(BaseComponent)); + + var ResourceTimelineLane = /** @class */ (function (_super) { + __extends(ResourceTimelineLane, _super); + function ResourceTimelineLane() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.refineHookProps = memoizeObjArg(refineHookProps); + _this.normalizeClassNames = buildClassNameNormalizer(); + _this.handleHeightChange = function (innerEl, isStable) { + if (_this.props.onHeightChange) { + _this.props.onHeightChange( + // would want to use own ref, but not guaranteed to be ready when this fires + elementClosest(innerEl, 'tr'), isStable); + } + }; + return _this; + } + ResourceTimelineLane.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, context = _a.context; + var options = context.options; + var hookProps = this.refineHookProps({ resource: props.resource, context: context }); + var customClassNames = this.normalizeClassNames(options.resourceLaneClassNames, hookProps); + return (createElement("tr", { ref: props.elRef }, + createElement(MountHook, { hookProps: hookProps, didMount: options.resourceLaneDidMount, willUnmount: options.resourceLaneWillUnmount }, function (rootElRef) { return (createElement("td", { ref: rootElRef, className: ['fc-timeline-lane', 'fc-resource'].concat(customClassNames).join(' '), "data-resource-id": props.resource.id }, + createElement("div", { className: "fc-timeline-lane-frame", style: { height: props.innerHeight } }, + createElement(ResourceTimelineLaneMisc, { resource: props.resource }), + createElement(TimelineLane, { dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, nextDayThreshold: props.nextDayThreshold, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, timelineCoords: props.timelineCoords, onHeightChange: _this.handleHeightChange, resourceId: props.resource.id })))); }))); // important NOT to do liquid-height. dont want to shrink height smaller than content + }; + return ResourceTimelineLane; + }(BaseComponent)); + function refineHookProps(raw) { + return { + resource: new ResourceApi(raw.context, raw.resource), + }; + } + + /* + parallels the SpreadsheetGroupRow + */ + var DividerRow = /** @class */ (function (_super) { + __extends(DividerRow, _super); + function DividerRow() { + return _super !== null && _super.apply(this, arguments) || this; + } + DividerRow.prototype.render = function () { + var _this = this; + var props = this.props; + var renderingHooks = this.props.renderingHooks; + var hookProps = { groupValue: props.groupValue, view: this.context.viewApi }; + return (createElement("tr", { ref: props.elRef }, + createElement(RenderHook, { hookProps: hookProps, classNames: renderingHooks.laneClassNames, content: renderingHooks.laneContent, didMount: renderingHooks.laneDidMount, willUnmount: renderingHooks.laneWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: [ + 'fc-timeline-lane', + 'fc-resource-group', + _this.context.theme.getClass('tableCellShaded'), + ].concat(classNames).join(' ') }, + createElement("div", { style: { height: props.innerHeight }, ref: innerElRef }, innerContent))); }))); + }; + return DividerRow; + }(BaseComponent)); + + var ResourceTimelineLanesBody = /** @class */ (function (_super) { + __extends(ResourceTimelineLanesBody, _super); + function ResourceTimelineLanesBody() { + return _super !== null && _super.apply(this, arguments) || this; + } + ResourceTimelineLanesBody.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + var rowElRefs = props.rowElRefs, innerHeights = props.innerHeights; + return (createElement("tbody", null, props.rowNodes.map(function (node, index) { + if (node.group) { + return (createElement(DividerRow, { key: node.id, elRef: rowElRefs.createRef(node.id), groupValue: node.group.value, renderingHooks: node.group.spec, innerHeight: innerHeights[index] || '' })); + } + if (node.resource) { + var resource = node.resource; + return (createElement(ResourceTimelineLane, __assign({ key: node.id, elRef: rowElRefs.createRef(node.id) }, props.splitProps[resource.id], { resource: resource, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, nextDayThreshold: context.options.nextDayThreshold, businessHours: resource.businessHours || props.fallbackBusinessHours, innerHeight: innerHeights[index] || '', timelineCoords: props.slatCoords, onHeightChange: props.onRowHeightChange }))); + } + return null; + }))); + }; + return ResourceTimelineLanesBody; + }(BaseComponent)); + + var ResourceTimelineLanes = /** @class */ (function (_super) { + __extends(ResourceTimelineLanes, _super); + function ResourceTimelineLanes() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rootElRef = createRef(); + _this.rowElRefs = new RefMap(); + return _this; + } + ResourceTimelineLanes.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + return (createElement("table", { ref: this.rootElRef, "aria-hidden": true, className: 'fc-scrollgrid-sync-table ' + context.theme.getClass('table'), style: { + minWidth: props.tableMinWidth, + width: props.clientWidth, + height: props.minHeight, + } }, + createElement(ResourceTimelineLanesBody, { rowElRefs: this.rowElRefs, rowNodes: props.rowNodes, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, splitProps: props.splitProps, fallbackBusinessHours: props.fallbackBusinessHours, slatCoords: props.slatCoords, innerHeights: props.innerHeights, onRowHeightChange: props.onRowHeightChange }))); + }; + ResourceTimelineLanes.prototype.componentDidMount = function () { + this.updateCoords(); + }; + ResourceTimelineLanes.prototype.componentDidUpdate = function () { + this.updateCoords(); + }; + ResourceTimelineLanes.prototype.componentWillUnmount = function () { + if (this.props.onRowCoords) { + this.props.onRowCoords(null); + } + }; + ResourceTimelineLanes.prototype.updateCoords = function () { + var props = this.props; + if (props.onRowCoords && props.clientWidth !== null) { // a populated clientWidth means sizing has stabilized + this.props.onRowCoords(new PositionCache(this.rootElRef.current, collectRowEls(this.rowElRefs.currentMap, props.rowNodes), false, true)); + } + }; + return ResourceTimelineLanes; + }(BaseComponent)); + function collectRowEls(elMap, rowNodes) { + return rowNodes.map(function (rowNode) { return elMap[rowNode.id]; }); + } + + var ResourceTimelineGrid = /** @class */ (function (_super) { + __extends(ResourceTimelineGrid, _super); + function ResourceTimelineGrid() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.computeHasResourceBusinessHours = memoize(computeHasResourceBusinessHours); + _this.resourceSplitter = new ResourceSplitter(); // doesn't let it do businessHours tho + _this.bgSlicer = new TimelineLaneSlicer(); + _this.slatsRef = createRef(); // needed for Hit creation :( + _this.state = { + slatCoords: null, + }; + _this.handleEl = function (el) { + if (el) { + _this.context.registerInteractiveComponent(_this, { el: el }); + } + else { + _this.context.unregisterInteractiveComponent(_this); + } + }; + _this.handleSlatCoords = function (slatCoords) { + _this.setState({ slatCoords: slatCoords }); + if (_this.props.onSlatCoords) { + _this.props.onSlatCoords(slatCoords); + } + }; + _this.handleRowCoords = function (rowCoords) { + _this.rowCoords = rowCoords; + if (_this.props.onRowCoords) { + _this.props.onRowCoords(rowCoords); + } + }; + return _this; + } + ResourceTimelineGrid.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; + var timerUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit; + var hasResourceBusinessHours = this.computeHasResourceBusinessHours(props.rowNodes); + var splitProps = this.resourceSplitter.splitProps(props); + var bgLaneProps = splitProps['']; + var bgSlicedProps = this.bgSlicer.sliceProps(bgLaneProps, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't need to pass in the rest of these args... + dateProfile, context.dateProfileGenerator, tDateProfile, context.dateEnv); + // WORKAROUND: make ignore slatCoords when out of sync with dateProfile + var slatCoords = state.slatCoords && state.slatCoords.dateProfile === props.dateProfile ? state.slatCoords : null; + return (createElement("div", { ref: this.handleEl, className: [ + 'fc-timeline-body', + props.expandRows ? 'fc-timeline-body-expandrows' : '', + ].join(' '), style: { minWidth: props.tableMinWidth } }, + createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement(Fragment, null, + createElement(TimelineSlats, { ref: _this.slatsRef, dateProfile: dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, clientWidth: props.clientWidth, tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, onCoords: _this.handleSlatCoords, onScrollLeftRequest: props.onScrollLeftRequest }), + createElement(TimelineLaneBg, { businessHourSegs: hasResourceBusinessHours ? null : bgSlicedProps.businessHourSegs, bgEventSegs: bgSlicedProps.bgEventSegs, timelineCoords: slatCoords, + // empty array will result in unnecessary rerenders? + eventResizeSegs: (bgSlicedProps.eventResize ? bgSlicedProps.eventResize.segs : []), dateSelectionSegs: bgSlicedProps.dateSelectionSegs, nowDate: nowDate, todayRange: todayRange }), + createElement(ResourceTimelineLanes, { rowNodes: props.rowNodes, dateProfile: dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, splitProps: splitProps, fallbackBusinessHours: hasResourceBusinessHours ? props.businessHours : null, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, innerHeights: props.rowInnerHeights, slatCoords: slatCoords, onRowCoords: _this.handleRowCoords, onRowHeightChange: props.onRowHeightChange }), + (context.options.nowIndicator && slatCoords && slatCoords.isDateInRange(nowDate)) && (createElement("div", { className: "fc-timeline-now-indicator-container" }, + createElement(NowIndicatorRoot, { isAxis: false, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-line'].concat(classNames).join(' '), style: coordToCss(slatCoords.dateToCoord(nowDate), context.isRtl) }, innerContent)); }))))); }))); + }; + // Hit System + // ------------------------------------------------------------------------------------------ + ResourceTimelineGrid.prototype.queryHit = function (positionLeft, positionTop) { + var rowCoords = this.rowCoords; + var rowIndex = rowCoords.topToIndex(positionTop); + if (rowIndex != null) { + var resource = this.props.rowNodes[rowIndex].resource; + if (resource) { // not a group + var slatHit = this.slatsRef.current.positionToHit(positionLeft); + if (slatHit) { + return { + dateProfile: this.props.dateProfile, + dateSpan: { + range: slatHit.dateSpan.range, + allDay: slatHit.dateSpan.allDay, + resourceId: resource.id, + }, + rect: { + left: slatHit.left, + right: slatHit.right, + top: rowCoords.tops[rowIndex], + bottom: rowCoords.bottoms[rowIndex], + }, + dayEl: slatHit.dayEl, + layer: 0, + }; + } + } + } + return null; + }; + return ResourceTimelineGrid; + }(DateComponent)); + function computeHasResourceBusinessHours(rowNodes) { + for (var _i = 0, rowNodes_1 = rowNodes; _i < rowNodes_1.length; _i++) { + var node = rowNodes_1[_i]; + var resource = node.resource; + if (resource && resource.businessHours) { + return true; + } + } + return false; + } + + var MIN_RESOURCE_AREA_WIDTH = 30; // definitely bigger than scrollbars + // RENAME? + var ResourceTimelineViewLayout = /** @class */ (function (_super) { + __extends(ResourceTimelineViewLayout, _super); + function ResourceTimelineViewLayout() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.scrollGridRef = createRef(); + _this.timeBodyScrollerElRef = createRef(); + _this.spreadsheetHeaderChunkElRef = createRef(); + _this.rootElRef = createRef(); + _this.ensureScrollGridResizeId = 0; + _this.state = { + resourceAreaWidthOverride: null, + }; + /* + ghetto debounce. don't race with ScrollGrid's resizing delay. solves #6140 + */ + _this.ensureScrollGridResize = function () { + if (_this.ensureScrollGridResizeId) { + clearTimeout(_this.ensureScrollGridResizeId); + } + _this.ensureScrollGridResizeId = setTimeout(function () { + _this.scrollGridRef.current.handleSizing(false); + }, config.SCROLLGRID_RESIZE_INTERVAL + 1); + }; + return _this; + } + ResourceTimelineViewLayout.prototype.render = function () { + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var options = context.options; + var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(options); + var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options); + var sections = [ + { + type: 'header', + key: 'header', + syncRowHeights: true, + isSticky: stickyHeaderDates, + chunks: [ + { + key: 'datagrid', + elRef: this.spreadsheetHeaderChunkElRef, + // TODO: allow the content to specify this. have general-purpose 'content' with obj with keys + tableClassName: 'fc-datagrid-header', + rowContent: props.spreadsheetHeaderRows, + }, + { + key: 'divider', + outerContent: (createElement("td", { role: "presentation", className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') })), + }, + { + key: 'timeline', + content: props.timeHeaderContent, + }, + ], + }, + { + type: 'body', + key: 'body', + syncRowHeights: true, + liquid: true, + expandRows: Boolean(options.expandRows), + chunks: [ + { + key: 'datagrid', + tableClassName: 'fc-datagrid-body', + rowContent: props.spreadsheetBodyRows, + }, + { + key: 'divider', + outerContent: (createElement("td", { role: "presentation", className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') })), + }, + { + key: 'timeline', + scrollerElRef: this.timeBodyScrollerElRef, + content: props.timeBodyContent, + }, + ], + }, + ]; + if (stickyFooterScrollbar) { + sections.push({ + type: 'footer', + key: 'footer', + isSticky: true, + chunks: [ + { + key: 'datagrid', + content: renderScrollShim, + }, + { + key: 'divider', + outerContent: (createElement("td", { role: "presentation", className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') })), + }, + { + key: 'timeline', + content: renderScrollShim, + }, + ], + }); + } + var resourceAreaWidth = state.resourceAreaWidthOverride != null + ? state.resourceAreaWidthOverride + : options.resourceAreaWidth; + return (createElement(ScrollGrid, { ref: this.scrollGridRef, elRef: this.rootElRef, liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ + { cols: props.spreadsheetCols, width: resourceAreaWidth }, + { cols: [] }, + { cols: props.timeCols }, + ], sections: sections })); + }; + ResourceTimelineViewLayout.prototype.forceTimeScroll = function (left) { + var scrollGrid = this.scrollGridRef.current; + scrollGrid.forceScrollLeft(2, left); // 2 = the time area + }; + ResourceTimelineViewLayout.prototype.forceResourceScroll = function (top) { + var scrollGrid = this.scrollGridRef.current; + scrollGrid.forceScrollTop(1, top); // 1 = the body + }; + ResourceTimelineViewLayout.prototype.getResourceScroll = function () { + var timeBodyScrollerEl = this.timeBodyScrollerElRef.current; + return timeBodyScrollerEl.scrollTop; + }; + // Resource Area Resizing + // ------------------------------------------------------------------------------------------ + // NOTE: a callback Ref for the resizer was firing multiple times with same elements (Preact) + // that's why we use spreadsheetResizerElRef instead + ResourceTimelineViewLayout.prototype.componentDidMount = function () { + this.initSpreadsheetResizing(); + }; + ResourceTimelineViewLayout.prototype.componentWillUnmount = function () { + this.destroySpreadsheetResizing(); + }; + ResourceTimelineViewLayout.prototype.initSpreadsheetResizing = function () { + var _this = this; + var _a = this.context, isRtl = _a.isRtl, pluginHooks = _a.pluginHooks; + var ElementDraggingImpl = pluginHooks.elementDraggingImpl; + var spreadsheetHeadEl = this.spreadsheetHeaderChunkElRef.current; + if (ElementDraggingImpl) { + var rootEl_1 = this.rootElRef.current; + var dragging = this.spreadsheetResizerDragging = new ElementDraggingImpl(rootEl_1, '.fc-resource-timeline-divider'); + var dragStartWidth_1; + var viewWidth_1; + dragging.emitter.on('dragstart', function () { + dragStartWidth_1 = spreadsheetHeadEl.getBoundingClientRect().width; + viewWidth_1 = rootEl_1.getBoundingClientRect().width; + }); + dragging.emitter.on('dragmove', function (pev) { + var newWidth = dragStartWidth_1 + pev.deltaX * (isRtl ? -1 : 1); + newWidth = Math.max(newWidth, MIN_RESOURCE_AREA_WIDTH); + newWidth = Math.min(newWidth, viewWidth_1 - MIN_RESOURCE_AREA_WIDTH); + // scrollgrid will ignore resize requests if there are too many :| + _this.setState({ + resourceAreaWidthOverride: newWidth, + }, _this.ensureScrollGridResize); + }); + dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area + } + }; + ResourceTimelineViewLayout.prototype.destroySpreadsheetResizing = function () { + if (this.spreadsheetResizerDragging) { + this.spreadsheetResizerDragging.destroy(); + } + }; + return ResourceTimelineViewLayout; + }(BaseComponent)); + + var ResourceTimelineView = /** @class */ (function (_super) { + __extends(ResourceTimelineView, _super); + function ResourceTimelineView(props, context) { + var _this = _super.call(this, props, context) || this; + _this.processColOptions = memoize(processColOptions); + _this.buildTimelineDateProfile = memoize(buildTimelineDateProfile); + _this.hasNesting = memoize(hasNesting); + _this.buildRowNodes = memoize(buildRowNodes); + _this.layoutRef = createRef(); + _this.rowNodes = []; + _this.renderedRowNodes = []; + _this.buildRowIndex = memoize(buildRowIndex); + _this.handleSlatCoords = function (slatCoords) { + _this.setState({ slatCoords: slatCoords }); + }; + _this.handleRowCoords = function (rowCoords) { + _this.rowCoords = rowCoords; + _this.scrollResponder.update(false); // TODO: could eliminate this if rowCoords lived in state + }; + _this.handleMaxCushionWidth = function (slotCushionMaxWidth) { + _this.setState({ + slotCushionMaxWidth: Math.ceil(slotCushionMaxWidth), // for less rerendering TODO: DRY + }); + }; + // Scrolling + // ------------------------------------------------------------------------------------------------------------------ + // this is useful for scrolling prev/next dates while resource is scrolled down + _this.handleScrollLeftRequest = function (scrollLeft) { + var layout = _this.layoutRef.current; + layout.forceTimeScroll(scrollLeft); + }; + _this.handleScrollRequest = function (request) { + var rowCoords = _this.rowCoords; + var layout = _this.layoutRef.current; + var rowId = request.rowId || request.resourceId; + if (rowCoords) { + if (rowId) { + var rowIdToIndex = _this.buildRowIndex(_this.renderedRowNodes); + var index = rowIdToIndex[rowId]; + if (index != null) { + var scrollTop = (request.fromBottom != null ? + rowCoords.bottoms[index] - request.fromBottom : // pixels from bottom edge + rowCoords.tops[index] // just use top edge + ); + layout.forceResourceScroll(scrollTop); + } + } + return true; + } + return null; + }; + // Resource INDIVIDUAL-Column Area Resizing + // ------------------------------------------------------------------------------------------ + _this.handleColWidthChange = function (colWidths) { + _this.setState({ + spreadsheetColWidths: colWidths, + }); + }; + _this.state = { + resourceAreaWidth: context.options.resourceAreaWidth, + spreadsheetColWidths: [], + }; + return _this; + } + ResourceTimelineView.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var options = context.options, viewSpec = context.viewSpec; + var _b = this.processColOptions(context.options), superHeaderRendering = _b.superHeaderRendering, groupSpecs = _b.groupSpecs, orderSpecs = _b.orderSpecs, isVGrouping = _b.isVGrouping, colSpecs = _b.colSpecs; + var tDateProfile = this.buildTimelineDateProfile(props.dateProfile, context.dateEnv, options, context.dateProfileGenerator); + var rowNodes = this.rowNodes = this.buildRowNodes(props.resourceStore, groupSpecs, orderSpecs, isVGrouping, props.resourceEntityExpansions, options.resourcesInitiallyExpanded); + var extraClassNames = [ + 'fc-resource-timeline', + this.hasNesting(rowNodes) ? '' : 'fc-resource-timeline-flat', + 'fc-timeline', + options.eventOverlap === false ? 'fc-timeline-overlap-disabled' : 'fc-timeline-overlap-enabled', + ]; + var slotMinWidth = options.slotMinWidth; + var slatCols = buildSlatCols(tDateProfile, slotMinWidth || this.computeFallbackSlotMinWidth(tDateProfile)); + return (createElement(ViewRoot, { viewSpec: viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') }, + createElement(ResourceTimelineViewLayout, { ref: _this.layoutRef, forPrint: props.forPrint, isHeightAuto: props.isHeightAuto, spreadsheetCols: buildSpreadsheetCols(colSpecs, state.spreadsheetColWidths, ''), spreadsheetHeaderRows: function (contentArg) { return (createElement(SpreadsheetHeader // TODO: rename to SpreadsheetHeaderRows + , { superHeaderRendering: superHeaderRendering, colSpecs: colSpecs, onColWidthChange: _this.handleColWidthChange, rowInnerHeights: contentArg.rowSyncHeights })); }, spreadsheetBodyRows: function (contentArg) { return (createElement(Fragment, null, _this.renderSpreadsheetRows(rowNodes, colSpecs, contentArg.rowSyncHeights))); }, timeCols: slatCols, timeHeaderContent: function (contentArg) { return (createElement(TimelineHeader, { clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, dateProfile: props.dateProfile, tDateProfile: tDateProfile, slatCoords: state.slatCoords, rowInnerHeights: contentArg.rowSyncHeights, onMaxCushionWidth: slotMinWidth ? null : _this.handleMaxCushionWidth })); }, timeBodyContent: function (contentArg) { return (createElement(ResourceTimelineGrid, { dateProfile: props.dateProfile, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, expandRows: contentArg.expandRows, tDateProfile: tDateProfile, rowNodes: rowNodes, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, resourceStore: props.resourceStore, nextDayThreshold: context.options.nextDayThreshold, rowInnerHeights: contentArg.rowSyncHeights, onSlatCoords: _this.handleSlatCoords, onRowCoords: _this.handleRowCoords, onScrollLeftRequest: _this.handleScrollLeftRequest, onRowHeightChange: contentArg.reportRowHeightChange })); } }))); })); + }; + ResourceTimelineView.prototype.renderSpreadsheetRows = function (nodes, colSpecs, rowSyncHeights) { + return nodes.map(function (node, index) { + if (node.group) { + return (createElement(SpreadsheetGroupRow, { key: node.id, id: node.id, spreadsheetColCnt: colSpecs.length, isExpanded: node.isExpanded, group: node.group, innerHeight: rowSyncHeights[index] || '' })); + } + if (node.resource) { + return (createElement(SpreadsheetRow, { key: node.id, colSpecs: colSpecs, rowSpans: node.rowSpans, depth: node.depth, isExpanded: node.isExpanded, hasChildren: node.hasChildren, resource: node.resource, innerHeight: rowSyncHeights[index] || '' })); + } + return null; + }); + }; + ResourceTimelineView.prototype.componentDidMount = function () { + this.renderedRowNodes = this.rowNodes; + this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); + }; + ResourceTimelineView.prototype.getSnapshotBeforeUpdate = function () { + if (!this.props.forPrint) { // because print-view is always zero? + return { resourceScroll: this.queryResourceScroll() }; + } + return {}; + }; + ResourceTimelineView.prototype.componentDidUpdate = function (prevProps, prevState, snapshot) { + this.renderedRowNodes = this.rowNodes; + this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); + if (snapshot.resourceScroll) { + this.handleScrollRequest(snapshot.resourceScroll); // TODO: this gets triggered too often + } + }; + ResourceTimelineView.prototype.componentWillUnmount = function () { + this.scrollResponder.detach(); + }; + ResourceTimelineView.prototype.computeFallbackSlotMinWidth = function (tDateProfile) { + return Math.max(30, ((this.state.slotCushionMaxWidth || 0) / tDateProfile.slotsPerLabel)); + }; + ResourceTimelineView.prototype.queryResourceScroll = function () { + var _a = this, rowCoords = _a.rowCoords, renderedRowNodes = _a.renderedRowNodes; + if (rowCoords) { + var layout = this.layoutRef.current; + var trBottoms = rowCoords.bottoms; + var scrollTop = layout.getResourceScroll(); + var scroll_1 = {}; + for (var i = 0; i < trBottoms.length; i += 1) { + var rowNode = renderedRowNodes[i]; + var elBottom = trBottoms[i] - scrollTop; // from the top of the scroller + if (elBottom > 0) { + scroll_1.rowId = rowNode.id; + scroll_1.fromBottom = elBottom; + break; + } + } + return scroll_1; + } + return null; + }; + return ResourceTimelineView; + }(BaseComponent)); + ResourceTimelineView.addStateEquality({ + spreadsheetColWidths: isArraysEqual, + }); + function buildRowIndex(rowNodes) { + var rowIdToIndex = {}; + for (var i = 0; i < rowNodes.length; i += 1) { + rowIdToIndex[rowNodes[i].id] = i; + } + return rowIdToIndex; + } + function buildSpreadsheetCols(colSpecs, forcedWidths, fallbackWidth) { + if (fallbackWidth === void 0) { fallbackWidth = ''; } + return colSpecs.map(function (colSpec, i) { return ({ + className: colSpec.isMain ? 'fc-main-col' : '', + width: forcedWidths[i] || colSpec.width || fallbackWidth, + }); }); + } + function hasNesting(nodes) { + for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { + var node = nodes_1[_i]; + if (node.group) { + return true; + } + if (node.resource) { + if (node.hasChildren) { + return true; + } + } + } + return false; + } + function processColOptions(options) { + var allColSpecs = options.resourceAreaColumns || []; + var superHeaderRendering = null; + if (!allColSpecs.length) { + allColSpecs.push({ + headerClassNames: options.resourceAreaHeaderClassNames, + headerContent: options.resourceAreaHeaderContent || 'Resources', + headerDidMount: options.resourceAreaHeaderDidMount, + headerWillUnmount: options.resourceAreaHeaderWillUnmount, + }); + } + else if (options.resourceAreaHeaderContent) { // weird way to determine if content + superHeaderRendering = { + headerClassNames: options.resourceAreaHeaderClassNames, + headerContent: options.resourceAreaHeaderContent, + headerDidMount: options.resourceAreaHeaderDidMount, + headerWillUnmount: options.resourceAreaHeaderWillUnmount, + }; + } + var plainColSpecs = []; + var groupColSpecs = []; // part of the colSpecs, but filtered out in order to put first + var groupSpecs = []; + var isVGrouping = false; + for (var _i = 0, allColSpecs_1 = allColSpecs; _i < allColSpecs_1.length; _i++) { + var colSpec = allColSpecs_1[_i]; + if (colSpec.group) { + groupColSpecs.push(__assign(__assign({}, colSpec), { cellClassNames: colSpec.cellClassNames || options.resourceGroupLabelClassNames, cellContent: colSpec.cellContent || options.resourceGroupLabelContent, cellDidMount: colSpec.cellDidMount || options.resourceGroupLabelDidMount, cellWillUnmount: colSpec.cellWillUnmount || options.resourceGroupLaneWillUnmount })); + } + else { + plainColSpecs.push(colSpec); + } + } + // BAD: mutates a user-supplied option + var mainColSpec = plainColSpecs[0]; + mainColSpec.isMain = true; + mainColSpec.cellClassNames = mainColSpec.cellClassNames || options.resourceLabelClassNames; + mainColSpec.cellContent = mainColSpec.cellContent || options.resourceLabelContent; + mainColSpec.cellDidMount = mainColSpec.cellDidMount || options.resourceLabelDidMount; + mainColSpec.cellWillUnmount = mainColSpec.cellWillUnmount || options.resourceLabelWillUnmount; + if (groupColSpecs.length) { + groupSpecs = groupColSpecs; + isVGrouping = true; + } + else { + var hGroupField = options.resourceGroupField; + if (hGroupField) { + groupSpecs.push({ + field: hGroupField, + labelClassNames: options.resourceGroupLabelClassNames, + labelContent: options.resourceGroupLabelContent, + labelDidMount: options.resourceGroupLabelDidMount, + labelWillUnmount: options.resourceGroupLabelWillUnmount, + laneClassNames: options.resourceGroupLaneClassNames, + laneContent: options.resourceGroupLaneContent, + laneDidMount: options.resourceGroupLaneDidMount, + laneWillUnmount: options.resourceGroupLaneWillUnmount, + }); + } + } + var allOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER; + var plainOrderSpecs = []; + for (var _a = 0, allOrderSpecs_1 = allOrderSpecs; _a < allOrderSpecs_1.length; _a++) { + var orderSpec = allOrderSpecs_1[_a]; + var isGroup = false; + for (var _b = 0, groupSpecs_1 = groupSpecs; _b < groupSpecs_1.length; _b++) { + var groupSpec = groupSpecs_1[_b]; + if (groupSpec.field === orderSpec.field) { + groupSpec.order = orderSpec.order; // -1, 0, 1 + isGroup = true; + break; + } + } + if (!isGroup) { + plainOrderSpecs.push(orderSpec); + } + } + return { + superHeaderRendering: superHeaderRendering, + isVGrouping: isVGrouping, + groupSpecs: groupSpecs, + colSpecs: groupColSpecs.concat(plainColSpecs), + orderSpecs: plainOrderSpecs, + }; + } + + var resourceTimelinePlugin = createPlugin({ + deps: [ + premiumCommonPlugin, + resourceCommonPlugin, + timelinePlugin, + ], + initialView: 'resourceTimelineDay', + views: { + resourceTimeline: { + type: 'timeline', + component: ResourceTimelineView, + needsResourceData: true, + resourceAreaWidth: '30%', + resourcesInitiallyExpanded: true, + eventResizableFromStart: true, // TODO: not DRY with this same setting in the main timeline config + }, + resourceTimelineDay: { + type: 'resourceTimeline', + duration: { days: 1 }, + }, + resourceTimelineWeek: { + type: 'resourceTimeline', + duration: { weeks: 1 }, + }, + resourceTimelineMonth: { + type: 'resourceTimeline', + duration: { months: 1 }, + }, + resourceTimelineYear: { + type: 'resourceTimeline', + duration: { years: 1 }, + }, + }, + }); + + globalPlugins.push(interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, plugin$1, plugin, googleCalendarPlugin, scrollGridPlugin, adaptivePlugin, timelinePlugin, resourceCommonPlugin, resourceDayGridPlugin, resourceTimeGridPlugin, resourceTimelinePlugin); + + exports.AbstractResourceDayTableModel = AbstractResourceDayTableModel; + exports.BASE_OPTION_DEFAULTS = BASE_OPTION_DEFAULTS; + exports.BASE_OPTION_REFINERS = BASE_OPTION_REFINERS; + exports.BaseComponent = BaseComponent; + exports.BgEvent = BgEvent; + exports.BootstrapTheme = BootstrapTheme$1; + exports.Calendar = Calendar; + exports.CalendarApi = CalendarApi; + exports.CalendarContent = CalendarContent; + exports.CalendarDataManager = CalendarDataManager; + exports.CalendarDataProvider = CalendarDataProvider; + exports.CalendarRoot = CalendarRoot; + exports.Component = Component; + exports.ContentHook = ContentHook; + exports.CustomContentRenderContext = CustomContentRenderContext; + exports.DEFAULT_RESOURCE_ORDER = DEFAULT_RESOURCE_ORDER; + exports.DateComponent = DateComponent; + exports.DateEnv = DateEnv; + exports.DateProfileGenerator = DateProfileGenerator; + exports.DayCellContent = DayCellContent; + exports.DayCellRoot = DayCellRoot; + exports.DayGridView = DayTableView; + exports.DayHeader = DayHeader; + exports.DayResourceTableModel = DayResourceTableModel; + exports.DaySeriesModel = DaySeriesModel; + exports.DayTable = DayTable; + exports.DayTableModel = DayTableModel; + exports.DayTableSlicer = DayTableSlicer; + exports.DayTimeCols = DayTimeCols; + exports.DayTimeColsSlicer = DayTimeColsSlicer; + exports.DayTimeColsView = DayTimeColsView; + exports.DelayedRunner = DelayedRunner; + exports.Draggable = ExternalDraggable; + exports.ElementDragging = ElementDragging; + exports.ElementScrollController = ElementScrollController; + exports.Emitter = Emitter; + exports.EventApi = EventApi; + exports.EventRoot = EventRoot; + exports.EventSourceApi = EventSourceApi; + exports.FeaturefulElementDragging = FeaturefulElementDragging; + exports.Fragment = Fragment; + exports.Interaction = Interaction; + exports.ListView = ListView; + exports.MoreLinkRoot = MoreLinkRoot; + exports.MountHook = MountHook; + exports.NamedTimeZoneImpl = NamedTimeZoneImpl; + exports.NowIndicatorRoot = NowIndicatorRoot; + exports.NowTimer = NowTimer; + exports.PointerDragging = PointerDragging; + exports.PositionCache = PositionCache; + exports.RefMap = RefMap; + exports.RenderHook = RenderHook; + exports.ResourceApi = ResourceApi; + exports.ResourceDayHeader = ResourceDayHeader; + exports.ResourceDayTable = ResourceDayTable; + exports.ResourceDayTableModel = ResourceDayTableModel; + exports.ResourceDayTableView = ResourceDayTableView; + exports.ResourceDayTimeCols = ResourceDayTimeCols; + exports.ResourceDayTimeColsView = ResourceDayTimeColsView; + exports.ResourceLabelRoot = ResourceLabelRoot; + exports.ResourceSplitter = ResourceSplitter; + exports.ResourceTimelineLane = ResourceTimelineLane; + exports.ResourceTimelineView = ResourceTimelineView; + exports.ScrollController = ScrollController; + exports.ScrollGrid = ScrollGrid; + exports.ScrollResponder = ScrollResponder; + exports.Scroller = Scroller; + exports.SegHierarchy = SegHierarchy; + exports.SimpleScrollGrid = SimpleScrollGrid; + exports.Slicer = Slicer; + exports.Splitter = Splitter; + exports.SpreadsheetRow = SpreadsheetRow; + exports.StandardEvent = StandardEvent; + exports.Table = Table; + exports.TableDateCell = TableDateCell; + exports.TableDowCell = TableDowCell; + exports.TableView = TableView; + exports.Theme = Theme; + exports.ThirdPartyDraggable = ThirdPartyDraggable; + exports.TimeCols = TimeCols; + exports.TimeColsSlatsCoords = TimeColsSlatsCoords; + exports.TimeColsView = TimeColsView; + exports.TimelineCoords = TimelineCoords; + exports.TimelineHeader = TimelineHeader; + exports.TimelineHeaderRows = TimelineHeaderRows; + exports.TimelineLane = TimelineLane; + exports.TimelineLaneBg = TimelineLaneBg; + exports.TimelineLaneSlicer = TimelineLaneSlicer; + exports.TimelineSlats = TimelineSlats; + exports.TimelineView = TimelineView; + exports.VResourceJoiner = VResourceJoiner; + exports.VResourceSplitter = VResourceSplitter; + exports.ViewApi = ViewApi; + exports.ViewContextType = ViewContextType; + exports.ViewRoot = ViewRoot; + exports.WeekNumberRoot = WeekNumberRoot; + exports.WindowScrollController = WindowScrollController; + exports.addDays = addDays; + exports.addDurations = addDurations; + exports.addMs = addMs; + exports.addWeeks = addWeeks; + exports.allowContextMenu = allowContextMenu; + exports.allowSelection = allowSelection; + exports.applyMutationToEventStore = applyMutationToEventStore; + exports.applyStyle = applyStyle; + exports.applyStyleProp = applyStyleProp; + exports.asCleanDays = asCleanDays; + exports.asRoughMinutes = asRoughMinutes; + exports.asRoughMs = asRoughMs; + exports.asRoughSeconds = asRoughSeconds; + exports.binarySearch = binarySearch; + exports.buildClassNameNormalizer = buildClassNameNormalizer; + exports.buildDayRanges = buildDayRanges; + exports.buildDayTableModel = buildDayTableModel; + exports.buildEntryKey = buildEntryKey; + exports.buildEventApis = buildEventApis; + exports.buildEventRangeKey = buildEventRangeKey; + exports.buildHashFromArray = buildHashFromArray; + exports.buildIsoString = buildIsoString; + exports.buildNavLinkAttrs = buildNavLinkAttrs; + exports.buildResourceFields = buildResourceFields; + exports.buildRowNodes = buildRowNodes; + exports.buildSegCompareObj = buildSegCompareObj; + exports.buildSegTimeText = buildSegTimeText; + exports.buildSlatCols = buildSlatCols; + exports.buildSlatMetas = buildSlatMetas; + exports.buildTimeColsModel = buildTimeColsModel; + exports.buildTimelineDateProfile = buildTimelineDateProfile; + exports.collectFromHash = collectFromHash; + exports.combineEventUis = combineEventUis; + exports.compareByFieldSpec = compareByFieldSpec; + exports.compareByFieldSpecs = compareByFieldSpecs; + exports.compareNumbers = compareNumbers; + exports.compareObjs = compareObjs; + exports.computeEarliestSegStart = computeEarliestSegStart; + exports.computeEdges = computeEdges; + exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat; + exports.computeHeightAndMargins = computeHeightAndMargins; + exports.computeInnerRect = computeInnerRect; + exports.computeRect = computeRect; + exports.computeSegDraggable = computeSegDraggable; + exports.computeSegEndResizable = computeSegEndResizable; + exports.computeSegStartResizable = computeSegStartResizable; + exports.computeShrinkWidth = computeShrinkWidth; + exports.computeSmallestCellWidth = computeSmallestCellWidth; + exports.computeVisibleDayRange = computeVisibleDayRange; + exports.config = config; + exports.constrainPoint = constrainPoint; + exports.coordToCss = coordToCss; + exports.coordsToCss = coordsToCss; + exports.createAriaClickAttrs = createAriaClickAttrs; + exports.createContext = createContext; + exports.createDuration = createDuration; + exports.createElement = createElement; + exports.createEmptyEventStore = createEmptyEventStore; + exports.createEventInstance = createEventInstance; + exports.createEventUi = createEventUi; + exports.createFormatter = createFormatter; + exports.createPlugin = createPlugin; + exports.createPortal = createPortal; + exports.createRef = createRef; + exports.diffDates = diffDates; + exports.diffDayAndTime = diffDayAndTime; + exports.diffDays = diffDays; + exports.diffPoints = diffPoints; + exports.diffWeeks = diffWeeks; + exports.diffWholeDays = diffWholeDays; + exports.diffWholeWeeks = diffWholeWeeks; + exports.disableCursor = disableCursor; + exports.elementClosest = elementClosest; + exports.elementMatches = elementMatches; + exports.enableCursor = enableCursor; + exports.eventTupleToStore = eventTupleToStore; + exports.filterEventStoreDefs = filterEventStoreDefs; + exports.filterHash = filterHash; + exports.findDirectChildren = findDirectChildren; + exports.findElements = findElements; + exports.flattenResources = flattenResources; + exports.flexibleCompare = flexibleCompare; + exports.flushSync = flushSync; + exports.formatDate = formatDate; + exports.formatDayString = formatDayString; + exports.formatIsoTimeString = formatIsoTimeString; + exports.formatRange = formatRange; + exports.getAllowYScrolling = getAllowYScrolling; + exports.getCanVGrowWithinCell = getCanVGrowWithinCell; + exports.getClippingParents = getClippingParents; + exports.getDateMeta = getDateMeta; + exports.getDayClassNames = getDayClassNames; + exports.getDefaultEventEnd = getDefaultEventEnd; + exports.getElRoot = getElRoot; + exports.getElSeg = getElSeg; + exports.getEntrySpanEnd = getEntrySpanEnd; + exports.getEventClassNames = getEventClassNames; + exports.getEventTargetViaRoot = getEventTargetViaRoot; + exports.getIsRtlScrollbarOnLeft = getIsRtlScrollbarOnLeft; + exports.getPublicId = getPublicId; + exports.getRectCenter = getRectCenter; + exports.getRelevantEvents = getRelevantEvents; + exports.getScrollGridClassNames = getScrollGridClassNames; + exports.getScrollbarWidths = getScrollbarWidths; + exports.getSectionClassNames = getSectionClassNames; + exports.getSectionHasLiquidHeight = getSectionHasLiquidHeight; + exports.getSegAnchorAttrs = getSegAnchorAttrs; + exports.getSegMeta = getSegMeta; + exports.getSlotClassNames = getSlotClassNames; + exports.getStickyFooterScrollbar = getStickyFooterScrollbar; + exports.getStickyHeaderDates = getStickyHeaderDates; + exports.getUnequalProps = getUnequalProps; + exports.getUniqueDomId = getUniqueDomId; + exports.globalLocales = globalLocales; + exports.globalPlugins = globalPlugins; + exports.greatestDurationDenominator = greatestDurationDenominator; + exports.groupIntersectingEntries = groupIntersectingEntries; + exports.guid = guid; + exports.hasBgRendering = hasBgRendering; + exports.hasShrinkWidth = hasShrinkWidth; + exports.identity = identity; + exports.interactionSettingsStore = interactionSettingsStore; + exports.interactionSettingsToStore = interactionSettingsToStore; + exports.intersectRanges = intersectRanges; + exports.intersectRects = intersectRects; + exports.intersectSpans = intersectSpans; + exports.isArraysEqual = isArraysEqual; + exports.isColPropsEqual = isColPropsEqual; + exports.isDateSelectionValid = isDateSelectionValid; + exports.isDateSpansEqual = isDateSpansEqual; + exports.isGroupsEqual = isGroupsEqual; + exports.isInt = isInt; + exports.isInteractionValid = isInteractionValid; + exports.isMultiDayRange = isMultiDayRange; + exports.isPropsEqual = isPropsEqual; + exports.isPropsValid = isPropsValid; + exports.isValidDate = isValidDate$1; + exports.joinSpans = joinSpans; + exports.listenBySelector = listenBySelector; + exports.mapHash = mapHash; + exports.memoize = memoize; + exports.memoizeArraylike = memoizeArraylike; + exports.memoizeHashlike = memoizeHashlike; + exports.memoizeObjArg = memoizeObjArg; + exports.mergeEventStores = mergeEventStores; + exports.multiplyDuration = multiplyDuration; + exports.padStart = padStart; + exports.parseBusinessHours = parseBusinessHours; + exports.parseClassNames = parseClassNames; + exports.parseDragMeta = parseDragMeta; + exports.parseEventDef = parseEventDef; + exports.parseFieldSpecs = parseFieldSpecs; + exports.parseMarker = parse; + exports.pointInsideRect = pointInsideRect; + exports.preventContextMenu = preventContextMenu; + exports.preventDefault = preventDefault; + exports.preventSelection = preventSelection; + exports.rangeContainsMarker = rangeContainsMarker; + exports.rangeContainsRange = rangeContainsRange; + exports.rangesEqual = rangesEqual; + exports.rangesIntersect = rangesIntersect; + exports.refineEventDef = refineEventDef; + exports.refineProps = refineProps; + exports.removeElement = removeElement; + exports.removeExact = removeExact; + exports.render = render; + exports.renderChunkContent = renderChunkContent; + exports.renderFill = renderFill; + exports.renderMicroColGroup = renderMicroColGroup; + exports.renderScrollShim = renderScrollShim; + exports.requestJson = requestJson; + exports.sanitizeShrinkWidth = sanitizeShrinkWidth; + exports.setElSeg = setElSeg; + exports.setRef = setRef; + exports.setScrollFromLeftEdge = setScrollFromLeftEdge; + exports.sliceEventStore = sliceEventStore; + exports.sliceEvents = sliceEvents; + exports.sortEventSegs = sortEventSegs; + exports.startOfDay = startOfDay; + exports.translateRect = translateRect; + exports.triggerDateSelect = triggerDateSelect; + exports.unmountComponentAtNode = unmountComponentAtNode; + exports.unpromisify = unpromisify; + exports.version = version; + exports.whenTransitionDone = whenTransitionDone; + exports.wholeDivideDurations = wholeDivideDurations; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +}({})); diff --git a/html/sternwarte/kalender/lib/main.min.css b/html/sternwarte/kalender/lib/main.min.css new file mode 100644 index 0000000..b3a5c80 --- /dev/null +++ b/html/sternwarte/kalender/lib/main.min.css @@ -0,0 +1 @@ +.fc-icon,.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.fc .fc-button,.fc-icon{text-transform:none;font-weight:400}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc .fc-button:not(:disabled),.fc a[data-navlink],.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-unselectable{user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc{display:flex;flex-direction:column;font-size:1em}.fc .fc-button,.fc-icon{display:inline-block;text-align:center}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{vertical-align:top;padding:0}.fc .fc-button,.fc .fc-button .fc-icon,.fc .fc-button-group,.fc .fc-timegrid-slot-label{vertical-align:middle}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format('truetype');font-weight:400;font-style:normal}.fc-icon{width:1em;height:1em;user-select:none;font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc .fc-scroller-harness-liquid,.fc .fc-scroller-liquid,.fc .fc-scrollgrid-liquid{height:100%}.fc-icon-chevron-left:before{content:"\e900"}.fc-icon-chevron-right:before{content:"\e901"}.fc-icon-chevrons-left:before{content:"\e902"}.fc-icon-chevrons-right:before{content:"\e903"}.fc-icon-minus-square:before{content:"\e904"}.fc-icon-plus-square:before{content:"\e905"}.fc-icon-x:before{content:"\e906"}.fc .fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button-primary:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color,#1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color,#1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color,#1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color,#151e27)}.fc .fc-button .fc-icon{font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color,#fff);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business,.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color,rgba(215,215,215,.3))}.fc .fc-bg-event{background:var(--fc-bg-event-color,#8fdf82);opacity:.3;opacity:var(--fc-bg-event-opacity,.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size,.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color,rgba(188,232,241,.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer,.fc-h-event{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width,8px)/ 2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width,1px);width:8px;width:var(--fc-event-resizer-dot-total-width,8px);height:8px;height:var(--fc-event-resizer-dot-total-width,8px);border-style:solid;border-color:inherit;background:var(--fc-page-bg-color,#fff)}.fc-event-selected .fc-event-resizer:before{content:'';position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after,.fc-event:focus:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color,rgba(0,0,0,.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-h-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness,8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc .fc-popover{position:absolute;z-index:9999;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd);background:var(--fc-page-bg-color,#fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}:root{--fc-daygrid-event-dot-width:8px;--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin-top:1px}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{content:"";clear:both;display:table}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));color:grey;color:var(--fc-neutral-text-color,grey)}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:700}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:0 4px;box-sizing:content-box;width:0;height:0;border:4px solid #3788d8;border:calc(var(--fc-daygrid-event-dot-width,8px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:4px;border-radius:calc(var(--fc-daygrid-event-dot-width,8px)/ 2)}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{display:block;border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-v-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff);height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness,8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-body,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0}.fc .fc-timegrid-slot:empty:before{content:'\00a0'}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc-timegrid-more-link,.fc-timeline-more-link{background:var(--fc-more-link-bg-color,#d0d0d0);cursor:pointer}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight,.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{position:absolute;top:0;bottom:0;left:0;right:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px var(--fc-page-bg-color,#fff)}.fc-timegrid-event,.fc-timegrid-more-link{font-size:.85em;font-size:var(--fc-small-font-size,.85em);border-radius:3px}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size,.85em);margin-bottom:1px}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:'\00a0-\00a0'}.fc-timegrid-event-short .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-timegrid-more-link{position:absolute;z-index:9999;color:inherit;color:var(--fc-more-link-text-color,inherit);margin-bottom:1px}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red);border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-theme-standard .fc-list{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-list-empty{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:sticky;top:0;background:var(--fc-page-bg-color,#fff)}.fc .fc-list-table thead{position:absolute;left:-10000px}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:#f5f5f5;background-color:var(--fc-list-event-hover-bg-color,#f5f5f5)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;box-sizing:content-box;width:0;height:0;border:5px solid #3788d8;border:calc(var(--fc-list-event-dot-width,10px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:5px;border-radius:calc(var(--fc-list-event-dot-width,10px)/ 2)}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit}.fc-theme-bootstrap5 a:not([href]){color:inherit;text-decoration:inherit}.fc-theme-bootstrap5 .fc-list,.fc-theme-bootstrap5 .fc-scrollgrid,.fc-theme-bootstrap5 td,.fc-theme-bootstrap5 th{border:1px solid var(--bs-gray-400)}.fc-theme-bootstrap5 .fc-scrollgrid{border-right-width:0;border-bottom-width:0}.fc-theme-bootstrap5-shaded{background-color:var(--bs-gray-200)}.fc .fc-event,.fc .fc-scrollgrid table tr{-moz-column-break-inside:avoid;break-inside:avoid}.fc-media-print{display:block;max-width:100%}.fc-media-print .fc-bg-event,.fc-media-print .fc-non-business,.fc-media-print .fc-timegrid-axis-chunk,.fc-media-print .fc-timegrid-slots,.fc-media-print .fc-timeline-slots{display:none}.fc-media-print .fc-h-event,.fc-media-print .fc-toolbar button,.fc-media-print .fc-v-event{color:#000!important;background:#fff!important}.fc-media-print .fc-event,.fc-media-print .fc-event-main{color:#000!important}.fc-media-print .fc-timegrid-event{margin:.5em 0}.fc .fc-timeline-body{min-height:100%;position:relative;z-index:1}.fc .fc-timeline-slots{position:absolute;z-index:1;top:0;bottom:0}.fc .fc-timeline-slots>table{height:100%}.fc .fc-timeline-slot-minor{border-style:dotted}.fc .fc-timeline-slot-frame{display:flex;align-items:center;justify-content:center}.fc .fc-timeline-header-row-chrono .fc-timeline-slot-frame{justify-content:flex-start}.fc .fc-timeline-header-row:last-child .fc-timeline-slot-frame{overflow:hidden}.fc .fc-timeline-slot-cushion{padding:4px 5px;white-space:nowrap}.fc-direction-ltr .fc-timeline-slot{border-right:0!important}.fc-direction-rtl .fc-timeline-slot{border-left:0!important}.fc .fc-timeline-now-indicator-container{position:absolute;z-index:4;top:0;bottom:0;left:0;right:0;width:0}.fc .fc-timeline-now-indicator-arrow,.fc .fc-timeline-now-indicator-line{position:absolute;top:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc .fc-timeline-now-indicator-arrow{margin:0 -6px;border-width:6px 5px 0;border-left-color:transparent;border-right-color:transparent}.fc .fc-timeline-now-indicator-line{margin:0 -1px;bottom:0;border-width:0 0 0 1px}.fc .fc-timeline-events{position:relative;z-index:3;width:0}.fc .fc-timeline-event-harness,.fc .fc-timeline-more-link{position:absolute;top:0}.fc-timeline-event{z-index:1;position:relative;display:flex;align-items:center;border-radius:0;padding:2px 1px;margin-bottom:1px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-timeline-event.fc-event-mirror{z-index:2}.fc-timeline-event .fc-event-main{flex-grow:1;flex-shrink:1;min-width:0}.fc-timeline-event .fc-event-time{font-weight:700}.fc-timeline-event .fc-event-time,.fc-timeline-event .fc-event-title{white-space:nowrap;padding:0 2px}.fc-direction-ltr .fc-timeline-event.fc-event-end,.fc-direction-ltr .fc-timeline-more-link{margin-right:1px}.fc-direction-rtl .fc-timeline-event.fc-event-end,.fc-direction-rtl .fc-timeline-more-link{margin-left:1px}.fc-timeline-overlap-disabled .fc-timeline-event{padding-top:5px;padding-bottom:5px;margin-bottom:0}.fc-timeline-event:not(.fc-event-end):after,.fc-timeline-event:not(.fc-event-start):before{content:"";flex-grow:0;flex-shrink:0;opacity:.5;width:0;height:0;margin:0 1px;border:5px solid #000;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-ltr .fc-timeline-event:not(.fc-event-start):before,.fc-direction-rtl .fc-timeline-event:not(.fc-event-end):after{border-left:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-end):after,.fc-direction-rtl .fc-timeline-event:not(.fc-event-start):before{border-right:0}.fc-timeline-more-link{font-size:.85em;font-size:var(--fc-small-font-size,.85em);color:inherit;color:var(--fc-more-link-text-color,inherit);padding:1px}.fc-timeline-more-link-inner{display:inline-block;left:0;right:0;padding:2px}.fc .fc-timeline-bg{position:absolute;z-index:2;top:0;bottom:0;width:0;left:0;right:0}.fc .fc-timeline-bg .fc-non-business{z-index:1}.fc .fc-timeline-bg .fc-bg-event{z-index:2}.fc .fc-timeline-bg .fc-highlight{z-index:3}.fc .fc-timeline-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-timeline-lane-frame,.fc-timeline-body-expandrows td.fc-timeline-lane{position:relative}.fc .fc-resource-timeline-divider{width:3px;cursor:col-resize}.fc .fc-resource-group{font-weight:inherit;text-align:inherit}.fc .fc-resource-timeline .fc-resource-group:not([rowspan]){background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc .fc-timeline-overlap-enabled .fc-timeline-lane-frame .fc-timeline-events{box-sizing:content-box;padding-bottom:10px}.fc-timeline-body-expandrows .fc-timeline-lane-frame{position:static}.fc-datagrid-cell-frame-liquid{height:100%}.fc-liquid-hack .fc-datagrid-cell-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-datagrid-header .fc-datagrid-cell-frame{position:relative;display:flex;justify-content:flex-start;align-items:center}.fc .fc-datagrid-cell-resizer{position:absolute;z-index:1;top:0;bottom:0;width:5px;cursor:col-resize}.fc .fc-datagrid-cell-cushion{padding:8px;white-space:nowrap;overflow:hidden}.fc .fc-datagrid-expander{cursor:pointer;opacity:.65}.fc .fc-datagrid-expander .fc-icon{display:inline-block;width:1em}.fc .fc-datagrid-expander-placeholder{cursor:auto}.fc .fc-resource-timeline-flat .fc-datagrid-expander-placeholder{display:none}.fc-direction-ltr .fc-datagrid-cell-resizer{right:-3px}.fc-direction-rtl .fc-datagrid-cell-resizer{left:-3px}.fc-direction-ltr .fc-datagrid-expander{margin-right:3px}.fc-direction-rtl .fc-datagrid-expander{margin-left:3px} \ No newline at end of file diff --git a/html/sternwarte/kalender/lib/main.min.js b/html/sternwarte/kalender/lib/main.min.js new file mode 100644 index 0000000..9d4cbe0 --- /dev/null +++ b/html/sternwarte/kalender/lib/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Scheduler v5.11.3 +Docs & License: https://fullcalendar.io/scheduler +(c) 2022 Adam Shaw +*/ +var FullCalendar=function(e){"use strict";var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,n)};function n(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}var r=function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n3)for(n=[n],i=3;i0?g(v.type,v.props,v.key,null,v.__v):v)){if(v.__=n,v.__b=n.__b+1,null===(h=C[p])||h&&v.key==h.key&&v.type===h.type)C[p]=void 0;else for(f=0;f3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),W(v(oe,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}(ne.prototype=new y).__e=function(e){var t=this,n=te(t.__v),r=t.o.get(e);return r[0]++,function(o){var i=function(){t.props.revealOrder?(r.push(o),re(t,e,r)):o()};n?n(i):i()}},ne.prototype.render=function(e){this.u=null,this.o=new Map;var t=w(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},ne.prototype.componentDidUpdate=ne.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){re(e,n,t)}))};var ae="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,se=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,le=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var ue=i.event;function ce(){}function de(){return this.cancelBubble}function pe(){return this.defaultPrevented}i.event=function(e){return ue&&(e=ue(e)),e.persist=ce,e.isPropagationStopped=de,e.isDefaultPrevented=pe,e.nativeEvent=e};var fe={configurable:!0,get:function(){return this.class}},he=i.vnode;i.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var i=n[o];"value"===o&&"defaultValue"in n&&null==i||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===i?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!le(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():se.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===i&&(i=void 0),r[o]=i)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=w(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=w(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(fe.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",fe)),e.$$typeof=ae,he&&he(e)};var ve=i.__r;i.__r=function(e){ve&&ve(e)},"object"==typeof performance&&"function"==typeof performance.now&&performance.now.bind(performance);var ge="undefined"!=typeof globalThis?globalThis:window;ge.FullCalendarVDom?console.warn("FullCalendar VDOM already loaded"):ge.FullCalendarVDom={Component:y,createElement:v,render:W,createRef:function(){return{current:null}},Fragment:m,createContext:function(e){var t=function(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(b)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}(e),n=t.Provider;return t.Provider=function(){var e=this,t=!this.getChildContext,r=n.apply(this,arguments);if(t){var o=[];this.shouldComponentUpdate=function(t){e.props.value!==t.value&&o.forEach((function(e){e.context=t.value,e.forceUpdate()}))},this.sub=function(e){o.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){o.splice(o.indexOf(e),1),t&&t.call(e)}}}return r},t},createPortal:function(e,t){return v(ie,{__v:e,i:t})},flushSync:function(e){e();var t=i.debounceRendering,n=[];function r(e){n.push(e)}i.debounceRendering=r,W(v(me,{}),document.createElement("div"));for(;n.length;)n.shift()();i.debounceRendering=t},unmountComponentAtNode:function(e){W(null,e)}};var me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return v("div",{})},t.prototype.componentDidMount=function(){this.setState({})},t}(y);var ye=function(){function e(e,t){this.context=e,this.internalEventSource=t}return e.prototype.remove=function(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"format",{get:function(){return this.internalEventSource.meta.format},enumerable:!1,configurable:!0}),e}();function Se(e){e.parentNode&&e.parentNode.removeChild(e)}function Ee(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(be(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function be(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function Ce(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o=0;i-=1){var a=e[i][r];if("object"==typeof a&&a)o.unshift(a);else if(void 0!==a){n[r]=a;break}}o.length&&(n[r]=Et(o))}for(i=e.length-1;i>=0;i-=1){var s=e[i];for(var l in s)l in n||(n[l]=s[l])}return n}function bt(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Ct(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Dt(e){for(var t={},n=0,r=e;n10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",Zt(t,!0)))),r}function qt(e){return e.toISOString().replace(/T.*$/,"")}function Yt(e){return Xe(e.getUTCHours(),2)+":"+Xe(e.getUTCMinutes(),2)+":"+Xe(e.getUTCSeconds(),2)}function Zt(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=Math.round(r%60);return t?n+Xe(o,2)+":"+Xe(i,2):"GMT"+n+o+(i?":"+Xe(i,2):"")}function Xt(e,t){for(var n=0,r=0;r1)||"numeric"!==o.year&&"2-digit"!==o.year||"numeric"!==o.month&&"2-digit"!==o.month||"numeric"!==o.day&&"2-digit"!==o.day||(s=1);var l=this.format(e,n),u=this.format(t,n);if(l===u)return l;var c=cn(function(e,t){var n={};for(var r in e)(!(r in nn)||nn[r]<=t)&&(n[r]=e[r]);return n}(o,s),i,n),d=c(e),p=c(t),f=function(e,t,n,r){var o=0;for(;o=Vt(t)&&(r=nt(r,1))}return e.start&&(n=ut(e.start),r&&r<=n&&(r=nt(n,1))),{start:n,end:r}}function Yn(e){var t=qn(e);return it(t.start,t.end)>1}function Zn(e,t,n,r){return"year"===r?Ht(n.diffWholeYears(e,t),"year"):"month"===r?Ht(n.diffWholeMonths(e,t),"month"):at(e,t)}function Xn(e,t){var n,r,o=[],i=t.start;for(e.sort(Kn),n=0;ni&&o.push({start:i,end:r.start}),r.end>i&&(i=r.end);return it.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function tr(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t=(n||t.end),isToday:t&&tr(t,r.start)}}function vr(e){var t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function gr(e){return e.instance?e.instance.instanceId:e.def.defId+":"+e.range.start.toISOString()}function mr(e,t){var n=e.eventRange,r=n.def,o=n.instance,i=r.url;if(i)return{href:i};var a=t.emitter,s=t.options.eventInteractive;return null==s&&null==(s=r.interactive)&&(s=Boolean(a.hasHandlers("eventClick"))),s?Ae((function(e){a.trigger("eventClick",{el:e.target,event:new Ar(t,r,o),jsEvent:e,view:t.viewApi})})):{}}var yr={start:wn,end:wn,allDay:Boolean};function Sr(e,t,n){var o=function(e,t){var n=Rn(e,yr),o=n.refined,i=n.extra,a=o.start?t.createMarkerMeta(o.start):null,s=o.end?t.createMarkerMeta(o.end):null,l=o.allDay;null==l&&(l=a&&a.isTimeUnspecified&&(!s||s.isTimeUnspecified));return r({range:{start:a?a.marker:null,end:s?s.marker:null},allDay:l},i)}(e,t),i=o.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return o}function Er(e,t){return Jn(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)}function br(e,t,n){return r(r({},Cr(e,t,n)),{timeZone:t.timeZone})}function Cr(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function Dr(e,t,n){var r=Vn({editable:!1},n),o=Gn(r.refined,r.extra,"",e.allDay,!0,n);return{def:o,ui:sr(o,t),instance:yt(o.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function Rr(e,t,n){n.emitter.trigger("select",r(r({},wr(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function wr(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.dateSpanTransforms;a=0;r-=1){var o=n[r].parseMeta(e);if(o)return{sourceDefId:r,meta:o}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Le(),sourceDefId:s.sourceDefId,meta:s.meta,ui:On(i,t),extendedProps:a}}return null}function Nr(e){return r(r(r({},Nn),Ir),e.pluginHooks.eventSourceRefiners)}function Hr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}var Or=function(){function e(){}return e.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},e.prototype.dispatch=function(e){return this.currentDataManager.dispatch(e)},Object.defineProperty(e.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),e.prototype.batchRendering=function(e){e()},e.prototype.updateSize=function(){this.trigger("_resize",!0)},e.prototype.setOption=function(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})},e.prototype.getOption=function(e){return this.currentDataManager.currentCalendarOptionsInput[e]},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},e.prototype.on=function(e,t){var n=this.currentDataManager;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn("Unknown listener name '"+e+"'")},e.prototype.off=function(e,t){this.currentDataManager.emitter.off(e,t)},e.prototype.trigger=function(e){for(var t,n=[],r=1;r=1?Math.min(o,i):o}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=rt(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),jt(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?vt(pt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?vt(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-ft(ht(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(ht(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?ft(ht(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(ht(e))*60):new Date(e.valueOf()-(t||0))},e}(),jr=[],qr={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},Yr=r(r({},qr),{buttonHints:{prev:"Previous $0",next:"Next $0",today:function(e,t){return"day"===t?"Today":"This "+e}},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:function(e){return"Show "+e+" more event"+(1===e?"":"s")}});function Zr(e){for(var t=e.length>0?e[0].code:"en",n=jr.concat(e),r={en:Yr},o=0,i=n;o0;o-=1){var i=r.slice(0,o).join("-");if(t[i])return t[i]}return null}(n,t)||Yr;return Kr(e,n,r)}(e,t):Kr(e.code,[e.code],e)}function Kr(e,t,n){var r=Et([qr,n],["buttonText"]);delete r.code;var o=r.week;return delete r.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function $r(e){var t=Xr(e.locale||"en",Zr([]).map);return new Gr(r(r({timeZone:mn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}var Jr,Qr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function eo(e,t){return Tn(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return r(r({},Qr),e)}))}(e),null,t)}function to(e,t){return e.left>=t.left&&e.left=t.top&&e.top
    / elements with colspans. + SOLUTION: making individual
    + _this.frameElRefs = new RefMap(); // the fc-daygrid-day-frame + _this.fgElRefs = new RefMap(); // the fc-daygrid-day-events + _this.segHarnessRefs = new RefMap(); // indexed by "instanceId:firstCol" + _this.rootElRef = createRef(); + _this.state = { + framePositions: null, + maxContentHeight: null, + eventInstanceHeights: {}, + }; + return _this; + } + TableRow.prototype.render = function () { + var _this = this; + var _a = this, props = _a.props, state = _a.state, context = _a.context; + var options = context.options; + var colCnt = props.cells.length; + var businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt); + var bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt); + var highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt); + var mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt); + var _b = computeFgSegPlacement(sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells), singleColPlacements = _b.singleColPlacements, multiColPlacements = _b.multiColPlacements, moreCnts = _b.moreCnts, moreMarginTops = _b.moreMarginTops; + var isForcedInvisible = // TODO: messy way to compute this + (props.eventDrag && props.eventDrag.affectedInstances) || + (props.eventResize && props.eventResize.affectedInstances) || + {}; + return (createElement("tr", { ref: this.rootElRef, role: "row" }, + props.renderIntro && props.renderIntro(), + props.cells.map(function (cell, col) { + var normalFgNodes = _this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); + var mirrorFgNodes = _this.renderFgSegs(col, buildMirrorPlacements$1(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); + return (createElement(TableCell, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), innerElRef: _this.frameElRefs.createRef(cell.key) /* FF problem, but okay to use for left/right. TODO: rename prop */, dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers /* even displaying weeknum for row, not necessarily day */, todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: _this.fgElRefs.createRef(cell.key), fgContent: ( // Fragment scopes the keys + createElement(Fragment, null, + createElement(Fragment, null, normalFgNodes), + createElement(Fragment, null, mirrorFgNodes))), bgContent: ( // Fragment scopes the keys + createElement(Fragment, null, + _this.renderFillSegs(highlightSegsByCol[col], 'highlight'), + _this.renderFillSegs(businessHoursByCol[col], 'non-business'), + _this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))) })); + }))); + }; + TableRow.prototype.componentDidMount = function () { + this.updateSizing(true); + }; + TableRow.prototype.componentDidUpdate = function (prevProps, prevState) { + var currentProps = this.props; + this.updateSizing(!isPropsEqual(prevProps, currentProps)); + }; + TableRow.prototype.getHighlightSegs = function () { + var props = this.props; + if (props.eventDrag && props.eventDrag.segs.length) { // messy check + return props.eventDrag.segs; + } + if (props.eventResize && props.eventResize.segs.length) { // messy check + return props.eventResize.segs; + } + return props.dateSelectionSegs; + }; + TableRow.prototype.getMirrorSegs = function () { + var props = this.props; + if (props.eventResize && props.eventResize.segs.length) { // messy check + return props.eventResize.segs; + } + return []; + }; + TableRow.prototype.renderFgSegs = function (col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) { + var context = this.context; + var eventSelection = this.props.eventSelection; + var framePositions = this.state.framePositions; + var defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1 + var isMirror = isDragging || isResizing || isDateSelecting; + var nodes = []; + if (framePositions) { + for (var _i = 0, segPlacements_1 = segPlacements; _i < segPlacements_1.length; _i++) { + var placement = segPlacements_1[_i]; + var seg = placement.seg; + var instanceId = seg.eventRange.instance.instanceId; + var key = instanceId + ':' + col; + var isVisible = placement.isVisible && !isForcedInvisible[instanceId]; + var isAbsolute = placement.isAbsolute; + var left = ''; + var right = ''; + if (isAbsolute) { + if (context.isRtl) { + right = 0; + left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]; + } + else { + left = 0; + right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]; + } + } + /* + known bug: events that are force to be list-item but span multiple days still take up space in later columns + todo: in print view, for multi-day events, don't display title within non-start/end segs + */ + nodes.push(createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: { + visibility: isVisible ? '' : 'hidden', + marginTop: isAbsolute ? '' : placement.marginTop, + top: isAbsolute ? placement.absoluteTop : '', + left: left, + right: right, + } }, hasListItemDisplay(seg) ? (createElement(TableListItemEvent, __assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))) : (createElement(TableBlockEvent, __assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))))); + } + } + return nodes; + }; + TableRow.prototype.renderFillSegs = function (segs, fillType) { + var isRtl = this.context.isRtl; + var todayRange = this.props.todayRange; + var framePositions = this.state.framePositions; + var nodes = []; + if (framePositions) { + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + var leftRightCss = isRtl ? { + right: 0, + left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol], + } : { + left: 0, + right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol], + }; + nodes.push(createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ? + createElement(BgEvent, __assign({ seg: seg }, getSegMeta(seg, todayRange))) : + renderFill(fillType))); + } + } + return createElement.apply(void 0, __spreadArray([Fragment, {}], nodes)); + }; + TableRow.prototype.updateSizing = function (isExternalSizingChange) { + var _a = this, props = _a.props, frameElRefs = _a.frameElRefs; + if (!props.forPrint && + props.clientWidth !== null // positioning ready? + ) { + if (isExternalSizingChange) { + var frameEls = props.cells.map(function (cell) { return frameElRefs.currentMap[cell.key]; }); + if (frameEls.length) { + var originEl = this.rootElRef.current; + this.setState({ + framePositions: new PositionCache(originEl, frameEls, true, // isHorizontal + false), + }); + } + } + var oldInstanceHeights = this.state.eventInstanceHeights; + var newInstanceHeights = this.queryEventInstanceHeights(); + var limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true; + this.safeSetState({ + // HACK to prevent oscillations of events being shown/hidden from max-event-rows + // Essentially, once you compute an element's height, never null-out. + // TODO: always display all events, as visibility:hidden? + eventInstanceHeights: __assign(__assign({}, oldInstanceHeights), newInstanceHeights), + maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null, + }); + } + }; + TableRow.prototype.queryEventInstanceHeights = function () { + var segElMap = this.segHarnessRefs.currentMap; + var eventInstanceHeights = {}; + // get the max height amongst instance segs + for (var key in segElMap) { + var height = Math.round(segElMap[key].getBoundingClientRect().height); + var instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key + eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height); + } + return eventInstanceHeights; + }; + TableRow.prototype.computeMaxContentHeight = function () { + var firstKey = this.props.cells[0].key; + var cellEl = this.cellElRefs.currentMap[firstKey]; + var fcContainerEl = this.fgElRefs.currentMap[firstKey]; + return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top; + }; + TableRow.prototype.getCellEls = function () { + var elMap = this.cellElRefs.currentMap; + return this.props.cells.map(function (cell) { return elMap[cell.key]; }); + }; + return TableRow; + }(DateComponent)); + TableRow.addStateEquality({ + eventInstanceHeights: isPropsEqual, + }); + function buildMirrorPlacements$1(mirrorSegs, colPlacements) { + if (!mirrorSegs.length) { + return []; + } + var topsByInstanceId = buildAbsoluteTopHash$1(colPlacements); // TODO: cache this at first render? + return mirrorSegs.map(function (seg) { return ({ + seg: seg, + isVisible: true, + isAbsolute: true, + absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId], + marginTop: 0, + }); }); + } + function buildAbsoluteTopHash$1(colPlacements) { + var topsByInstanceId = {}; + for (var _i = 0, colPlacements_1 = colPlacements; _i < colPlacements_1.length; _i++) { + var placements = colPlacements_1[_i]; + for (var _a = 0, placements_1 = placements; _a < placements_1.length; _a++) { + var placement = placements_1[_a]; + topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop; + } + } + return topsByInstanceId; + } + + var Table = /** @class */ (function (_super) { + __extends(Table, _super); + function Table() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.splitBusinessHourSegs = memoize(splitSegsByRow); + _this.splitBgEventSegs = memoize(splitSegsByRow); + _this.splitFgEventSegs = memoize(splitSegsByRow); + _this.splitDateSelectionSegs = memoize(splitSegsByRow); + _this.splitEventDrag = memoize(splitInteractionByRow); + _this.splitEventResize = memoize(splitInteractionByRow); + _this.rowRefs = new RefMap(); + _this.handleRootEl = function (rootEl) { + _this.rootEl = rootEl; + if (rootEl) { + _this.context.registerInteractiveComponent(_this, { + el: rootEl, + isHitComboAllowed: _this.props.isHitComboAllowed, + }); + } + else { + _this.context.unregisterInteractiveComponent(_this); + } + }; + return _this; + } + Table.prototype.render = function () { + var _this = this; + var props = this.props; + var dateProfile = props.dateProfile, dayMaxEventRows = props.dayMaxEventRows, dayMaxEvents = props.dayMaxEvents, expandRows = props.expandRows; + var rowCnt = props.cells.length; + var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt); + var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt); + var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt); + var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt); + var eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt); + var eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt); + var limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; + // if rows can't expand to fill fixed height, can't do balanced-height event limit + // TODO: best place to normalize these options? + if (limitViaBalanced && !expandRows) { + limitViaBalanced = false; + dayMaxEventRows = null; + dayMaxEvents = null; + } + var classNames = [ + 'fc-daygrid-body', + limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', + expandRows ? '' : 'fc-daygrid-body-natural', // will height of one row depend on the others? + ]; + return (createElement("div", { className: classNames.join(' '), ref: this.handleRootEl, style: { + // these props are important to give this wrapper correct dimensions for interactions + // TODO: if we set it here, can we avoid giving to inner tables? + width: props.clientWidth, + minWidth: props.tableMinWidth, + } }, + createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { return (createElement(Fragment, null, + createElement("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { + width: props.clientWidth, + minWidth: props.tableMinWidth, + height: expandRows ? props.clientHeight : '', + } }, + props.colGroupNode, + createElement("tbody", { role: "presentation" }, props.cells.map(function (cells, row) { return (createElement(TableRow, { ref: _this.rowRefs.createRef(row), key: cells.length + ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */ + : row // in case there are no cells (like when resource view is loading) + , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })); }))))); }))); + }; + // Hit System + // ---------------------------------------------------------------------------------------------------- + Table.prototype.prepareHits = function () { + this.rowPositions = new PositionCache(this.rootEl, this.rowRefs.collect().map(function (rowObj) { return rowObj.getCellEls()[0]; }), // first cell el in each row. TODO: not optimal + false, true); + this.colPositions = new PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row + true, // horizontal + false); + }; + Table.prototype.queryHit = function (positionLeft, positionTop) { + var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions; + var col = colPositions.leftToIndex(positionLeft); + var row = rowPositions.topToIndex(positionTop); + if (row != null && col != null) { + var cell = this.props.cells[row][col]; + return { + dateProfile: this.props.dateProfile, + dateSpan: __assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan), + dayEl: this.getCellEl(row, col), + rect: { + left: colPositions.lefts[col], + right: colPositions.rights[col], + top: rowPositions.tops[row], + bottom: rowPositions.bottoms[row], + }, + layer: 0, + }; + } + return null; + }; + Table.prototype.getCellEl = function (row, col) { + return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal + }; + Table.prototype.getCellRange = function (row, col) { + var start = this.props.cells[row][col].date; + var end = addDays(start, 1); + return { start: start, end: end }; + }; + return Table; + }(DateComponent)); + function isSegAllDay(seg) { + return seg.eventRange.def.allDay; + } + + var DayTableSlicer = /** @class */ (function (_super) { + __extends(DayTableSlicer, _super); + function DayTableSlicer() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.forceDayIfListItem = true; + return _this; + } + DayTableSlicer.prototype.sliceRange = function (dateRange, dayTableModel) { + return dayTableModel.sliceRange(dateRange); + }; + return DayTableSlicer; + }(Slicer)); + + var DayTable = /** @class */ (function (_super) { + __extends(DayTable, _super); + function DayTable() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.slicer = new DayTableSlicer(); + _this.tableRef = createRef(); + return _this; + } + DayTable.prototype.render = function () { + var _a = this, props = _a.props, context = _a.context; + return (createElement(Table, __assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint }))); + }; + return DayTable; + }(DateComponent)); + + var DayTableView = /** @class */ (function (_super) { + __extends(DayTableView, _super); + function DayTableView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.buildDayTableModel = memoize(buildDayTableModel); + _this.headerRef = createRef(); + _this.tableRef = createRef(); + return _this; + } + DayTableView.prototype.render = function () { + var _this = this; + var _a = this.context, options = _a.options, dateProfileGenerator = _a.dateProfileGenerator; + var props = this.props; + var dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator); + var headerContent = options.dayHeaders && (createElement(DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 })); + var bodyContent = function (contentArg) { return (createElement(DayTable, { ref: _this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint })); }; + return options.dayMinWidth + ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth) + : this.renderSimpleLayout(headerContent, bodyContent); + }; + return DayTableView; + }(TableView)); + function buildDayTableModel(dateProfile, dateProfileGenerator) { + var daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); + return new DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); + } + + var TableDateProfileGenerator = /** @class */ (function (_super) { + __extends(TableDateProfileGenerator, _super); + function TableDateProfileGenerator() { + return _super !== null && _super.apply(this, arguments) || this; + } + // Computes the date range that will be rendered. + TableDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { + var dateEnv = this.props.dateEnv; + var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay); + var start = renderRange.start; + var end = renderRange.end; + var endOfWeek; + // year and month views should be aligned with weeks. this is already done for week + if (/^(year|month)$/.test(currentRangeUnit)) { + start = dateEnv.startOfWeek(start); + // make end-of-week if not already + endOfWeek = dateEnv.startOfWeek(end); + if (endOfWeek.valueOf() !== end.valueOf()) { + end = addWeeks(endOfWeek, 1); + } + } + // ensure 6 weeks + if (this.props.monthMode && + this.props.fixedWeekCount) { + var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays + diffWeeks(start, end)); + end = addWeeks(end, 6 - rowCnt); + } + return { start: start, end: end }; + }; + return TableDateProfileGenerator; + }(DateProfileGenerator)); + + var dayGridPlugin = createPlugin({ + initialView: 'dayGridMonth', + views: { + dayGrid: { + component: DayTableView, + dateProfileGeneratorClass: TableDateProfileGenerator, + }, + dayGridDay: { + type: 'dayGrid', + duration: { days: 1 }, + }, + dayGridWeek: { + type: 'dayGrid', + duration: { weeks: 1 }, + }, + dayGridMonth: { + type: 'dayGrid', + duration: { months: 1 }, + monthMode: true, + fixedWeekCount: true, + }, + }, + }); + + var AllDaySplitter = /** @class */ (function (_super) { + __extends(AllDaySplitter, _super); + function AllDaySplitter() { + return _super !== null && _super.apply(this, arguments) || this; + } + AllDaySplitter.prototype.getKeyInfo = function () { + return { + allDay: {}, + timed: {}, + }; + }; + AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) { + if (dateSpan.allDay) { + return ['allDay']; + } + return ['timed']; + }; + AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) { + if (!eventDef.allDay) { + return ['timed']; + } + if (hasBgRendering(eventDef)) { + return ['timed', 'allDay']; + } + return ['allDay']; + }; + return AllDaySplitter; + }(Splitter)); + + var DEFAULT_SLAT_LABEL_FORMAT = createFormatter({ + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true, + meridiem: 'short', + }); + function TimeColsAxisCell(props) { + var classNames = [ + 'fc-timegrid-slot', + 'fc-timegrid-slot-label', + props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor', + ]; + return (createElement(ViewContextType.Consumer, null, function (context) { + if (!props.isLabeled) { + return (createElement("td", { className: classNames.join(' '), "data-time": props.isoTimeStr })); + } + var dateEnv = context.dateEnv, options = context.options, viewApi = context.viewApi; + var labelFormat = // TODO: fully pre-parse + options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : + Array.isArray(options.slotLabelFormat) ? createFormatter(options.slotLabelFormat[0]) : + createFormatter(options.slotLabelFormat); + var hookProps = { + level: 0, + time: props.time, + date: dateEnv.toDate(props.date), + view: viewApi, + text: dateEnv.format(props.date, labelFormat), + }; + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLabelClassNames, content: options.slotLabelContent, defaultContent: renderInnerContent$3, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": props.isoTimeStr }, + createElement("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, + createElement("div", { className: "fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion", ref: innerElRef }, innerContent)))); })); + })); + } + function renderInnerContent$3(props) { + return props.text; + } + + var TimeBodyAxis = /** @class */ (function (_super) { + __extends(TimeBodyAxis, _super); + function TimeBodyAxis() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimeBodyAxis.prototype.render = function () { + return this.props.slatMetas.map(function (slatMeta) { return (createElement("tr", { key: slatMeta.key }, + createElement(TimeColsAxisCell, __assign({}, slatMeta)))); }); + }; + return TimeBodyAxis; + }(BaseComponent)); + + var DEFAULT_WEEK_NUM_FORMAT = createFormatter({ week: 'short' }); + var AUTO_ALL_DAY_MAX_EVENT_ROWS = 5; + var TimeColsView = /** @class */ (function (_super) { + __extends(TimeColsView, _super); + function TimeColsView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.allDaySplitter = new AllDaySplitter(); // for use by subclasses + _this.headerElRef = createRef(); + _this.rootElRef = createRef(); + _this.scrollerElRef = createRef(); + _this.state = { + slatCoords: null, + }; + _this.handleScrollTopRequest = function (scrollTop) { + var scrollerEl = _this.scrollerElRef.current; + if (scrollerEl) { // TODO: not sure how this could ever be null. weirdness with the reducer + scrollerEl.scrollTop = scrollTop; + } + }; + /* Header Render Methods + ------------------------------------------------------------------------------------------------------------------*/ + _this.renderHeadAxis = function (rowKey, frameHeight) { + if (frameHeight === void 0) { frameHeight = ''; } + var options = _this.context.options; + var dateProfile = _this.props.dateProfile; + var range = dateProfile.renderRange; + var dayCnt = diffDays(range.start, range.end); + var navLinkAttrs = (dayCnt === 1) // only do in day views (to avoid doing in week views that dont need it) + ? buildNavLinkAttrs(_this.context, range.start, 'week') + : {}; + if (options.weekNumbers && rowKey === 'day') { + return (createElement(WeekNumberRoot, { date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, "aria-hidden": true, className: [ + 'fc-timegrid-axis', + 'fc-scrollgrid-shrink', + ].concat(classNames).join(' ') }, + createElement("div", { className: "fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid", style: { height: frameHeight } }, + createElement("a", __assign({ ref: innerElRef, className: "fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner" }, navLinkAttrs), innerContent)))); })); + } + return (createElement("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, + createElement("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } }))); + }; + /* Table Component Render Methods + ------------------------------------------------------------------------------------------------------------------*/ + // only a one-way height sync. we don't send the axis inner-content height to the DayGrid, + // but DayGrid still needs to have classNames on inner elements in order to measure. + _this.renderTableRowAxis = function (rowHeight) { + var _a = _this.context, options = _a.options, viewApi = _a.viewApi; + var hookProps = { + text: options.allDayText, + view: viewApi, + }; + return ( + // TODO: make reusable hook. used in list view too + createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner$1, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, "aria-hidden": true, className: [ + 'fc-timegrid-axis', + 'fc-scrollgrid-shrink', + ].concat(classNames).join(' ') }, + createElement("div", { className: 'fc-timegrid-axis-frame fc-scrollgrid-shrink-frame' + (rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : ''), style: { height: rowHeight } }, + createElement("span", { className: "fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner", ref: innerElRef }, innerContent)))); })); + }; + _this.handleSlatCoords = function (slatCoords) { + _this.setState({ slatCoords: slatCoords }); + }; + return _this; + } + // rendering + // ---------------------------------------------------------------------------------------------------- + TimeColsView.prototype.renderSimpleLayout = function (headerRowContent, allDayContent, timeContent) { + var _a = this, context = _a.context, props = _a.props; + var sections = []; + var stickyHeaderDates = getStickyHeaderDates(context.options); + if (headerRowContent) { + sections.push({ + type: 'header', + key: 'header', + isSticky: stickyHeaderDates, + chunk: { + elRef: this.headerElRef, + tableClassName: 'fc-col-header', + rowContent: headerRowContent, + }, + }); + } + if (allDayContent) { + sections.push({ + type: 'body', + key: 'all-day', + chunk: { content: allDayContent }, + }); + sections.push({ + type: 'body', + key: 'all-day-divider', + outerContent: ( // TODO: rename to cellContent so don't need to define
    ",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);var t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),Jr}var lo={defs:{},instances:{}},uo=function(){function e(){this.getKeysForEventDefs=$t(this._getKeysForEventDefs),this.splitDateSelection=$t(this._splitDateSpan),this.splitEventStore=$t(this._splitEventStore),this.splitIndividualUi=$t(this._splitIndividualUi),this.splitEventDrag=$t(this._splitInteraction),this.splitEventResize=$t(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),o=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),l=this.splitEventResize(e.eventResize),u={};for(var c in this.eventUiBuilders=Ct(n,(function(e,n){return t.eventUiBuilders[n]||$t(co)})),n){var d=n[c],p=a[c]||lo,f=this.eventUiBuilders[c];u[c]={businessHours:d.businessHours||e.businessHours,dateSelection:o[c]||null,eventStore:p,eventUiBases:f(e.eventUiBases[""],d.ui,i[c]),eventSelection:p.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:l[c]||null}}return u},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);nn:!!t&&e>=t.end)}}function fo(e,t){var n=["fc-day","fc-day-"+et[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}function ho(e,t){var n=["fc-slot","fc-slot-"+et[e.dow]];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n}var vo=vn({year:"numeric",month:"long",day:"numeric"}),go=vn({week:"long"});function mo(e,t,n,o){void 0===n&&(n="day"),void 0===o&&(o=!0);var i=e.dateEnv,a=e.options,s=e.calendarApi,l=i.format(t,"week"===n?go:vo);if(a.navLinks){var u=i.toDate(t),c=function(e){var r="day"===n?a.navLinkDayClick:"week"===n?a.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return r({title:Ke(a.navLinkHint,[l,u],l),"data-navlink":""},o?Oe(c):{onClick:c})}return{"aria-label":l}}var yo,So=null;function Eo(){return null===So&&(So=function(){var e=document.createElement("div");we(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
    ",document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Se(e),t}()),So}function bo(){return yo||(yo=function(){var e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);var t=Co(e);return document.body.removeChild(e),t}()),yo}function Co(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Do(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,o=parseInt(n.borderRightWidth,10)||0,i=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=Co(e),l=s.y-r-o,u={borderLeft:r,borderRight:o,borderTop:i,borderBottom:a,scrollbarBottom:s.x-i-a,scrollbarLeft:0,scrollbarRight:0};return Eo()&&"rtl"===n.direction?u.scrollbarLeft=l:u.scrollbarRight=l,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function Ro(e,t,n){void 0===t&&(t=!1);var r=n?e.getBoundingClientRect():wo(e),o=Do(e,t),i={left:r.left+o.borderLeft+o.scrollbarLeft,right:r.right-o.borderRight-o.scrollbarRight,top:r.top+o.borderTop,bottom:r.bottom-o.borderBottom-o.scrollbarBottom};return t&&(i.left+=o.paddingLeft,i.right-=o.paddingRight,i.top+=o.paddingTop,i.bottom-=o.paddingBottom),i}function wo(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function To(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function xo(e,t,n){var r=!1,o=function(){r||(r=!0,t.apply(this,arguments))},i=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(o,i);a&&"function"==typeof a.then&&a.then(o,i)}var _o=function(){function e(){this.handlers={},this.thisContext=null}return e.prototype.setThisContext=function(e){this.thisContext=e},e.prototype.setOptions=function(e){this.options=e},e.prototype.on=function(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)},e.prototype.off=function(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}(this.handlers,e,t)},e.prototype.trigger=function(e){for(var t=[],n=1;n=n[t]&&e=n[t]&&e0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()0},e.prototype.canScrollRight=function(){return this.getScrollLeft()=c.end?new Date(c.end.valueOf()-1):u),o=this.buildCurrentRangeInfo(e,t),i=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.range),o.unit,i),s=a=this.trimHiddenDays(a),d.showNonCurrentDates||(s=$n(s,o.range)),s=$n(s=this.adjustActiveRange(s),r),l=Qn(o.range,r),{validRange:r,currentRange:o.range,currentRangeUnit:o.unit,isRangeAllDay:i,activeRange:s,renderRange:a,slotMinTime:d.slotMinTime,slotMaxTime:d.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(o.duration)}},e.prototype.buildValidRange=function(){var e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.props,o=null,i=null,a=null;return r.duration?(o=r.duration,i=r.durationUnit,a=this.buildRangeFromDuration(e,t,o,i)):(n=this.props.dayCount)?(i="day",a=this.buildRangeFromDayCount(e,t,n)):(a=this.buildCustomVisibleRange(e))?i=r.dateEnv.greatestWholeUnit(a.start,a.end).unit:(i=Gt(o=this.getFallbackDuration()).unit,a=this.buildRangeFromDuration(e,t,o,i)),{duration:o,unit:i,range:a}},e.prototype.getFallbackDuration=function(){return Ht({day:1})},e.prototype.adjustActiveRange=function(e){var t=this.props,n=t.dateEnv,r=t.usesMinMaxTime,o=t.slotMinTime,i=t.slotMaxTime,a=e.start,s=e.end;return r&&(Ut(o)<0&&(a=ut(a),a=n.add(a,o)),Ut(i)>1&&(s=nt(s=ut(s),-1),s=n.add(s,i))),{start:a,end:s}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var o,i,a,s=this.props,l=s.dateEnv,u=s.dateAlignment;if(!u){var c=this.props.dateIncrement;u=c&&Vt(c)e.fetchRange.end}(e,t,n)})),t,!1,n)}function bi(e,t,n,r,o){var i={};for(var a in e){var s=e[a];t[a]?i[a]=Ci(s,n,r,o):i[a]=s}return i}function Ci(e,t,n,o){var i=o.options,a=o.calendarApi,s=o.pluginHooks.eventSourceDefs[e.sourceDefId],l=Le();return s.fetch({eventSource:e,range:t,isRefetch:n,context:o},(function(n){var r=n.rawEvents;i.eventSourceSuccess&&(r=i.eventSourceSuccess.call(a,r,n.xhr)||r),e.success&&(r=e.success.call(a,r,n.xhr)||r),o.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(function(n){console.warn(n.message,n),i.eventSourceFailure&&i.eventSourceFailure.call(a,n),e.failure&&e.failure(n),o.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),r(r({},e),{isFetching:!0,latestFetchId:l})}function Di(e,t){return bt(e,(function(e){return Ri(e,t)}))}function Ri(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function wi(e,t,n,r,o){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,o,i){if(t&&n===t.latestFetchId){var a=Tn(function(e,t,n){var r=n.options.eventDataTransform,o=t?t.eventDataTransform:null;o&&(e=Ti(e,o));r&&(e=Ti(e,r));return e}(o,t,i),t,i);return r&&(a=Mt(a,r,i)),Mn(xi(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,o);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=Mt(t,n,r));return Mn(e,t)}(e,t.eventStore,r?r.activeRange:null,o);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Mn(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?Mt(e,r.activeRange,o):e;case"REMOVE_EVENTS":return function(e,t){var n=e.defs,r=e.instances,o={},i={};for(var a in n)t.defs[a]||(o[a]=n[a]);for(var s in r)!t.instances[s]&&o[r[s].defId]&&(i[s]=r[s]);return{defs:o,instances:i}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return xi(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return In(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function Ti(e,t){var n;if(t){n=[];for(var r=0,o=e;r=200&&a.status<400){var e=!1,t=void 0;try{t=JSON.parse(a.responseText),e=!0}catch(e){}e?r(t,a):o("Failure parsing JSON",a)}else o("Request failed",a)},a.onerror=function(){o("Request failed",a)},a.send(i)}function Ai(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function Wi(e,t){for(var n=Rt(t.getCurrentData().eventSources),r=[],o=0,i=e;o1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}var Vi=function(){function e(e){var t=this;this.computeOptionsData=$t(this._computeOptionsData),this.computeCurrentViewData=$t(this._computeCurrentViewData),this.organizeRawLocales=$t(Zr),this.buildLocale=$t(Xr),this.buildPluginHooks=Qo(),this.buildDateEnv=$t(Fi),this.buildTheme=$t(Gi),this.parseToolbars=$t(Pi),this.buildViewSpecs=$t(fi),this.buildDateProfileGenerator=Jt(ji),this.buildViewApi=$t(qi),this.buildViewUiProps=Jt(Xi),this.buildEventUiBySource=$t(Yi,wt),this.buildEventUiBases=$t(Zi),this.parseContextBusinessHours=Jt($i),this.buildTitle=$t(zi),this.emitter=new _o,this.actionRunner=new Bi(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=function(){return t.data},this.dispatch=function(e){t.actionRunner.request(e)},this.props=e,this.actionRunner.pause();var n={},o=this.computeOptionsData(e.optionOverrides,n,e.calendarApi),i=o.calendarOptions.initialView||o.pluginHooks.initialView,a=this.computeCurrentViewData(i,o,e.optionOverrides,n);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(a.options);var s,l,u,c=(s=o.calendarOptions,l=o.dateEnv,null!=(u=s.initialDate)?l.createMarker(u):Hr(s.now,l)),d=a.dateProfileGenerator.build(c);tr(d.activeRange,c)||(c=d.currentRange.start);for(var p={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f=0,h=o.pluginHooks.contextInit;fs.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:a.end}},i)),r?(n.push.apply(n,o([{index:e.index,thickness:e.thickness,span:aa(s,a)}],i)),r):(n.push(e),0)},e.prototype.insertEntryAt=function(e,t){var n=this.entriesByLevel,r=this.levelCoords;-1===t.lateral?(sa(r,t.level,t.levelCoord),sa(n,t.level,[e])):sa(n[t.level],t.lateral,e),this.stackCnts[ra(e)]=t.stackCnt},e.prototype.findInsertion=function(e){for(var t=this,n=t.levelCoords,r=t.entriesByLevel,o=t.strictOrder,i=t.stackCnts,a=n.length,s=0,l=-1,u=-1,c=null,d=0,p=0;p=s+e.thickness)break;for(var h=r[p],v=void 0,g=la(h,e.span.start,na),m=g[0]+g[1];(v=h[m])&&v.span.starts&&(s=y,c=v,l=p,u=m),y===s&&(d=Math.max(d,i[ra(v)]+1)),m+=1}}var S=0;if(c)for(S=l+1;Sn(e[o-1]))return[o,0];for(;ra))return[i,1];r=i+1}}return[r,0]}var ua=function(){function e(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}return e.prototype.destroy=function(){},e}();function ca(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}function da(e){var t;return(t={})[e.component.uid]=e,t}var pa={},fa=function(){function e(e,t){this.emitter=new _o}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}(),ha={},va={startTime:Ht,duration:Ht,create:Boolean,sourceId:String};function ga(e){var t=Rn(e,va),n=t.refined,r=t.extra;return{startTime:n.startTime||null,duration:n.duration||null,create:null==n.create||n.create,sourceId:n.sourceId,leftoverProps:r}}var ma=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props.widgetGroups.map((function(t){return e.renderWidgetGroup(t)}));return Oo.apply(void 0,o(["div",{className:"fc-toolbar-chunk"}],t))},t.prototype.renderWidgetGroup=function(e){for(var t=this.props,n=this.context.theme,r=[],i=!0,a=0,s=e;a1){var m=i&&n.getClass("buttonGroup")||"";return Oo.apply(void 0,o(["div",{className:m}],r))}return r[0]},t}(Yo),ya=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.model,o=n.extraClassName,i=!1,a=r.sectionWidgets,s=a.center;return a.left?(i=!0,e=a.left):e=a.start,a.right?(i=!0,t=a.right):t=a.end,Oo("div",{className:[o||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",s||[]),this.renderSection("end",t||[]))},t.prototype.renderSection=function(e,t){var n=this.props;return Oo(ma,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})},t}(Yo),Sa=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={availableWidth:null},t.handleEl=function(e){t.el=e,Ko(t.props.elRef,e),t.updateAvailableWidth()},t.handleResize=function(){t.updateAvailableWidth()},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=e.aspectRatio,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],o="",i="";return n?null!==t.availableWidth?o=t.availableWidth/n:i=1/n*100+"%":o=e.height||"",Oo("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:o,paddingBottom:i}},e.children)},t.prototype.componentDidMount=function(){this.context.addResizeHandler(this.handleResize)},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleResize)},t.prototype.updateAvailableWidth=function(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})},t}(Yo),Ea=function(e){function t(t){var n=e.call(this,t)||this;return n.handleSegClick=function(e,t){var r=n.component,o=r.context,i=ir(t);if(i&&r.isValidSegDownEl(e.target)){var a=Ee(e.target,".fc-event-forced-url"),s=a?a.querySelector("a[href]").href:"";o.emitter.trigger("eventClick",{el:t,event:new Ar(r.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:o.viewApi}),s&&!e.defaultPrevented&&(window.location.href=s)}},n.destroy=Pe(t.el,"click",".fc-event",n.handleSegClick),n}return n(t,e),t}(ua),ba=function(e){function t(t){var n,r,o,i,a,s=e.call(this,t)||this;return s.handleEventElRemove=function(e){e===s.currentSegEl&&s.handleSegLeave(null,s.currentSegEl)},s.handleSegEnter=function(e,t){ir(t)&&(s.currentSegEl=t,s.triggerEvent("eventMouseEnter",e,t))},s.handleSegLeave=function(e,t){s.currentSegEl&&(s.currentSegEl=null,s.triggerEvent("eventMouseLeave",e,t))},s.removeHoverListeners=(n=t.el,r=".fc-event",o=s.handleSegEnter,i=s.handleSegLeave,Pe(n,"mouseover",r,(function(e,t){if(t!==a){a=t,o(e,t);var n=function(e){a=null,i(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),s}return n(t,e),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(e,t,n){var r=this.component,o=r.context,i=ir(n);t&&!r.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new Ar(o,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:o.viewApi})},t}(ua),Ca=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildViewContext=$t(jo),t.buildViewPropTransformers=$t(Ra),t.buildToolbarProps=$t(Da),t.headerRef=Wo(),t.footerRef=Wo(),t.interactionsStore={},t.state={viewLabelId:Me()},t.registerInteractiveComponent=function(e,n){var r=ca(e,n),o=[Ea,ba].concat(t.props.pluginHooks.componentInteractions).map((function(e){return new e(r)}));t.interactionsStore[e.uid]=o,pa[e.uid]=r},t.unregisterInteractiveComponent=function(e){var n=t.interactionsStore[e.uid];if(n){for(var r=0,o=n;r10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}var xa="fc-col-header-cell";function _a(e){return e.text}var ka=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.dateEnv,n=e.options,o=e.theme,i=e.viewApi,a=this.props,s=a.date,l=a.dateProfile,u=po(s,a.todayRange,null,l),c=[xa].concat(fo(u,o)),d=t.format(s,a.dayHeaderFormat),p=!u.isDisabled&&a.colCnt>1?mo(this.context,s):{},f=r(r(r({date:t.toDate(s),view:i},a.extraHookProps),{text:d}),u);return Oo(ni,{hookProps:f,classNames:n.dayHeaderClassNames,content:n.dayHeaderContent,defaultContent:_a,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},(function(e,t,n,o){return Oo("th",r({ref:e,role:"columnheader",className:c.concat(t).join(" "),"data-date":u.isDisabled?void 0:qt(s),colSpan:a.colSpan},a.extraDataAttrs),Oo("div",{className:"fc-scrollgrid-sync-inner"},!u.isDisabled&&Oo("a",r({ref:n,className:["fc-col-header-cell-cushion",a.isSticky?"fc-sticky":""].join(" ")},p),o)))}))},t}(Yo),Ma=vn({weekday:"long"}),Ia=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.theme,i=t.viewApi,a=t.options,s=nt(new Date(2592e5),e.dow),l={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},u=[xa].concat(fo(l,o),e.extraClassNames||[]),c=n.format(s,e.dayHeaderFormat),d=r(r(r(r({date:s},l),{view:i}),e.extraHookProps),{text:c});return Oo(ni,{hookProps:d,classNames:a.dayHeaderClassNames,content:a.dayHeaderContent,defaultContent:_a,didMount:a.dayHeaderDidMount,willUnmount:a.dayHeaderWillUnmount},(function(t,o,i,a){return Oo("th",r({ref:t,role:"columnheader",className:u.concat(o).join(" "),colSpan:e.colSpan},e.extraDataAttrs),Oo("div",{className:"fc-scrollgrid-sync-inner"},Oo("a",{"aria-label":n.format(s,Ma),className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:i},a)))}))},t}(Yo),Pa=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.initialNowDate=Hr(n.options.now,n.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return e.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var e=this.props,t=this.context,n=rt(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),o=t.dateEnv.add(r,Ht(1,e.unit)),i=o.valueOf()-n.valueOf();return i=Math.min(864e5,i),{currentState:{nowDate:r,todayRange:Na(r)},nextState:{nowDate:o,todayRange:Na(o)},waitMs:i}},t.prototype.setTimeout=function(){var e=this,t=this.computeTiming(),n=t.nextState,r=t.waitMs;this.timeoutId=setTimeout((function(){e.setState(n,(function(){e.setTimeout()}))}),r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=Go,t}(Ho);function Na(e){var t=ut(e);return{start:t,end:nt(t,1)}}var Ha=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.createDayHeaderFormatter=$t(Oa),t}return n(t,e),t.prototype.render=function(){var e=this.context,t=this.props,n=t.dates,r=t.dateProfile,o=t.datesRepDistinctDays,i=t.renderIntro,a=this.createDayHeaderFormatter(e.options.dayHeaderFormat,o,n.length);return Oo(Pa,{unit:"day"},(function(e,t){return Oo("tr",{role:"row"},i&&i("day"),n.map((function(e){return o?Oo(ka,{key:e.toISOString(),date:e,dateProfile:r,todayRange:t,colCnt:n.length,dayHeaderFormat:a}):Oo(Ia,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:a})})))}))},t}(Yo);function Oa(e,t,n){return e||Ta(t,n)}var Aa=function(){function e(e,t){for(var n=e.start,r=e.end,o=[],i=[],a=-1;n=t.length?t[t.length-1]+1:t[n]},e}(),Wa=function(){function e(e,t){var n,r,o,i=e.dates;if(t){for(r=i[0].getUTCDay(),n=1;nt)return!0}return!1},t.prototype.needsYScrolling=function(){if(Za.test(this.props.overflowY))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),n=e.children,r=0;rt)return!0}return!1},t.prototype.getXScrollbarWidth=function(){return Za.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},t.prototype.getYScrollbarWidth=function(){return Za.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},t}(Yo),Ka=function(){function e(e){var t=this;this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=function(e,n){var r=t,o=r.depths,i=r.currentMap,a=!1,s=!1;null!==e?(a=n in i,i[n]=e,o[n]=(o[n]||0)+1,s=!0):(o[n]-=1,o[n]||(delete i[n],delete t.callbackMap[n],a=!0)),t.masterCallback&&(a&&t.masterCallback(null,String(n)),s&&t.masterCallback(e,String(n)))}}return e.prototype.createRef=function(e){var t=this,n=this.callbackMap[e];return n||(n=this.callbackMap[e]=function(n){t.handleValue(n,String(e))}),n},e.prototype.collect=function(e,t,n){return kt(this.currentMap,e,t,n)},e.prototype.getAll=function(){return Rt(this.currentMap)},e}();function $a(e){for(var t=0,n=0,r=Ce(e,".fc-scrollgrid-shrink");n=0&&e=0&&tt.eventRange.range.end?e:t}var Ps=function(e){function t(t,n){void 0===n&&(n={});var o=e.call(this)||this;return o.isRendering=!1,o.isRendered=!1,o.currentClassNames=[],o.customContentRenderId=0,o.handleAction=function(e){switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":o.renderRunner.tryDrain()}},o.handleData=function(e){o.currentData=e,o.renderRunner.request(e.calendarOptions.rerenderDelay)},o.handleRenderRequest=function(){if(o.isRendering){o.isRendered=!0;var e=o.currentData;zo((function(){Ao(Oo(wa,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(function(t,n,i,a){return o.setClassNames(t),o.setHeight(n),Oo(ri.Provider,{value:o.customContentRenderId},Oo(Ca,r({isHeightAuto:i,forPrint:a},e)))})),o.el)}))}else o.isRendered&&(o.isRendered=!1,Vo(o.el),o.setClassNames([]),o.setHeight(""))},o.el=t,o.renderRunner=new Ui(o.handleRenderRequest),new Vi({optionOverrides:n,calendarApi:o,onAction:o.handleAction,onData:o.handleData}),o}return n(t,e),Object.defineProperty(t.prototype,"view",{get:function(){return this.currentData.viewApi},enumerable:!1,configurable:!0}),t.prototype.render=function(){var e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()},t.prototype.destroy=function(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())},t.prototype.updateSize=function(){var t=this;zo((function(){e.prototype.updateSize.call(t)}))},t.prototype.batchRendering=function(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")},t.prototype.pauseRendering=function(){this.renderRunner.pause("pauseRendering")},t.prototype.resumeRendering=function(){this.renderRunner.resume("pauseRendering",!0)},t.prototype.resetOptions=function(e,t){this.currentDataManager.resetOptions(e,t)},t.prototype.setClassNames=function(e){if(!Kt(e,this.currentClassNames)){for(var t=this.el.classList,n=0,r=this.currentClassNames;n0&&(this.everMovedDown=!0),i<0?this.everMovedLeft=!0:i>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Vs()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e=0&&u>=0&&c>=0&&d>=0&&(c<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"top",distance:c}),d<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"bottom",distance:d}),l<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>l)&&(r={scrollCache:a,name:"left",distance:l}),u<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"right",distance:u}))}return r},e.prototype.buildCaches=function(e){return this.queryScrollEls(e).map((function(e){return e===window?new zs(!1):new Bs(e,!1)}))},e.prototype.queryScrollEls=function(e){for(var t=[],n=0,r=this.scrollQuery;n=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,Ve(document.body),Ge(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var o=r.pointer=new As(t);return o.emitter.on("pointerdown",r.onPointerDown),o.emitter.on("pointermove",r.onPointerMove),o.emitter.on("pointerup",r.onPointerUp),n&&(o.selector=n),r.mirror=new Ls,r.autoScroller=new Fs,r}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy(),this.onPointerUp({})},t.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},t.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},t.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},t.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},t.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},t.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},t.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},t.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},t.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},t}(fa),js=function(){function e(e){this.origRect=wo(e),this.scrollCaches=To(e).map((function(e){return new Bs(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e=0&&c=0&&do.layer)&&(v.componentId=i,v.context=a.context,v.rect.left+=l,v.rect.right+=l,v.rect.top+=u,v.rect.bottom+=u,o=v)}}}return o},e}();function Ys(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&Er(e.dateSpan,t.dateSpan)}function Zs(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.datePointTransforms;ar.start)return{endDelta:s};return null}(a,e,r.subjectEl.classList.contains("fc-event-resizer-start"),s.range)));l&&(u=xr(i,o.getCurrentData().eventUiBases,l,o),d.mutatedEvents=u,Ba(d,e.dateProfile,o)||(c=!0,l=null,u=null,d.mutatedEvents=null)),u?o.dispatch({type:"SET_EVENT_RESIZE",state:d}):o.dispatch({type:"UNSET_EVENT_RESIZE"}),c?Ue():Be(),t||(l&&Ys(a,e)&&(l=null),n.validMutation=l,n.mutatedRelevantEvents=u)},n.handleDragEnd=function(e){var t=n.component.context,o=n.eventRange.def,i=n.eventRange.instance,a=new Ar(t,o,i),s=n.relevantEvents,l=n.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:n.draggingSegEl,event:a,jsEvent:e.origEvent,view:t.viewApi}),n.validMutation){var u=new Ar(t,l.defs[o.defId],i?l.instances[i.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:l});var c={oldEvent:a,event:u,relatedEvents:Lr(l,t,i),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",r(r({},c),{el:n.draggingSegEl,startDelta:n.validMutation.startDelta||Ht(0),endDelta:n.validMutation.endDelta||Ht(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");n.draggingSeg=null,n.relevantEvents=null,n.validMutation=null};var o=t.component,i=n.dragging=new Gs(t.el);i.pointer.selector=".fc-event-resizer",i.touchScrollAllowed=!1,i.autoScroller.isEnabled=o.context.options.dragScroll;var a=n.hitDragging=new qs(n.dragging,da(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.querySegEl=function(e){return Ee(e.subjectEl,".fc-event")},t}(ua);var Qs=function(){function e(e){var t=this;this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=function(e){e.jsEvent&&(t.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=function(e){var n=t.context.options.unselectCancel,r=xe(e.origEvent);t.matchesCancel=!!Ee(r,n),t.matchesEvent=!!Ee(r,$s.SELECTOR)},this.onDocumentPointerUp=function(e){var n=t.context,r=t.documentPointer,o=n.getCurrentData();if(!r.wasTouchScroll){if(o.dateSelection&&!t.isRecentPointerDateSelect){var i=n.options.unselectAuto;!i||i&&t.matchesCancel||n.calendarApi.unselect(e)}o.eventSelection&&!t.matchesEvent&&n.dispatch({type:"UNSELECT_EVENT"})}t.isRecentPointerDateSelect=!1};var n=this.documentPointer=new As(document);n.shouldIgnoreMove=!0,n.shouldWatchScroll=!1,n.emitter.on("pointerdown",this.onDocumentPointerDown),n.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}return e.prototype.destroy=function(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()},e}(),el={fixedMirrorParent:wn},tl={dateClick:wn,eventDragStart:wn,eventDragStop:wn,eventDrop:wn,eventResizeStart:wn,eventResizeStop:wn,eventResize:wn,drop:wn,eventReceive:wn,eventLeave:wn},nl=function(){function e(e,t){var n=this;this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){n.dragMeta=n.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,t,o){var i=n.hitDragging.dragging,a=null,s=null,l=!1,u={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:n.dragMeta.create};e&&(a=e.context,n.canDropElOnCalendar(o.subjectEl,a)&&(s=function(e,t,n){for(var o=r({},t.leftoverProps),i=0,a=n.pluginHooks.externalDefTransforms;i1,E=y.span.start===s;d+=y.levelCoord-c,c=y.levelCoord+y.thickness,S?(d+=y.thickness,E&&v.push({seg:Dl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:y.levelCoord,marginTop:0})):E&&(v.push({seg:Dl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:y.levelCoord,marginTop:d}),d=0)}o.push(u),i.push(v),a.push(d)}return{singleColPlacements:o,multiColPlacements:i,leftoverMargins:a}}(s.toRects(),e,a),h=f.singleColPlacements,v=f.multiColPlacements,g=f.leftoverMargins,m=[],y=[],S=0,E=u;S1,showWeekNumbers:t.showWeekNumbers,todayRange:h,dateProfile:n,cells:i,renderIntro:t.renderRowIntro,businessHourSegs:s[f],eventSelection:t.eventSelection,bgEventSegs:l[f].filter(xl),fgEventSegs:u[f],dateSelectionSegs:c[f],eventDrag:d[f],eventResize:p[f],dayMaxEvents:o,dayMaxEventRows:r,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:t.forPrint})})))))})))},t.prototype.prepareHits=function(){this.rowPositions=new ko(this.rootEl,this.rowRefs.collect().map((function(e){return e.getCellEls()[0]})),!1,!0),this.colPositions=new ko(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},t.prototype.queryHit=function(e,t){var n=this.colPositions,o=this.rowPositions,i=n.leftToIndex(e),a=o.topToIndex(t);if(null!=a&&null!=i){var s=this.props.cells[a][i];return{dateProfile:this.props.dateProfile,dateSpan:r({range:this.getCellRange(a,i),allDay:!0},s.extraDateSpan),dayEl:this.getCellEl(a,i),rect:{left:n.lefts[i],right:n.rights[i],top:o.tops[a],bottom:o.bottoms[a]},layer:0}}return null},t.prototype.getCellEl=function(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]},t.prototype.getCellRange=function(e,t){var n=this.props.cells[e][t].date;return{start:n,end:nt(n,1)}},t}($o);function xl(e){return e.eventRange.def.allDay}var _l=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(La),kl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new _l,t.tableRef=Wo(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return Oo(Tl,r({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))},t}($o),Ml=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayTableModel=$t(Il),t.headerRef=Wo(),t.tableRef=Wo(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,r=t.dateProfileGenerator,o=this.props,i=this.buildDayTableModel(o.dateProfile,r),a=n.dayHeaders&&Oo(Ha,{ref:this.headerRef,dateProfile:o.dateProfile,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt}),s=function(t){return Oo(kl,{ref:e.tableRef,dateProfile:o.dateProfile,dayTableModel:i,businessHours:o.businessHours,dateSelection:o.dateSelection,eventStore:o.eventStore,eventUiBases:o.eventUiBases,eventSelection:o.eventSelection,eventDrag:o.eventDrag,eventResize:o.eventResize,nextDayThreshold:n.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.weekNumbers,expandRows:!o.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:o.forPrint})};return n.dayMinWidth?this.renderHScrollLayout(a,s,i.colCnt,n.dayMinWidth):this.renderSimpleLayout(a,s)},t}(sl);function Il(e,t){var n=new Aa(e.renderRange,t);return new Wa(n,/year|month|week/.test(e.currentRangeUnit))}var Pl=Jo({initialView:"dayGridMonth",views:{dayGrid:{component:Ml,dateProfileGeneratorClass:function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.buildRenderRange=function(t,n,r){var o,i=this.props.dateEnv,a=e.prototype.buildRenderRange.call(this,t,n,r),s=a.start,l=a.end;(/^(year|month)$/.test(n)&&(s=i.startOfWeek(s),(o=i.startOfWeek(l)).valueOf()!==l.valueOf()&&(l=tt(o,1))),this.props.monthMode&&this.props.fixedWeekCount)&&(l=tt(l,6-Math.ceil(ot(s,l))));return{start:s,end:l}},t}(vi)},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),Nl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(e){return e.allDay?rr(e)?["timed","allDay"]:["allDay"]:["timed"]},t}(uo),Hl=vn({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function Ol(e){var t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return Oo(Go.Consumer,null,(function(n){if(!e.isLabeled)return Oo("td",{className:t.join(" "),"data-time":e.isoTimeStr});var r=n.dateEnv,o=n.options,i=n.viewApi,a=null==o.slotLabelFormat?Hl:Array.isArray(o.slotLabelFormat)?vn(o.slotLabelFormat[0]):vn(o.slotLabelFormat),s={level:0,time:e.time,date:r.toDate(e.date),view:i,text:r.format(e.date,a)};return Oo(ni,{hookProps:s,classNames:o.slotLabelClassNames,content:o.slotLabelContent,defaultContent:Al,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(n,r,o,i){return Oo("td",{ref:n,className:t.concat(r).join(" "),"data-time":e.isoTimeStr},Oo("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},Oo("div",{className:"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",ref:o},i)))}))}))}function Al(e){return e.text}var Wl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return this.props.slatMetas.map((function(e){return Oo("tr",{key:e.key},Oo(Ol,r({},e)))}))},t}(Yo),Ll=vn({week:"short"}),Ul=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allDaySplitter=new Nl,t.headerElRef=Wo(),t.rootElRef=Wo(),t.scrollerElRef=Wo(),t.state={slatCoords:null},t.handleScrollTopRequest=function(e){var n=t.scrollerElRef.current;n&&(n.scrollTop=e)},t.renderHeadAxis=function(e,n){void 0===n&&(n="");var o=t.context.options,i=t.props.dateProfile.renderRange,a=1===it(i.start,i.end)?mo(t.context,i.start,"week"):{};return o.weekNumbers&&"day"===e?Oo(Cs,{date:i.start,defaultFormat:Ll},(function(e,t,o,i){return Oo("th",{ref:e,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(t).join(" ")},Oo("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:n}},Oo("a",r({ref:o,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner"},a),i)))})):Oo("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},Oo("div",{className:"fc-timegrid-axis-frame",style:{height:n}}))},t.renderTableRowAxis=function(e){var n=t.context,r=n.options,o=n.viewApi,i={text:r.allDayText,view:o};return Oo(ni,{hookProps:i,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:Bl,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(t,n,r,o){return Oo("td",{ref:t,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},Oo("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(null==e?" fc-timegrid-axis-frame-liquid":""),style:{height:e}},Oo("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t,n){var r=this.context,o=this.props,i=[],a=ls(r.options);return e&&i.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(i.push({type:"body",key:"all-day",chunk:{content:t}}),i.push({type:"body",key:"all-day-divider",outerContent:Oo("tr",{role:"presentation",className:"fc-scrollgrid-section"},Oo("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),i.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),Oo(ci,{viewSpec:r.viewSpec,elRef:this.rootElRef},(function(e,t){return Oo("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},Oo(cs,{liquid:!o.isHeightAuto&&!o.forPrint,collapsibleWidth:o.forPrint,cols:[{width:"shrink"}],sections:i}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r,o,i,a){var s=this,l=this.context.pluginHooks.scrollGridImpl;if(!l)throw new Error("No ScrollGrid implementation");var u=this.context,c=this.props,d=!c.forPrint&&ls(u.options),p=!c.forPrint&&us(u.options),f=[];e&&f.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return Oo("tr",{role:"presentation"},s.renderHeadAxis("day",e.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(f.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return Oo("tr",{role:"presentation"},s.renderTableRowAxis(e.rowSyncHeights[0]))}},{key:"cols",content:t}]}),f.push({key:"all-day-divider",type:"body",outerContent:Oo("tr",{role:"presentation",className:"fc-scrollgrid-section"},Oo("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));var h=u.options.nowIndicator;return f.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:function(e){return Oo("div",{className:"fc-timegrid-axis-chunk"},Oo("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,Oo("tbody",null,Oo(Wl,{slatMetas:i}))),Oo("div",{className:"fc-timegrid-now-indicator-container"},Oo(Pa,{unit:h?"minute":"day"},(function(e){var t=h&&a&&a.safeComputeTop(e);return"number"==typeof t?Oo(hs,{isAxis:!0,date:e},(function(e,n,r,o){return Oo("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(n).join(" "),style:{top:t}},o)})):null}))))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&f.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:ss},{key:"cols",content:ss}]}),Oo(ci,{viewSpec:u.viewSpec,elRef:this.rootElRef},(function(e,t){return Oo("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},Oo(l,{liquid:!c.isHeightAuto&&!c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:f}))}))},t.prototype.getAllDayMaxEventProps=function(){var e=this.context.options,t=e.dayMaxEvents,n=e.dayMaxEventRows;return!0!==t&&!0!==n||(t=void 0,n=5),{dayMaxEvents:t,dayMaxEventRows:n}},t}($o);function Bl(e){return e.text}var zl=function(){function e(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}return e.prototype.safeComputeTop=function(e){var t=this.dateProfile;if(tr(t.currentRange,e)){var n=ut(e),r=e.valueOf()-n.valueOf();if(r>=Vt(t.slotMinTime)&&r0,S=Boolean(l)&&l.span.end-l.span.start=0;t-=1)if(null!==(r=Ft(n=Ht(pu[t]),e))&&r>1)return n;return e}(r),u=[];Vt(a)0?e.renderSegList(s,i):e.renderEmptyMessage()))}))},t.prototype.renderEmptyMessage=function(){var e=this.context,t=e.options,n=e.viewApi,r={text:t.noEventsText,view:n};return Oo(ni,{hookProps:r,classNames:t.noEventsClassNames,content:t.noEventsContent,defaultContent:Du,didMount:t.noEventsDidMount,willUnmount:t.noEventsWillUnmount},(function(e,t,n,r){return Oo("div",{className:["fc-list-empty"].concat(t).join(" "),ref:e},Oo("div",{className:"fc-list-empty-cushion",ref:n},r))}))},t.prototype.renderSegList=function(e,t){var n=this.context,o=n.theme,i=n.options,a=this.state,s=a.timeHeaderId,l=a.eventHeaderId,u=a.dateHeaderIdRoot,c=function(e){var t,n,r=[];for(t=0;t0?e="positive":(t.scrollLeft=1,e=t.scrollLeft>0?"reverse":"negative");return Se(t),e}())}var Fu,Gu="undefined"!=typeof navigator&&/Edge/.test(navigator.userAgent),ju=function(){function e(e,t){var n=this;this.scrollEl=e,this.isRtl=t,this.usingRelative=null,this.updateSize=function(){var e=n.scrollEl,t=Ce(e,".fc-sticky"),r=n.queryElGeoms(t),o=e.clientWidth,i=e.clientHeight;n.usingRelative?function(e,t,n,r,o){e.forEach((function(e,i){var a,s,l=t[i],u=l.naturalBound,c=l.parentBound,d=c.right-c.left,p=c.bottom-c.bottom;d>r||p>o?(a=n[i].left-u.left,s=n[i].top-u.top):(a="",s=""),we(e,{position:"relative",left:a,right:-a,top:s})}))}(t,r,n.computeElDestinations(r,o),o,i):function(e,t,n){e.forEach((function(e,r){var o,i=t[r],a=i.textAlign,s=i.elWidth,l=i.parentBound,u=l.right-l.left;we(e,{left:o="center"===a&&u>n?(n-s)/2:"",right:o,top:0})}))}(t,r,o)},this.usingRelative=!function(){null==Fu&&(Fu=function(){var e=document.createElement("div");e.style.position="sticky",document.body.appendChild(e);var t=window.getComputedStyle(e).position;return Se(e),"sticky"===t}());return Fu}()||Gu&&t,this.usingRelative&&(this.listener=new Uu(e),this.listener.emitter.on("scrollEnd",this.updateSize))}return e.prototype.destroy=function(){this.listener&&this.listener.destroy()},e.prototype.queryElGeoms=function(e){for(var t=this.scrollEl,n=this.isRtl,r=function(e){var t=e.getBoundingClientRect(),n=Do(e);return{left:t.left+n.borderLeft+n.scrollbarLeft-Bu(e),top:t.top+n.borderTop-e.scrollTop}}(t),o=[],i=0,a=e;ithis.lastSizingDate.valueOf()+ha.SCROLLGRID_RESIZE_INTERVAL?(this.lastSizingDate=e,this.recentSizingCnt=0,!0):(this.recentSizingCnt+=1)<=10},t.prototype.computeShrinkWidths=function(){var e=this,t=this.compileColGroupStats(this.props.colGroups.map((function(e){return[e]}))),n=this.getDims(),r=n[0],o=n[1],i=r*o,a=[];return t.forEach((function(t,n){if(t.hasShrinkCol){var r=e.chunkElRefs.collect(n,i,o);a[n]=$a(r)}})),a},t.prototype.computeSectionRowMaxHeights=function(){for(var e=new Map,t=this.getDims(),n=t[0],r=t[1],o=[],i=0;i .fc-scroller"),t=e.map((function(e){var t=window.getComputedStyle(e);return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop,overflowX:t.overflowX,overflowY:t.overflowY,marginBottom:t.marginBottom}})),n=0,r=sc;nha.MAX_TIMELINE_SLOTS&&(console.warn("slotLabelInterval results in too many cells"),e.labelInterval=null)}if(e.slotDuration){n.countDurationsBetween(r.start,r.end,e.slotDuration)>ha.MAX_TIMELINE_SLOTS&&(console.warn("slotDuration results in too many cells"),e.slotDuration=null)}if(e.labelInterval&&e.slotDuration){var o=Ft(e.labelInterval,e.slotDuration);(null===o||o<1)&&(console.warn("slotLabelInterval must be a multiple of slotDuration"),e.slotDuration=null)}}(o,e,t),yc(o,e,t),function(e,t,n){var r=t.currentRange,o=e.slotDuration;if(!o){for(var i=yc(e,t,n),a=0,s=hc;a1&&u<=6){o=l;break}}if(o)n.countDurationsBetween(r.start,r.end,o)>200&&(o=null);o||(o=i),e.slotDuration=o}}(o,e,t);var i=n.slotLabelFormat,a=Array.isArray(i)?i:null!=i?[i]:function(e,t,n,r){var o,i,a=e.labelInterval,s=Gt(a).unit,l=r.weekNumbers,u=o=i=null;"week"!==s||l||(s="day");switch(s){case"year":u={year:"numeric"};break;case"month":Sc("years",t,n)>1&&(u={year:"numeric"}),o={month:"short"};break;case"week":Sc("years",t,n)>1&&(u={year:"numeric"}),o={week:"narrow"};break;case"day":Sc("years",t,n)>1?u={year:"numeric",month:"long"}:Sc("months",t,n)>1&&(u={month:"long"}),l&&(o={week:"short"}),i={weekday:"narrow",day:"numeric"};break;case"hour":l&&(u={week:"short"}),Sc("days",t,n)>1&&(o={weekday:"short",day:"numeric",month:"numeric",omitCommas:!0}),i={hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"};break;case"minute":Bt(a)/60>=6?(u={hour:"numeric",meridiem:"short"},o=function(e){return":"+Xe(e.date.minute,2)}):u={hour:"numeric",minute:"numeric",meridiem:"short"};break;case"second":zt(a)/60>=6?(u={hour:"numeric",minute:"2-digit",meridiem:"lowercase"},o=function(e){return":"+Xe(e.date.second,2)}):u={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"};break;case"millisecond":u={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"},o=function(e){return"."+Xe(e.millisecond,3)}}return[].concat(u||[],o||[],i||[])}(o,e,t,n);o.headerFormats=a.map((function(e){return vn(e)})),o.isTimeScale=Boolean(o.slotDuration.milliseconds);var s=null;if(!o.isTimeScale){var l=Gt(o.slotDuration).unit;/year|month|week/.test(l)&&(s=l)}o.largeUnit=s,o.emphasizeWeeks=1===At(o.slotDuration)&&Sc("weeks",e,t)>=2&&!n.businessHours;var u,c,d=n.snapDuration;d&&(u=Ht(d),c=Ft(o.slotDuration,u)),null==c&&(u=o.slotDuration,c=1),o.snapDuration=u,o.snapsPerSlot=c;var p=Vt(e.slotMaxTime)-Vt(e.slotMinTime),f=gc(e.renderRange.start,o,t),h=gc(e.renderRange.end,o,t);o.isTimeScale&&(f=t.add(f,e.slotMinTime),h=t.add(nt(h,-1),e.slotMaxTime)),o.timeWindowMs=p,o.normalizedRange={start:f,end:h};for(var v=[],g=f;g1&&!v,m=null,y=s[d]||(v?a:null);if(g){var S=t.format(u,p);h&&h.text===S?h.colspan+=1:m=Ec(u,S,y)}else if(!h||Je(t.countDurationsBetween(e.normalizedRange.start,u,e.labelInterval))){m=Ec(u,S=t.format(u,p),y)}else h.colspan+=1;m&&(m.weekStart=c,f.push(m))}return o}(o,t),o.slotsPerLabel=Ft(o.labelInterval,o.slotDuration),o}function gc(e,t,n){var r=e;return t.isTimeScale||(r=ut(r),t.largeUnit&&(r=n.startOf(r,t.largeUnit))),r}function mc(e,t,n,r){if(r.isHiddenDay(e))return!1;if(t.isTimeScale){var o=ut(e),i=e.valueOf()-o.valueOf()-Vt(n.slotMinTime);return(i=(i%864e5+864e5)%864e5)=18)break}e.labelInterval=o}return o}function Sc(e,t,n){var r=t.currentRange,o=null;return"years"===e?o=n.diffWholeYears(r.start,r.end):"months"===e||"weeks"===e?o=n.diffWholeMonths(r.start,r.end):"days"===e&&(o=lt(r.start,r.end)),o||0}function Ec(e,t,n){return{date:e,text:t,rowUnit:n,colspan:1,isWeekStart:!1}}var bc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return Oo(oi,{hookProps:e.hookProps,content:t.options.slotLabelContent,defaultContent:Cc},(function(t,n){return Oo("a",r({ref:t,className:"fc-timeline-slot-cushion fc-scrollgrid-sync-inner"+(e.isSticky?" fc-sticky":"")},e.navLinkAttrs),n)}))},t}(Yo);function Cc(e){return e.text}function Dc(e){return{level:e.level,date:e.dateEnv.toDate(e.dateMarker),view:e.viewApi,text:e.text}}var Rc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.refineHookProps=Jt(Dc),t.normalizeClassNames=si(),t.buildCellNavLinkAttrs=$t(wc),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=n.dateEnv,o=n.options,i=t.cell,a=t.dateProfile,s=t.tDateProfile,l=po(i.date,t.todayRange,t.nowDate,a),u=["fc-timeline-slot","fc-timeline-slot-label"].concat("time"===i.rowUnit?ho(l,n.theme):fo(l,n.theme));i.isWeekStart&&u.push("fc-timeline-slot-em");var c=this.refineHookProps({level:t.rowLevel,dateMarker:i.date,text:i.text,dateEnv:n.dateEnv,viewApi:n.viewApi}),d=this.normalizeClassNames(o.slotLabelClassNames,c);return Oo(ai,{hookProps:c,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(o){return Oo("th",{ref:o,className:u.concat(d).join(" "),"data-date":r.formatIso(i.date,{omitTime:!s.isTimeScale,omitTimeZoneOffset:!0}),colSpan:i.colspan},Oo("div",{className:"fc-timeline-slot-frame",style:{height:t.rowInnerHeight}},Oo(bc,{hookProps:c,isSticky:t.isSticky,navLinkAttrs:e.buildCellNavLinkAttrs(n,i.date,i.rowUnit)})))}))},t}(Yo);function wc(e,t,n){return n&&"time"!==n?mo(e,t,n):{}}var Tc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.dateProfile,n=e.tDateProfile,r=e.rowInnerHeights,o=e.todayRange,i=e.nowDate,a=n.cellRows;return Oo(Lo,null,a.map((function(e,s){var l=s===a.length-1,u=n.isTimeScale&&l;return Oo("tr",{key:s,className:["fc-timeline-header-row",u?"fc-timeline-header-row-chrono":""].join(" ")},e.map((function(e){return Oo(Rc,{key:e.date.toISOString(),cell:e,rowLevel:s,dateProfile:t,tDateProfile:n,todayRange:o,nowDate:i,rowInnerHeight:r&&r[s],isSticky:!l})})))})))},t}(Yo),xc=function(){function e(e,t,n,r,o,i){this.slatRootEl=e,this.dateProfile=n,this.tDateProfile=r,this.dateEnv=o,this.isRtl=i,this.outerCoordCache=new ko(e,t,!0,!1),this.innerCoordCache=new ko(e,De(t,"div"),!0,!1)}return e.prototype.isDateInRange=function(e){return tr(this.dateProfile.currentRange,e)},e.prototype.dateToCoord=function(e){var t=this.tDateProfile,n=this.computeDateSnapCoverage(e)/t.snapsPerSlot,r=Math.floor(n),o=n-(r=Math.min(r,t.slotCnt-1)),i=this.innerCoordCache,a=this.outerCoordCache;return this.isRtl?a.originClientRect.width-(a.rights[r]-i.getWidth(r)*o):a.lefts[r]+i.getWidth(r)*o},e.prototype.rangeToCoords=function(e){return{start:this.dateToCoord(e.start),end:this.dateToCoord(e.end)}},e.prototype.durationToCoord=function(e){var t=this,n=t.dateProfile,r=t.tDateProfile,o=t.dateEnv,i=t.isRtl,a=0;if(n){var s=o.add(n.activeRange.start,e);r.isTimeScale||(s=ut(s)),a=this.dateToCoord(s),!i&&a&&(a+=1)}return a},e.prototype.coordFromLeft=function(e){return this.isRtl?this.outerCoordCache.originClientRect.width-e:e},e.prototype.computeDateSnapCoverage=function(e){return _c(e,this.tDateProfile,this.dateEnv)},e}();function _c(e,t,n){var r=n.countDurationsBetween(t.normalizedRange.start,e,t.snapDuration);if(r<0)return 0;if(r>=t.snapDiffToIndex.length)return t.snapCnt;var o=Math.floor(r),i=t.snapDiffToIndex[o];return Je(i)?i+=r-o:i=Math.ceil(i),i}function kc(e,t){return null===e?{left:"",right:""}:t?{right:e,left:""}:{left:e,right:""}}function Mc(e,t){return e?t?{right:e.start,left:-e.end}:{left:e.start,right:-e.end}:{left:"",right:""}}var Ic=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Wo(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=Gt(t.tDateProfile.slotDuration).unit,o=t.slatCoords&&t.slatCoords.dateProfile===t.dateProfile?t.slatCoords:null;return Oo(Pa,{unit:r},(function(r,i){return Oo("div",{className:"fc-timeline-header",ref:e.rootElRef},Oo("table",{"aria-hidden":!0,className:"fc-scrollgrid-sync-table",style:{minWidth:t.tableMinWidth,width:t.clientWidth}},t.tableColGroupNode,Oo("tbody",null,Oo(Tc,{dateProfile:t.dateProfile,tDateProfile:t.tDateProfile,nowDate:r,todayRange:i,rowInnerHeights:t.rowInnerHeights}))),n.options.nowIndicator&&Oo("div",{className:"fc-timeline-now-indicator-container"},o&&o.isDateInRange(r)&&Oo(hs,{isAxis:!0,date:r},(function(e,t,i,a){return Oo("div",{ref:e,className:["fc-timeline-now-indicator-arrow"].concat(t).join(" "),style:kc(o.dateToCoord(r),n.isRtl)},a)}))))}))},t.prototype.componentDidMount=function(){this.updateSize()},t.prototype.componentDidUpdate=function(){this.updateSize()},t.prototype.updateSize=function(){this.props.onMaxCushionWidth&&this.props.onMaxCushionWidth(this.computeMaxCushionWidth())},t.prototype.computeMaxCushionWidth=function(){return Math.max.apply(Math,Ce(this.rootElRef.current,".fc-timeline-header-row:last-child .fc-timeline-slot-cushion").map((function(e){return e.getBoundingClientRect().width})))},t}(Yo),Pc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.options,i=t.theme,a=e.date,s=e.tDateProfile,l=e.isEm,u=po(e.date,e.todayRange,e.nowDate,e.dateProfile),c=["fc-timeline-slot","fc-timeline-slot-lane"],d={"data-date":n.formatIso(a,{omitTimeZoneOffset:!0,omitTime:!s.isTimeScale})},p=r(r({date:n.toDate(e.date)},u),{view:t.viewApi});return l&&c.push("fc-timeline-slot-em"),s.isTimeScale&&c.push(Je(n.countDurationsBetween(s.normalizedRange.start,e.date,s.labelInterval))?"fc-timeline-slot-major":"fc-timeline-slot-minor"),c.push.apply(c,e.isDay?fo(u,i):ho(u,i)),Oo(ni,{hookProps:p,classNames:o.slotLaneClassNames,content:o.slotLaneContent,didMount:o.slotLaneDidMount,willUnmount:o.slotLaneWillUnmount,elRef:e.elRef},(function(e,t,n,o){return Oo("td",r({ref:e,className:c.concat(t).join(" ")},d),Oo("div",{ref:n},o))}))},t}(Yo),Nc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.tDateProfile,n=e.cellElRefs,r=t.slotDates,o=t.isWeekStarts,i=!t.isTimeScale&&!t.largeUnit;return Oo("tbody",null,Oo("tr",null,r.map((function(r,a){var s=r.toISOString();return Oo(Pc,{key:s,elRef:n.createRef(s),date:r,dateProfile:e.dateProfile,tDateProfile:t,nowDate:e.nowDate,todayRange:e.todayRange,isEm:o[a],isDay:i})}))))},t}(Yo),Hc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Wo(),t.cellElRefs=new Ka,t.handleScrollRequest=function(e){var n=t.props.onScrollLeftRequest,r=t.coords;if(n&&r){if(e.time)n(r.coordFromLeft(r.durationToCoord(e.time)));return!0}return null},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return Oo("div",{className:"fc-timeline-slots",ref:this.rootElRef},Oo("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,Oo(Nc,{cellElRefs:this.cellElRefs,dateProfile:e.dateProfile,tDateProfile:e.tDateProfile,nowDate:e.nowDate,todayRange:e.todayRange})))},t.prototype.componentDidMount=function(){this.updateSizing(),this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)},t.prototype.componentDidUpdate=function(e){this.updateSizing(),this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)},t.prototype.componentWillUnmount=function(){this.scrollResponder.detach(),this.props.onCoords&&this.props.onCoords(null)},t.prototype.updateSizing=function(){var e,t=this.props,n=this.context;null!==t.clientWidth&&this.scrollResponder&&(this.rootElRef.current.offsetWidth&&(this.coords=new xc(this.rootElRef.current,(e=this.cellElRefs.currentMap,t.tDateProfile.slotDates.map((function(t){var n=t.toISOString();return e[n]}))),t.dateProfile,t.tDateProfile,n.dateEnv,n.isRtl),t.onCoords&&t.onCoords(this.coords),this.scrollResponder.update(!1)))},t.prototype.positionToHit=function(e){var t=this.coords.outerCoordCache,n=this.context,r=n.dateEnv,o=n.isRtl,i=this.props.tDateProfile,a=t.leftToIndex(e);if(null!=a){var s=t.getWidth(a),l=o?(t.rights[a]-e)/s:(e-t.lefts[a])/s,u=Math.floor(l*i.snapsPerSlot),c=r.add(i.slotDates[a],Lt(i.snapDuration,u));return{dateSpan:{range:{start:c,end:r.add(c,i.snapDuration)},allDay:!this.props.tDateProfile.isTimeScale},dayEl:this.cellElRefs.currentMap[a],left:t.lefts[a],right:t.rights[a]}}return null},t}(Yo);function Oc(e,t,n){var r=[];if(n)for(var o=0,i=e;o=0;n-=1){var r=t[n].parseMeta(e);if(r)return{meta:r,sourceDefId:n}}return null}(r);if(o)return{_raw:e,sourceId:Le(),sourceDefId:o.sourceDefId,meta:o.meta,publicId:r.id||"",isFetching:!1,latestFetchId:"",fetchRange:null}}return null}function od(e,t,n){var o=n.options,i=n.dateProfile;if(!e||!t)return id(o.initialResources||o.resources,i.activeRange,o.refetchResourcesOnNavigate,n);switch(t.type){case"RESET_RESOURCE_SOURCE":return id(t.resourceSourceInput,i.activeRange,o.refetchResourcesOnNavigate,n);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return function(e,t,n,r){if(n&&!function(e){return Boolean(ed(e.sourceDefId).ignoreRange)}(e)&&(!e.fetchRange||!Jn(e.fetchRange,t)))return ad(e,t,r);return e}(e,i.activeRange,o.refetchResourcesOnNavigate,n);case"RECEIVE_RESOURCES":case"RECEIVE_RESOURCE_ERROR":return function(e,t,n){if(t===e.latestFetchId)return r(r({},e),{isFetching:!1,fetchRange:n});return e}(e,t.fetchId,t.fetchRange);case"REFETCH_RESOURCES":return ad(e,i.activeRange,n);default:return e}}function id(e,t,n,r){if(e){var o=rd(e);return o=ad(o,n?t:null,r)}return null}function ad(e,t,n){var o=ed(e.sourceDefId),i=Le();return o.fetch({resourceSource:e,range:t,context:n},(function(e){n.dispatch({type:"RECEIVE_RESOURCES",fetchId:i,fetchRange:t,rawResources:e.rawResources})}),(function(e){n.dispatch({type:"RECEIVE_RESOURCE_ERROR",fetchId:i,fetchRange:t,error:e})})),r(r({},e),{isFetching:!0,latestFetchId:i})}var sd="_fc:",ld={id:String,parentId:String,children:wn,title:String,businessHours:wn,extendedProps:wn,eventEditable:Boolean,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventConstraint:wn,eventOverlap:Boolean,eventAllow:wn,eventClassNames:Pn,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String};function ud(e,t,n,o){void 0===t&&(t="");var i=Rn(e,ld),a=i.refined,s=i.extra,l={id:a.id||sd+Le(),parentId:a.parentId||t,title:a.title||"",businessHours:a.businessHours?eo(a.businessHours,o):null,ui:On({editable:a.eventEditable,startEditable:a.eventStartEditable,durationEditable:a.eventDurationEditable,constraint:a.eventConstraint,overlap:a.eventOverlap,allow:a.eventAllow,classNames:a.eventClassNames,backgroundColor:a.eventBackgroundColor,borderColor:a.eventBorderColor,textColor:a.eventTextColor,color:a.eventColor},o),extendedProps:r(r({},s),a.extendedProps)};if(Object.freeze(l.ui.classNames),Object.freeze(l.extendedProps),n[l.id]);else if(n[l.id]=l,a.children)for(var u=0,c=a.children;u0)break}t.splice(r,0,e)}function Ld(e){var t=r(r(r({},e.extendedProps),e.ui),e);return delete t.ui,delete t.extendedProps,t}function Ud(e,t){return e.spec===t.spec&&e.value===t.value}var Bd=Jo({deps:[Wu],reducers:[function(e,t,n){var o=od(e&&e.resourceSource,t,n);return{resourceSource:o,resourceStore:dd(e&&e.resourceStore,t,o,n),resourceEntityExpansions:function(e,t){var n;if(!e||!t)return{};switch(t.type){case"SET_RESOURCE_ENTITY_EXPANDED":return r(r({},e),((n={})[t.id]=t.isExpanded,n));default:return e}}(e&&e.resourceEntityExpansions,t)}}],isLoadingFuncs:[function(e){return e.resourceSource&&e.resourceSource.isFetching}],eventRefiners:pd,eventDefMemberAdders:[function(e){return{resourceIds:(t=e.resourceIds,(t||[]).map((function(e){return String(e)}))).concat(e.resourceId?[e.resourceId]:[]),resourceEditable:e.resourceEditable};var t}],isDraggableTransformers:[function(e,t,n,r){if(!e){var o=r.getCurrentData();if(o.viewSpecs[o.currentViewType].optionDefaults.needsResourceData&&qc(t,r))return!0}return e}],eventDragMutationMassagers:[function(e,t,n){var r=t.dateSpan.resourceId,o=n.dateSpan.resourceId;r&&o&&r!==o&&(e.resourceMutation={matchResourceId:r,setResourceId:o})}],eventDefMutationAppliers:[function(e,t,n){var r=t.resourceMutation;if(r&&qc(e,n)){var o=e.resourceIds.indexOf(r.matchResourceId);if(-1!==o){var i=e.resourceIds.slice();i.splice(o,1),-1===i.indexOf(r.setResourceId)&&i.push(r.setResourceId),e.resourceIds=i}}}],dateSelectionTransformers:[function(e,t){var n=e.dateSpan.resourceId,r=t.dateSpan.resourceId;return n&&r?{resourceId:n}:null}],datePointTransforms:[function(e,t){return e.resourceId?{resource:t.calendarApi.getResourceById(e.resourceId)}:{}}],dateSpanTransforms:[function(e,t){return e.resourceId?{resource:t.calendarApi.getResourceById(e.resourceId)}:{}}],viewPropsTransformers:[Yc,Xc],isPropsValid:function(e,t){var n=(new hd).splitProps(r(r({},e),{resourceStore:t.getCurrentData().resourceStore}));for(var o in n){var i=n[o];if(o&&n[""]&&(i=r(r({},i),{eventStore:Mn(n[""].eventStore,i.eventStore),eventUiBases:r(r({},n[""].eventUiBases),i.eventUiBases)})),!Fa(i,t,{resourceId:o},vd.bind(null,o)))return!1}return!0},externalDefTransforms:[function(e){return e.resourceId?{resourceId:e.resourceId}:{}}],eventDropTransformers:[function(e,t){var n=e.resourceMutation;if(n){var r=t.calendarApi;return{oldResource:r.getResourceById(n.matchResourceId),newResource:r.getResourceById(n.setResourceId)}}return{oldResource:null,newResource:null}}],optionChangeHandlers:md,optionRefiners:Sd,listenerRefiners:Ed,propSetHandlers:{resourceStore:function(e,t){var n=t.emitter;n.hasHandlers("resourcesSet")&&n.trigger("resourcesSet",function(e,t){var n=[];for(var r in e)n.push(new fd(t,e[r]));return n}(e,t))}}}),zd=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.transformSeg=function(e,t,n){return t.computeColRanges(e.firstCol,e.lastCol,n).map((function(t){return r(r(r({},e),t),{isStart:e.isStart&&t.isStart,isEnd:e.isEnd&&t.isEnd})}))},t}(Id),Vd=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.splitter=new Pd,t.slicers={},t.joiner=new zd,t.tableRef=Wo(),t.isHitComboAllowed=function(e,n){return 1===t.props.resourceDayTableModel.dayTableModel.colCnt||e.dateSpan.resourceId===n.dateSpan.resourceId},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=t.resourceDayTableModel,i=t.nextDayThreshold,a=t.dateProfile,s=this.splitter.splitProps(t);this.slicers=Ct(s,(function(t,n){return e.slicers[n]||new _l}));var l=Ct(this.slicers,(function(e,t){return e.sliceProps(s[t],a,i,n,o.dayTableModel)}));return Oo(Tl,r({forPrint:t.forPrint,ref:this.tableRef},this.joiner.joinProps(l,o),{cells:o.cells,dateProfile:a,colGroupNode:t.colGroupNode,tableMinWidth:t.tableMinWidth,renderRowIntro:t.renderRowIntro,dayMaxEvents:t.dayMaxEvents,dayMaxEventRows:t.dayMaxEventRows,showWeekNumbers:t.showWeekNumbers,expandRows:t.expandRows,headerAlignElRef:t.headerAlignElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,isHitComboAllowed:this.isHitComboAllowed}))},t}($o),Fd=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.flattenResources=$t(Nd),t.buildResourceDayTableModel=$t(Gd),t.headerRef=Wo(),t.tableRef=Wo(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=n.options,o=r.resourceOrder||yd,i=this.flattenResources(t.resourceStore,o),a=this.buildResourceDayTableModel(t.dateProfile,n.dateProfileGenerator,i,r.datesAboveResources,n),s=r.dayHeaders&&Oo(Rd,{ref:this.headerRef,resources:i,dateProfile:t.dateProfile,dates:a.dayTableModel.headerDates,datesRepDistinctDays:!0}),l=function(n){return Oo(Vd,{ref:e.tableRef,dateProfile:t.dateProfile,resourceDayTableModel:a,businessHours:t.businessHours,eventStore:t.eventStore,eventUiBases:t.eventUiBases,dateSelection:t.dateSelection,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,nextDayThreshold:r.nextDayThreshold,tableMinWidth:n.tableMinWidth,colGroupNode:n.tableColGroupNode,dayMaxEvents:r.dayMaxEvents,dayMaxEventRows:r.dayMaxEventRows,showWeekNumbers:r.weekNumbers,expandRows:!t.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:n.clientWidth,clientHeight:n.clientHeight,forPrint:t.forPrint})};return r.dayMinWidth?this.renderHScrollLayout(s,l,a.colCnt,r.dayMinWidth):this.renderSimpleLayout(s,l)},t}(sl);function Gd(e,t,n,r,o){var i=Il(e,t);return r?new kd(i,n,o):new _d(i,n,o)}var jd=Jo({deps:[Wu,Bd,Pl],initialView:"resourceDayGridDay",views:{resourceDayGrid:{type:"dayGrid",component:Fd,needsResourceData:!0},resourceDayGridDay:{type:"resourceDayGrid",duration:{days:1}},resourceDayGridWeek:{type:"resourceDayGrid",duration:{weeks:1}},resourceDayGridMonth:{type:"resourceDayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),qd=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.transformSeg=function(e,t,n){return[r(r({},e),{col:t.computeCol(e.col,n)})]},t}(Id),Yd=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayRanges=$t(du),t.splitter=new Pd,t.slicers={},t.joiner=new qd,t.timeColsRef=Wo(),t.isHitComboAllowed=function(e,n){return 1===t.dayRanges.length||e.dateSpan.resourceId===n.dateSpan.resourceId},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=n.dateEnv,i=n.options,a=t.dateProfile,s=t.resourceDayTableModel,l=this.dayRanges=this.buildDayRanges(s.dayTableModel,a,o),u=this.splitter.splitProps(t);this.slicers=Ct(u,(function(t,n){return e.slicers[n]||new uu}));var c=Ct(this.slicers,(function(e,t){return e.sliceProps(u[t],a,null,n,l)}));return Oo(Pa,{unit:i.nowIndicator?"minute":"day"},(function(n,o){return Oo(su,r({ref:e.timeColsRef},e.joiner.joinProps(c,s),{dateProfile:a,axis:t.axis,slotDuration:t.slotDuration,slatMetas:t.slatMetas,cells:s.cells[0],tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,expandRows:t.expandRows,nowDate:n,nowIndicatorSegs:i.nowIndicator&&e.buildNowIndicatorSegs(n),todayRange:o,onScrollTopRequest:t.onScrollTopRequest,forPrint:t.forPrint,onSlatCoords:t.onSlatCoords,isHitComboAllowed:e.isHitComboAllowed}))}))},t.prototype.buildNowIndicatorSegs=function(e){var t=this.slicers[""].sliceNowDate(e,this.context,this.dayRanges);return this.joiner.expandSegs(this.props.resourceDayTableModel,t)},t}($o),Zd=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.flattenResources=$t(Nd),t.buildResourceTimeColsModel=$t(Xd),t.buildSlatMetas=$t(fu),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=n.options,i=n.dateEnv,a=t.dateProfile,s=this.allDaySplitter.splitProps(t),l=o.resourceOrder||yd,u=this.flattenResources(t.resourceStore,l),c=this.buildResourceTimeColsModel(a,n.dateProfileGenerator,u,o.datesAboveResources,n),d=this.buildSlatMetas(a.slotMinTime,a.slotMaxTime,o.slotLabelInterval,o.slotDuration,i),p=o.dayMinWidth,f=!p,h=p,v=o.dayHeaders&&Oo(Rd,{resources:u,dates:c.dayTableModel.headerDates,dateProfile:a,datesRepDistinctDays:!0,renderIntro:f?this.renderHeadAxis:null}),g=!1!==o.allDaySlot&&function(n){return Oo(Vd,r({},s.allDay,{dateProfile:a,resourceDayTableModel:c,nextDayThreshold:o.nextDayThreshold,tableMinWidth:n.tableMinWidth,colGroupNode:n.tableColGroupNode,renderRowIntro:f?e.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:e.headerElRef,clientWidth:n.clientWidth,clientHeight:n.clientHeight,forPrint:t.forPrint},e.getAllDayMaxEventProps()))},m=function(n){return Oo(Yd,r({},s.timed,{dateProfile:a,axis:f,slotDuration:o.slotDuration,slatMetas:d,resourceDayTableModel:c,tableColGroupNode:n.tableColGroupNode,tableMinWidth:n.tableMinWidth,clientWidth:n.clientWidth,clientHeight:n.clientHeight,onSlatCoords:e.handleSlatCoords,expandRows:n.expandRows,forPrint:t.forPrint,onScrollTopRequest:e.handleScrollTopRequest}))};return h?this.renderHScrollLayout(v,g,m,c.colCnt,p,d,this.state.slatCoords):this.renderSimpleLayout(v,g,m)},t}(Ul);function Xd(e,t,n,r,o){var i=vu(e,t);return r?new kd(i,n,o):new _d(i,n,o)}var Kd=Jo({deps:[Wu,Bd,gu],initialView:"resourceTimeGridDay",views:{resourceTimeGrid:{type:"timeGrid",component:Zd,needsResourceData:!0},resourceTimeGridDay:{type:"resourceTimeGrid",duration:{days:1}},resourceTimeGridWeek:{type:"resourceTimeGrid",duration:{weeks:1}}}});function $d(e){for(var t=e.depth,n=e.hasChildren,r=e.isExpanded,i=e.onExpanderClick,a=[],s=0;s1?Oo(np,{key:a,colSpec:i,fieldValue:l,rowSpan:s}):Oo(tp,{key:a,colSpec:i,resource:t,fieldValue:l,depth:r,hasChildren:e.hasChildren,isExpanded:e.isExpanded,innerHeight:e.innerHeight})})))},t}(Yo);op.addPropsEquality({rowSpans:Kt});var ip=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.innerInnerRef=Wo(),t.onExpanderClick=function(){var e=t.props;t.context.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:e.id,isExpanded:!e.isExpanded})},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r={groupValue:t.group.value,view:n.viewApi},o=t.group.spec;return Oo("tr",{role:"row"},Oo(ni,{hookProps:r,classNames:o.labelClassNames,content:o.labelContent,defaultContent:ap,didMount:o.labelDidMount,willUnmount:o.labelWillUnmount},(function(r,o,i,a){return Oo("th",{ref:r,role:"columnheader",scope:"colgroup",colSpan:t.spreadsheetColCnt,className:["fc-datagrid-cell","fc-resource-group",n.theme.getClass("tableCellShaded")].concat(o).join(" ")},Oo("div",{className:"fc-datagrid-cell-frame",style:{height:t.innerHeight}},Oo("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner",ref:e.innerInnerRef},Oo($d,{depth:0,hasChildren:!0,isExpanded:t.isExpanded,onExpanderClick:e.onExpanderClick}),Oo("span",{className:"fc-datagrid-cell-main",ref:i},a))))})))},t}(Yo);function ap(e){return e.groupValue||Oo(Lo,null," ")}ip.addPropsEquality({group:Ud});var sp=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.resizerElRefs=new Ka(t._handleColResizerEl.bind(t)),t.colDraggings={},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.colSpecs,r=t.superHeaderRendering,o=t.rowInnerHeights,i={view:this.context.viewApi},a=[];if(o=o.slice(),r){var s=o.shift();a.push(Oo("tr",{key:"row-super",role:"row"},Oo(ni,{hookProps:i,classNames:r.headerClassNames,content:r.headerContent,didMount:r.headerDidMount,willUnmount:r.headerWillUnmount},(function(e,t,r,o){return Oo("th",{ref:e,role:"columnheader",scope:"colgroup",colSpan:n.length,className:["fc-datagrid-cell","fc-datagrid-cell-super"].concat(t).join(" ")},Oo("div",{className:"fc-datagrid-cell-frame",style:{height:s}},Oo("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))))}var l=o.shift();return a.push(Oo("tr",{key:"row",role:"row"},n.map((function(t,r){var o=r===n.length-1;return Oo(ni,{key:r,hookProps:i,classNames:t.headerClassNames,content:t.headerContent,didMount:t.headerDidMount,willUnmount:t.headerWillUnmount},(function(n,i,a,s){return Oo("th",{ref:n,role:"columnheader",className:["fc-datagrid-cell"].concat(i).join(" ")},Oo("div",{className:"fc-datagrid-cell-frame",style:{height:l}},Oo("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner"},t.isMain&&Oo("span",{className:"fc-datagrid-expander fc-datagrid-expander-placeholder"},Oo("span",{className:"fc-icon"})),Oo("span",{className:"fc-datagrid-cell-main",ref:a},s)),!o&&Oo("div",{className:"fc-datagrid-cell-resizer",ref:e.resizerElRefs.createRef(r)})))}))})))),Oo(Lo,null,a)},t.prototype._handleColResizerEl=function(e,t){var n,r=this.colDraggings;e?(n=this.initColResizing(e,parseInt(t,10)))&&(r[t]=n):(n=r[t])&&(n.destroy(),delete r[t])},t.prototype.initColResizing=function(e,t){var n=this.context,r=n.pluginHooks,o=n.isRtl,i=this.props.onColWidthChange,a=r.elementDraggingImpl;if(a){var s,l,u=new a(e);return u.emitter.on("dragstart",(function(){var n=Ce(Ee(e,"tr"),"th");l=n.map((function(e){return e.getBoundingClientRect().width})),s=l[t]})),u.emitter.on("dragmove",(function(e){l[t]=Math.max(s+e.deltaX*(o?-1:1),20),i&&i(l.slice())})),u.setAutoScrollEnabled(!1),u}return null},t}(Yo),lp=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n={resource:new fd(t,e.resource)};return Oo(oi,{hookProps:n,content:t.options.resourceLaneContent},(function(e,t){return t&&Oo("div",{className:"fc-timeline-lane-misc",ref:e},t)}))},t}(Yo),up=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.refineHookProps=Jt(cp),t.normalizeClassNames=si(),t.handleHeightChange=function(e,n){t.props.onHeightChange&&t.props.onHeightChange(Ee(e,"tr"),n)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=n.options,o=this.refineHookProps({resource:t.resource,context:n}),i=this.normalizeClassNames(r.resourceLaneClassNames,o);return Oo("tr",{ref:t.elRef},Oo(ai,{hookProps:o,didMount:r.resourceLaneDidMount,willUnmount:r.resourceLaneWillUnmount},(function(n){return Oo("td",{ref:n,className:["fc-timeline-lane","fc-resource"].concat(i).join(" "),"data-resource-id":t.resource.id},Oo("div",{className:"fc-timeline-lane-frame",style:{height:t.innerHeight}},Oo(lp,{resource:t.resource}),Oo(zc,{dateProfile:t.dateProfile,tDateProfile:t.tDateProfile,nowDate:t.nowDate,todayRange:t.todayRange,nextDayThreshold:t.nextDayThreshold,businessHours:t.businessHours,eventStore:t.eventStore,eventUiBases:t.eventUiBases,dateSelection:t.dateSelection,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,timelineCoords:t.timelineCoords,onHeightChange:e.handleHeightChange,resourceId:t.resource.id})))})))},t}(Yo);function cp(e){return{resource:new fd(e.context,e.resource)}}var dp=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.props.renderingHooks,r={groupValue:t.groupValue,view:this.context.viewApi};return Oo("tr",{ref:t.elRef},Oo(ni,{hookProps:r,classNames:n.laneClassNames,content:n.laneContent,didMount:n.laneDidMount,willUnmount:n.laneWillUnmount},(function(n,r,o,i){return Oo("td",{ref:n,className:["fc-timeline-lane","fc-resource-group",e.context.theme.getClass("tableCellShaded")].concat(r).join(" ")},Oo("div",{style:{height:t.innerHeight},ref:o},i))})))},t}(Yo),pp=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.rowElRefs,o=e.innerHeights;return Oo("tbody",null,e.rowNodes.map((function(i,a){if(i.group)return Oo(dp,{key:i.id,elRef:n.createRef(i.id),groupValue:i.group.value,renderingHooks:i.group.spec,innerHeight:o[a]||""});if(i.resource){var s=i.resource;return Oo(up,r({key:i.id,elRef:n.createRef(i.id)},e.splitProps[s.id],{resource:s,dateProfile:e.dateProfile,tDateProfile:e.tDateProfile,nowDate:e.nowDate,todayRange:e.todayRange,nextDayThreshold:t.options.nextDayThreshold,businessHours:s.businessHours||e.fallbackBusinessHours,innerHeight:o[a]||"",timelineCoords:e.slatCoords,onHeightChange:e.onRowHeightChange}))}return null})))},t}(Yo),fp=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Wo(),t.rowElRefs=new Ka,t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return Oo("table",{ref:this.rootElRef,"aria-hidden":!0,className:"fc-scrollgrid-sync-table "+t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},Oo(pp,{rowElRefs:this.rowElRefs,rowNodes:e.rowNodes,dateProfile:e.dateProfile,tDateProfile:e.tDateProfile,nowDate:e.nowDate,todayRange:e.todayRange,splitProps:e.splitProps,fallbackBusinessHours:e.fallbackBusinessHours,slatCoords:e.slatCoords,innerHeights:e.innerHeights,onRowHeightChange:e.onRowHeightChange}))},t.prototype.componentDidMount=function(){this.updateCoords()},t.prototype.componentDidUpdate=function(){this.updateCoords()},t.prototype.componentWillUnmount=function(){this.props.onRowCoords&&this.props.onRowCoords(null)},t.prototype.updateCoords=function(){var e,t=this.props;t.onRowCoords&&null!==t.clientWidth&&this.props.onRowCoords(new ko(this.rootElRef.current,(e=this.rowElRefs.currentMap,t.rowNodes.map((function(t){return e[t.id]}))),!1,!0))},t}(Yo);var hp=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.computeHasResourceBusinessHours=$t(vp),t.resourceSplitter=new hd,t.bgSlicer=new Wc,t.slatsRef=Wo(),t.state={slatCoords:null},t.handleEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t.handleSlatCoords=function(e){t.setState({slatCoords:e}),t.props.onSlatCoords&&t.props.onSlatCoords(e)},t.handleRowCoords=function(e){t.rowCoords=e,t.props.onRowCoords&&t.props.onRowCoords(e)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this,n=t.props,r=t.state,o=t.context,i=n.dateProfile,a=n.tDateProfile,s=Gt(a.slotDuration).unit,l=this.computeHasResourceBusinessHours(n.rowNodes),u=this.resourceSplitter.splitProps(n),c=u[""],d=this.bgSlicer.sliceProps(c,i,a.isTimeScale?null:n.nextDayThreshold,o,i,o.dateProfileGenerator,a,o.dateEnv),p=r.slatCoords&&r.slatCoords.dateProfile===n.dateProfile?r.slatCoords:null;return Oo("div",{ref:this.handleEl,className:["fc-timeline-body",n.expandRows?"fc-timeline-body-expandrows":""].join(" "),style:{minWidth:n.tableMinWidth}},Oo(Pa,{unit:s},(function(t,r){return Oo(Lo,null,Oo(Hc,{ref:e.slatsRef,dateProfile:i,tDateProfile:a,nowDate:t,todayRange:r,clientWidth:n.clientWidth,tableColGroupNode:n.tableColGroupNode,tableMinWidth:n.tableMinWidth,onCoords:e.handleSlatCoords,onScrollLeftRequest:n.onScrollLeftRequest}),Oo(Ac,{businessHourSegs:l?null:d.businessHourSegs,bgEventSegs:d.bgEventSegs,timelineCoords:p,eventResizeSegs:d.eventResize?d.eventResize.segs:[],dateSelectionSegs:d.dateSelectionSegs,nowDate:t,todayRange:r}),Oo(fp,{rowNodes:n.rowNodes,dateProfile:i,tDateProfile:n.tDateProfile,nowDate:t,todayRange:r,splitProps:u,fallbackBusinessHours:l?n.businessHours:null,clientWidth:n.clientWidth,minHeight:n.expandRows?n.clientHeight:"",tableMinWidth:n.tableMinWidth,innerHeights:n.rowInnerHeights,slatCoords:p,onRowCoords:e.handleRowCoords,onRowHeightChange:n.onRowHeightChange}),o.options.nowIndicator&&p&&p.isDateInRange(t)&&Oo("div",{className:"fc-timeline-now-indicator-container"},Oo(hs,{isAxis:!1,date:t},(function(e,n,r,i){return Oo("div",{ref:e,className:["fc-timeline-now-indicator-line"].concat(n).join(" "),style:kc(p.dateToCoord(t),o.isRtl)},i)}))))})))},t.prototype.queryHit=function(e,t){var n=this.rowCoords,r=n.topToIndex(t);if(null!=r){var o=this.props.rowNodes[r].resource;if(o){var i=this.slatsRef.current.positionToHit(e);if(i)return{dateProfile:this.props.dateProfile,dateSpan:{range:i.dateSpan.range,allDay:i.dateSpan.allDay,resourceId:o.id},rect:{left:i.left,right:i.right,top:n.tops[r],bottom:n.bottoms[r]},dayEl:i.dayEl,layer:0}}}return null},t}($o);function vp(e){for(var t=0,n=e;t0){i.rowId=s.id,i.fromBottom=l;break}}return i}return null},t}(Yo);function yp(e){for(var t={},n=0;n + + + +Sternwarte Welzheim + + + + + + +
    + + +
    + + +
    +
    +

    Postanschrift und Kontaktadresse

    +

    Gesellschaft zur Förderung des Planetariums Stuttgart und der Sternwarte Welzheim e.V.

    +

    Willy-Brandt-Str. 25
    + 70173 Stuttgart * Germany
    + Telefon: (0711) 216 890 15
    + Fax: : (0711) 216 890 01
    + planetarium@stuttgart.de
    +
    www.planetarium-stuttgart.de
    + www.planetariumsgesellschaft.de
    + www.sternwarte-welzheim.de
    +

    +

    Sternwarte Welzheim:

    + Telefon in der Sternwarte Welzheim: (0 7182) 42 84 – nur zu den Beobachtungszeiten besetzt!
    + +

    Bankverbindung:

    + Deutsche Bank AG Stuttgart
    + IBAN DE18600700700122038300
    + BIC DEUTDESSXXX +
    +
    + +
    + + diff --git a/html/sternwarte/maintenance.html b/html/sternwarte/maintenance.html new file mode 100644 index 0000000..f138137 --- /dev/null +++ b/html/sternwarte/maintenance.html @@ -0,0 +1,5 @@ +
    + Aufgrund von Wartungsarbeiten sind userere
    + Webseiten zur Zeit leider nicht erreichbar !

    + Bitte versuchen Sie es später noch einmal. +
    diff --git a/html/sternwarte/maintenance.php b/html/sternwarte/maintenance.php new file mode 100644 index 0000000..89f5ac4 --- /dev/null +++ b/html/sternwarte/maintenance.php @@ -0,0 +1,6 @@ + diff --git a/html/sternwarte/merkurtransit.php b/html/sternwarte/merkurtransit.php new file mode 100755 index 0000000..0fa9b2a --- /dev/null +++ b/html/sternwarte/merkurtransit.php @@ -0,0 +1,87 @@ + + + + + + + + +Sternwarte Welzheim + + + + + + + + + + + + + +
    + + + + + +
    + + + + + +
    + + + +
    + +

    Seltenes kosmisches Ereignis im Mai 2016 zu erwarten

    +

    Bei wolkenfreiem Himmel auf der Sternwarte Welzheim zu beobachten

    +

    Ein außergewöhnliches astronomisches Ereignis erwartet uns im Mai dieses Jahres: Der sonnennächste Planet Merkur zieht als dunkler Punkt vor der Sonnenscheibe vorbei

    + +

    Merkurtransit
    + + Verlauf des Merkurtransits vom 9. Mai 2016. Die Zeiten (MESZ) gelten exakt für den in Deutschland zentralen Ort 50° Nord und 10° Ost. Für andere Orte in Deutschland weichen diese Zeiten nur um wenige Sekunden ab.

    +

    Merkurtransit 2003Merkur-Transit 7.Mai 2003, Merkur links oben, nicht zu verwechseln mit Sunspot im Zentrum
    + Sternwarte Welzheim/Gutzeit/Idler.

    +

    +

    Mitte April zeigte sich der sonnennahe Merkur kurz in der Abenddämmerung am Westhimmel. Bereits am Montag, 9. Mai überholt der flinke Planet die Erde auf der Innenbahn. Dies ist allerdings normalerweise nichts Besonderes. Denn alle vier Monate überholt Merkur die Erde. Doch diesmal liegt die um sieben Grad geneigte Merkurbahn so, dass der Benjamin der Planeten als dunkler Punkt vor der Sonnenscheibe vorbeiwandert. Ein solches Ereignis nennt man Merkurtransit oder –durchgang.

    +

    Merkurtransite sind noch seltener als Sonnen- und Mondfinsternisse. Im 21. Jahrhundert tritt Merkur nur vierzehn Mal vor die Sonne. Nicht alle Merkurtransite sind von Mitteleuropa aus beobachtbar. Denn einige finden statt, wenn bei uns die Sonne bereits untergegangen ist. Der letzte von Deutschland aus sichtbare Merkurtransit erfolgte am 7. Mai 2003. Sollte man den Merkurdurchgang am 9. Mai wegen bewölktem Himmel verpassen, so bietet sich erst am 11. November 2019 und danach am 13. November 2032 eine Gelegenheit, Merkur als dunklen Punkt vor der Sonne zu beobachten.

    +

    Das kosmische Schattenspiel beginnt in Stuttgart und Umgebung um 13h 12m 14s Sommerzeit mit dem Eintritt von Merkur am Ostrand der Sonne. Die geringste Entfernung vom Mittelpunkt der Sonnenscheibe wird um 16h 56m 25s erreicht, wobei Merkur etwas mehr als fünf Bogenminuten Abstand vom Sonnenscheibenmittelpunkt hat. Der Merkurtransit endet mit dem Austritt von Merkur um 20h 40m 33s Uhr.

    +

    Die genauen Zeiten von Beginn und Ende des Merkurtransits sind ortsabhängig, weichen aber innerhalb Deutschlands nur um wenige Sekunden voneinander ab.

    +

    Das Merkurscheibchen ist winzig klein, es hat nur den 158. Teil des scheinbaren Sonnendurchmessers. Daher ist der Transit mit bloßen Augen nicht sichtbar.

    +

    Um Merkur als dunklen Punkt vor der Sonne zu sehen, benötigt man ein Fernrohr mit stabilem Stativ und mindestens fünfzigfacher Vergrößerung. Ohne geeignete Schutzmaßnahmen wie Objektivfilter oder Projektionseinrichtung darf man keinesfalls mit Fernglas oder Teleskop in die Sonne sehen! Am besten, man besucht eine Sternwarte, um dieses Himmelsspektakel zu verfolgen.

    +

    Die Sternwarte Welzheim bietet bei wolkenfreiem Himmel am Montag, -9. Mai 2016 von 13 bis 20 Uhr eine Sonderführung an, bei der man den Merkurtransit per Teleskop verfolgen kann.

    +

    Prof. Dr. Hans-Ulrich Keller
    + Planetarium Stuttgart  /  15.04.2016
    + + +

    + +
    + +
    + + + +
    + + + + + diff --git a/html/sternwarte/mofi2015.php b/html/sternwarte/mofi2015.php new file mode 100755 index 0000000..26adc01 --- /dev/null +++ b/html/sternwarte/mofi2015.php @@ -0,0 +1,180 @@ + + + + + Sternwarte Welzheim + + + + + + + + +
    + + + +
    + + +
    +
    +

    Totale Mondfinsternis 28.09.2015

    +

    Bilder der totalen Mondfinsternis aufgenommen auf der Sternwarte Welzheim
    + Bildautor: Martin Gertz

    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +

    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    + Totale Mondfinsternis Aufnahmen Jörg Nikolaizig, Sternwarte Welzheim
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    +
    Mondfinsternis2015
    +
     
    +
    +
    + +
    +
    + + + diff --git a/html/sternwarte/mofi2019.php b/html/sternwarte/mofi2019.php new file mode 100755 index 0000000..42c1136 --- /dev/null +++ b/html/sternwarte/mofi2019.php @@ -0,0 +1,70 @@ + + + + + + + + +Sternwarte Welzheim + + + + + + + + + + + + + +
    + + + + + +
    + + + + + +
    + + + +
    + +

    Partielle Mondfinsternis 16.07.2019

    +

    Merkurtransit
    + + Bildautor: Martin Gertz + +

    +
    + +
    + + + +
    + + + + + diff --git a/html/sternwarte/mofi2025.php b/html/sternwarte/mofi2025.php new file mode 100644 index 0000000..6822187 --- /dev/null +++ b/html/sternwarte/mofi2025.php @@ -0,0 +1,96 @@ + + + + + + + + +Sternwarte Welzheim + + + + + + + + + + + + + +
    + + + + + +
    + + + + + +
    + + + +
    + + + + +

    Totale Mondfinsternis am So, 7. September

    + + +

    Kosmisches Schattenspiel auf der Sternwarte Welzheim beobachtbar

    + + + + +

    Der September beschert uns nach längerer Zeit wieder einmal eine totale Mondfinsternis, die von Deutschland aus beobachtbar ist. In den Abendstunden am Sonntag, 7. September wandert der Vollmond durch den Schatten unseres Globus. Der Eintritt in den Kernschatten der Erde erfolgt um 18:27 Uhr Mitteleuropäischer Sommerzeit. Von 19:30 bis 20:53 Uhr befindet sich der Mond vollständig im Kernschatten der Erde, die Finsternis ist in diesem Zeitraum total.

    + +

    Allerdings geht der Mond in Welzheim erst um 19:49 Uhr auf, weshalb nur der zweite Teil der Mondfinsternis bei klarem Himmel beobachtbar ist. Der verfinsterte Mond steht vor der Sternenkulisse des Wassermanns. Die Größe der Finsternis beträgt das 1,367-fache des scheinbaren Monddurchmessers.

    +Vollmond tritt exakt um 20:09 Uhr am 7. ein. + +

    Im Schatten der Erde ist der Mond nicht völlig verschwunden, sondern leuchtet in einem mehr oder minder hellen Kupferrot, da ein Teil des Sonnenlichtes durch die Erdatmosphäre in den Kernschattenkegel gelenkt wird und auch auf den Mond trifft.

    +Bei stark verschmutzter Lufthülle zeigt sich der Mond in einem dunklen, schwach rötlichen Licht. + +

    Um 21:57 Uhr endet der sichtbare Teil der Finsternis mit dem Austritt des Mondes aus dem Kernschatten. Mit Austritt des Mondes aus dem Halbschatten der Erde um 22:57 Uhr endet die Mondfinsternis. Der Austritt des Mondes aus dem Halbschatten der Erde bleibt als infinitesimaler Vorgang prinzipiell unbeobachtbar.

    + +

    Die nächste von Deutschland aus beobachtbare totale Mondfinsternis findet erst am +31. Dezember 2028 statt.

    + +

    Bei sternklarem Wetter findet in der Sternwarte Welzheim am Sonntag, 7. September 2025 eine Sonderführung statt. Interessierte Mondguckerinnen und Mondgucker treffen sich um 20 Uhr vor der Sternwarte. Bei bewölktem Himmel findet keine Mond- führung statt. + +

    +

    Text: Hans-Ulrich Keller +
    + + +

    +
    + +
    + + + +
    + + + + + diff --git a/html/sternwarte/navi.php b/html/sternwarte/navi.php new file mode 100755 index 0000000..4781cd0 --- /dev/null +++ b/html/sternwarte/navi.php @@ -0,0 +1,37 @@ + + diff --git a/html/sternwarte/perseide2019.php b/html/sternwarte/perseide2019.php new file mode 100755 index 0000000..33c3561 --- /dev/null +++ b/html/sternwarte/perseide2019.php @@ -0,0 +1,70 @@ + + + + + + + + +Sternwarte Welzheim + + + + + + + + + + + + + +
    + + + + + +
    + + + + + +
    + + + +
    + +

    Perseide 13.08.2019

    +

    Merkurtransit
    + + Bildautor: Olaf Meyer-Hamme + +

    +
    + +
    + + + +
    + + + + + diff --git a/html/sternwarte/phpmailer/composer.json b/html/sternwarte/phpmailer/composer.json new file mode 100644 index 0000000..3c65b5c --- /dev/null +++ b/html/sternwarte/phpmailer/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "phpmailer/phpmailer": "^6.5" + } +} diff --git a/html/sternwarte/phpmailer/composer.lock b/html/sternwarte/phpmailer/composer.lock new file mode 100644 index 0000000..f95db50 --- /dev/null +++ b/html/sternwarte/phpmailer/composer.lock @@ -0,0 +1,93 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "90bbf95869b4e88bf0dc5022e708a458", + "packages": [ + { + "name": "phpmailer/phpmailer", + "version": "v6.5.1", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.2", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.6.0", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2021-08-18T09:14:16+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/html/sternwarte/phpmailer/dosendmail.php b/html/sternwarte/phpmailer/dosendmail.php new file mode 100644 index 0000000..acd0f8b --- /dev/null +++ b/html/sternwarte/phpmailer/dosendmail.php @@ -0,0 +1,101 @@ +SMTPDebug = SMTP::DEBUG_SERVER; + $mail->Debugoutput = function($str, $level) { + file_put_contents(__DIR__ . '/phpmailer_debug.log', + date('Y-m-d H:i:s') . " [Level $level] $str\n", FILE_APPEND); + }; + + // Basis-Einstellungen + $mail->CharSet = 'UTF-8'; + $mail->isSMTP(); + + if ($develop == 'true') { + $mail->Host = 'mailhog'; + $mail->Port = 1025; + $mail->SMTPAuth = false; + } else { + // GMX Einstellungen + $mail->Host = 'smtp.gmx.com'; // ✅ Korrekter Host + $mail->Port = 465; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; + $mail->SMTPAuth = true; + $mail->Username = 'sternwarte.welzheim@gmx.de'; + $mail->Password = '4NT&%nH9&5wz'; // ✅ Tippfehler korrigiert + +// // GMX Einstellungen +// $mail->Host = 'smtp.office365.com'; // ✅ Korrekter Host +// $mail->Port = 587; +// $mail->SMTPSecure = 'tls'; +// $mail->SMTPAuth = true; +// $mail->Username = 'sonderfuehrung@sternwarte.welzheim.de'; +// $mail->Password = 'UNK44mkap5'; // ✅ Tippfehler korrigiert + + // Optional: Zusätzliche Authentifizierung + $mail->AuthType = 'LOGIN'; + + // Optional: Timeout erhöhen + $mail->Timeout = 60; + } + + // Absender + $mail->setFrom('sternwarte.welzheim@gmx.de', 'Sternwarte-Welzheim'); + + // Empfänger + if (count($to) != 0) { + foreach ($to as $t) { + $mail->addAddress($t); + } + } + + // CC + if (count($cc) != 0) { + foreach ($cc as $c) { + $mail->addCC($c); + } + } + + // BCC + if (count($bcc) != 0) { + foreach ($bcc as $bc) { + $mail->addBCC($bc); + } + } + + // Reply-To + if (!empty($from)) { + $mail->addReplyTo($from); + } + + // Inhalt + $mail->Subject = $subject; + $mail->isHTML(false); // Oder true, je nach Bedarf + $mail->Body = $body; + + // Senden + $mail->send(); + $ret['oktext'] = 'Mail erfolgreich versendet'; + + } catch (Exception $e) { + $ret['error'] = true; + $ret['errortext'] = "Mailer Error: {$mail->ErrorInfo}"; + error_log("PHPMailer Error: " . $e->getMessage()); + } + + return $ret; +} diff --git a/html/sternwarte/phpmailer/dosendmail.php_1 b/html/sternwarte/phpmailer/dosendmail.php_1 new file mode 100644 index 0000000..a96884c --- /dev/null +++ b/html/sternwarte/phpmailer/dosendmail.php_1 @@ -0,0 +1,93 @@ +SMTPDebug = SMTP::DEBUG_SERVER; + $mail->Debugoutput = function($str, $level) { + file_put_contents(__DIR__ . '/phpmailer_debug.log', + date('Y-m-d H:i:s') . " [Level $level] $str\n", FILE_APPEND); + }; + + // Basis-Einstellungen + $mail->CharSet = 'UTF-8'; + $mail->isSMTP(); + + if ($develop == 'true') { + $mail->Host = 'mailhog'; + $mail->Port = 1025; + $mail->SMTPAuth = false; + } else { + // GMX Einstellungen + $mail->Host = 'mail.gmx.net'; // ✅ Korrekter Host + $mail->Port = 587; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->SMTPAuth = true; + $mail->Username = 'sternwarte.welzheim@gmx.de'; + $mail->Password = '4NT&%nH9&5wz'; // ✅ Tippfehler korrigiert + + // Optional: Zusätzliche Authentifizierung + $mail->AuthType = 'LOGIN'; + + // Optional: Timeout erhöhen + $mail->Timeout = 60; + } + + // Absender + $mail->setFrom('sternwarte.welzheim@gmx.de', 'Sternwarte-Welzheim'); + + // Empfänger + if (count($to) != 0) { + foreach ($to as $t) { + $mail->addAddress($t); + } + } + + // CC + if (count($cc) != 0) { + foreach ($cc as $c) { + $mail->addCC($c); + } + } + + // BCC + if (count($bcc) != 0) { + foreach ($bcc as $bc) { + $mail->addBCC($bc); + } + } + + // Reply-To + if (!empty($from)) { + $mail->addReplyTo($from); + } + + // Inhalt + $mail->Subject = $subject; + $mail->isHTML(false); // Oder true, je nach Bedarf + $mail->Body = $body; + + // Senden + $mail->send(); + $ret['oktext'] = 'Mail erfolgreich versendet'; + + } catch (Exception $e) { + $ret['error'] = true; + $ret['errortext'] = "Mailer Error: {$mail->ErrorInfo}"; + error_log("PHPMailer Error: " . $e->getMessage()); + } + + return $ret; +} diff --git a/html/sternwarte/phpmailer/dosendmail.php_copy b/html/sternwarte/phpmailer/dosendmail.php_copy new file mode 100644 index 0000000..db103f8 --- /dev/null +++ b/html/sternwarte/phpmailer/dosendmail.php_copy @@ -0,0 +1,58 @@ +CharSet = 'utf-8'; + $mail->isSMTP(); + + if ($develop == 'true') { + $mail->Host = 'mailhog'; + $mail->Port = 1025; + } else { + $mail->SMTPAuth = true; + $mail->Host = "sslout.df.eu"; + $mail->Port = "465"; + $mail->SMTPSecure = "ssl"; + $mail->Username = "sonderfuehrung@sternwarte-welzheim.de"; + $mail->Password = "v|kR9D8m}K"; + } + $mail->setFrom($from); + if (count($to) != 0) { + foreach ($to as $t) { + $mail->addAddress($t); + } + } + $mail->Subject = $subject; + $mail->Body = $body; + if (count($cc) != 0) { + foreach ($cc as $c) { + $mail->addCC($c); + } + } + if(count($bcc) != 0) { + foreach ($bcc as $bc) { + $mail->addBCC($bc); + } + } + $mail->addReplyTo($from); + + if (!$mail->send()) { + $ret['error'] = true; + $ret['errortext'] = $mail->ErrorInfo; + } + return $ret; +} + +?> diff --git a/html/sternwarte/phpmailer/dosendmail.php_o b/html/sternwarte/phpmailer/dosendmail.php_o new file mode 100644 index 0000000..cff2800 --- /dev/null +++ b/html/sternwarte/phpmailer/dosendmail.php_o @@ -0,0 +1,69 @@ +CharSet = 'utf-8'; + $mail->SMTPDebug = 2; + $mail->isSMTP(); + $mail->Debugoutput = function($str, $level) { + // Debug-Ausgabe in Datei schreiben + file_put_contents(__DIR__ . '/phpmailer_debug.log', + date('Y-m-d H:i:s') . " [Level $level] $str\n", FILE_APPEND); + }; + + if ($develop == 'true') { + $mail->Host = 'mailhog'; + $mail->Port = 1025; + } else { + $mail->SMTPAuth = true; + $mail->Host = "mail.gmx.de"; + $mail->Port = "587"; + $mail->SMTPSecure = "tls"; + $mail->Username = "sternwarte.welzheim@gmx.de"; + $mail->Password = "4NT&%nH9&5wz"; + } + $mail->setFrom("sternwarte.welzheim@gmx.de", 'Sternwarte-Welzheim'); + + if (count($to) != 0) { + foreach ($to as $t) { + $mail->addAddress($t); + } + } + $mail->Subject = $subject; + $mail->Body = $body; + if (count($cc) != 0) { + foreach ($cc as $c) { + $mail->addCC($c); + } + } + if(count($bcc) != 0) { + foreach ($bcc as $bc) { + $mail->addBCC($bc); + } + } + $mail->addReplyTo($from); + + $mail->send(); + $ret ['oktext'] = 'Mail erfolgreich versendet'; + } catch (Exception $e) { + $ret['error'] = true; + $ret['errortext'] = $mail->ErrorInfo; + } + + return $ret; +} + +?> diff --git a/html/sternwarte/phpmailer/phpmailer_debug.log b/html/sternwarte/phpmailer/phpmailer_debug.log new file mode 100644 index 0000000..bf33912 --- /dev/null +++ b/html/sternwarte/phpmailer/phpmailer_debug.log @@ -0,0 +1,11593 @@ +2025-10-21 10:00:18 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-21 10:00:18 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 10:00:18 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 10:00:18 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 10:00:18 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 10:00:18 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:00:18 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 10:00:18 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 10:00:18 +0200 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: To: carola_vollmer@web.de + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Message-ID: <4KnoNmXnYGGz4hXWxZG35bFKXxSw9pggvoC2uREQ9C0@www.sternwarte-welzheim.de> + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Carola Bubeck am Mo, 05.01.2026 um 20 Uhr für 4 Personen . + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: . + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MyKDe-1uHCDX057M-00uyUV + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 10:00:19 +0200 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_05.01.2026_20_Uhr?= + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Name, Vorname: Bubeck, Carola + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Strasse: Schießgasse 42 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Ort: 73660 Urbach + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Telefon: 07181924576 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: E-mail: carola_vollmer@web.de + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 05.01.2026 20 Uhr + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: . + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mj8mb-1uWG5m1Nsj-00doEs + +2025-10-21 10:00:19 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 10:00:19 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 10:39:16 +0200 + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: To: geht-dich-nichts-an@weibsvolk.org + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?Sonnen-F=C3=BChrung=20auf=20der=20Sternwarte?= =?UTF-8?Q?=20Welzheim?= + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Message-ID: <5AGok3og4li1jd26bJURFsgIhRiONwFSreduO2Q0k@sternwarte-welzheim.de> + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Sonnen-Führung auf der Sternwarte Welzheim für + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Heike Pietschmann am So, 01.03.2026 um 11 Uhr für 3 Personen . + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei klarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: . + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M8QWG-1v6kB23fAO-005qob + +2025-10-21 10:39:16 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 10:39:16 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 10:39:16 +0200 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Cc: martin.gertz@gmx.de, hansdschida1@gmail.com, anmeldung@sternwarte-welzheim.de + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_Sonnen-F=C3=BChrung_in_Welzheim_am_So,_01.03.2026_11_Uhr?= + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Name, Vorname: Pietschmann, Heike + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Strasse: Freiburgstr. 75 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Ort: 73614 Schorndorf + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: E-mail: geht-dich-nichts-an@weibsvolk.org + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Gewünschter Termin: So, 01.03.2026 11 Uhr + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Personen: 3 + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: . + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N49lD-1uBMKS0VE1-014YWR + +2025-10-21 10:39:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 10:39:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 12:20:56 +0200 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: To: marcel@taus-metall.de + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_22.10.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Message-ID: <00PWz0oVRRaFbDsjTuvMyHUGMxafyQrSTU9oxgov0@www.sternwarte-welzheim.de> + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Mittwoch, den 22.10.2025 um 20 Uhr mit 2 Personen. + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: . + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N49h5-1uBNvt0rGj-014wXt + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 12:20:56 +0200 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_22.10.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Die Führung vom 22.10.2025 wurde storniert + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: Besucher: Marcel Taus + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: . + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MDywu-1v1HbA2RW8-009CBt + +2025-10-21 12:20:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 12:20:56 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 12:21:19 +0200 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: To: marcel@taus-metall.de + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Message-ID: <5NhA2IHRNzaG0MCFpTiUbJb60D9hi6Vd7dpd18RM@www.sternwarte-welzheim.de> + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Marcel Taus am Sa, 25.10.2025 um 20 Uhr für 2 Personen . + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: . + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MD9X9-1v275C1jYv-00DxwF + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 12:21:19 +0200 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_25.10.2025_20_Uhr?= + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Name, Vorname: Taus, Marcel + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Strasse: Rotenmad 1 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Ort: 73667 Kaisersbach + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Telefon: 015788108850 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: E-mail: marcel@taus-metall.de + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 25.10.2025 20 Uhr + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: . + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mf0BG-1uZJUj2vJi-00hwc8 + +2025-10-21 12:21:19 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 12:21:19 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 14:05:38 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-21 14:05:38 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 14:05:38 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 14:05:38 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 14:05:38 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 14:05:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 14:05:38 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 14:05:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 14:05:38 +0200 + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Absage_der_Sternf=C3=BChrung_am_Mittwoch,_den_5._November_2025?= + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Sie haben sich über unsere Webseite www.sternwarte-welzheim.de zur Sternführung am Mittwoch, den 5. November 2025 angemeldet. + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Aufgrund der Erneuerung unserer Technik können wir am Mittwoch, den 5. November 2025 keine Sternführung anbieten. + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Bitte melden Sie sich für einen anderen Termin neu an. + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: Beobachtergruppe Sternwarte Welzheim + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: . + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MHXFx-1uxeSo05TN-0041va + +2025-10-21 14:05:39 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 14:05:39 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 18:29:51 +0200 + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: To: Tanja20285@yahoo.de + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_27.10.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Montag, den 27.10.2025 um 20 Uhr mit 3 Personen. + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: . + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MPGRz-1uq7z03kqb-00Lwhu + +2025-10-21 18:29:51 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 18:29:51 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 18:29:52 +0200 + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_27.10.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Die Führung vom 27.10.2025 wurde storniert + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: Besucher: Königseder Tanja + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: . + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MQeA2-1une7i15gU-00MpaP + +2025-10-21 18:29:52 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 18:29:52 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 18:31:54 +0200 + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: To: Tanja20285@yahoo.de + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Tanja Königseder am Sa, 15.11.2025 um 20 Uhr für 2 Personen . + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: . + +2025-10-21 18:31:54 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MBUqL-1v2gx33uxT-00Ghuk + +2025-10-21 18:31:54 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 18:31:55 +0200 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_15.11.2025_20_Uhr?= + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Name, Vorname: Königseder , Tanja + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Strasse: Heilbronnerstr. 60 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Ort: 71732 Tamm + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: E-mail: Tanja20285@yahoo.de + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 15.11.2025 20 Uhr + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: . + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N2mBQ-1uCeOd0osG-00w98Y + +2025-10-21 18:31:55 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 18:31:55 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 19:23:59 +0200 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: To: lukas.brukner@gmail.com + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_05.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Message-ID: <9MlBUWj4nAdjCf32oK4S13BLEoRe0I0qB46I1iSoVFY@www.sternwarte-welzheim.de> + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 05.11.2025. + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Montag, den 01.12.2025 um 20 Uhr mit 2 Personen + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: . + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MryXH-1uNP4M3Gtx-00jkJJ + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 19:23:59 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 19:23:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 19:24:00 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 19:24:00 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 19:24:00 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 19:24:00 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 19:23:59 +0200 + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_05.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Die Führung vom 05.11.2025 wurde umgebucht + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: auf Montag, den 01.12.2025 um 20 Uhr mit 2 Personen + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: Besucher: Brukner Lukas + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: . + +2025-10-21 19:24:00 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MgvvT-1uYNQr0EMH-00dAdc + +2025-10-21 19:24:00 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 19:24:00 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 21:01:44 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 21:01:44 +0200 + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: To: Tina.Roessler@gmx.de + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Message-ID: <6OjNvqdow8cBd06F2tmsmquV31i3vq7UbgPc3wWOiTY@www.sternwarte-welzheim.de> + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Montag, den 03.11.2025 um 20 Uhr mit 4 Personen. + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:44 [Level 1] CLIENT -> SERVER: . + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M3DNt-1vC6Yn41LJ-00Dv0x + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 21:01:45 +0200 + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Die Führung vom 03.11.2025 wurde storniert + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: Besucher: Roessler Tina + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: . + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N5VDE-1u8k2F1C7W-0125yW + +2025-10-21 21:01:45 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 21:01:45 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 21:02:52 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-21 21:02:52 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-21 21:02:52 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 21:02:52 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 21:02:52 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 21:02:52 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:02:52 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 21:02:52 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 21:02:52 +0200 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: To: tina.roessler@gmx.de + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Tina Roessler am Sa, 31.01.2026 um 20 Uhr für 4 Personen . + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: . + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N3bX1-1uAh2605Nz-00ycFE + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 21:02:53 +0200 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_31.01.2026_20_Uhr?= + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Name, Vorname: Roessler, Tina + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Strasse: Keplerweg 16 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Ort: 73655 Plüderhauden + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Telefon: 071819929353 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: E-mail: tina.roessler@gmx.de + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 31.01.2026 20 Uhr + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: . + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MQMuX-1uovO81F8j-00N6IW + +2025-10-21 21:02:53 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 21:02:53 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: DATA + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Date: Tue, 21 Oct 2025 22:34:13 +0200 + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Absage_der_Sternf=C3=BChrung_am_Samstag,_den_8._November_2025?= + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Sie haben sich über unsere Webseite www.sternwarte-welzheim.de zur Sternführung am Samstag, den 8. November 2025 angemeldet. + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Aufgrund der Erneuerung unserer Technik können wir am Samstag, den 8. November 2025 keine Sternführung anbieten. + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Bitte melden Sie sich für einen anderen Termin neu an. + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: Beobachtergruppe Sternwarte Welzheim + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: . + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MQv8x-1unKGA379b-00MYPG + +2025-10-21 22:34:13 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-21 22:34:13 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 08:08:37 +0200 + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Absage_der_Sternf=C3=BChrung_am_Montag,_den_10._November_2025?= + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Sie haben sich über unsere Webseite www.sternwarte-welzheim.de zur Sternführung am Montag, den 10. November 2025 angemeldet. + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Aufgrund der Erneuerung unserer Technik können wir am Montag, den 10. November 2025 keine Sternführung anbieten. + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Bitte melden Sie sich für einen anderen Termin neu an. + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: Beobachtergruppe Sternwarte Welzheim + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: . + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MSKuA-1uil3N0vV2-00Xyad + +2025-10-22 08:08:37 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 08:08:37 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 08:09:03 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 08:09:03 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-22 08:09:03 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 08:09:03 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 08:09:03 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 08:09:03 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 08:09:03 +0200 + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Absage_der_Sternf=C3=BChrung_am_Mittwoch,_den_12._November_2025?= + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Sie haben sich über unsere Webseite www.sternwarte-welzheim.de zur Sternführung am Mittwoch, den 12. November 2025 angemeldet. + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Aufgrund der Erneuerung unserer Technik können wir am Mittwoch, den 12. November 2025 keine Sternführung anbieten. + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Bitte melden Sie sich für einen anderen Termin neu an. + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: Beobachtergruppe Sternwarte Welzheim + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: . + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mirng-1uZ4Pk0KHc-00e540 + +2025-10-22 08:09:04 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 08:09:04 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 10:55:26 +0200 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: To: andrea.lilja-prowin@web.de + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 08.11.2025. + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Samstag, den 10.01.2026 um 20 Uhr mit 2 Personen + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: . + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M1Hdq-1v9pfI2y8w-004Dc7 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 10:55:26 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 10:55:26 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 10:55:27 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 10:55:27 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 10:55:26 +0200 + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Die Führung vom 08.11.2025 wurde umgebucht + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: auf Samstag, den 10.01.2026 um 20 Uhr mit 2 Personen + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: Besucher: Lilja Andrea + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: . + +2025-10-22 10:55:27 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MuUnA-1uLAtA49Ni-00vHuG + +2025-10-22 10:55:27 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 10:55:27 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:31:11 +0200 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: To: Stefanie@schillinger-win.de + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_22.10.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 22.10.2025. + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Mittwoch, den 03.12.2025 um 20 Uhr mit 3 Personen + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mt75H-1uIjjy1lbV-00yJr4 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:31:11 +0200 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_22.10.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Die Führung vom 22.10.2025 wurde umgebucht + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: auf Mittwoch, den 03.12.2025 um 20 Uhr mit 3 Personen + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: Besucher: Schillinger Stefanie + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MnaoZ-1uUjF42nf3-00o842 + +2025-10-22 12:31:11 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:31:11 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: lara@schillinger-win.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Montag, den 15.12.2025 um 20 Uhr mit 3 Personen. + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: jochen@schillinger-win.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mittwoch, den 03.12.2025 um 20 Uhr mit 3 Personen. + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mn2W5-1uVH341nC3-00npNE + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: jochen@schillinger-win.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mittwoch, den 03.12.2025 um 20 Uhr mit 3 Personen. + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: Stefanie@schillinger-win.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mittwoch, den 03.12.2025 um 20 Uhr mit 3 Personen. + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: jochen@schillinger-win.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: <0UTpfDymAGF4xNeGQM5NqjFALaT5pFdJi5Jsdihpo@sternwarte-welzheim.de> + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mittwoch, den 03.12.2025 um 20 Uhr mit 3 Personen. + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: Stefanie@schillinger-win.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mittwoch, den 03.12.2025 um 20 Uhr mit 3 Personen. + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MtfJd-1uKNzW22O7-00yrwl + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MXp5Q-1ufdvl26Um-00Ig9w + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MC30P-1v1rm424HF-00B893 + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mxm3K-1uFh23247i-00yN4X + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MzhnN-1uGVqe2BZx-013WG2 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Die Führung vom 03.12.2025 wurde storniert + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Besucher: Schillinger Lara + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Die Führung vom 03.12.2025 wurde storniert + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Besucher: Schillinger Jochen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mn2aD-1uVH3431Vv-00nZo2 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MFbRs-1uxj2x3EXW-00CbBm + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: <347LkTaG8rxw5lYVp7jxEMrlNjYPAeOTNucXnz1ctw@sternwarte-welzheim.de> + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Die Führung vom 03.12.2025 wurde storniert + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Besucher: Schillinger Jochen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Die Führung vom 03.12.2025 wurde storniert + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Besucher: Schillinger Jochen + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Die Führung vom 03.12.2025 wurde storniert + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Besucher: Schillinger Stefanie + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:41:17 +0200 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_03.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Die Führung vom 03.12.2025 wurde storniert + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: Besucher: Schillinger Stefanie + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N8XPt-1u7gA03Upt-015H07 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N9dwd-1u8m5Y3XQz-011HFn + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MXGvG-1ugCA73Y8U-00Xry3 + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N3bX1-1uCeEg3VMh-00ycwJ + +2025-10-22 12:41:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:41:17 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:44:48 +0200 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: To: stefanie@schillinger-win.de + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Message-ID: <6JlpdWzENuVe1a88qgRYB84LUFhxuVFVTNqMzQjqCk@sternwarte-welzheim.de> + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Stefanie Schillinger am Mi, 03.12.2025 um 20 Uhr für 3 Personen . + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MQv8x-1urUmc0OnP-00MY2Y + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:44:49 +0200 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mi,_03.12.2025_20_Uhr?= + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Name, Vorname: Schillinger, Stefanie + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Strasse: Körnle 29 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Ort: 71364 Winnenden + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: E-mail: stefanie@schillinger-win.de + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mi, 03.12.2025 20 Uhr + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Personen: 3 + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mdeb5-1ucSUy1Tfd-00eRhN + +2025-10-22 12:44:49 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:44:49 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 12:46:41 +0200 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: To: lara@schillinger-win.de + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Lara Schillinger am Mo, 15.12.2025 um 20 Uhr für 3 Personen . + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: . + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MAOJV-1v1Jtq3SWJ-00FsTU + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:46:41 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:46:41 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:46:42 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:46:42 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:46:42 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:46:42 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:46:42 [Level 2] SERVER -> CLIENT: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1MWzk3-1uepER0Dsn-00TJHd + +2025-10-22 12:46:42 [Level 1] SMTP ERROR: RCPT TO command failed: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1MWzk3-1uepER0Dsn-00TJHd + +2025-10-22 12:46:42 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:46:42 [Level 2] SERVER -> CLIENT: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1M2wGs-1vAQRC0GFg-008lci + +2025-10-22 12:46:42 [Level 1] SMTP ERROR: RCPT TO command failed: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1M2wGs-1vAQRC0GFg-008lci + +2025-10-22 12:46:42 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:46:42 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:46:42 [Level 2] SMTP Error: The following recipients failed: rexfue@gmail.com: Requested mail action not taken: mailbox unavailable +Failure sending mail. Try again later +1MWzk3-1uepER0Dsn-00TJHd +anmeldung@sternwarte-welzheim.de: Requested mail action not taken: mailbox unavailable +Failure sending mail. Try again later +1M2wGs-1vAQRC0GFg-008lci + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1N8XTv-1u7gID2gQD-010Ak5 + +2025-10-22 12:49:44 [Level 1] SMTP ERROR: RCPT TO command failed: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1N8XTv-1u7gID2gQD-010Ak5 + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1M26vL-1v9bfN2jUX-007OIL + +2025-10-22 12:49:44 [Level 1] SMTP ERROR: RCPT TO command failed: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1M26vL-1v9bfN2jUX-007OIL + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:49:44 [Level 2] SMTP Error: The following recipients failed: jochen@schillinger-win.de: Requested mail action not taken: mailbox unavailable +Failure sending mail. Try again later +1N8XTv-1u7gID2gQD-010Ak5 +anmeldungen@sternwarte.rexfue.de: Requested mail action not taken: mailbox unavailable +Failure sending mail. Try again later +1M26vL-1v9bfN2jUX-007OIL + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:49:44 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 12:49:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 12:49:45 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 12:49:45 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 12:49:45 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 12:49:45 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:49:45 [Level 2] SERVER -> CLIENT: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1MdebB-1ucSi00CYL-00aWdv + +2025-10-22 12:49:45 [Level 1] SMTP ERROR: RCPT TO command failed: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1MdebB-1ucSi00CYL-00aWdv + +2025-10-22 12:49:45 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 12:49:45 [Level 2] SERVER -> CLIENT: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1MQv8x-1urUh40Fnz-00MYGb + +2025-10-22 12:49:45 [Level 1] SMTP ERROR: RCPT TO command failed: 450-Requested mail action not taken: mailbox unavailable +450-Failure sending mail. Try again later +450 1MQv8x-1urUh40Fnz-00MYGb + +2025-10-22 12:49:45 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 12:49:45 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 12:49:45 [Level 2] SMTP Error: The following recipients failed: rexfue@gmail.com: Requested mail action not taken: mailbox unavailable +Failure sending mail. Try again later +1MdebB-1ucSi00CYL-00aWdv +anmeldung@sternwarte-welzheim.de: Requested mail action not taken: mailbox unavailable +Failure sending mail. Try again later +1MQv8x-1urUh40Fnz-00MYGb + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 17:03:56 +0200 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: To: Juko78@gmx.de + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 08.11.2025. + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Samstag, den 17.01.2026 um 20 Uhr mit 2 Personen + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: . + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MuUj2-1uL8BS2YPy-00vW96 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: DATA + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Date: Wed, 22 Oct 2025 17:03:56 +0200 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Die Führung vom 08.11.2025 wurde umgebucht + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: auf Samstag, den 17.01.2026 um 20 Uhr mit 2 Personen + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: Besucher: Haffner Judith + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: . + +2025-10-22 17:03:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M59GG-1vCgq83lI4-000Mpa + +2025-10-22 17:03:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-22 17:03:57 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: DATA + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Date: Thu, 23 Oct 2025 08:04:32 +0200 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: To: Elke.schoch@web.de + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 08.11.2025. + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Mittwoch, den 07.01.2026 um 20 Uhr mit 4 Personen + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: . + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MwfWU-1uEmvj0YYM-0112dx + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: DATA + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Date: Thu, 23 Oct 2025 08:04:33 +0200 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Die Führung vom 08.11.2025 wurde umgebucht + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: auf Mittwoch, den 07.01.2026 um 20 Uhr mit 4 Personen + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: Besucher: Schoch Elke + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: . + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N79u8-1u6ZBd1zrw-00rjbh + +2025-10-23 08:04:33 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-23 08:04:33 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 07:27:55 +0200 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: To: K.sayler@t-online.de + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Katharina Sayler am Mo, 29.12.2025 um 20 Uhr für 2 Personen . + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: . + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MryTF-1uPSIA2Voj-00mdtH + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 07:27:55 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 07:27:55 +0200 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_29.12.2025_20_Uhr?= + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Name, Vorname: Sayler, Katharina + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Strasse: Robert-Stolz-Str 73 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Ort: 73642 Welzheim + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Telefon: 01717787261 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: E-mail: K.sayler@t-online.de + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 29.12.2025 20 Uhr + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: + +2025-10-25 07:27:55 [Level 1] CLIENT -> SERVER: . + +2025-10-25 07:27:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M1Ygt-1vB8q03kUd-00ET3D + +2025-10-25 07:27:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 07:27:56 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 12:27:56 +0200 + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: To: klaudi.tudjina@web.de + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Klaudia Tudjina am Sa, 14.02.2026 um 20 Uhr für 2 Personen . + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: . + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MysVs-1uHu9O3PMo-00qs8I + +2025-10-25 12:27:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 12:27:56 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 12:27:56 +0200 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_14.02.2026_20_Uhr?= + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Name, Vorname: Tudjina, Klaudia + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Strasse: Wilhelmstraße, 31/3 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Ort: 70734 Fellbach + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Telefon: 015773579077 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: E-mail: klaudi.tudjina@web.de + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 14.02.2026 20 Uhr + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: . + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MfHAH-1uXWFy0JgZ-00bfu3 + +2025-10-25 12:27:57 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 12:27:57 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 18:55:08 +0200 + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Absage_der_heutigen_Sternf=C3=BChrung?= + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Sie haben sich über unsere Webseite www.sternwarte-welzheim.de zur heutigen Sternführung angemeldet. + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Aufgrund der Erneuerung unserer Technik können wir heute keine Sternführung anbieten. + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Bitte melden Sie sich für einen anderen Termin neu an. + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: Beobachtergruppe Sternwarte Welzheim + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: . + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MWASY-1ugNsM1R0M-00YyCB + +2025-10-25 18:55:08 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 18:55:08 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 21:46:35 +0200 + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: To: info@stb-diebel.de + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_05.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Mittwoch, den 05.11.2025 um 20 Uhr mit 2 Personen. + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: . + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MybGh-1uEByY2xjR-00v0DN + +2025-10-25 21:46:35 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 21:46:35 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 21:46:35 +0200 + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_05.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Die Führung vom 05.11.2025 wurde storniert + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: Besucher: Diebel Andrea + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: . + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mbir8-1uavtS0are-00mhA0 + +2025-10-25 21:46:36 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 21:46:36 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 21:46:48 +0200 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: To: info@stb-diebel.de + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Andrea Diebel am Mo, 17.11.2025 um 20 Uhr für 2 Personen . + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: . + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MdefJ-1udPPE0OCv-00qGjk + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 21:46:49 +0200 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_17.11.2025_20_Uhr?= + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Name, Vorname: Andrea Diebel, + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Strasse: Urbacher Weg 19 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Ort: 73655 Plüderhausen + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Telefon: 07181884328 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: E-mail: info@stb-diebel.de + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 17.11.2025 20 Uhr + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: . + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MzhjF-1uHUqG1esb-00wRG7 + +2025-10-25 21:46:49 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 21:46:49 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 22:53:43 +0200 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: To: Mail@kerstinjanssen.com + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Message-ID: <8Qc0jtMvXpLDOL4cGoSjAI6VxMFRfN4WGRn6NEJ64k@www.sternwarte-welzheim.de> + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Kerstin Janßen am Mi, 26.11.2025 um 20 Uhr für 2 Personen . + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: . + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M5QJJ-1vBOM60y0L-00G6cv + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: DATA + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Date: Sat, 25 Oct 2025 22:53:43 +0200 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mi,_26.11.2025_20_Uhr?= + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Name, Vorname: Janßen, Kerstin + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Strasse: Beethovenstraße 22 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Ort: 74642 Welzheim + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: E-mail: Mail@kerstinjanssen.com + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mi, 26.11.2025 20 Uhr + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: . + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MY68d-1ueP0c2JcD-00Um2W + +2025-10-25 22:53:43 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-25 22:53:43 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 13:59:07 +0100 + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: To: ehjo@gmx.de + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Johannes Ehrenmann am Sa, 17.01.2026 um 20 Uhr für 3 Personen . + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: . + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M5fIQ-1v5pKL3ZJC-00AKGV + +2025-10-26 13:59:07 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 13:59:07 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 13:59:07 +0100 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_17.01.2026_20_Uhr?= + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Name, Vorname: Ehrenmann, Johannes + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Strasse: Gänsäckerstr 93 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Ort: 71332 Waiblingen + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: E-mail: ehjo@gmx.de + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 17.01.2026 20 Uhr + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Personen: 3 + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: Bemerkungen: 2 Erwachsene und 1-2 Kinder (4&7 Jahre) + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: . + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MvsJ5-1uL2bb0aDH-016HbC + +2025-10-26 13:59:08 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 13:59:08 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 16:07:50 +0100 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: To: Nicoleda22@gmx.de + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_03.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 03.11.2025. + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Montag, den 01.12.2025 um 20 Uhr mit 2 Personen + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: . + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MHXFr-1v03nT2F8L-009aE4 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 16:07:50 +0100 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_03.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Die Führung vom 03.11.2025 wurde umgebucht + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: auf Montag, den 01.12.2025 um 20 Uhr mit 2 Personen + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: Besucher: Mayer Nicole + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: . + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MiacR-1uYBt33T55-00kCZU + +2025-10-26 16:07:50 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 16:07:50 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 17:18:10 +0100 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: To: judith.mazioschek@gmx.net + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Mazioschek am Sa, 24.01.2026 um 20 Uhr für 4 Personen . + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: . + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MLi8m-1uvO2F0YmO-00Z9d4 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 17:18:11 +0100 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_24.01.2026_20_Uhr?= + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Message-ID: <33MonfrqQFGdR2dfAA9TVPb0xmw8gLZDf1OP9D87EU@www.sternwarte-welzheim.de> + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Name, Vorname: Mazioschek, + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Strasse: Köllestr. 58 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Ort: 70193 Stuttgart + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: E-mail: judith.mazioschek@gmx.net + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 24.01.2026 20 Uhr + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: . + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MQ5vW-1ur0K31aiW-00IM6v + +2025-10-26 17:18:11 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 17:18:11 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 18:43:10 +0100 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: To: simone.mangold@gmx.net + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Simone Mangold am Sa, 10.01.2026 um 20 Uhr für 2 Personen . + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: . + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M8ykg-1v70Uy1K7S-005IGu + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 18:43:10 +0100 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_10.01.2026_20_Uhr?= + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Name, Vorname: Mangold, Simone + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Strasse: Jakobstr.39 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Ort: 73734 Esslingen + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: E-mail: simone.mangold@gmx.net + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 10.01.2026 20 Uhr + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: . + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MxDou-1uFir82SAC-00yuzy + +2025-10-26 18:43:10 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 18:43:10 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 19:53:56 +0100 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: To: durian.alexandra@gmail.com + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Alexandra Durian am Sa, 31.01.2026 um 20 Uhr für 4 Personen . + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: . + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MlNtP-1uSADR0sBh-00qJyU + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 19:53:56 +0100 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_31.01.2026_20_Uhr?= + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Name, Vorname: Durian , Alexandra + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Strasse: Fellbacherstr. 39 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Ort: 71394 Kernen im Remstal + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Telefon: 01797654603 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: E-mail: durian.alexandra@gmail.com + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 31.01.2026 20 Uhr + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: . + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MAwXr-1v2KNh1mpN-00GQRF + +2025-10-26 19:53:56 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 19:53:56 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 21:52:54 +0100 + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: To: maxtroue@hotmail.com + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_05.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 05.11.2025. + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Mittwoch, den 26.11.2025 um 20 Uhr mit 2 Personen + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: . + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MXGvM-1ueads35pe-00TxDz + +2025-10-26 21:52:54 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 21:52:54 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: DATA + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Date: Sun, 26 Oct 2025 21:52:55 +0100 + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_05.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Die Führung vom 05.11.2025 wurde umgebucht + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: auf Mittwoch, den 26.11.2025 um 20 Uhr mit 2 Personen + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: Besucher: Troue-Haudek Maximilian + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: . + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N1wq3-1uBYsg1Amf-016kRR + +2025-10-26 21:52:55 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-26 21:52:55 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 06:00:36 +0100 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: To: sabzh@gmx.de + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Sabine Zeyher-Haller am Sa, 17.01.2026 um 20 Uhr für 2 Personen . + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: . + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MgvvT-1uWSTJ2wur-00dAPD + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 06:00:36 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 06:00:36 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 06:00:37 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 06:00:37 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 06:00:37 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 06:00:37 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 06:00:36 +0100 + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_17.01.2026_20_Uhr?= + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Name, Vorname: Zeyher-Haller, Sabine + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Strasse: Konradweg 8 + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Ort: 71384 Weinstadt + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Telefon: 01638871138 + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: E-mail: sabzh@gmx.de + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 17.01.2026 20 Uhr + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: . + +2025-10-27 06:00:37 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MZCfJ-1uibUj4B1d-00Lh88 + +2025-10-27 06:00:37 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 06:00:37 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 10:20:04 +0100 + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: To: saskia.fuchs83@web.de + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_12.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Message-ID: <1SZS7QI219vcCOqvOguhDsbmkDp4gNxRBONOXunw@www.sternwarte-welzheim.de> + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 12.11.2025. + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Montag, den 26.01.2026 um 20 Uhr mit 3 Personen + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: . + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N9dsV-1u86EL2VMr-011cnn + +2025-10-27 10:20:04 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 10:20:04 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 10:20:04 +0100 + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_12.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Message-ID: <1xtyEBcJbBS1CNHw8l1BTwV5zt2nYI08jY1lUa8SDU@www.sternwarte-welzheim.de> + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Die Führung vom 12.11.2025 wurde umgebucht + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: auf Montag, den 26.01.2026 um 20 Uhr mit 3 Personen + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: Besucher: Saskia Fuchs + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: . + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N2E1M-1uA2It0YpC-017QMy + +2025-10-27 10:20:05 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 10:20:05 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 10:21:06 +0100 + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: To: saskia.fuchs83@web.de + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_26.01.2026_auf_der_Sternwarte_Welzheim?= + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Message-ID: <4DDM1MxHG1TscLyUqoJzNbAfqUsdaCb2086I1SkjIXg@sternwarte-welzheim.de> + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Stornierung Ihrer Führung auf der Sternwarte Welzheim vom + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Montag, den 26.01.2026 um 20 Uhr mit 3 Personen. + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: . + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MfYLa-1uXcsM3Xg0-00cLWQ + +2025-10-27 10:21:06 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 10:21:06 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 10:21:07 +0100 + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Stornierung_der_F=C3=BChrung_vom_26.01.2026_auf_der_Sternwarte_Welzheim?= + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Die Führung vom 26.01.2026 wurde storniert + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: Besucher: Saskia Fuchs + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: . + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mzhj9-1uI1pa1HyD-00rhK6 + +2025-10-27 10:21:07 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 10:21:07 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 550-Requested action not taken: mailbox unavailable +550 invalid DNS MX or A/AAAA resource record 1MVeMA-1ulmVk1e7Q-00Wi8z + +2025-10-27 15:18:36 [Level 1] SMTP ERROR: RCPT TO command failed: 550-Requested action not taken: mailbox unavailable +550 invalid DNS MX or A/AAAA resource record 1MVeMA-1ulmVk1e7Q-00Wi8z + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 15:18:36 +0100 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: To: kat@zinkundauber.de + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Kathrin Buhl-Bereket am Mo, 17.11.2025 um 20 Uhr für 4 Personen . + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: . + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mlw3N-1uUfIl1bjn-00miza + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 15:18:36 [Level 2] SMTP Error: The following recipients failed: kat@zinkundauber.de: Requested action not taken: mailbox unavailable +invalid DNS MX or A/AAAA resource record 1MVeMA-1ulmVk1e7Q-00Wi8z + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 15:18:36 +0100 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_17.11.2025_20_Uhr?= + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Name, Vorname: Buhl-Bereket, Kathrin + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Strasse: Welzheimer-Wald-Str.20 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Ort: 73614 Schorndorf + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: E-mail: kat@zinkundauber.de + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 17.11.2025 20 Uhr + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: . + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MD9T1-1v4HEb2c6b-00EDhy + +2025-10-27 15:18:36 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 15:18:36 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 15:23:27 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-27 15:23:27 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 15:23:27 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 15:23:27 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 15:23:27 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 15:23:27 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:23:27 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 15:23:27 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:23:27 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 15:23:27 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 15:23:30 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 15:23:30 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:23:32 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:23:32 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:23:33 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 15:23:33 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 15:23:27 +0100 + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: To: kat@zinkundzauber.de + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Kathri Buhl-Bereket am Sa, 17.01.2026 um 20 Uhr für 4 Personen . + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:33 [Level 1] CLIENT -> SERVER: . + +2025-10-27 15:23:34 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MWici-1ugWEp3wVc-00JmC8 + +2025-10-27 15:23:34 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 15:23:34 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 15:23:34 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-27 15:23:34 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 15:23:34 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 15:23:34 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 15:23:34 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 15:23:34 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:23:34 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 15:23:34 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:23:34 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 15:23:34 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 15:23:36 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 15:23:36 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:23:40 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:23:40 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:23:42 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 15:23:42 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 15:23:34 +0100 + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_17.01.2026_20_Uhr?= + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Name, Vorname: Buhl-Bereket, Kathri + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Strasse: Welzheimer-Wad-Str.20 + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Ort: 73614 Schorndorf + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: E-mail: kat@zinkundzauber.de + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 17.01.2026 20 Uhr + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: . + +2025-10-27 15:23:42 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M4Jqb-1vD79L1MZt-00HCyf + +2025-10-27 15:23:42 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 15:23:42 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 15:43:00 +0100 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: To: winfried.funk@arcor.de + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Winfried Funk am Mi, 26.11.2025 um 20 Uhr für 4 Personen . + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: . + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MTiPl-1ujWo51gFh-00SeuV + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 15:43:00 +0100 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mi,_26.11.2025_20_Uhr?= + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Name, Vorname: Funk, Winfried + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Strasse: Fasanenweg 14 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Ort: 73557 Mutlangen + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Telefon: 0717175948 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: E-mail: winfried.funk@arcor.de + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mi, 26.11.2025 20 Uhr + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: . + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mw9QC-1uLQGm2rfI-0176d8 + +2025-10-27 15:43:00 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 15:43:00 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 20:43:29 +0100 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: To: K.sayler@t-online.de + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_29.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Message-ID: <8AU6g1m06ZfkBuzDrj5DUSuO6Mvd59r5PbPMnbDIO0@sternwarte-welzheim.de> + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 29.12.2025. + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Montag, den 24.11.2025 um 20 Uhr mit 2 Personen + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: . + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N1OXT-1uAfFq1jDP-013eB5 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: DATA + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Date: Mon, 27 Oct 2025 20:43:29 +0100 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_29.12.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Die Führung vom 29.12.2025 wurde umgebucht + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: auf Montag, den 24.11.2025 um 20 Uhr mit 2 Personen + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: Besucher: Sayler Katharina + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: . + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M8ygY-1v7RFn3H3m-00BPjQ + +2025-10-27 20:43:29 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-27 20:43:29 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 17:01:50 +0100 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: To: birgit@rajic.org + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Message-ID: <2aZgn24hq4vMx63y7OXV3rMswro72Ei1KyIUEflc@www.sternwarte-welzheim.de> + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Birgit Rajic am Sa, 14.02.2026 um 20 Uhr für 4 Personen . + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: . + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MYeMj-1vjJcL0sVP-00QuiB + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 17:01:50 +0100 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_14.02.2026_20_Uhr?= + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Name, Vorname: Rajic, Birgit + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Strasse: Jakob-Fischer-Weg 5 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Ort: 71336 Waiblingen + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Telefon: 016099066629 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: E-mail: birgit@rajic.org + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 14.02.2026 20 Uhr + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: . + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mirna-1vsM9q26ZI-00ar22 + +2025-10-28 17:01:50 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 17:01:50 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 17:12:37 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-28 17:12:37 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 17:12:37 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 17:12:37 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 17:12:37 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 17:12:37 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:12:37 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 17:12:37 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 17:12:37 +0100 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: To: saskia.landau@web.de + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Saskia Landau am Mo, 15.12.2025 um 20 Uhr für 2 Personen . + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: . + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MPGVx-1vdIJH0ALV-00ISEY + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 17:12:38 +0100 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_15.12.2025_20_Uhr?= + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Name, Vorname: Landau, Saskia + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Strasse: Wernerstraße 113/1 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Ort: 71636 Ludwigsburg + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: E-mail: saskia.landau@web.de + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 15.12.2025 20 Uhr + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: . + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N8XPn-1wHpBP1Cz3-010Wrd + +2025-10-28 17:12:38 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 17:12:38 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 17:14:18 +0100 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: To: verenathon1310@gmail.com + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Andreas Ihle am Mo, 17.11.2025 um 20 Uhr für 3 Personen . + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: . + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MLi8g-1vVJBi1H4C-00Uao4 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 17:14:18 +0100 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_17.11.2025_20_Uhr?= + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Name, Vorname: Ihle, Andreas + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Strasse: David-Wolleber-Str., 20 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Ort: 73614 Schorndorf + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Telefon: 017643244886 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: E-mail: verenathon1310@gmail.com + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 17.11.2025 20 Uhr + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Personen: 3 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: . + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N2mBa-1wGQeU2DaG-00rMl2 + +2025-10-28 17:14:18 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 17:14:18 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:31:29 +0100 + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: To: karin.meier@kmmeier.de + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Message-ID: <9yFF0WfV4JHOx76wSo84iYypD3BSSMuU6VcrIfeUWB0@www.sternwarte-welzheim.de> + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Karin Meier am Mo, 29.12.2025 um 20 Uhr für 2 Personen . + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N1wlv-1wFZHs3WAL-0179i1 + +2025-10-28 19:31:29 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:31:29 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:31:29 +0100 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_29.12.2025_20_Uhr?= + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Name, Vorname: Meier, Karin + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Strasse: Schubertstraße 1 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Ort: 70734 Fellbach + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: E-mail: karin.meier@kmmeier.de + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 29.12.2025 20 Uhr + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N2V4P-1wHDRt0NEl-00r3JT + +2025-10-28 19:31:30 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:31:30 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:34:36 +0100 + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: To: lnmeier@outlook.com + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Lisa Meier am Sa, 17.01.2026 um 20 Uhr für 2 Personen . + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MpUZ4-1w3gaw0L1g-00ltIY + +2025-10-28 19:34:38 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:34:38 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:34:40 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:34:38 +0100 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_17.01.2026_20_Uhr?= + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Name, Vorname: Meier, Lisa + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Strasse: Schubertstraße 1 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Ort: 70734 Fellbach + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: E-mail: lnmeier@outlook.com + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 17.01.2026 20 Uhr + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:34:40 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:34:41 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M6DWs-1vKQEy3pUW-00F9fo + +2025-10-28 19:34:41 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:34:41 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:36:24 +0100 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: To: matthias.meier@kmmeier.de + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Matthias Meier am Sa, 24.01.2026 um 20 Uhr für 2 Personen . + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MWAOW-1vlTak2zyE-00NVME + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:36:24 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:36:24 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:36:25 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:36:25 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:36:25 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:36:24 +0100 + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_24.01.2026_20_Uhr?= + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Name, Vorname: Meier, Matthias + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Strasse: Schubertstraße 1 + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Ort: 70734 Fellbach + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: E-mail: matthias.meier@kmmeier.de + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 24.01.2026 20 Uhr + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:36:25 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mz9Un-1w9VkZ47mt-00r8zq + +2025-10-28 19:36:25 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:36:25 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:37:55 +0100 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: To: ek.fries@web.de + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Erika Fries am Sa, 31.01.2026 um 20 Uhr für 2 Personen . + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mv2xU-1w4ojr1Du4-00zBbO + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 19:37:55 +0100 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_31.01.2026_20_Uhr?= + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Name, Vorname: Fries, Erika + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Strasse: Schubertstraße 1 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Ort: 70734 Fellbach + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: E-mail: ek.fries@web.de + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 31.01.2026 20 Uhr + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: . + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mz9Z5-1w9Vho2MAV-00uX5l + +2025-10-28 19:37:55 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 19:37:55 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 22:44:53 +0100 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: To: bmschm@outlook.de + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_03.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 03.11.2025. + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Montag, den 17.11.2025 um 20 Uhr mit 1 Person + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: . + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mn2W5-1vxLKk35mB-00npLa + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-28 22:44:53 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-28 22:44:53 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 22:44:54 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-28 22:44:54 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-28 22:44:54 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-28 22:44:54 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: DATA + +2025-10-28 22:44:54 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Date: Tue, 28 Oct 2025 22:44:53 +0100 + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_03.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Die Führung vom 03.11.2025 wurde umgebucht + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: auf Montag, den 17.11.2025 um 20 Uhr mit 1 Person + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: Besucher: Schmid Bernd Michael + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: . + +2025-10-28 22:44:54 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MF3DW-1vTCVq0Hf6-006Nw9 + +2025-10-28 22:44:54 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-28 22:44:54 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 14:39:45 +0100 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: To: hannah@innspot.de + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Hannah Bratenstein am Mo, 17.11.2025 um 20 Uhr für 2 Personen . + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: . + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MVNB1-1vfQyk2VSp-00XJI0 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 14:39:45 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 14:39:45 +0100 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_17.11.2025_20_Uhr?= + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Message-ID: <6rxq7gRM2dBch93Qrl1Tbu6NdBouLUSH00DvjBdQ@www.sternwarte-welzheim.de> + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Name, Vorname: Bratenstein, Hannah + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Strasse: Seyfferstraße 65 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Ort: 70197 Stuttgart + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: E-mail: hannah@innspot.de + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 17.11.2025 20 Uhr + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: + +2025-10-29 14:39:45 [Level 1] CLIENT -> SERVER: . + +2025-10-29 14:39:46 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MHXBj-1vRanA3eF7-009nbh + +2025-10-29 14:39:46 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 14:39:46 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 16:27:22 +0100 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: To: XNastos@t-online.de + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Vereinbarte_Sonderf=C3=BChrung_am_Do,_20.11.2025_19:30?= + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Hallo Xeno, + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: vielen Dank für die Bereitschaft, die Sonderführung am Do, 20.11.2025 19:30 zu übernehmen. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Bitte den Termin nicht vergessen und bitte ggf. auch das Teammitglied, das die + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Führung mitmacht, informieren. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Der Termin wurde in den Sternwartenkalender eingetragen. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Die Kontaktdaten sind auf der Sonderführungsseite ( https://sternwarte-welzheim.de/intern/sofue/sofue.php ) zu finden. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Viele Grüße + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Reinhard + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Diese Meldung wurde automatisch erzeugt. Es kann nicht geantwortet werden. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: . + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mr9Fs-1w1AHk3jba-00j8MJ + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 16:27:22 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 16:27:22 +0100 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: To: elbert-rolf@web.de + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Cc: XNastos@t-online.de + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?ZUSAGE_-_Sternwartenf=C3=BChrung_am_Do,_20.11.2025_19:30_Uhr?= + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Message-ID: <4mcuXoiqK5BWUEQ21pfOQQP5Sj3fHHjavul16UlF8o@sternwarte-welzheim.de> + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Guten Tag, + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: für Ihren Wunschtermin, Do, 20.11.2025 19:30 Uhr, hat sich unser ehrenamtlicher Mitarbeiter, Herr Xeno Nastos bereit erklärt, + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: die Sonderführung zu übernehmen. Sie erreichen ihn über die e-mail-Adresse: XNastos@t-online.de + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Um nähere Besuchsmodalitäten zu klären, bitten wir Sie, mit Herrn Nastos Kontakt aufzunehmen. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Wir bitten Sie, die Spende in Höhe von €50.00 auf unten aufgeführtes Konto zu überweisen oder in bar zur Führung mitzubringen. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Gesellschaft zur Förderung des Planetariums Stuttgart und der Sternwarte Welzheim e.V. + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: BANKVERBINDUNG: Deutsche Bank AG Stuttgart + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: IBAN DE18 6007 0070 0122 0383 00 + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: BIC: DEUTDESSXXX + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Mit sternfreundlichen Grüßen + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Reinhard X. Fürst + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: Sternwarte Welzheim + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 16:27:22 [Level 1] CLIENT -> SERVER: . + +2025-10-29 16:27:23 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mr9Bu-1w1AHk3mje-00kSfS + +2025-10-29 16:27:23 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 16:27:23 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 19:10:22 +0100 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: To: maria.koehler@gmx.de + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Maria Köhler am Sa, 07.02.2026 um 20 Uhr für 4 Personen . + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: . + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MSKyI-1vgj4Q1TKa-00Xomt + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 19:10:22 +0100 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_07.02.2026_20_Uhr?= + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Name, Vorname: Köhler , Maria + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Strasse: Pappelweg 16 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Ort: 71546 Aspach + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Telefon: 07191 9330820 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: E-mail: maria.koehler@gmx.de + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 07.02.2026 20 Uhr + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Personen: 4 + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: . + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MUXtY-1veXDK2faK-00RpQn + +2025-10-29 19:10:22 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 19:10:22 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 19:10:59 +0100 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: To: hansdschida1@gmail.com + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Vereinbarte_Sonderf=C3=BChrung_am_Fr,_14.11.2025_19:00?= + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Hallo Hans, + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: vielen Dank für die Bereitschaft, die Sonderführung am Fr, 14.11.2025 19:00 zu übernehmen. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Bitte den Termin nicht vergessen und bitte ggf. auch das Teammitglied, das die + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Führung mitmacht, informieren. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Der Termin wurde in den Sternwartenkalender eingetragen. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Die Kontaktdaten sind auf der Sonderführungsseite ( https://sternwarte-welzheim.de/intern/sofue/sofue.php ) zu finden. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Viele Grüße + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Reinhard + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Diese Meldung wurde automatisch erzeugt. Es kann nicht geantwortet werden. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: . + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: DATA + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Date: Wed, 29 Oct 2025 19:10:59 +0100 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: To: maxsigel11@gmail.com + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Cc: hansdschida1@gmail.com + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?ZUSAGE_-_Sternwartenf=C3=BChrung_am_Fr,_14.11.2025_19:00_Uhr?= + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Guten Tag, + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: für Ihren Wunschtermin, Fr, 14.11.2025 19:00 Uhr, hat sich unser ehrenamtlicher Mitarbeiter, Herr Hans Dschida bereit erklärt, + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: die Sonderführung zu übernehmen. Sie erreichen ihn über die e-mail-Adresse: hansdschida1@gmail.com + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Um nähere Besuchsmodalitäten zu klären, bitten wir Sie, mit Herrn Dschida Kontakt aufzunehmen. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Wir bitten Sie, die Spende in Höhe von €50.00 auf unten aufgeführtes Konto zu überweisen oder in bar zur Führung mitzubringen. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Gesellschaft zur Förderung des Planetariums Stuttgart und der Sternwarte Welzheim e.V. + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: BANKVERBINDUNG: Deutsche Bank AG Stuttgart + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: IBAN DE18 6007 0070 0122 0383 00 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: BIC: DEUTDESSXXX + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Mit sternfreundlichen Grüßen + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Reinhard X. Fürst + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: Sternwarte Welzheim + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: . + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mzyyk-1w9yTt2aYQ-00wABj + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MlNp7-1vzuVq2U5F-00kTE4 + +2025-10-29 19:10:59 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-29 19:10:59 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: DATA + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Date: Thu, 30 Oct 2025 11:49:20 +0100 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: To: cegceg@gmail.com + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Carlos Gutierrez am Sa, 24.01.2026 um 20 Uhr für 3 Personen . + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: . + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mplbx-1w42uL33aH-00j5ZR + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 11:49:20 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-30 11:49:20 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 11:49:21 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-30 11:49:21 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 11:49:21 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 11:49:21 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: DATA + +2025-10-30 11:49:21 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Date: Thu, 30 Oct 2025 11:49:20 +0100 + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Sa,_24.01.2026_20_Uhr?= + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Name, Vorname: Gutierrez, Carlos + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Strasse: Sattelstr 4 + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Ort: 70327 Stuttgart + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: E-mail: cegceg@gmail.com + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Sa, 24.01.2026 20 Uhr + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Personen: 3 + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: . + +2025-10-30 11:49:21 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MpUYu-1w4JtF04qK-00p7Yf + +2025-10-30 11:49:21 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-30 11:49:21 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-30 19:01:07 [Level 2] SERVER -> CLIENT: 220 FR3P281CA0164.outlook.office365.com Microsoft ESMTP MAIL Service ready at Thu, 30 Oct 2025 18:01:05 +0000 [08DE17541D94C749] + +2025-10-30 19:01:07 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-30 19:01:07 [Level 2] SERVER -> CLIENT: 250-FR3P281CA0164.outlook.office365.com Hello [92.205.53.160] +250-SIZE 157286400 +250-PIPELINING +250-DSN +250-ENHANCEDSTATUSCODES +250-STARTTLS +250-8BITMIME +250-BINARYMIME +250-CHUNKING +250 SMTPUTF8 + +2025-10-30 19:01:07 [Level 1] CLIENT -> SERVER: STARTTLS + +2025-10-30 19:01:07 [Level 2] SERVER -> CLIENT: 220 2.0.0 SMTP server ready + +2025-10-30 19:01:07 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-30 19:01:07 [Level 2] SERVER -> CLIENT: 250-FR3P281CA0164.outlook.office365.com Hello [92.205.53.160] +250-SIZE 157286400 +250-PIPELINING +250-DSN +250-ENHANCEDSTATUSCODES +250-AUTH LOGIN XOAUTH2 +250-8BITMIME +250-BINARYMIME +250-CHUNKING +250 SMTPUTF8 + +2025-10-30 19:01:07 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-30 19:01:07 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-30 19:01:07 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:01:07 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-30 19:01:07 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 535 5.7.3 Authentication unsuccessful [FR3P281CA0164.DEUP281.PROD.OUTLOOK.COM 2025-10-30T18:01:11.083Z 08DE17541D94C749] + +2025-10-30 19:01:12 [Level 1] SMTP ERROR: Password command failed: 535 5.7.3 Authentication unsuccessful [FR3P281CA0164.DEUP281.PROD.OUTLOOK.COM 2025-10-30T18:01:11.083Z 08DE17541D94C749] + +2025-10-30 19:01:12 [Level 2] SMTP Error: Could not authenticate. +2025-10-30 19:01:12 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 221 2.0.0 Service closing transmission channel + +2025-10-30 19:01:12 [Level 2] SMTP Error: Could not authenticate. +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 220 FR3P281CA0154.outlook.office365.com Microsoft ESMTP MAIL Service ready at Thu, 30 Oct 2025 18:01:06 +0000 [08DE17656021C353] + +2025-10-30 19:01:12 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 250-FR3P281CA0154.outlook.office365.com Hello [92.205.53.160] +250-SIZE 157286400 +250-PIPELINING +250-DSN +250-ENHANCEDSTATUSCODES +250-STARTTLS +250-8BITMIME +250-BINARYMIME +250-CHUNKING +250 SMTPUTF8 + +2025-10-30 19:01:12 [Level 1] CLIENT -> SERVER: STARTTLS + +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 220 2.0.0 SMTP server ready + +2025-10-30 19:01:12 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 250-FR3P281CA0154.outlook.office365.com Hello [92.205.53.160] +250-SIZE 157286400 +250-PIPELINING +250-DSN +250-ENHANCEDSTATUSCODES +250-AUTH LOGIN XOAUTH2 +250-8BITMIME +250-BINARYMIME +250-CHUNKING +250 SMTPUTF8 + +2025-10-30 19:01:12 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-30 19:01:12 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:01:12 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-30 19:01:12 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:01:17 [Level 2] SERVER -> CLIENT: 535 5.7.3 Authentication unsuccessful [FR3P281CA0154.DEUP281.PROD.OUTLOOK.COM 2025-10-30T18:01:12.758Z 08DE17656021C353] + +2025-10-30 19:01:17 [Level 1] SMTP ERROR: Password command failed: 535 5.7.3 Authentication unsuccessful [FR3P281CA0154.DEUP281.PROD.OUTLOOK.COM 2025-10-30T18:01:12.758Z 08DE17656021C353] + +2025-10-30 19:01:17 [Level 2] SMTP Error: Could not authenticate. +2025-10-30 19:01:17 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-30 19:01:17 [Level 2] SERVER -> CLIENT: 221 2.0.0 Service closing transmission channel + +2025-10-30 19:01:17 [Level 2] SMTP Error: Could not authenticate. +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: DATA + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Date: Thu, 30 Oct 2025 19:13:25 +0100 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: ffrrff am Mo, 17.11.2025 um 20 Uhr für 2 Personen . + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: . + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M59GG-1vFdbu0l9Q-000MZn + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx105) Nemesis ESMTP Service ready + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: DATA + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Date: Thu, 30 Oct 2025 19:13:26 +0100 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mo,_17.11.2025_20_Uhr?= + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Name, Vorname: ffrrff, + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Strasse: Neue + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Ort: 12345 Stadt + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Telefon: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: E-mail: rexfue@gmail.com + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mo, 17.11.2025 20 Uhr + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Personen: 2 + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: Bemerkungen: TEST TEST TEST + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: . + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MEm27-1vT55h23HX-00H9zp + +2025-10-30 19:13:26 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-30 19:13:26 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: DATA + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Date: Fri, 31 Oct 2025 12:33:44 +0100 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: To: c.bott@jks-welzheim.de + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anfrage_Sonderf=C3=BChrung_auf_der_Sternwarte_Welzheim?= + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Guten Tag, + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: vielen Dank für Ihre Anfrage. Wir freuen uns über Ihr Interesse an der Sternwarte Welzheim und Ihren Wunsch nach einer Sonderführung. + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Wir bemühen uns, Ihnen innerhalb einer Woche Bescheid zu geben, ob einer unserer freien Mitarbeiter/-innen die Sonderführung außerhalb unserer öffentlichen Sternführungen übernehmen kann. + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: ................................................................................................. + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: . + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Mi2Nv-1vsVuz1AYr-00qP17 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 OK + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: DATA + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Date: Fri, 31 Oct 2025 12:33:44 +0100 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: To: anmeldungen@sternwarte.rexfue.de + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Cc: andrea.ess@t-online.de, sonderfuehrung@sternwarte-welzheim.de, martin.gertz@gmx.de, info@planetarium-stuttgart.de, HUK@observatory-stuttgart.de + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anfrage_f=C3=BCr_Sonderf=C3=BChrung_am_Di_09.12.2025_18:30_Uhr?= + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Name, Vorname: Bott, Christina + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Verein / Organisation : Janusz Korczak Schule Welzheim + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Strasse: Rienharzer Str 57 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Ort: 73642 Welzheim + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Telefon: 0152-53498929 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: E-mail: c.bott@jks-welzheim.de + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Di 09.12.2025, 18:30 Uhr + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Personen: 25 + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Weitere Fragen oder Mitteilungen: Wir sind die Lerngruppe 4 der Janusz Korczak Schule (SBBZ Lernen). D.h. wir sind eine Mischung aus SchülerInnen der Klassen 6 und 7. + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Die Lerninhalte unserer SchülerInnen liegen ca. auf dem Niveau der 4. Klasse der Regelschule. Daher bitten wir um einfache Sprache und kleinschrittige Erklärungen. + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Vielen Dank! Wir freuen uns sehr, wenn es mit der Führung klappt. + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Freundliche Grüße + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Christina Bott + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: Spendenbescheinigung: nein + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: . + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MiacR-1vrxQF2JUN-00btwD + +2025-10-31 12:33:44 [Level 1] CLIENT -> SERVER: QUIT + +2025-10-31 12:33:44 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 09:20:03 +0100 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: To: sternwarte@planetariumsgesellschaft.de + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Reply-To: sonderfuehrung@sternwarte-welzheim.de + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anfrage_Sonderf=C3=BChrung_am_2025-12-09_18:30:00?= + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Liebe BEOs, + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: wer kann folgende Sonderführung übernehmen? + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Viele Grüße + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Reinhard + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: --------------------------------------------------------------------------------------------------- + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Name, Vorname: Bott Christina + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Verein / Organisation : Janusz Korczak Schule Welzheim + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Wunsch - Termin: 2025-12-09 18:30:00 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Teilnehmerzahl ca.: 25 + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Weitere Fragen oder Mitteilungen: Wir sind die Lerngruppe 4 der Janusz Korczak Schule (SBBZ Lernen). D.h. wir sind eine Mischung aus SchülerInnen der Klassen 6 und 7. + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Die Lerninhalte unserer SchülerInnen liegen ca. auf dem Niveau der 4. Klasse der Regelschule. Daher bitten wir um einfache Sprache und kleinschrittige Erklärungen. + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Vielen Dank! Wir freuen uns sehr, wenn es mit der Führung klappt. + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Freundliche Grüße + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Christina Bott + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: Spendenbescheinigung: nein + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: --------------------------------------------------------------------------------------------------- + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: . + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M7K3i-1vKdgN3PO0-003zwT + +2025-11-01 09:20:03 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 09:20:03 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 09:38:50 +0100 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: To: sternwarte@planetariumsgesellschaft.de + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Reply-To: sonderfuehrung@sternwarte-welzheim.de + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anfrage_Sonderf=C3=BChrung_am_2025-12-09_18:30:00?= + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Message-ID: <96ZRTSmKP5O0Yc7wHCr9tsbAQ8pGJYPImjkkLX9QlU@sternwarte-welzheim.de> + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Liebe BEOs, + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: wer kann folgende Sonderführung übernehmen? + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Viele Grüße + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Reinhard + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: --------------------------------------------------------------------------------------------------- + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Name, Vorname: Bott Christina + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Verein / Organisation : Janusz Korczak Schule Welzheim + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Wunsch - Termin: 2025-12-09 18:30:00 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Teilnehmerzahl ca.: 25 + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Weitere Fragen oder Mitteilungen: Wir sind die Lerngruppe 4 der Janusz Korczak Schule (SBBZ Lernen). D.h. wir sind eine Mischung aus SchülerInnen der Klassen 6 und 7. + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Die Lerninhalte unserer SchülerInnen liegen ca. auf dem Niveau der 4. Klasse der Regelschule. Daher bitten wir um einfache Sprache und kleinschrittige Erklärungen. + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Vielen Dank! Wir freuen uns sehr, wenn es mit der Führung klappt. + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Freundliche Grüße + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Christina Bott + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: Spendenbescheinigung: nein + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: --------------------------------------------------------------------------------------------------- + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: . + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1Ma20q-1vin6c191Q-00TCrn + +2025-11-01 09:38:50 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 09:38:50 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 14:23:28 +0100 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: To: hansdschida1@gmail.com + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Vereinbarte_Sonderf=C3=BChrung_am_Di,_09.12.2025_18:30?= + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Hallo Hans, + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: vielen Dank für die Bereitschaft, die Sonderführung am Di, 09.12.2025 18:30 zu übernehmen. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Bitte den Termin nicht vergessen und bitte ggf. auch das Teammitglied, das die + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Führung mitmacht, informieren. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Der Termin wurde in den Sternwartenkalender eingetragen. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Die Kontaktdaten sind auf der Sonderführungsseite ( https://sternwarte-welzheim.de/intern/sofue/sofue.php ) zu finden. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Viele Grüße + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Reinhard + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Diese Meldung wurde automatisch erzeugt. Es kann nicht geantwortet werden. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: . + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 14:23:28 +0100 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: To: c.bott@jks-welzheim.de + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Cc: hansdschida1@gmail.com + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?ZUSAGE_-_Sternwartenf=C3=BChrung_am_Di,_09.12.2025_18:30_Uhr?= + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Guten Tag, + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: für Ihren Wunschtermin, Di, 09.12.2025 18:30 Uhr, hat sich unser ehrenamtlicher Mitarbeiter, Herr Hans Dschida bereit erklärt, + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: die Sonderführung zu übernehmen. Sie erreichen ihn über die e-mail-Adresse: hansdschida1@gmail.com + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Um nähere Besuchsmodalitäten zu klären, bitten wir Sie, mit Herrn Dschida Kontakt aufzunehmen. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Wir bitten Sie, die Spende in Höhe von €50.00 auf unten aufgeführtes Konto zu überweisen oder in bar zur Führung mitzubringen. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Gesellschaft zur Förderung des Planetariums Stuttgart und der Sternwarte Welzheim e.V. + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: BANKVERBINDUNG: Deutsche Bank AG Stuttgart + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: IBAN DE18 6007 0070 0122 0383 00 + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: BIC: DEUTDESSXXX + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Mit sternfreundlichen Grüßen + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Reinhard X. Fürst + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: Sternwarte Welzheim + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: . + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MWici-1vmIMS2eG8-00S73q + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1McYCb-1vptF72aGj-00edgE + +2025-11-01 14:23:28 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 14:23:28 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 16:34:38 +0100 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: To: Kagorooh@yahoo.de + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_22.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 22.11.2025. + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Samstag, den 31.01.2026 um 20 Uhr mit 6 Personen + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: . + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MnJhO-1vwDt40sFg-00cOsv + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: EHLO sternwarte-welzheim.de + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 16:34:38 +0100 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_22.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Die Führung vom 22.11.2025 wurde umgebucht + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: auf Samstag, den 31.01.2026 um 20 Uhr mit 6 Personen + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: Besucher: Häberlein Sabine + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: . + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1M2wL0-1vGJYA1vbw-008Q0s + +2025-11-01 16:34:38 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 16:34:38 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx104) Nemesis ESMTP Service ready + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 16:48:20 +0100 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: To: boguslav.vic@gmail.com + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Subject: Anmeldung zu einer =?UTF-8?Q?F=C3=BChrung=20auf=20der=20Sternwarte=20Welz?= =?UTF-8?Q?heim?= + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir Ihre Anmeldung zu einer Führung auf der Sternwarte Welzheim für + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Boguslavskyi Viktor am Mi, 07.01.2026 um 20 Uhr für 6 Personen . + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden. + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Sollten Sie die Anmeldung stornieren oder umbuchen wollen, so können Sie dies über die Webseite https://sternwarte-welzheim.de/storno selbst durchführen. + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: . + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N2Dx8-1wFX6g3JeA-014BQE + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx005) Nemesis ESMTP Service ready + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 16:48:20 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 16:48:20 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 16:48:20 +0100 + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Cc: anmeldung@sternwarte-welzheim.de + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Reply-To: anmeldung@sternwarte-welzheim.de + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Anmeldung_zur_F=C3=BChrung_in_Welzheim_am_Mi,_07.01.2026_20_Uhr?= + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Message-ID: <5IclUsyTGIG5vBe2w07IbaehJf0dDl5cqRvIoAG6i8@www.sternwarte-welzheim.de> + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Name, Vorname: Viktor, Boguslavskyi + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Strasse: Schulstaße 3 + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Ort: 73553 Alfdorf + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Telefon: 015202199744 + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: E-mail: boguslav.vic@gmail.com + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Gewünschter Termin: Mi, 07.01.2026 20 Uhr + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Personen: 6 + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: Bemerkungen: + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: . + +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1N8XPn-1wJgF20ENd-010WkX + +2025-11-01 16:48:21 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 16:48:21 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 21:47:28 +0100 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: To: Caroo1311@googlemail.com + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Sehr geehrte Dame, sehr geehrter Herr, + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: hiermit bestätigen wir die Umbuchung Ihrer Führung auf der Sternwarte Welzheim vom 08.11.2025. + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Sie wurden umgebucht auf: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Samstag, den 22.11.2025 um 20 Uhr mit 2 Personen + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden. + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de. + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Mit freundlichen Grüßen + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Beobachterteam der Sternwarte Welzheim + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: www.sternwarte-welzheim.de + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: . + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MBUqL-1vOtwt2hVH-00035G + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 220 gmx.net (mrgmx004) Nemesis ESMTP Service ready + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: EHLO www.sternwarte-welzheim.de + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 250-gmx.net Hello www.sternwarte-welzheim.de [92.205.53.160] +250-8BITMIME +250-AUTH PLAIN LOGIN +250 SIZE 141557760 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: AUTH LOGIN + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: [credentials hidden] +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 235 Authentication succeeded + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: MAIL FROM: + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: RCPT TO: + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 250 OK + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: DATA + +2025-11-01 21:47:28 [Level 2] SERVER -> CLIENT: 354 Start mail input; end with . + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Date: Sat, 1 Nov 2025 21:47:28 +0100 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: To: rexfue@gmail.com + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: From: Sternwarte-Welzheim + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Reply-To: noreply@sternwarte-welzheim.de + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Subject: =?UTF-8?Q?Umbuchung_der_F=C3=BChrung_vom_08.11.2025_auf_der_Sternwarte_Welzheim?= + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Message-ID: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: X-Mailer: PHPMailer 6.5.1 (https://github.com/PHPMailer/PHPMailer) + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: MIME-Version: 1.0 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Content-Type: text/plain; charset=UTF-8 + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Die Führung vom 08.11.2025 wurde umgebucht + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: auf Samstag, den 22.11.2025 um 20 Uhr mit 2 Personen + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: Besucher: Maier Caroline + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: + +2025-11-01 21:47:28 [Level 1] CLIENT -> SERVER: . + +2025-11-01 21:47:29 [Level 2] SERVER -> CLIENT: 250 Requested mail action okay, completed: id=1MLi8g-1vWpMG3vEG-00Ub5R + +2025-11-01 21:47:29 [Level 1] CLIENT -> SERVER: QUIT + +2025-11-01 21:47:29 [Level 2] SERVER -> CLIENT: 221 gmx.net Service closing transmission channel + diff --git a/html/sternwarte/phpmailer/vendor/autoload.php b/html/sternwarte/phpmailer/vendor/autoload.php new file mode 100644 index 0000000..5a6ad09 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/html/sternwarte/phpmailer/vendor/composer/LICENSE b/html/sternwarte/phpmailer/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/html/sternwarte/phpmailer/vendor/composer/autoload_classmap.php b/html/sternwarte/phpmailer/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..7a91153 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/composer/autoload_classmap.php @@ -0,0 +1,9 @@ + array($vendorDir . '/phpmailer/phpmailer/src'), +); diff --git a/html/sternwarte/phpmailer/vendor/composer/autoload_real.php b/html/sternwarte/phpmailer/vendor/composer/autoload_real.php new file mode 100644 index 0000000..81d7534 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/composer/autoload_real.php @@ -0,0 +1,55 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit8694c26efd94d80212987d135c122daf::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + return $loader; + } +} diff --git a/html/sternwarte/phpmailer/vendor/composer/autoload_static.php b/html/sternwarte/phpmailer/vendor/composer/autoload_static.php new file mode 100644 index 0000000..c73eba6 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/composer/autoload_static.php @@ -0,0 +1,31 @@ + + array ( + 'PHPMailer\\PHPMailer\\' => 20, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'PHPMailer\\PHPMailer\\' => + array ( + 0 => __DIR__ . '/..' . '/phpmailer/phpmailer/src', + ), + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit8694c26efd94d80212987d135c122daf::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit8694c26efd94d80212987d135c122daf::$prefixDirsPsr4; + + }, null, ClassLoader::class); + } +} diff --git a/html/sternwarte/phpmailer/vendor/composer/installed.json b/html/sternwarte/phpmailer/vendor/composer/installed.json new file mode 100644 index 0000000..3d45d95 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/composer/installed.json @@ -0,0 +1,78 @@ +[ + { + "name": "phpmailer/phpmailer", + "version": "v6.5.1", + "version_normalized": "6.5.1.0", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.2", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.6.0", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "time": "2021-08-18T09:14:16+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ] + } +] diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/COMMITMENT b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/COMMITMENT new file mode 100644 index 0000000..a687e0d --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/COMMITMENT @@ -0,0 +1,46 @@ +GPL Cooperation Commitment +Version 1.0 + +Before filing or continuing to prosecute any legal proceeding or claim +(other than a Defensive Action) arising from termination of a Covered +License, we commit to extend to the person or entity ('you') accused +of violating the Covered License the following provisions regarding +cure and reinstatement, taken from GPL version 3. As used here, the +term 'this License' refers to the specific Covered License being +enforced. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly + and finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you + have received notice of violation of this License (for any work) + from that copyright holder, and you cure the violation prior to 30 + days after your receipt of the notice. + +We intend this Commitment to be irrevocable, and binding and +enforceable against us and assignees of or successors to our +copyrights. + +Definitions + +'Covered License' means the GNU General Public License, version 2 +(GPLv2), the GNU Lesser General Public License, version 2.1 +(LGPLv2.1), or the GNU Library General Public License, version 2 +(LGPLv2), all as published by the Free Software Foundation. + +'Defensive Action' means a legal proceeding or claim that We bring +against you in response to a prior proceeding or claim initiated by +you or your affiliate. + +'We' means each contributor to this repository as of the date of +inclusion of this file, including subsidiaries of a corporate +contributor. + +This work is available under a Creative Commons Attribution-ShareAlike +4.0 International license (https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/LICENSE b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/LICENSE new file mode 100644 index 0000000..f166cc5 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/LICENSE @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! \ No newline at end of file diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/README.md b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/README.md new file mode 100644 index 0000000..81b0897 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/README.md @@ -0,0 +1,227 @@ +![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png) + +# PHPMailer – A full-featured email creation and transfer class for PHP + +[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions) +[![codecov.io](https://codecov.io/gh/PHPMailer/PHPMailer/branch/master/graph/badge.svg?token=iORZpwmYmM)](https://codecov.io/gh/PHPMailer/PHPMailer) +[![Latest Stable Version](https://poser.pugx.org/phpmailer/phpmailer/v/stable.svg)](https://packagist.org/packages/phpmailer/phpmailer) +[![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer) +[![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer) +[![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](https://phpmailer.github.io/PHPMailer/) + +## Features +- Probably the world's most popular code for sending email from PHP! +- Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more +- Integrated SMTP support – send without a local mail server +- Send emails with multiple To, CC, BCC and Reply-to addresses +- Multipart/alternative emails for mail clients that do not read HTML email +- Add attachments, including inline +- Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings +- SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SMTPS and SMTP+STARTTLS transports +- Validates email addresses automatically +- Protects against header injection attacks +- Error messages in over 50 languages! +- DKIM and S/MIME signing support +- Compatible with PHP 5.5 and later, including PHP 8.1 +- Namespaced to prevent name clashes +- Much more! + +## Why you might need it +Many PHP developers need to send email from their code. The only PHP function that supports this directly is [`mail()`](https://www.php.net/manual/en/function.mail.php). However, it does not provide any assistance for making use of popular features such as encryption, authentication, HTML messages, and attachments. + +Formatting email correctly is surprisingly difficult. There are myriad overlapping (and conflicting) standards, requiring tight adherence to horribly complicated formatting and encoding rules – the vast majority of code that you'll find online that uses the `mail()` function directly is just plain wrong, if not unsafe! + +The PHP `mail()` function usually sends via a local mail server, typically fronted by a `sendmail` binary on Linux, BSD, and macOS platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP client allows email sending on all platforms without needing a local mail server. Be aware though, that the `mail()` function should be avoided when possible; it's both faster and [safer](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html) to use SMTP to localhost. + +*Please* don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that +you should look at before rolling your own. Try [SwiftMailer](https://swiftmailer.symfony.com/) +, [Laminas/Mail](https://docs.laminas.dev/laminas-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail) etc. + +## License +This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html) license, along with the [GPL Cooperation Commitment](https://gplcc.github.io/gplcc/). Please read [LICENSE](https://github.com/PHPMailer/PHPMailer/blob/master/LICENSE) for information on the software availability and distribution. + +## Installation & loading +PHPMailer is available on [Packagist](https://packagist.org/packages/phpmailer/phpmailer) (using semantic versioning), and installation via [Composer](https://getcomposer.org) is the recommended way to install PHPMailer. Just add this line to your `composer.json` file: + +```json +"phpmailer/phpmailer": "^6.5" +``` + +or run + +```sh +composer require phpmailer/phpmailer +``` + +Note that the `vendor` folder and the `vendor/autoload.php` script are generated by Composer; they are not part of PHPMailer. + +If you want to use the Gmail XOAUTH2 authentication class, you will also need to add a dependency on the `league/oauth2-client` package in your `composer.json`. + +Alternatively, if you're not using Composer, you +can [download PHPMailer as a zip file](https://github.com/PHPMailer/PHPMailer/archive/master.zip), (note that docs and examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of the `include_path` directories specified in your PHP configuration and load each class file manually: + +```php +SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output + $mail->isSMTP(); //Send using SMTP + $mail->Host = 'smtp.example.com'; //Set the SMTP server to send through + $mail->SMTPAuth = true; //Enable SMTP authentication + $mail->Username = 'user@example.com'; //SMTP username + $mail->Password = 'secret'; //SMTP password + $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption + $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` + + //Recipients + $mail->setFrom('from@example.com', 'Mailer'); + $mail->addAddress('joe@example.net', 'Joe User'); //Add a recipient + $mail->addAddress('ellen@example.com'); //Name is optional + $mail->addReplyTo('info@example.com', 'Information'); + $mail->addCC('cc@example.com'); + $mail->addBCC('bcc@example.com'); + + //Attachments + $mail->addAttachment('/var/tmp/file.tar.gz'); //Add attachments + $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); //Optional name + + //Content + $mail->isHTML(true); //Set email format to HTML + $mail->Subject = 'Here is the subject'; + $mail->Body = 'This is the HTML message body in bold!'; + $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; + + $mail->send(); + echo 'Message has been sent'; +} catch (Exception $e) { + echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; +} +``` + +You'll find plenty to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder, which covers many common scenarios including sending through gmail, building contact forms, sending to mailing lists, and more. + +If you are re-using the instance (e.g. when sending to a mailing list), you may need to clear the recipient list to avoid sending duplicate messages. See [the mailing list example](https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps) for further guidance. + +That's it. You should now be ready to use PHPMailer! + +## Localization +PHPMailer defaults to English, but in the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder you'll find many translations for PHPMailer error messages that you may encounter. Their filenames contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for French. To specify a language, you need to tell PHPMailer which one to use, like this: + +```php +//To load the French version +$mail->setLanguage('fr', '/optional/path/to/language/directory/'); +``` + +We welcome corrections and new languages – if you're looking for corrections, run the [PHPMailerLangTest.php](https://github.com/PHPMailer/PHPMailer/tree/master/test/PHPMailerLangTest.php) script in the tests folder and it will show any missing translations. + +## Documentation +Start reading at the [GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki). If you're having trouble, head for [the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting) as it's frequently updated. + +Examples of how to use PHPMailer for common scenarios can be found in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder. If you're looking for a good starting point, we recommend you start with [the Gmail example](https://github.com/PHPMailer/PHPMailer/tree/master/examples/gmail.phps). + +To reduce PHPMailer's deployed code footprint, examples are not included if you load PHPMailer via Composer or via [GitHub's zip file download](https://github.com/PHPMailer/PHPMailer/archive/master.zip), so you'll need to either clone the git repository or use the above links to get to the examples directly. + +Complete generated API documentation is [available online](https://phpmailer.github.io/PHPMailer/). + +You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good reference for how to do various operations such as encryption. + +If the documentation doesn't cover what you need, search the [many questions on Stack Overflow](http://stackoverflow.com/questions/tagged/phpmailer), and before you ask a question about "SMTP Error: Could not connect to SMTP host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting). + +## Tests +[PHPMailer tests](https://github.com/PHPMailer/PHPMailer/tree/master/test/) use PHPUnit 9, with [a polyfill](https://github.com/Yoast/PHPUnit-Polyfills) to let 9-style tests run on older PHPUnit and PHP versions. + +[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions) + +If this isn't passing, is there something you can do to help? + +## Security +Please disclose any vulnerabilities found responsibly – report security issues to the maintainers privately. + +See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) and [PHPMailer's security advisories on GitHub](https://github.com/PHPMailer/PHPMailer/security). + +## Contributing +Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues). + +We're particularly interested in fixing edge-cases, expanding test coverage and updating translations. + +If you found a mistake in the docs, or want to add something, go ahead and amend the wiki – anyone can edit it. + +If you have git clones from prior to the move to the PHPMailer GitHub organisation, you'll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone: + +```sh +git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git +``` + +Please *don't* use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained. + +## Sponsorship +Development time and resources for PHPMailer are provided by [Smartmessages.net](https://info.smartmessages.net/), the world's only privacy-first email marketing system. + +Smartmessages.net privacy-first email marketing logo + +Donations are very welcome, whether in beer 🍺, T-shirts 👕, or cold, hard cash 💰. Sponsorship through GitHub is a simple and convenient way to say "thank you" to PHPMailer's maintainers and contributors – just click the "Sponsor" button [on the project page](https://github.com/PHPMailer/PHPMailer). If your company uses PHPMailer, consider taking part in Tidelift's enterprise support programme. + +## PHPMailer For Enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of PHPMailer and thousands of other packages are working with Tidelift to deliver commercial +support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and +improve code health, while paying the maintainers of the exact packages you +use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-phpmailer-phpmailer?utm_source=packagist-phpmailer-phpmailer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +## Changelog +See [changelog](changelog.md). + +## History +- PHPMailer was originally written in 2001 by Brent R. Matzelle as a [SourceForge project](http://sourceforge.net/projects/phpmailer/). +- [Marcus Bointon](https://github.com/Synchro) (`coolbru` on SF) and Andy Prevost (`codeworxtech`) took over the project in 2004. +- Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski. +- Marcus created [his fork on GitHub](https://github.com/Synchro/PHPMailer) in 2008. +- Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013. +- PHPMailer moves to [the PHPMailer organisation](https://github.com/PHPMailer) on GitHub in 2013. + +### What's changed since moving from SourceForge? +- Official successor to the SourceForge and Google Code projects. +- Test suite. +- Continuous integration with Github Actions. +- Composer support. +- Public development. +- Additional languages and language strings. +- CRAM-MD5 authentication support. +- Preserves full repo history of authors, commits and branches from the original SourceForge project. diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/SECURITY.md b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/SECURITY.md new file mode 100644 index 0000000..035a87f --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/SECURITY.md @@ -0,0 +1,37 @@ +# Security notices relating to PHPMailer + +Please disclose any security issues or vulnerabilities found through [Tidelift's coordinated disclosure system](https://tidelift.com/security) or to the maintainers privately. + +PHPMailer 6.4.1 and earlier contain a vulnerability that can result in untrusted code being called (if such code is injected into the host project's scope by other means). If the `$patternselect` parameter to `validateAddress()` is set to `'php'` (the default, defined by `PHPMailer::$validator`), and the global namespace contains a function called `php`, it will be called in preference to the built-in validator of the same name. Mitigated in PHPMailer 6.5.0 by denying the use of simple strings as validator function names. Recorded as [CVE-2021-3603](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-3603). Reported by [Vikrant Singh Chauhan](mailto:vi@hackberry.xyz) via [huntr.dev](https://www.huntr.dev/). + +PHPMailer versions 6.4.1 and earlier contain a possible remote code execution vulnerability through the `$lang_path` parameter of the `setLanguage()` method. If the `$lang_path` parameter is passed unfiltered from user input, it can be set to [a UNC path](https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#unc-paths), and if an attacker is also able to persuade the server to load a file from that UNC path, a script file under their control may be executed. This vulnerability only applies to systems that resolve UNC paths, typically only Microsoft Windows. +PHPMailer 6.5.0 mitigates this by no longer treating translation files as PHP code, but by parsing their text content directly. This approach avoids the possibility of executing unknown code while retaining backward compatibility. This isn't ideal, so the current translation format is deprecated and will be replaced in the next major release. Recorded as [CVE-2021-34551](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-34551). Reported by [Jilin Diting Information Technology Co., Ltd](https://listensec.com) via Tidelift. + +PHPMailer versions between 6.1.8 and 6.4.0 contain a regression of the earlier CVE-2018-19296 object injection vulnerability as a result of [a fix for Windows UNC paths in 6.1.8](https://github.com/PHPMailer/PHPMailer/commit/e2e07a355ee8ff36aba21d0242c5950c56e4c6f9). Recorded as [CVE-2020-36326](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-36326). Reported by Fariskhi Vidyan via Tidelift. 6.4.1 fixes this issue, and also enforces stricter checks for URL schemes in local path contexts. + +PHPMailer versions 6.1.5 and earlier contain an output escaping bug that occurs in `Content-Type` and `Content-Disposition` when filenames passed into `addAttachment` and other methods that accept attachment names contain double quote characters, in contravention of RFC822 3.4.1. No specific vulnerability has been found relating to this, but it could allow file attachments to bypass attachment filters that are based on matching filename extensions. Recorded as [CVE-2020-13625](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-13625). Reported by Elar Lang of Clarified Security. + +PHPMailer versions prior to 6.0.6 and 5.2.27 are vulnerable to an object injection attack by passing `phar://` paths into `addAttachment()` and other functions that may receive unfiltered local paths, possibly leading to RCE. Recorded as [CVE-2018-19296](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2018-19296). See [this article](https://knasmueller.net/5-answers-about-php-phar-exploitation) for more info on this type of vulnerability. Mitigated by blocking the use of paths containing URL-protocol style prefixes such as `phar://`. Reported by Sehun Oh of cyberone.kr. + +PHPMailer versions prior to 5.2.24 (released July 26th 2017) have an XSS vulnerability in one of the code examples, [CVE-2017-11503](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-11503). The `code_generator.phps` example did not filter user input prior to output. This file is distributed with a `.phps` extension, so it it not normally executable unless it is explicitly renamed, and the file is not included when PHPMailer is loaded through composer, so it is safe by default. There was also an undisclosed potential XSS vulnerability in the default exception handler (unused by default). Patches for both issues kindly provided by Patrick Monnerat of the Fedora Project. + +PHPMailer versions prior to 5.2.22 (released January 9th 2017) have a local file disclosure vulnerability, [CVE-2017-5223](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-5223). If content passed into `msgHTML()` is sourced from unfiltered user input, relative paths can map to absolute local file paths and added as attachments. Also note that `addAttachment` (just like `file_get_contents`, `passthru`, `unlink`, etc) should not be passed user-sourced params either! Reported by Yongxiang Li of Asiasecurity. + +PHPMailer versions prior to 5.2.20 (released December 28th 2016) are vulnerable to [CVE-2016-10045](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10045) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html), and patched by Paul Buonopane (@Zenexer). + +PHPMailer versions prior to 5.2.18 (released December 2016) are vulnerable to [CVE-2016-10033](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10033) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html). + +PHPMailer versions prior to 5.2.14 (released November 2015) are vulnerable to [CVE-2015-8476](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-8476) an SMTP CRLF injection bug permitting arbitrary message sending. + +PHPMailer versions prior to 5.2.10 (released May 2015) are vulnerable to [CVE-2008-5619](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2008-5619), a remote code execution vulnerability in the bundled html2text library. This file was removed in 5.2.10, so if you are using a version prior to that and make use of the html2text function, it's vitally important that you upgrade and remove this file. + +PHPMailer versions prior to 2.0.7 and 2.2.1 are vulnerable to [CVE-2012-0796](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-0796), an email header injection attack. + +Joomla 1.6.0 uses PHPMailer in an unsafe way, allowing it to reveal local file paths, reported in [CVE-2011-3747](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-3747). + +PHPMailer didn't sanitise the `$lang_path` parameter in `SetLanguage`. This wasn't a problem in itself, but some apps (PHPClassifieds, ATutor) also failed to sanitise user-provided parameters passed to it, permitting semi-arbitrary local file inclusion, reported in [CVE-2010-4914](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2010-4914), [CVE-2007-2021](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-2021) and [CVE-2006-5734](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2006-5734). + +PHPMailer 1.7.2 and earlier contained a possible DDoS vulnerability reported in [CVE-2005-1807](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-1807). + +PHPMailer 1.7 and earlier (June 2003) have a possible vulnerability in the `SendmailSend` method where shell commands may not be sanitised. Reported in [CVE-2007-3215](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-3215). + diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/VERSION b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/VERSION new file mode 100644 index 0000000..3d5762e --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/VERSION @@ -0,0 +1 @@ +6.5.1 \ No newline at end of file diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/composer.json b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/composer.json new file mode 100644 index 0000000..28557f5 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/composer.json @@ -0,0 +1,71 @@ +{ + "name": "phpmailer/phpmailer", + "type": "library", + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "require": { + "php": ">=5.5.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.2", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.6.0", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "PHPMailer\\Test\\": "test/" + } + }, + "license": "LGPL-2.1-only", + "scripts": { + "check": "./vendor/bin/phpcs", + "test": "./vendor/bin/phpunit --no-coverage", + "coverage": "./vendor/bin/phpunit", + "lint": [ + "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php,phps --exclude vendor --exclude .git --exclude build" + ] + } +} diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/get_oauth_token.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/get_oauth_token.php new file mode 100644 index 0000000..befdc34 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/get_oauth_token.php @@ -0,0 +1,146 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +/** + * Get an OAuth2 token from an OAuth2 provider. + * * Install this script on your server so that it's accessible + * as [https/http]:////get_oauth_token.php + * e.g.: http://localhost/phpmailer/get_oauth_token.php + * * Ensure dependencies are installed with 'composer install' + * * Set up an app in your Google/Yahoo/Microsoft account + * * Set the script address as the app's redirect URL + * If no refresh token is obtained when running this file, + * revoke access to your app and run the script again. + */ + +namespace PHPMailer\PHPMailer; + +/** + * Aliases for League Provider Classes + * Make sure you have added these to your composer.json and run `composer install` + * Plenty to choose from here: + * @see http://oauth2-client.thephpleague.com/providers/thirdparty/ + */ +//@see https://github.com/thephpleague/oauth2-google +use League\OAuth2\Client\Provider\Google; +//@see https://packagist.org/packages/hayageek/oauth2-yahoo +use Hayageek\OAuth2\Client\Provider\Yahoo; +//@see https://github.com/stevenmaguire/oauth2-microsoft +use Stevenmaguire\OAuth2\Client\Provider\Microsoft; + +if (!isset($_GET['code']) && !isset($_GET['provider'])) { + ?> + +Select Provider:
    +Google
    +Yahoo
    +Microsoft/Outlook/Hotmail/Live/Office365
    + + + $clientId, + 'clientSecret' => $clientSecret, + 'redirectUri' => $redirectUri, + 'accessType' => 'offline' +]; + +$options = []; +$provider = null; + +switch ($providerName) { + case 'Google': + $provider = new Google($params); + $options = [ + 'scope' => [ + 'https://mail.google.com/' + ] + ]; + break; + case 'Yahoo': + $provider = new Yahoo($params); + break; + case 'Microsoft': + $provider = new Microsoft($params); + $options = [ + 'scope' => [ + 'wl.imap', + 'wl.offline_access' + ] + ]; + break; +} + +if (null === $provider) { + exit('Provider missing'); +} + +if (!isset($_GET['code'])) { + //If we don't have an authorization code then get one + $authUrl = $provider->getAuthorizationUrl($options); + $_SESSION['oauth2state'] = $provider->getState(); + header('Location: ' . $authUrl); + exit; + //Check given state against previously stored one to mitigate CSRF attack +} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { + unset($_SESSION['oauth2state']); + unset($_SESSION['provider']); + exit('Invalid state'); +} else { + unset($_SESSION['provider']); + //Try to get an access token (using the authorization code grant) + $token = $provider->getAccessToken( + 'authorization_code', + [ + 'code' => $_GET['code'] + ] + ); + //Use this to interact with an API on the users behalf + //Use this to get a new access token if the old one expires + echo 'Refresh Token: ', $token->getRefreshToken(); +} diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-af.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-af.php new file mode 100644 index 0000000..0b2a72d --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-af.php @@ -0,0 +1,26 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'خطأ SMTP : لا يمكن تأكيد الهوية.'; +$PHPMAILER_LANG['connect_host'] = 'خطأ SMTP: لا يمكن الاتصال بالخادم SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'خطأ SMTP: لم يتم قبول المعلومات .'; +$PHPMAILER_LANG['empty_message'] = 'نص الرسالة فارغ'; +$PHPMAILER_LANG['encoding'] = 'ترميز غير معروف: '; +$PHPMAILER_LANG['execute'] = 'لا يمكن تنفيذ : '; +$PHPMAILER_LANG['file_access'] = 'لا يمكن الوصول للملف: '; +$PHPMAILER_LANG['file_open'] = 'خطأ في الملف: لا يمكن فتحه: '; +$PHPMAILER_LANG['from_failed'] = 'خطأ على مستوى عنوان المرسل : '; +$PHPMAILER_LANG['instantiate'] = 'لا يمكن توفير خدمة البريد.'; +$PHPMAILER_LANG['invalid_address'] = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.'; +$PHPMAILER_LANG['provide_address'] = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.'; +$PHPMAILER_LANG['recipients_failed'] = 'خطأ SMTP: الأخطاء التالية فشل في الارسال لكل من : '; +$PHPMAILER_LANG['signing'] = 'خطأ في التوقيع: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() غير ممكن.'; +$PHPMAILER_LANG['smtp_error'] = 'خطأ على مستوى الخادم SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'لا يمكن تعيين أو إعادة تعيين متغير: '; +$PHPMAILER_LANG['extension_missing'] = 'الإضافة غير موجودة: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-az.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-az.php new file mode 100644 index 0000000..552167e --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-az.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Greška: Neuspjela prijava.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Greška: Nije moguće spojiti se sa SMTP serverom.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Greška: Podatci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznata kriptografija: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvršiti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP Greška: Slanje sa navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Greška: Slanje na navedene e-mail adrese nije uspjelo: '; +$PHPMAILER_LANG['instantiate'] = 'Ne mogu pokrenuti mail funkcionalnost.'; +$PHPMAILER_LANG['invalid_address'] = 'E-mail nije poslan. Neispravna e-mail adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'Definišite barem jednu adresu primaoca.'; +$PHPMAILER_LANG['signing'] = 'Greška prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Spajanje na SMTP server nije uspjelo.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP greška: '; +$PHPMAILER_LANG['variable_set'] = 'Nije moguće postaviti varijablu ili je vratiti nazad: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje ekstenzija: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-be.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-be.php new file mode 100644 index 0000000..9e92dda --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-be.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Памылка SMTP: памылка ідэнтыфікацыі.'; +$PHPMAILER_LANG['connect_host'] = 'Памылка SMTP: нельга ўстанавіць сувязь з SMTP-серверам.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Памылка SMTP: звесткі непрынятыя.'; +$PHPMAILER_LANG['empty_message'] = 'Пустое паведамленне.'; +$PHPMAILER_LANG['encoding'] = 'Невядомая кадыроўка тэксту: '; +$PHPMAILER_LANG['execute'] = 'Нельга выканаць каманду: '; +$PHPMAILER_LANG['file_access'] = 'Няма доступу да файла: '; +$PHPMAILER_LANG['file_open'] = 'Нельга адкрыць файл: '; +$PHPMAILER_LANG['from_failed'] = 'Няправільны адрас адпраўніка: '; +$PHPMAILER_LANG['instantiate'] = 'Нельга прымяніць функцыю mail().'; +$PHPMAILER_LANG['invalid_address'] = 'Нельга даслаць паведамленне, няправільны email атрымальніка: '; +$PHPMAILER_LANG['provide_address'] = 'Запоўніце, калі ласка, правільны email атрымальніка.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - паштовы сервер не падтрымліваецца.'; +$PHPMAILER_LANG['recipients_failed'] = 'Памылка SMTP: няправільныя атрымальнікі: '; +$PHPMAILER_LANG['signing'] = 'Памылка подпісу паведамлення: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Памылка сувязі з SMTP-серверам.'; +$PHPMAILER_LANG['smtp_error'] = 'Памылка SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Нельга ўстанавіць або перамяніць значэнне пераменнай: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-bg.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-bg.php new file mode 100644 index 0000000..c41f675 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-bg.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP грешка: Не може да се удостовери пред сървъра.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP грешка: Не може да се свърже с SMTP хоста.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP грешка: данните не са приети.'; +$PHPMAILER_LANG['empty_message'] = 'Съдържанието на съобщението е празно'; +$PHPMAILER_LANG['encoding'] = 'Неизвестно кодиране: '; +$PHPMAILER_LANG['execute'] = 'Не може да се изпълни: '; +$PHPMAILER_LANG['file_access'] = 'Няма достъп до файл: '; +$PHPMAILER_LANG['file_open'] = 'Файлова грешка: Не може да се отвори файл: '; +$PHPMAILER_LANG['from_failed'] = 'Следните адреси за подател са невалидни: '; +$PHPMAILER_LANG['instantiate'] = 'Не може да се инстанцира функцията mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Невалиден адрес: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' - пощенски сървър не се поддържа.'; +$PHPMAILER_LANG['provide_address'] = 'Трябва да предоставите поне един email адрес за получател.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP грешка: Следните адреси за Получател са невалидни: '; +$PHPMAILER_LANG['signing'] = 'Грешка при подписване: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP провален connect().'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP сървърна грешка: '; +$PHPMAILER_LANG['variable_set'] = 'Не може да се установи или възстанови променлива: '; +$PHPMAILER_LANG['extension_missing'] = 'Липсва разширение: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ca.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ca.php new file mode 100644 index 0000000..3468485 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ca.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Error SMTP: No s’ha pogut autenticar.'; +$PHPMAILER_LANG['connect_host'] = 'Error SMTP: No es pot connectar al servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Dades no acceptades.'; +$PHPMAILER_LANG['empty_message'] = 'El cos del missatge està buit.'; +$PHPMAILER_LANG['encoding'] = 'Codificació desconeguda: '; +$PHPMAILER_LANG['execute'] = 'No es pot executar: '; +$PHPMAILER_LANG['file_access'] = 'No es pot accedir a l’arxiu: '; +$PHPMAILER_LANG['file_open'] = 'Error d’Arxiu: No es pot obrir l’arxiu: '; +$PHPMAILER_LANG['from_failed'] = 'La(s) següent(s) adreces de remitent han fallat: '; +$PHPMAILER_LANG['instantiate'] = 'No s’ha pogut crear una instància de la funció Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Adreça d’email invalida: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no està suportat'; +$PHPMAILER_LANG['provide_address'] = 'S’ha de proveir almenys una adreça d’email com a destinatari.'; +$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Els següents destinataris han fallat: '; +$PHPMAILER_LANG['signing'] = 'Error al signar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ha fallat el SMTP Connect().'; +$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'No s’ha pogut establir o restablir la variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php new file mode 100644 index 0000000..500c952 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ch.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 错误:身份验证失败。'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 错误: 不能连接SMTP主机。'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 错误: 数据不可接受。'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = '未知编码:'; +$PHPMAILER_LANG['execute'] = '不能执行: '; +$PHPMAILER_LANG['file_access'] = '不能访问文件:'; +$PHPMAILER_LANG['file_open'] = '文件错误:不能打开文件:'; +$PHPMAILER_LANG['from_failed'] = '下面的发送地址邮件发送失败了: '; +$PHPMAILER_LANG['instantiate'] = '不能实现mail方法。'; +//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' 您所选择的发送邮件的方法并不支持。'; +$PHPMAILER_LANG['provide_address'] = '您必须提供至少一个 收信人的email地址。'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 错误: 下面的 收件人失败了: '; +//$PHPMAILER_LANG['signing'] = 'Signing Error: '; +//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php new file mode 100644 index 0000000..e770a1a --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-cs.php @@ -0,0 +1,28 @@ + + * Rewrite and extension of the work by Mikael Stokkebro + * + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Login mislykkedes.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Forbindelse til SMTP serveren kunne ikke oprettes.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data blev ikke accepteret.'; +$PHPMAILER_LANG['empty_message'] = 'Meddelelsen er uden indhold'; +$PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: '; +$PHPMAILER_LANG['execute'] = 'Kunne ikke afvikle: '; +$PHPMAILER_LANG['file_access'] = 'Kunne ikke tilgå filen: '; +$PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke åbne filen: '; +$PHPMAILER_LANG['from_failed'] = 'Følgende afsenderadresse er forkert: '; +$PHPMAILER_LANG['instantiate'] = 'Email funktionen kunne ikke initialiseres.'; +$PHPMAILER_LANG['invalid_address'] = 'Udgyldig adresse: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.'; +$PHPMAILER_LANG['provide_address'] = 'Indtast mindst en modtagers email adresse.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere er forkerte: '; +$PHPMAILER_LANG['signing'] = 'Signeringsfejl: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fejlede.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server fejl: '; +$PHPMAILER_LANG['variable_set'] = 'Kunne ikke definere eller nulstille variablen: '; +$PHPMAILER_LANG['extension_missing'] = 'Udvidelse mangler: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-de.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-de.php new file mode 100644 index 0000000..e7e59d2 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-de.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.'; +$PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.'; +$PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje está vacío.'; +$PHPMAILER_LANG['encoding'] = 'Codificación desconocida: '; +$PHPMAILER_LANG['execute'] = 'Imposible ejecutar: '; +$PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: '; +$PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: '; +$PHPMAILER_LANG['from_failed'] = 'La(s) siguiente(s) direcciones de remitente fallaron: '; +$PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email inválido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.'; +$PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.'; +$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: '; +$PHPMAILER_LANG['signing'] = 'Error al firmar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.'; +$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-et.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-et.php new file mode 100644 index 0000000..93addc9 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-et.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Viga: Autoriseerimise viga.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Viga: Ei õnnestunud luua ühendust SMTP serveriga.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Viga: Vigased andmed.'; +$PHPMAILER_LANG['empty_message'] = 'Tühi kirja sisu'; +$PHPMAILER_LANG["encoding"] = 'Tundmatu kodeering: '; +$PHPMAILER_LANG['execute'] = 'Tegevus ebaõnnestus: '; +$PHPMAILER_LANG['file_access'] = 'Pole piisavalt õiguseid järgneva faili avamiseks: '; +$PHPMAILER_LANG['file_open'] = 'Faili Viga: Faili avamine ebaõnnestus: '; +$PHPMAILER_LANG['from_failed'] = 'Järgnev saatja e-posti aadress on vigane: '; +$PHPMAILER_LANG['instantiate'] = 'mail funktiooni käivitamine ebaõnnestus.'; +$PHPMAILER_LANG['invalid_address'] = 'Saatmine peatatud, e-posti address vigane: '; +$PHPMAILER_LANG['provide_address'] = 'Te peate määrama vähemalt ühe saaja e-posti aadressi.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' maileri tugi puudub.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Viga: Järgnevate saajate e-posti aadressid on vigased: '; +$PHPMAILER_LANG["signing"] = 'Viga allkirjastamisel: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() ebaõnnestus.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP serveri viga: '; +$PHPMAILER_LANG['variable_set'] = 'Ei õnnestunud määrata või lähtestada muutujat: '; +$PHPMAILER_LANG['extension_missing'] = 'Nõutud laiendus on puudu: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fa.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fa.php new file mode 100644 index 0000000..295a47f --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fa.php @@ -0,0 +1,28 @@ + + * @author Mohammad Hossein Mojtahedi + */ + +$PHPMAILER_LANG['authenticate'] = 'خطای SMTP: احراز هویت با شکست مواجه شد.'; +$PHPMAILER_LANG['connect_host'] = 'خطای SMTP: اتصال به سرور SMTP برقرار نشد.'; +$PHPMAILER_LANG['data_not_accepted'] = 'خطای SMTP: داده‌ها نا‌درست هستند.'; +$PHPMAILER_LANG['empty_message'] = 'بخش متن پیام خالی است.'; +$PHPMAILER_LANG['encoding'] = 'کد‌گذاری نا‌شناخته: '; +$PHPMAILER_LANG['execute'] = 'امکان اجرا وجود ندارد: '; +$PHPMAILER_LANG['file_access'] = 'امکان دسترسی به فایل وجود ندارد: '; +$PHPMAILER_LANG['file_open'] = 'خطای File: امکان بازکردن فایل وجود ندارد: '; +$PHPMAILER_LANG['from_failed'] = 'آدرس فرستنده اشتباه است: '; +$PHPMAILER_LANG['instantiate'] = 'امکان معرفی تابع ایمیل وجود ندارد.'; +$PHPMAILER_LANG['invalid_address'] = 'آدرس ایمیل معتبر نیست: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer پشتیبانی نمی‌شود.'; +$PHPMAILER_LANG['provide_address'] = 'باید حداقل یک آدرس گیرنده وارد کنید.'; +$PHPMAILER_LANG['recipients_failed'] = 'خطای SMTP: ارسال به آدرس گیرنده با خطا مواجه شد: '; +$PHPMAILER_LANG['signing'] = 'خطا در امضا: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'خطا در اتصال به SMTP.'; +$PHPMAILER_LANG['smtp_error'] = 'خطا در SMTP Server: '; +$PHPMAILER_LANG['variable_set'] = 'امکان ارسال یا ارسال مجدد متغیر‌ها وجود ندارد: '; +$PHPMAILER_LANG['extension_missing'] = 'افزونه موجود نیست: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fi.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fi.php new file mode 100644 index 0000000..243c054 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fi.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP feilur: Kundi ikki góðkenna.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP feilur: Kundi ikki knýta samband við SMTP vert.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP feilur: Data ikki góðkent.'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = 'Ókend encoding: '; +$PHPMAILER_LANG['execute'] = 'Kundi ikki útføra: '; +$PHPMAILER_LANG['file_access'] = 'Kundi ikki tilganga fílu: '; +$PHPMAILER_LANG['file_open'] = 'Fílu feilur: Kundi ikki opna fílu: '; +$PHPMAILER_LANG['from_failed'] = 'fylgjandi Frá/From adressa miseydnaðist: '; +$PHPMAILER_LANG['instantiate'] = 'Kuni ikki instantiera mail funktión.'; +//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' er ikki supporterað.'; +$PHPMAILER_LANG['provide_address'] = 'Tú skal uppgeva minst móttakara-emailadressu(r).'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Feilur: Fylgjandi móttakarar miseydnaðust: '; +//$PHPMAILER_LANG['signing'] = 'Signing Error: '; +//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php new file mode 100644 index 0000000..b57f0ec --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-fr.php @@ -0,0 +1,32 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro SMTP: Non puido ser autentificado.'; +$PHPMAILER_LANG['connect_host'] = 'Erro SMTP: Non puido conectar co servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro SMTP: Datos non aceptados.'; +$PHPMAILER_LANG['empty_message'] = 'Corpo da mensaxe vacía'; +$PHPMAILER_LANG['encoding'] = 'Codificación descoñecida: '; +$PHPMAILER_LANG['execute'] = 'Non puido ser executado: '; +$PHPMAILER_LANG['file_access'] = 'Nob puido acceder ó arquivo: '; +$PHPMAILER_LANG['file_open'] = 'Erro de Arquivo: No puido abrir o arquivo: '; +$PHPMAILER_LANG['from_failed'] = 'A(s) seguinte(s) dirección(s) de remitente(s) deron erro: '; +$PHPMAILER_LANG['instantiate'] = 'Non puido crear unha instancia da función Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Non puido envia-lo correo: dirección de email inválida: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer non está soportado.'; +$PHPMAILER_LANG['provide_address'] = 'Debe engadir polo menos unha dirección de email coma destino.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro SMTP: Os seguintes destinos fallaron: '; +$PHPMAILER_LANG['signing'] = 'Erro ó firmar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallou.'; +$PHPMAILER_LANG['smtp_error'] = 'Erro do servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Non puidemos axustar ou reaxustar a variábel: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-he.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-he.php new file mode 100644 index 0000000..b123aa5 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-he.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'שגיאת SMTP: פעולת האימות נכשלה.'; +$PHPMAILER_LANG['connect_host'] = 'שגיאת SMTP: לא הצלחתי להתחבר לשרת SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'שגיאת SMTP: מידע לא התקבל.'; +$PHPMAILER_LANG['empty_message'] = 'גוף ההודעה ריק'; +$PHPMAILER_LANG['invalid_address'] = 'כתובת שגויה: '; +$PHPMAILER_LANG['encoding'] = 'קידוד לא מוכר: '; +$PHPMAILER_LANG['execute'] = 'לא הצלחתי להפעיל את: '; +$PHPMAILER_LANG['file_access'] = 'לא ניתן לגשת לקובץ: '; +$PHPMAILER_LANG['file_open'] = 'שגיאת קובץ: לא ניתן לגשת לקובץ: '; +$PHPMAILER_LANG['from_failed'] = 'כתובות הנמענים הבאות נכשלו: '; +$PHPMAILER_LANG['instantiate'] = 'לא הצלחתי להפעיל את פונקציית המייל.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' אינה נתמכת.'; +$PHPMAILER_LANG['provide_address'] = 'חובה לספק לפחות כתובת אחת של מקבל המייל.'; +$PHPMAILER_LANG['recipients_failed'] = 'שגיאת SMTP: הנמענים הבאים נכשלו: '; +$PHPMAILER_LANG['signing'] = 'שגיאת חתימה: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +$PHPMAILER_LANG['smtp_error'] = 'שגיאת שרת SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'לא ניתן לקבוע או לשנות את המשתנה: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php new file mode 100644 index 0000000..d973a35 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hi.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP त्रुटि: प्रामाणिकता की जांच नहीं हो सका। '; +$PHPMAILER_LANG['connect_host'] = 'SMTP त्रुटि: SMTP सर्वर से कनेक्ट नहीं हो सका। '; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP त्रुटि: डेटा स्वीकार नहीं किया जाता है। '; +$PHPMAILER_LANG['empty_message'] = 'संदेश खाली है। '; +$PHPMAILER_LANG['encoding'] = 'अज्ञात एन्कोडिंग प्रकार। '; +$PHPMAILER_LANG['execute'] = 'आदेश को निष्पादित करने में विफल। '; +$PHPMAILER_LANG['file_access'] = 'फ़ाइल उपलब्ध नहीं है। '; +$PHPMAILER_LANG['file_open'] = 'फ़ाइल त्रुटि: फाइल को खोला नहीं जा सका। '; +$PHPMAILER_LANG['from_failed'] = 'प्रेषक का पता गलत है। '; +$PHPMAILER_LANG['instantiate'] = 'मेल फ़ंक्शन कॉल नहीं कर सकता है।'; +$PHPMAILER_LANG['invalid_address'] = 'पता गलत है। '; +$PHPMAILER_LANG['mailer_not_supported'] = 'मेल सर्वर के साथ काम नहीं करता है। '; +$PHPMAILER_LANG['provide_address'] = 'आपको कम से कम एक प्राप्तकर्ता का ई-मेल पता प्रदान करना होगा।'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP त्रुटि: निम्न प्राप्तकर्ताओं को पते भेजने में विफल। '; +$PHPMAILER_LANG['signing'] = 'साइनअप त्रुटि:। '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP का connect () फ़ंक्शन विफल हुआ। '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP सर्वर त्रुटि। '; +$PHPMAILER_LANG['variable_set'] = 'चर को बना या संशोधित नहीं किया जा सकता। '; +$PHPMAILER_LANG['extension_missing'] = 'एक्सटेन्षन गायब है: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hr.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hr.php new file mode 100644 index 0000000..cacb6c3 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hr.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Greška: Neuspjela autentikacija.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Greška: Ne mogu se spojiti na SMTP poslužitelj.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Greška: Podatci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznati encoding: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvršiti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP Greška: Slanje s navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Greška: Slanje na navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['instantiate'] = 'Ne mogu pokrenuti mail funkcionalnost.'; +$PHPMAILER_LANG['invalid_address'] = 'E-mail nije poslan. Neispravna e-mail adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'Definirajte barem jednu adresu primatelja.'; +$PHPMAILER_LANG['signing'] = 'Greška prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Spajanje na SMTP poslužitelj nije uspjelo.'; +$PHPMAILER_LANG['smtp_error'] = 'Greška SMTP poslužitelja: '; +$PHPMAILER_LANG['variable_set'] = 'Ne mogu postaviti varijablu niti ju vratiti nazad: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje proširenje: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hu.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hu.php new file mode 100644 index 0000000..e6b58b0 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-hu.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP -ի սխալ: չհաջողվեց ստուգել իսկությունը.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP -ի սխալ: չհաջողվեց կապ հաստատել SMTP սերվերի հետ.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP -ի սխալ: տվյալները ընդունված չեն.'; +$PHPMAILER_LANG['empty_message'] = 'Հաղորդագրությունը դատարկ է'; +$PHPMAILER_LANG['encoding'] = 'Կոդավորման անհայտ տեսակ: '; +$PHPMAILER_LANG['execute'] = 'Չհաջողվեց իրականացնել հրամանը: '; +$PHPMAILER_LANG['file_access'] = 'Ֆայլը հասանելի չէ: '; +$PHPMAILER_LANG['file_open'] = 'Ֆայլի սխալ: ֆայլը չհաջողվեց բացել: '; +$PHPMAILER_LANG['from_failed'] = 'Ուղարկողի հետևյալ հասցեն սխալ է: '; +$PHPMAILER_LANG['instantiate'] = 'Հնարավոր չէ կանչել mail ֆունկցիան.'; +$PHPMAILER_LANG['invalid_address'] = 'Հասցեն սխալ է: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' փոստային սերվերի հետ չի աշխատում.'; +$PHPMAILER_LANG['provide_address'] = 'Անհրաժեշտ է տրամադրել գոնե մեկ ստացողի e-mail հասցե.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP -ի սխալ: չի հաջողվել ուղարկել հետևյալ ստացողների հասցեներին: '; +$PHPMAILER_LANG['signing'] = 'Ստորագրման սխալ: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP -ի connect() ֆունկցիան չի հաջողվել'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP սերվերի սխալ: '; +$PHPMAILER_LANG['variable_set'] = 'Չի հաջողվում ստեղծել կամ վերափոխել փոփոխականը: '; +$PHPMAILER_LANG['extension_missing'] = 'Հավելվածը բացակայում է: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-id.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-id.php new file mode 100644 index 0000000..212a11f --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-id.php @@ -0,0 +1,31 @@ + + * @author @januridp + * @author Ian Mustafa + */ + +$PHPMAILER_LANG['authenticate'] = 'Kesalahan SMTP: Tidak dapat mengotentikasi.'; +$PHPMAILER_LANG['connect_host'] = 'Kesalahan SMTP: Tidak dapat terhubung ke host SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Kesalahan SMTP: Data tidak diterima.'; +$PHPMAILER_LANG['empty_message'] = 'Isi pesan kosong'; +$PHPMAILER_LANG['encoding'] = 'Pengkodean karakter tidak dikenali: '; +$PHPMAILER_LANG['execute'] = 'Tidak dapat menjalankan proses: '; +$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses berkas: '; +$PHPMAILER_LANG['file_open'] = 'Kesalahan Berkas: Berkas tidak dapat dibuka: '; +$PHPMAILER_LANG['from_failed'] = 'Alamat pengirim berikut mengakibatkan kesalahan: '; +$PHPMAILER_LANG['instantiate'] = 'Tidak dapat menginisialisasi fungsi surel.'; +$PHPMAILER_LANG['invalid_address'] = 'Gagal terkirim, alamat surel tidak sesuai: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'Gagal terkirim, entri host tidak sesuai: '; +$PHPMAILER_LANG['invalid_host'] = 'Gagal terkirim, host tidak sesuai: '; +$PHPMAILER_LANG['provide_address'] = 'Harus tersedia minimal satu alamat tujuan'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tidak didukung'; +$PHPMAILER_LANG['recipients_failed'] = 'Kesalahan SMTP: Alamat tujuan berikut menyebabkan kesalahan: '; +$PHPMAILER_LANG['signing'] = 'Kesalahan dalam penandatangan SSL: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() gagal.'; +$PHPMAILER_LANG['smtp_error'] = 'Kesalahan pada pelayan SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tidak dapat mengatur atau mengatur ulang variabel: '; +$PHPMAILER_LANG['extension_missing'] = 'Ekstensi PHP tidak tersedia: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-it.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-it.php new file mode 100644 index 0000000..08a6b73 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-it.php @@ -0,0 +1,28 @@ + + * @author Stefano Sabatini + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Impossibile autenticarsi.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Impossibile connettersi all\'host SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Dati non accettati dal server.'; +$PHPMAILER_LANG['empty_message'] = 'Il corpo del messaggio è vuoto'; +$PHPMAILER_LANG['encoding'] = 'Codifica dei caratteri sconosciuta: '; +$PHPMAILER_LANG['execute'] = 'Impossibile eseguire l\'operazione: '; +$PHPMAILER_LANG['file_access'] = 'Impossibile accedere al file: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Impossibile aprire il file: '; +$PHPMAILER_LANG['from_failed'] = 'I seguenti indirizzi mittenti hanno generato errore: '; +$PHPMAILER_LANG['instantiate'] = 'Impossibile istanziare la funzione mail'; +$PHPMAILER_LANG['invalid_address'] = 'Impossibile inviare, l\'indirizzo email non è valido: '; +$PHPMAILER_LANG['provide_address'] = 'Deve essere fornito almeno un indirizzo ricevente'; +$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: I seguenti indirizzi destinatari hanno generato un errore: '; +$PHPMAILER_LANG['signing'] = 'Errore nella firma: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallita.'; +$PHPMAILER_LANG['smtp_error'] = 'Errore del server SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Impossibile impostare o resettare la variabile: '; +$PHPMAILER_LANG['extension_missing'] = 'Estensione mancante: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php new file mode 100644 index 0000000..c76f526 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php @@ -0,0 +1,29 @@ + + * @author Yoshi Sakai + * @author Arisophy + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTPエラー: 認証できませんでした。'; +$PHPMAILER_LANG['connect_host'] = 'SMTPエラー: SMTPホストに接続できませんでした。'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTPエラー: データが受け付けられませんでした。'; +$PHPMAILER_LANG['empty_message'] = 'メール本文が空です。'; +$PHPMAILER_LANG['encoding'] = '不明なエンコーディング: '; +$PHPMAILER_LANG['execute'] = '実行できませんでした: '; +$PHPMAILER_LANG['file_access'] = 'ファイルにアクセスできません: '; +$PHPMAILER_LANG['file_open'] = 'ファイルエラー: ファイルを開けません: '; +$PHPMAILER_LANG['from_failed'] = 'Fromアドレスを登録する際にエラーが発生しました: '; +$PHPMAILER_LANG['instantiate'] = 'メール関数が正常に動作しませんでした。'; +$PHPMAILER_LANG['invalid_address'] = '不正なメールアドレス: '; +$PHPMAILER_LANG['provide_address'] = '少なくとも1つメールアドレスを 指定する必要があります。'; +$PHPMAILER_LANG['mailer_not_supported'] = ' メーラーがサポートされていません。'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTPエラー: 次の受信者アドレスに 間違いがあります: '; +$PHPMAILER_LANG['signing'] = '署名エラー: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP接続に失敗しました。'; +$PHPMAILER_LANG['smtp_error'] = 'SMTPサーバーエラー: '; +$PHPMAILER_LANG['variable_set'] = '変数が存在しません: '; +$PHPMAILER_LANG['extension_missing'] = '拡張機能が見つかりません: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ka.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ka.php new file mode 100644 index 0000000..51fe403 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ka.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP შეცდომა: ავტორიზაცია შეუძლებელია.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP შეცდომა: SMTP სერვერთან დაკავშირება შეუძლებელია.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP შეცდომა: მონაცემები არ იქნა მიღებული.'; +$PHPMAILER_LANG['encoding'] = 'კოდირების უცნობი ტიპი: '; +$PHPMAILER_LANG['execute'] = 'შეუძლებელია შემდეგი ბრძანების შესრულება: '; +$PHPMAILER_LANG['file_access'] = 'შეუძლებელია წვდომა ფაილთან: '; +$PHPMAILER_LANG['file_open'] = 'ფაილური სისტემის შეცდომა: არ იხსნება ფაილი: '; +$PHPMAILER_LANG['from_failed'] = 'გამგზავნის არასწორი მისამართი: '; +$PHPMAILER_LANG['instantiate'] = 'mail ფუნქციის გაშვება ვერ ხერხდება.'; +$PHPMAILER_LANG['provide_address'] = 'გთხოვთ მიუთითოთ ერთი ადრესატის e-mail მისამართი მაინც.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - საფოსტო სერვერის მხარდაჭერა არ არის.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP შეცდომა: შემდეგ მისამართებზე გაგზავნა ვერ მოხერხდა: '; +$PHPMAILER_LANG['empty_message'] = 'შეტყობინება ცარიელია'; +$PHPMAILER_LANG['invalid_address'] = 'არ გაიგზავნა, e-mail მისამართის არასწორი ფორმატი: '; +$PHPMAILER_LANG['signing'] = 'ხელმოწერის შეცდომა: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'შეცდომა SMTP სერვერთან დაკავშირებისას'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP სერვერის შეცდომა: '; +$PHPMAILER_LANG['variable_set'] = 'შეუძლებელია შემდეგი ცვლადის შექმნა ან შეცვლა: '; +$PHPMAILER_LANG['extension_missing'] = 'ბიბლიოთეკა არ არსებობს: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ko.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ko.php new file mode 100644 index 0000000..8c97dd9 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ko.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 오류: 인증할 수 없습니다.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 오류: SMTP 호스트에 접속할 수 없습니다.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 오류: 데이터가 받아들여지지 않았습니다.'; +$PHPMAILER_LANG['empty_message'] = '메세지 내용이 없습니다'; +$PHPMAILER_LANG['encoding'] = '알 수 없는 인코딩: '; +$PHPMAILER_LANG['execute'] = '실행 불가: '; +$PHPMAILER_LANG['file_access'] = '파일 접근 불가: '; +$PHPMAILER_LANG['file_open'] = '파일 오류: 파일을 열 수 없습니다: '; +$PHPMAILER_LANG['from_failed'] = '다음 From 주소에서 오류가 발생했습니다: '; +$PHPMAILER_LANG['instantiate'] = 'mail 함수를 인스턴스화할 수 없습니다'; +$PHPMAILER_LANG['invalid_address'] = '잘못된 주소: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' 메일러는 지원되지 않습니다.'; +$PHPMAILER_LANG['provide_address'] = '적어도 한 개 이상의 수신자 메일 주소를 제공해야 합니다.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 오류: 다음 수신자에서 오류가 발생했습니다: '; +$PHPMAILER_LANG['signing'] = '서명 오류: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP 연결을 실패하였습니다.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP 서버 오류: '; +$PHPMAILER_LANG['variable_set'] = '변수 설정 및 초기화 불가: '; +$PHPMAILER_LANG['extension_missing'] = '확장자 없음: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-lt.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-lt.php new file mode 100644 index 0000000..4f115b1 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-lt.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP klaida: autentifikacija nepavyko.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP klaida: nepavyksta prisijungti prie SMTP stoties.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP klaida: duomenys nepriimti.'; +$PHPMAILER_LANG['empty_message'] = 'Laiško turinys tuščias'; +$PHPMAILER_LANG['encoding'] = 'Neatpažinta koduotė: '; +$PHPMAILER_LANG['execute'] = 'Nepavyko įvykdyti komandos: '; +$PHPMAILER_LANG['file_access'] = 'Byla nepasiekiama: '; +$PHPMAILER_LANG['file_open'] = 'Bylos klaida: Nepavyksta atidaryti: '; +$PHPMAILER_LANG['from_failed'] = 'Neteisingas siuntėjo adresas: '; +$PHPMAILER_LANG['instantiate'] = 'Nepavyko paleisti mail funkcijos.'; +$PHPMAILER_LANG['invalid_address'] = 'Neteisingas adresas: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' pašto stotis nepalaikoma.'; +$PHPMAILER_LANG['provide_address'] = 'Nurodykite bent vieną gavėjo adresą.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP klaida: nepavyko išsiųsti šiems gavėjams: '; +$PHPMAILER_LANG['signing'] = 'Prisijungimo klaida: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP susijungimo klaida'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP stoties klaida: '; +$PHPMAILER_LANG['variable_set'] = 'Nepavyko priskirti reikšmės kintamajam: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-lv.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-lv.php new file mode 100644 index 0000000..679b18c --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-lv.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP kļūda: Autorizācija neizdevās.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Kļūda: Nevar izveidot savienojumu ar SMTP serveri.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Kļūda: Nepieņem informāciju.'; +$PHPMAILER_LANG['empty_message'] = 'Ziņojuma teksts ir tukšs'; +$PHPMAILER_LANG['encoding'] = 'Neatpazīts kodējums: '; +$PHPMAILER_LANG['execute'] = 'Neizdevās izpildīt komandu: '; +$PHPMAILER_LANG['file_access'] = 'Fails nav pieejams: '; +$PHPMAILER_LANG['file_open'] = 'Faila kļūda: Nevar atvērt failu: '; +$PHPMAILER_LANG['from_failed'] = 'Nepareiza sūtītāja adrese: '; +$PHPMAILER_LANG['instantiate'] = 'Nevar palaist sūtīšanas funkciju.'; +$PHPMAILER_LANG['invalid_address'] = 'Nepareiza adrese: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' sūtītājs netiek atbalstīts.'; +$PHPMAILER_LANG['provide_address'] = 'Lūdzu, norādiet vismaz vienu adresātu.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP kļūda: neizdevās nosūtīt šādiem saņēmējiem: '; +$PHPMAILER_LANG['signing'] = 'Autorizācijas kļūda: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP savienojuma kļūda'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP servera kļūda: '; +$PHPMAILER_LANG['variable_set'] = 'Nevar piešķirt mainīgā vērtību: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-mg.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-mg.php new file mode 100644 index 0000000..8a94f6a --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-mg.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Hadisoana SMTP: Tsy nahomby ny fanamarinana.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Tsy afaka mampifandray amin\'ny mpampiantrano SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP diso: tsy voarakitra ny angona.'; +$PHPMAILER_LANG['empty_message'] = 'Tsy misy ny votoaty mailaka.'; +$PHPMAILER_LANG['encoding'] = 'Tsy fantatra encoding: '; +$PHPMAILER_LANG['execute'] = 'Tsy afaka manatanteraka ity baiko manaraka ity: '; +$PHPMAILER_LANG['file_access'] = 'Tsy nahomby ny fidirana amin\'ity rakitra ity: '; +$PHPMAILER_LANG['file_open'] = 'Hadisoana diso: Tsy afaka nanokatra ity file manaraka ity: '; +$PHPMAILER_LANG['from_failed'] = 'Ny adiresy iraka manaraka dia diso: '; +$PHPMAILER_LANG['instantiate'] = 'Tsy afaka nanomboka ny hetsika mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Tsy mety ny adiresy: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tsy manohana.'; +$PHPMAILER_LANG['provide_address'] = 'Alefaso azafady iray adiresy iray farafahakeliny.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Tsy mety ireo mpanaraka ireto: '; +$PHPMAILER_LANG['signing'] = 'Error nandritra ny sonia:'; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Tsy nahomby ny fifandraisana tamin\'ny server SMTP.'; +$PHPMAILER_LANG['smtp_error'] = 'Fahadisoana tamin\'ny server SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tsy azo atao ny mametraka na mamerina ny variable: '; +$PHPMAILER_LANG['extension_missing'] = 'Tsy hita ny ampahany: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ms.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ms.php new file mode 100644 index 0000000..71db338 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ms.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Ralat SMTP: Tidak dapat pengesahan.'; +$PHPMAILER_LANG['connect_host'] = 'Ralat SMTP: Tidak dapat menghubungi hos pelayan SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Ralat SMTP: Data tidak diterima oleh pelayan.'; +$PHPMAILER_LANG['empty_message'] = 'Tiada isi untuk mesej'; +$PHPMAILER_LANG['encoding'] = 'Pengekodan tidak diketahui: '; +$PHPMAILER_LANG['execute'] = 'Tidak dapat melaksanakan: '; +$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses fail: '; +$PHPMAILER_LANG['file_open'] = 'Ralat Fail: Tidak dapat membuka fail: '; +$PHPMAILER_LANG['from_failed'] = 'Berikut merupakan ralat dari alamat e-mel: '; +$PHPMAILER_LANG['instantiate'] = 'Tidak dapat memberi contoh fungsi e-mel.'; +$PHPMAILER_LANG['invalid_address'] = 'Alamat emel tidak sah: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' jenis penghantar emel tidak disokong.'; +$PHPMAILER_LANG['provide_address'] = 'Anda perlu menyediakan sekurang-kurangnya satu alamat e-mel penerima.'; +$PHPMAILER_LANG['recipients_failed'] = 'Ralat SMTP: Penerima e-mel berikut telah gagal: '; +$PHPMAILER_LANG['signing'] = 'Ralat pada tanda tangan: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() telah gagal.'; +$PHPMAILER_LANG['smtp_error'] = 'Ralat pada pelayan SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tidak boleh menetapkan atau menetapkan semula pembolehubah: '; +$PHPMAILER_LANG['extension_missing'] = 'Sambungan hilang: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-nb.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-nb.php new file mode 100644 index 0000000..65793ce --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-nb.php @@ -0,0 +1,26 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP-fout: authenticatie mislukt.'; +$PHPMAILER_LANG['buggy_php'] = 'PHP versie gededecteerd die onderhavig is aan een bug die kan resulteren in gecorrumpeerde berichten. Om dit te voorkomen, gebruik SMTP voor het verzenden van berichten, zet de mail.add_x_header optie in uw php.ini file uit, gebruik MacOS of Linux, of pas de gebruikte PHP versie aan naar versie 7.0.17+ or 7.1.3+.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP-fout: kon niet verbinden met SMTP-host.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-fout: data niet geaccepteerd.'; +$PHPMAILER_LANG['empty_message'] = 'Berichttekst is leeg'; +$PHPMAILER_LANG['encoding'] = 'Onbekende codering: '; +$PHPMAILER_LANG['execute'] = 'Kon niet uitvoeren: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensie afwezig: '; +$PHPMAILER_LANG['file_access'] = 'Kreeg geen toegang tot bestand: '; +$PHPMAILER_LANG['file_open'] = 'Bestandsfout: kon bestand niet openen: '; +$PHPMAILER_LANG['from_failed'] = 'Het volgende afzendersadres is mislukt: '; +$PHPMAILER_LANG['instantiate'] = 'Kon mailfunctie niet initialiseren.'; +$PHPMAILER_LANG['invalid_address'] = 'Ongeldig adres: '; +$PHPMAILER_LANG['invalid_header'] = 'Ongeldige header naam of waarde'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Ongeldige hostentry: '; +$PHPMAILER_LANG['invalid_host'] = 'Ongeldige host: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wordt niet ondersteund.'; +$PHPMAILER_LANG['provide_address'] = 'Er moet minstens één ontvanger worden opgegeven.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP-fout: de volgende ontvangers zijn mislukt: '; +$PHPMAILER_LANG['signing'] = 'Signeerfout: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP code: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Aanvullende SMTP informatie: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Verbinding mislukt.'; +$PHPMAILER_LANG['smtp_detail'] = 'Detail: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP-serverfout: '; +$PHPMAILER_LANG['variable_set'] = 'Kan de volgende variabele niet instellen of resetten: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-pl.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-pl.php new file mode 100644 index 0000000..23caa71 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-pl.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro do SMTP: Não foi possível realizar a autenticação.'; +$PHPMAILER_LANG['connect_host'] = 'Erro do SMTP: Não foi possível realizar ligação com o servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro do SMTP: Os dados foram rejeitados.'; +$PHPMAILER_LANG['empty_message'] = 'A mensagem no e-mail está vazia.'; +$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: '; +$PHPMAILER_LANG['execute'] = 'Não foi possível executar: '; +$PHPMAILER_LANG['file_access'] = 'Não foi possível aceder o ficheiro: '; +$PHPMAILER_LANG['file_open'] = 'Abertura do ficheiro: Não foi possível abrir o ficheiro: '; +$PHPMAILER_LANG['from_failed'] = 'Ocorreram falhas nos endereços dos seguintes remententes: '; +$PHPMAILER_LANG['instantiate'] = 'Não foi possível iniciar uma instância da função mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Não foi enviado nenhum e-mail para o endereço de e-mail inválido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Tem de fornecer pelo menos um endereço como destinatário do e-mail.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro do SMTP: O endereço do seguinte destinatário falhou: '; +$PHPMAILER_LANG['signing'] = 'Erro ao assinar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.'; +$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Não foi possível definir ou redefinir a variável: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensão em falta: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php new file mode 100644 index 0000000..d863809 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php @@ -0,0 +1,30 @@ + + * @author Lucas Guimarães + * @author Phelipe Alves + * @author Fabio Beneditto + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro de SMTP: Não foi possível autenticar.'; +$PHPMAILER_LANG['connect_host'] = 'Erro de SMTP: Não foi possível conectar ao servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro de SMTP: Dados rejeitados.'; +$PHPMAILER_LANG['empty_message'] = 'Mensagem vazia'; +$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: '; +$PHPMAILER_LANG['execute'] = 'Não foi possível executar: '; +$PHPMAILER_LANG['file_access'] = 'Não foi possível acessar o arquivo: '; +$PHPMAILER_LANG['file_open'] = 'Erro de Arquivo: Não foi possível abrir o arquivo: '; +$PHPMAILER_LANG['from_failed'] = 'Os seguintes remetentes falharam: '; +$PHPMAILER_LANG['instantiate'] = 'Não foi possível instanciar a função mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Endereço de e-mail inválido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Você deve informar pelo menos um destinatário.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro de SMTP: Os seguintes destinatários falharam: '; +$PHPMAILER_LANG['signing'] = 'Erro de Assinatura: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.'; +$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Não foi possível definir ou redefinir a variável: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensão não existe: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php new file mode 100644 index 0000000..292ec1e --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ro.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Eroare SMTP: Autentificarea a eșuat.'; +$PHPMAILER_LANG['connect_host'] = 'Eroare SMTP: Conectarea la serverul SMTP a eșuat.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Eroare SMTP: Datele nu au fost acceptate.'; +$PHPMAILER_LANG['empty_message'] = 'Mesajul este gol.'; +$PHPMAILER_LANG['encoding'] = 'Encodare necunoscută: '; +$PHPMAILER_LANG['execute'] = 'Nu se poate executa următoarea comandă: '; +$PHPMAILER_LANG['file_access'] = 'Nu se poate accesa următorul fișier: '; +$PHPMAILER_LANG['file_open'] = 'Eroare fișier: Nu se poate deschide următorul fișier: '; +$PHPMAILER_LANG['from_failed'] = 'Următoarele adrese From au dat eroare: '; +$PHPMAILER_LANG['instantiate'] = 'Funcția mail nu a putut fi inițializată.'; +$PHPMAILER_LANG['invalid_address'] = 'Adresa de email nu este validă: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.'; +$PHPMAILER_LANG['provide_address'] = 'Trebuie să adăugați cel puțin o adresă de email.'; +$PHPMAILER_LANG['recipients_failed'] = 'Eroare SMTP: Următoarele adrese de email au eșuat: '; +$PHPMAILER_LANG['signing'] = 'A aparut o problemă la semnarea emailului. '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Conectarea la serverul SMTP a eșuat.'; +$PHPMAILER_LANG['smtp_error'] = 'Eroare server SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Nu se poate seta/reseta variabila. '; +$PHPMAILER_LANG['extension_missing'] = 'Lipsește extensia: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ru.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ru.php new file mode 100644 index 0000000..8c8c5e8 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-ru.php @@ -0,0 +1,28 @@ + + * @author Foster Snowhill + */ + +$PHPMAILER_LANG['authenticate'] = 'Ошибка SMTP: ошибка авторизации.'; +$PHPMAILER_LANG['connect_host'] = 'Ошибка SMTP: не удается подключиться к SMTP-серверу.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Ошибка SMTP: данные не приняты.'; +$PHPMAILER_LANG['encoding'] = 'Неизвестная кодировка: '; +$PHPMAILER_LANG['execute'] = 'Невозможно выполнить команду: '; +$PHPMAILER_LANG['file_access'] = 'Нет доступа к файлу: '; +$PHPMAILER_LANG['file_open'] = 'Файловая ошибка: не удаётся открыть файл: '; +$PHPMAILER_LANG['from_failed'] = 'Неверный адрес отправителя: '; +$PHPMAILER_LANG['instantiate'] = 'Невозможно запустить функцию mail().'; +$PHPMAILER_LANG['provide_address'] = 'Пожалуйста, введите хотя бы один email-адрес получателя.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не поддерживается.'; +$PHPMAILER_LANG['recipients_failed'] = 'Ошибка SMTP: не удалась отправка таким адресатам: '; +$PHPMAILER_LANG['empty_message'] = 'Пустое сообщение'; +$PHPMAILER_LANG['invalid_address'] = 'Не отправлено из-за неправильного формата email-адреса: '; +$PHPMAILER_LANG['signing'] = 'Ошибка подписи: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ошибка соединения с SMTP-сервером'; +$PHPMAILER_LANG['smtp_error'] = 'Ошибка SMTP-сервера: '; +$PHPMAILER_LANG['variable_set'] = 'Невозможно установить или сбросить переменную: '; +$PHPMAILER_LANG['extension_missing'] = 'Расширение отсутствует: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php new file mode 100644 index 0000000..028f5bc --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sk.php @@ -0,0 +1,30 @@ + + * @author Peter Orlický + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Chyba autentifikácie.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Nebolo možné nadviazať spojenie so SMTP serverom.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Dáta neboli prijaté'; +$PHPMAILER_LANG['empty_message'] = 'Prázdne telo správy.'; +$PHPMAILER_LANG['encoding'] = 'Neznáme kódovanie: '; +$PHPMAILER_LANG['execute'] = 'Nedá sa vykonať: '; +$PHPMAILER_LANG['file_access'] = 'Súbor nebol nájdený: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Súbor sa otvoriť pre čítanie: '; +$PHPMAILER_LANG['from_failed'] = 'Následujúca adresa From je nesprávna: '; +$PHPMAILER_LANG['instantiate'] = 'Nedá sa vytvoriť inštancia emailovej funkcie.'; +$PHPMAILER_LANG['invalid_address'] = 'Neodoslané, emailová adresa je nesprávna: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'Záznam hostiteľa je nesprávny: '; +$PHPMAILER_LANG['invalid_host'] = 'Hostiteľ je nesprávny: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' emailový klient nieje podporovaný.'; +$PHPMAILER_LANG['provide_address'] = 'Musíte zadať aspoň jednu emailovú adresu príjemcu.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Adresy príjemcov niesu správne '; +$PHPMAILER_LANG['signing'] = 'Chyba prihlasovania: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() zlyhalo.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP chyba serveru: '; +$PHPMAILER_LANG['variable_set'] = 'Nemožno nastaviť alebo resetovať premennú: '; +$PHPMAILER_LANG['extension_missing'] = 'Chýba rozšírenie: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php new file mode 100644 index 0000000..c437a88 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sl.php @@ -0,0 +1,31 @@ + + * @author Filip Š + * @author Blaž Oražem + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP napaka: Avtentikacija ni uspela.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP napaka: Vzpostavljanje povezave s SMTP gostiteljem ni uspelo.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP napaka: Strežnik zavrača podatke.'; +$PHPMAILER_LANG['empty_message'] = 'E-poštno sporočilo nima vsebine.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznan tip kodiranja: '; +$PHPMAILER_LANG['execute'] = 'Operacija ni uspela: '; +$PHPMAILER_LANG['file_access'] = 'Nimam dostopa do datoteke: '; +$PHPMAILER_LANG['file_open'] = 'Ne morem odpreti datoteke: '; +$PHPMAILER_LANG['from_failed'] = 'Neveljaven e-naslov pošiljatelja: '; +$PHPMAILER_LANG['instantiate'] = 'Ne morem inicializirati mail funkcije.'; +$PHPMAILER_LANG['invalid_address'] = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'Neveljaven vnos gostitelja: '; +$PHPMAILER_LANG['invalid_host'] = 'Neveljaven gostitelj: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.'; +$PHPMAILER_LANG['provide_address'] = 'Prosimo, vnesite vsaj enega naslovnika.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP napaka: Sledeči naslovniki so neveljavni: '; +$PHPMAILER_LANG['signing'] = 'Napaka pri podpisovanju: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ne morem vzpostaviti povezave s SMTP strežnikom.'; +$PHPMAILER_LANG['smtp_error'] = 'Napaka SMTP strežnika: '; +$PHPMAILER_LANG['variable_set'] = 'Ne morem nastaviti oz. ponastaviti spremenljivke: '; +$PHPMAILER_LANG['extension_missing'] = 'Manjkajoča razširitev: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr.php new file mode 100644 index 0000000..0b5280f --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr.php @@ -0,0 +1,28 @@ + + * @author Miloš Milanović + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP грешка: аутентификација није успела.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP грешка: повезивање са SMTP сервером није успело.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP грешка: подаци нису прихваћени.'; +$PHPMAILER_LANG['empty_message'] = 'Садржај поруке је празан.'; +$PHPMAILER_LANG['encoding'] = 'Непознато кодирање: '; +$PHPMAILER_LANG['execute'] = 'Није могуће извршити наредбу: '; +$PHPMAILER_LANG['file_access'] = 'Није могуће приступити датотеци: '; +$PHPMAILER_LANG['file_open'] = 'Није могуће отворити датотеку: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP грешка: слање са следећих адреса није успело: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP грешка: слање на следеће адресе није успело: '; +$PHPMAILER_LANG['instantiate'] = 'Није могуће покренути mail функцију.'; +$PHPMAILER_LANG['invalid_address'] = 'Порука није послата. Неисправна адреса: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' мејлер није подржан.'; +$PHPMAILER_LANG['provide_address'] = 'Дефинишите бар једну адресу примаоца.'; +$PHPMAILER_LANG['signing'] = 'Грешка приликом пријаве: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Повезивање са SMTP сервером није успело.'; +$PHPMAILER_LANG['smtp_error'] = 'Грешка SMTP сервера: '; +$PHPMAILER_LANG['variable_set'] = 'Није могуће задати нити ресетовати променљиву: '; +$PHPMAILER_LANG['extension_missing'] = 'Недостаје проширење: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php new file mode 100644 index 0000000..6213832 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sr_latn.php @@ -0,0 +1,28 @@ + + * @author Miloš Milanović + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP greška: autentifikacija nije uspela.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP greška: povezivanje sa SMTP serverom nije uspelo.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP greška: podaci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznato kodiranje: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvršiti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP greška: slanje sa sledećih adresa nije uspelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP greška: slanje na sledeće adrese nije uspelo: '; +$PHPMAILER_LANG['instantiate'] = 'Nije moguće pokrenuti mail funkciju.'; +$PHPMAILER_LANG['invalid_address'] = 'Poruka nije poslata. Neispravna adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' majler nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'Definišite bar jednu adresu primaoca.'; +$PHPMAILER_LANG['signing'] = 'Greška prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Povezivanje sa SMTP serverom nije uspelo.'; +$PHPMAILER_LANG['smtp_error'] = 'Greška SMTP servera: '; +$PHPMAILER_LANG['variable_set'] = 'Nije moguće zadati niti resetovati promenljivu: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje proširenje: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sv.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sv.php new file mode 100644 index 0000000..9872c19 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-sv.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP fel: Kunde inte autentisera.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fel: Kunde inte ansluta till SMTP-server.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fel: Data accepterades inte.'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = 'Okänt encode-format: '; +$PHPMAILER_LANG['execute'] = 'Kunde inte köra: '; +$PHPMAILER_LANG['file_access'] = 'Ingen åtkomst till fil: '; +$PHPMAILER_LANG['file_open'] = 'Fil fel: Kunde inte öppna fil: '; +$PHPMAILER_LANG['from_failed'] = 'Följande avsändaradress är felaktig: '; +$PHPMAILER_LANG['instantiate'] = 'Kunde inte initiera e-postfunktion.'; +$PHPMAILER_LANG['invalid_address'] = 'Felaktig adress: '; +$PHPMAILER_LANG['provide_address'] = 'Du måste ange minst en mottagares e-postadress.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer stöds inte.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fel: Följande mottagare är felaktig: '; +$PHPMAILER_LANG['signing'] = 'Signeringsfel: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() misslyckades.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP serverfel: '; +$PHPMAILER_LANG['variable_set'] = 'Kunde inte definiera eller återställa variabel: '; +$PHPMAILER_LANG['extension_missing'] = 'Tillägg ej tillgängligt: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-tl.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-tl.php new file mode 100644 index 0000000..d15bed1 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-tl.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Hindi mapatotohanan.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Hindi makakonekta sa SMTP host.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Ang datos ay hindi naitanggap.'; +$PHPMAILER_LANG['empty_message'] = 'Walang laman ang mensahe'; +$PHPMAILER_LANG['encoding'] = 'Hindi alam ang encoding: '; +$PHPMAILER_LANG['execute'] = 'Hindi maisasagawa: '; +$PHPMAILER_LANG['file_access'] = 'Hindi ma-access ang file: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Hindi mabuksan ang file: '; +$PHPMAILER_LANG['from_failed'] = 'Ang sumusunod na address ay nabigo: '; +$PHPMAILER_LANG['instantiate'] = 'Hindi maisimulan ang instance ng mail function.'; +$PHPMAILER_LANG['invalid_address'] = 'Hindi wasto ang address na naibigay: '; +$PHPMAILER_LANG['mailer_not_supported'] = 'Ang mailer ay hindi suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Kailangan mong magbigay ng kahit isang email address na tatanggap.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Ang mga sumusunod na tatanggap ay nabigo: '; +$PHPMAILER_LANG['signing'] = 'Hindi ma-sign: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ang SMTP connect() ay nabigo.'; +$PHPMAILER_LANG['smtp_error'] = 'Ang server ng SMTP ay nabigo: '; +$PHPMAILER_LANG['variable_set'] = 'Hindi matatakda o ma-reset ang mga variables: '; +$PHPMAILER_LANG['extension_missing'] = 'Nawawala ang extension: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-tr.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-tr.php new file mode 100644 index 0000000..f938f80 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-tr.php @@ -0,0 +1,31 @@ + + * @fixed by Boris Yurchenko + */ + +$PHPMAILER_LANG['authenticate'] = 'Помилка SMTP: помилка авторизації.'; +$PHPMAILER_LANG['connect_host'] = 'Помилка SMTP: не вдається під\'єднатися до SMTP-серверу.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Помилка SMTP: дані не прийнято.'; +$PHPMAILER_LANG['encoding'] = 'Невідоме кодування: '; +$PHPMAILER_LANG['execute'] = 'Неможливо виконати команду: '; +$PHPMAILER_LANG['file_access'] = 'Немає доступу до файлу: '; +$PHPMAILER_LANG['file_open'] = 'Помилка файлової системи: не вдається відкрити файл: '; +$PHPMAILER_LANG['from_failed'] = 'Невірна адреса відправника: '; +$PHPMAILER_LANG['instantiate'] = 'Неможливо запустити функцію mail().'; +$PHPMAILER_LANG['provide_address'] = 'Будь ласка, введіть хоча б одну email-адресу отримувача.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - поштовий сервер не підтримується.'; +$PHPMAILER_LANG['recipients_failed'] = 'Помилка SMTP: не вдалося відправлення для таких отримувачів: '; +$PHPMAILER_LANG['empty_message'] = 'Пусте повідомлення'; +$PHPMAILER_LANG['invalid_address'] = 'Не відправлено через неправильний формат email-адреси: '; +$PHPMAILER_LANG['signing'] = 'Помилка підпису: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Помилка з\'єднання з SMTP-сервером'; +$PHPMAILER_LANG['smtp_error'] = 'Помилка SMTP-сервера: '; +$PHPMAILER_LANG['variable_set'] = 'Неможливо встановити або скинути змінну: '; +$PHPMAILER_LANG['extension_missing'] = 'Розширення відсутнє: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-vi.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-vi.php new file mode 100644 index 0000000..d65576e --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-vi.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Lỗi SMTP: Không thể xác thực.'; +$PHPMAILER_LANG['connect_host'] = 'Lỗi SMTP: Không thể kết nối máy chủ SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Lỗi SMTP: Dữ liệu không được chấp nhận.'; +$PHPMAILER_LANG['empty_message'] = 'Không có nội dung'; +$PHPMAILER_LANG['encoding'] = 'Mã hóa không xác định: '; +$PHPMAILER_LANG['execute'] = 'Không thực hiện được: '; +$PHPMAILER_LANG['file_access'] = 'Không thể truy cập tệp tin '; +$PHPMAILER_LANG['file_open'] = 'Lỗi Tập tin: Không thể mở tệp tin: '; +$PHPMAILER_LANG['from_failed'] = 'Lỗi địa chỉ gửi đi: '; +$PHPMAILER_LANG['instantiate'] = 'Không dùng được các hàm gửi thư.'; +$PHPMAILER_LANG['invalid_address'] = 'Đại chỉ emai không đúng: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' trình gửi thư không được hỗ trợ.'; +$PHPMAILER_LANG['provide_address'] = 'Bạn phải cung cấp ít nhất một địa chỉ người nhận.'; +$PHPMAILER_LANG['recipients_failed'] = 'Lỗi SMTP: lỗi địa chỉ người nhận: '; +$PHPMAILER_LANG['signing'] = 'Lỗi đăng nhập: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Lỗi kết nối với SMTP'; +$PHPMAILER_LANG['smtp_error'] = 'Lỗi máy chủ smtp '; +$PHPMAILER_LANG['variable_set'] = 'Không thể thiết lập hoặc thiết lập lại biến: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh.php new file mode 100644 index 0000000..35e4e70 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh.php @@ -0,0 +1,29 @@ + + * @author Peter Dave Hello <@PeterDaveHello/> + * @author Jason Chiang + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 錯誤:登入失敗。'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 錯誤:無法連線到 SMTP 主機。'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 錯誤:無法接受的資料。'; +$PHPMAILER_LANG['empty_message'] = '郵件內容為空'; +$PHPMAILER_LANG['encoding'] = '未知編碼: '; +$PHPMAILER_LANG['execute'] = '無法執行:'; +$PHPMAILER_LANG['file_access'] = '無法存取檔案:'; +$PHPMAILER_LANG['file_open'] = '檔案錯誤:無法開啟檔案:'; +$PHPMAILER_LANG['from_failed'] = '發送地址錯誤:'; +$PHPMAILER_LANG['instantiate'] = '未知函數呼叫。'; +$PHPMAILER_LANG['invalid_address'] = '因為電子郵件地址無效,無法傳送: '; +$PHPMAILER_LANG['mailer_not_supported'] = '不支援的發信客戶端。'; +$PHPMAILER_LANG['provide_address'] = '必須提供至少一個收件人地址。'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 錯誤:以下收件人地址錯誤:'; +$PHPMAILER_LANG['signing'] = '電子簽章錯誤: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP 連線失敗'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP 伺服器錯誤: '; +$PHPMAILER_LANG['variable_set'] = '無法設定或重設變數: '; +$PHPMAILER_LANG['extension_missing'] = '遺失模組 Extension: '; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php new file mode 100644 index 0000000..728a499 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php @@ -0,0 +1,29 @@ + + * @author young + * @author Teddysun + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 错误:登录失败。'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 错误:无法连接到 SMTP 主机。'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 错误:数据不被接受。'; +$PHPMAILER_LANG['empty_message'] = '邮件正文为空。'; +$PHPMAILER_LANG['encoding'] = '未知编码:'; +$PHPMAILER_LANG['execute'] = '无法执行:'; +$PHPMAILER_LANG['file_access'] = '无法访问文件:'; +$PHPMAILER_LANG['file_open'] = '文件错误:无法打开文件:'; +$PHPMAILER_LANG['from_failed'] = '发送地址错误:'; +$PHPMAILER_LANG['instantiate'] = '未知函数调用。'; +$PHPMAILER_LANG['invalid_address'] = '发送失败,电子邮箱地址是无效的:'; +$PHPMAILER_LANG['mailer_not_supported'] = '发信客户端不被支持。'; +$PHPMAILER_LANG['provide_address'] = '必须提供至少一个收件人地址。'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 错误:收件人地址错误:'; +$PHPMAILER_LANG['signing'] = '登录失败:'; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP服务器连接失败。'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP服务器出错:'; +$PHPMAILER_LANG['variable_set'] = '无法设置或重置变量:'; +$PHPMAILER_LANG['extension_missing'] = '丢失模块 Extension:'; diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/Exception.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/Exception.php new file mode 100644 index 0000000..52eaf95 --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/Exception.php @@ -0,0 +1,40 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer exception handler. + * + * @author Marcus Bointon + */ +class Exception extends \Exception +{ + /** + * Prettify error message output. + * + * @return string + */ + public function errorMessage() + { + return '' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . "
    \n"; + } +} diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/OAuth.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/OAuth.php new file mode 100644 index 0000000..c93d0be --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/OAuth.php @@ -0,0 +1,139 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +use League\OAuth2\Client\Grant\RefreshToken; +use League\OAuth2\Client\Provider\AbstractProvider; +use League\OAuth2\Client\Token\AccessToken; + +/** + * OAuth - OAuth2 authentication wrapper class. + * Uses the oauth2-client package from the League of Extraordinary Packages. + * + * @see http://oauth2-client.thephpleague.com + * + * @author Marcus Bointon (Synchro/coolbru) + */ +class OAuth +{ + /** + * An instance of the League OAuth Client Provider. + * + * @var AbstractProvider + */ + protected $provider; + + /** + * The current OAuth access token. + * + * @var AccessToken + */ + protected $oauthToken; + + /** + * The user's email address, usually used as the login ID + * and also the from address when sending email. + * + * @var string + */ + protected $oauthUserEmail = ''; + + /** + * The client secret, generated in the app definition of the service you're connecting to. + * + * @var string + */ + protected $oauthClientSecret = ''; + + /** + * The client ID, generated in the app definition of the service you're connecting to. + * + * @var string + */ + protected $oauthClientId = ''; + + /** + * The refresh token, used to obtain new AccessTokens. + * + * @var string + */ + protected $oauthRefreshToken = ''; + + /** + * OAuth constructor. + * + * @param array $options Associative array containing + * `provider`, `userName`, `clientSecret`, `clientId` and `refreshToken` elements + */ + public function __construct($options) + { + $this->provider = $options['provider']; + $this->oauthUserEmail = $options['userName']; + $this->oauthClientSecret = $options['clientSecret']; + $this->oauthClientId = $options['clientId']; + $this->oauthRefreshToken = $options['refreshToken']; + } + + /** + * Get a new RefreshToken. + * + * @return RefreshToken + */ + protected function getGrant() + { + return new RefreshToken(); + } + + /** + * Get a new AccessToken. + * + * @return AccessToken + */ + protected function getToken() + { + return $this->provider->getAccessToken( + $this->getGrant(), + ['refresh_token' => $this->oauthRefreshToken] + ); + } + + /** + * Generate a base64-encoded OAuth token. + * + * @return string + */ + public function getOauth64() + { + //Get a new token if it's not available or has expired + if (null === $this->oauthToken || $this->oauthToken->hasExpired()) { + $this->oauthToken = $this->getToken(); + } + + return base64_encode( + 'user=' . + $this->oauthUserEmail . + "\001auth=Bearer " . + $this->oauthToken . + "\001\001" + ); + } +} diff --git a/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/PHPMailer.php b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/PHPMailer.php new file mode 100644 index 0000000..5b6dcfa --- /dev/null +++ b/html/sternwarte/phpmailer/vendor/phpmailer/phpmailer/src/PHPMailer.php @@ -0,0 +1,5029 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer - PHP email creation and transport class. + * + * @author Marcus Bointon (Synchro/coolbru) + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + */ +class PHPMailer +{ + const CHARSET_ASCII = 'us-ascii'; + const CHARSET_ISO88591 = 'iso-8859-1'; + const CHARSET_UTF8 = 'utf-8'; + + const CONTENT_TYPE_PLAINTEXT = 'text/plain'; + const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar'; + const CONTENT_TYPE_TEXT_HTML = 'text/html'; + const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative'; + const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed'; + const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related'; + + const ENCODING_7BIT = '7bit'; + const ENCODING_8BIT = '8bit'; + const ENCODING_BASE64 = 'base64'; + const ENCODING_BINARY = 'binary'; + const ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; + + const ENCRYPTION_STARTTLS = 'tls'; + const ENCRYPTION_SMTPS = 'ssl'; + + const ICAL_METHOD_REQUEST = 'REQUEST'; + const ICAL_METHOD_PUBLISH = 'PUBLISH'; + const ICAL_METHOD_REPLY = 'REPLY'; + const ICAL_METHOD_ADD = 'ADD'; + const ICAL_METHOD_CANCEL = 'CANCEL'; + const ICAL_METHOD_REFRESH = 'REFRESH'; + const ICAL_METHOD_COUNTER = 'COUNTER'; + const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER'; + + /** + * Email priority. + * Options: null (default), 1 = High, 3 = Normal, 5 = low. + * When null, the header is not set at all. + * + * @var int|null + */ + public $Priority; + + /** + * The character set of the message. + * + * @var string + */ + public $CharSet = self::CHARSET_ISO88591; + + /** + * The MIME Content-type of the message. + * + * @var string + */ + public $ContentType = self::CONTENT_TYPE_PLAINTEXT; + + /** + * The message encoding. + * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". + * + * @var string + */ + public $Encoding = self::ENCODING_8BIT; + + /** + * Holds the most recent mailer error message. + * + * @var string + */ + public $ErrorInfo = ''; + + /** + * The From email address for the message. + * + * @var string + */ + public $From = ''; + + /** + * The From name of the message. + * + * @var string + */ + public $FromName = ''; + + /** + * The envelope sender of the message. + * This will usually be turned into a Return-Path header by the receiver, + * and is the address that bounces will be sent to. + * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP. + * + * @var string + */ + public $Sender = ''; + + /** + * The Subject of the message. + * + * @var string + */ + public $Subject = ''; + + /** + * An HTML or plain text message body. + * If HTML then call isHTML(true). + * + * @var string + */ + public $Body = ''; + + /** + * The plain-text message body. + * This body can be read by mail clients that do not have HTML email + * capability such as mutt & Eudora. + * Clients that can read HTML will view the normal Body. + * + * @var string + */ + public $AltBody = ''; + + /** + * An iCal message part body. + * Only supported in simple alt or alt_inline message types + * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator. + * + * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ + * @see http://kigkonsult.se/iCalcreator/ + * + * @var string + */ + public $Ical = ''; + + /** + * Value-array of "method" in Contenttype header "text/calendar" + * + * @var string[] + */ + protected static $IcalMethods = [ + self::ICAL_METHOD_REQUEST, + self::ICAL_METHOD_PUBLISH, + self::ICAL_METHOD_REPLY, + self::ICAL_METHOD_ADD, + self::ICAL_METHOD_CANCEL, + self::ICAL_METHOD_REFRESH, + self::ICAL_METHOD_COUNTER, + self::ICAL_METHOD_DECLINECOUNTER, + ]; + + /** + * The complete compiled MIME message body. + * + * @var string + */ + protected $MIMEBody = ''; + + /** + * The complete compiled MIME message headers. + * + * @var string + */ + protected $MIMEHeader = ''; + + /** + * Extra headers that createHeader() doesn't fold in. + * + * @var string + */ + protected $mailHeader = ''; + + /** + * Word-wrap the message body to this number of chars. + * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. + * + * @see static::STD_LINE_LENGTH + * + * @var int + */ + public $WordWrap = 0; + + /** + * Which method to use to send mail. + * Options: "mail", "sendmail", or "smtp". + * + * @var string + */ + public $Mailer = 'mail'; + + /** + * The path to the sendmail program. + * + * @var string + */ + public $Sendmail = '/usr/sbin/sendmail'; + + /** + * Whether mail() uses a fully sendmail-compatible MTA. + * One which supports sendmail's "-oi -f" options. + * + * @var bool + */ + public $UseSendmailOptions = true; + + /** + * The email address that a reading confirmation should be sent to, also known as read receipt. + * + * @var string + */ + public $ConfirmReadingTo = ''; + + /** + * The hostname to use in the Message-ID header and as default HELO string. + * If empty, PHPMailer attempts to find one with, in order, + * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value + * 'localhost.localdomain'. + * + * @see PHPMailer::$Helo + * + * @var string + */ + public $Hostname = ''; + + /** + * An ID to be used in the Message-ID header. + * If empty, a unique id will be generated. + * You can set your own, but it must be in the format "", + * as defined in RFC5322 section 3.6.4 or it will be ignored. + * + * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 + * + * @var string + */ + public $MessageID = ''; + + /** + * The message Date to be used in the Date header. + * If empty, the current date will be added. + * + * @var string + */ + public $MessageDate = ''; + + /** + * SMTP hosts. + * Either a single hostname or multiple semicolon-delimited hostnames. + * You can also specify a different port + * for each host by using this format: [hostname:port] + * (e.g. "smtp1.example.com:25;smtp2.example.com"). + * You can also specify encryption type, for example: + * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). + * Hosts will be tried in order. + * + * @var string + */ + public $Host = 'localhost'; + + /** + * The default SMTP server port. + * + * @var int + */ + public $Port = 25; + + /** + * The SMTP HELO/EHLO name used for the SMTP connection. + * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find + * one with the same method described above for $Hostname. + * + * @see PHPMailer::$Hostname + * + * @var string + */ + public $Helo = ''; + + /** + * What kind of encryption to use on the SMTP connection. + * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS. + * + * @var string + */ + public $SMTPSecure = ''; + + /** + * Whether to enable TLS encryption automatically if a server supports it, + * even if `SMTPSecure` is not set to 'tls'. + * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. + * + * @var bool + */ + public $SMTPAutoTLS = true; + + /** + * Whether to use SMTP authentication. + * Uses the Username and Password properties. + * + * @see PHPMailer::$Username + * @see PHPMailer::$Password + * + * @var bool + */ + public $SMTPAuth = false; + + /** + * Options array passed to stream_context_create when connecting via SMTP. + * + * @var array + */ + public $SMTPOptions = []; + + /** + * SMTP username. + * + * @var string + */ + public $Username = ''; + + /** + * SMTP password. + * + * @var string + */ + public $Password = ''; + + /** + * SMTP auth type. + * Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified. + * + * @var string + */ + public $AuthType = ''; + + /** + * An instance of the PHPMailer OAuth class. + * + * @var OAuth + */ + protected $oauth; + + /** + * The SMTP server timeout in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. + * + * @var int + */ + public $Timeout = 300; + + /** + * Comma separated list of DSN notifications + * 'NEVER' under no circumstances a DSN must be returned to the sender. + * If you use NEVER all other notifications will be ignored. + * 'SUCCESS' will notify you when your mail has arrived at its destination. + * 'FAILURE' will arrive if an error occurred during delivery. + * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual + * delivery's outcome (success or failure) is not yet decided. + * + * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY + */ + public $dsn = ''; + + /** + * SMTP class debug output mode. + * Debug output level. + * Options: + * @see SMTP::DEBUG_OFF: No output + * @see SMTP::DEBUG_CLIENT: Client messages + * @see SMTP::DEBUG_SERVER: Client and server messages + * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status + * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed + * + * @see SMTP::$do_debug + * + * @var int + */ + public $SMTPDebug = 0; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `
    `, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise. + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * + * ```php + * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * ``` + * + * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` + * level output is used: + * + * ```php + * $mail->Debugoutput = new myPsr3Logger; + * ``` + * + * @see SMTP::$Debugoutput + * + * @var string|callable|\Psr\Log\LoggerInterface + */ + public $Debugoutput = 'echo'; + + /** + * Whether to keep the SMTP connection open after each message. + * If this is set to true then the connection will remain open after a send, + * and closing the connection will require an explicit call to smtpClose(). + * It's a good idea to use this if you are sending multiple messages as it reduces overhead. + * See the mailing list example for how to use it. + * + * @var bool + */ + public $SMTPKeepAlive = false; + + /** + * Whether to split multiple to addresses into multiple messages + * or send them all in one message. + * Only supported in `mail` and `sendmail` transports, not in SMTP. + * + * @var bool + * + * @deprecated 6.0.0 PHPMailer isn't a mailing list manager! + */ + public $SingleTo = false; + + /** + * Storage for addresses when SingleTo is enabled. + * + * @var array + */ + protected $SingleToArray = []; + + /** + * Whether to generate VERP addresses on send. + * Only applicable when sending via SMTP. + * + * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path + * @see http://www.postfix.org/VERP_README.html Postfix VERP info + * + * @var bool + */ + public $do_verp = false; + + /** + * Whether to allow sending messages with an empty body. + * + * @var bool + */ + public $AllowEmpty = false; + + /** + * DKIM selector. + * + * @var string + */ + public $DKIM_selector = ''; + + /** + * DKIM Identity. + * Usually the email address used as the source of the email. + * + * @var string + */ + public $DKIM_identity = ''; + + /** + * DKIM passphrase. + * Used if your key is encrypted. + * + * @var string + */ + public $DKIM_passphrase = ''; + + /** + * DKIM signing domain name. + * + * @example 'example.com' + * + * @var string + */ + public $DKIM_domain = ''; + + /** + * DKIM Copy header field values for diagnostic use. + * + * @var bool + */ + public $DKIM_copyHeaderFields = true; + + /** + * DKIM Extra signing headers. + * + * @example ['List-Unsubscribe', 'List-Help'] + * + * @var array + */ + public $DKIM_extraHeaders = []; + + /** + * DKIM private key file path. + * + * @var string + */ + public $DKIM_private = ''; + + /** + * DKIM private key string. + * + * If set, takes precedence over `$DKIM_private`. + * + * @var string + */ + public $DKIM_private_string = ''; + + /** + * Callback Action function name. + * + * The function that handles the result of the send email action. + * It is called out by send() for each email sent. + * + * Value can be any php callable: http://www.php.net/is_callable + * + * Parameters: + * bool $result result of the send action + * array $to email addresses of the recipients + * array $cc cc email addresses + * array $bcc bcc email addresses + * string $subject the subject + * string $body the email body + * string $from email address of sender + * string $extra extra information of possible use + * "smtp_transaction_id' => last smtp transaction id + * + * @var string + */ + public $action_function = ''; + + /** + * What to put in the X-Mailer header. + * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use. + * + * @var string|null + */ + public $XMailer = ''; + + /** + * Which validator to use by default when validating email addresses. + * May be a callable to inject your own validator, but there are several built-in validators. + * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option. + * + * @see PHPMailer::validateAddress() + * + * @var string|callable + */ + public static $validator = 'php'; + + /** + * An instance of the SMTP sender class. + * + * @var SMTP + */ + protected $smtp; + + /** + * The array of 'to' names and addresses. + * + * @var array + */ + protected $to = []; + + /** + * The array of 'cc' names and addresses. + * + * @var array + */ + protected $cc = []; + + /** + * The array of 'bcc' names and addresses. + * + * @var array + */ + protected $bcc = []; + + /** + * The array of reply-to names and addresses. + * + * @var array + */ + protected $ReplyTo = []; + + /** + * An array of all kinds of addresses. + * Includes all of $to, $cc, $bcc. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * + * @var array + */ + protected $all_recipients = []; + + /** + * An array of names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $all_recipients + * and one of $to, $cc, or $bcc. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * @see PHPMailer::$all_recipients + * + * @var array + */ + protected $RecipientsQueue = []; + + /** + * An array of reply-to names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $ReplyTo. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$ReplyTo + * + * @var array + */ + protected $ReplyToQueue = []; + + /** + * The array of attachments. + * + * @var array + */ + protected $attachment = []; + + /** + * The array of custom headers. + * + * @var array + */ + protected $CustomHeader = []; + + /** + * The most recent Message-ID (including angular brackets). + * + * @var string + */ + protected $lastMessageID = ''; + + /** + * The message's MIME type. + * + * @var string + */ + protected $message_type = ''; + + /** + * The array of MIME boundary strings. + * + * @var array + */ + protected $boundary = []; + + /** + * The array of available text strings for the current language. + * + * @var array + */ + protected $language = []; + + /** + * The number of errors encountered. + * + * @var int + */ + protected $error_count = 0; + + /** + * The S/MIME certificate file path. + * + * @var string + */ + protected $sign_cert_file = ''; + + /** + * The S/MIME key file path. + * + * @var string + */ + protected $sign_key_file = ''; + + /** + * The optional S/MIME extra certificates ("CA Chain") file path. + * + * @var string + */ + protected $sign_extracerts_file = ''; + + /** + * The S/MIME password for the key. + * Used only if the key is encrypted. + * + * @var string + */ + protected $sign_key_pass = ''; + + /** + * Whether to throw exceptions for errors. + * + * @var bool + */ + protected $exceptions = false; + + /** + * Unique ID used for message ID and boundaries. + * + * @var string + */ + protected $uniqueid = ''; + + /** + * The PHPMailer Version number. + * + * @var string + */ + const VERSION = '6.5.1'; + + /** + * Error severity: message only, continue processing. + * + * @var int + */ + const STOP_MESSAGE = 0; + + /** + * Error severity: message, likely ok to continue processing. + * + * @var int + */ + const STOP_CONTINUE = 1; + + /** + * Error severity: message, plus full stop, critical error reached. + * + * @var int + */ + const STOP_CRITICAL = 2; + + /** + * The SMTP standard CRLF line break. + * If you want to change line break format, change static::$LE, not this. + */ + const CRLF = "\r\n"; + + /** + * "Folding White Space" a white space string used for line folding. + */ + const FWS = ' '; + + /** + * SMTP RFC standard line ending; Carriage Return, Line Feed. + * + * @var string + */ + protected static $LE = self::CRLF; + + /** + * The maximum line length supported by mail(). + * + * Background: mail() will sometimes corrupt messages + * with headers headers longer than 65 chars, see #818. + * + * @var int + */ + const MAIL_MAX_LINE_LENGTH = 63; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1. + * + * @var int + */ + const MAX_LINE_LENGTH = 998; + + /** + * The lower maximum line length allowed by RFC 2822 section 2.1.1. + * This length does NOT include the line break + * 76 means that lines will be 77 or 78 chars depending on whether + * the line break format is LF or CRLF; both are valid. + * + * @var int + */ + const STD_LINE_LENGTH = 76; + + /** + * Constructor. + * + * @param bool $exceptions Should we throw external exceptions? + */ + public function __construct($exceptions = null) + { + if (null !== $exceptions) { + $this->exceptions = (bool) $exceptions; + } + //Pick an appropriate debug output format automatically + $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html'); + } + + /** + * Destructor. + */ + public function __destruct() + { + //Close any open SMTP connection nicely + $this->smtpClose(); + } + + /** + * Call mail() in a safe_mode-aware fashion. + * Also, unless sendmail_path points to sendmail (or something that + * claims to be sendmail), don't pass params (not a perfect fix, + * but it will do). + * + * @param string $to To + * @param string $subject Subject + * @param string $body Message Body + * @param string $header Additional Header(s) + * @param string|null $params Params + * + * @return bool + */ + private function mailPassthru($to, $subject, $body, $header, $params) + { + //Check overloading of mail function to avoid double-encoding + if (ini_get('mbstring.func_overload') & 1) { + $subject = $this->secureHeader($subject); + } else { + $subject = $this->encodeHeader($this->secureHeader($subject)); + } + //Calling mail() with null params breaks + $this->edebug('Sending with mail()'); + $this->edebug('Sendmail path: ' . ini_get('sendmail_path')); + $this->edebug("Envelope sender: {$this->Sender}"); + $this->edebug("To: {$to}"); + $this->edebug("Subject: {$subject}"); + $this->edebug("Headers: {$header}"); + if (!$this->UseSendmailOptions || null === $params) { + $result = @mail($to, $subject, $body, $header); + } else { + $this->edebug("Additional params: {$params}"); + $result = @mail($to, $subject, $body, $header, $params); + } + $this->edebug('Result: ' . ($result ? 'true' : 'false')); + return $result; + } + + /** + * Output debugging info via a user-defined method. + * Only generates output if debug output is enabled. + * + * @see PHPMailer::$Debugoutput + * @see PHPMailer::$SMTPDebug + * + * @param string $str + */ + protected function edebug($str) + { + if ($this->SMTPDebug <= 0) { + return; + } + //Is this a PSR-3 logger? + if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { + $this->Debugoutput->debug($str); + + return; + } + //Avoid clash with built-in function names + if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) { + call_user_func($this->Debugoutput, $str, $this->SMTPDebug); + + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + /** @noinspection ForgottenDebugOutputInspection */ + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ), "
    \n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/\r\n|\r/m', "\n", $str); + echo gmdate('Y-m-d H:i:s'), + "\t", + //Trim trailing space + trim( + //Indent for readability, except for trailing break + str_replace( + "\n", + "\n \t ", + trim($str) + ) + ), + "\n"; + } + } + + /** + * Sets message type to HTML or plain. + * + * @param bool $isHtml True for HTML mode + */ + public function isHTML($isHtml = true) + { + if ($isHtml) { + $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; + } else { + $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; + } + } + + /** + * Send messages using SMTP. + */ + public function isSMTP() + { + $this->Mailer = 'smtp'; + } + + /** + * Send messages using PHP's mail() function. + */ + public function isMail() + { + $this->Mailer = 'mail'; + } + + /** + * Send messages using $Sendmail. + */ + public function isSendmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'sendmail')) { + $this->Sendmail = '/usr/sbin/sendmail'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'sendmail'; + } + + /** + * Send messages using qmail. + */ + public function isQmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'qmail')) { + $this->Sendmail = '/var/qmail/bin/qmail-inject'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'qmail'; + } + + /** + * Add a "To" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addAddress($address, $name = '') + { + return $this->addOrEnqueueAnAddress('to', $address, $name); + } + + /** + * Add a "CC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('cc', $address, $name); + } + + /** + * Add a "BCC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addBCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('bcc', $address, $name); + } + + /** + * Add a "Reply-To" address. + * + * @param string $address The email address to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addReplyTo($address, $name = '') + { + return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer + * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still + * be modified after calling this function), addition of such addresses is delayed until send(). + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addOrEnqueueAnAddress($kind, $address, $name) + { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + $pos = strrpos($address, '@'); + if (false === $pos) { + //At-sign is missing. + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + $params = [$kind, $address, $name]; + //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. + if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { + if ('Reply-To' !== $kind) { + if (!array_key_exists($address, $this->RecipientsQueue)) { + $this->RecipientsQueue[$address] = $params; + + return true; + } + } elseif (!array_key_exists($address, $this->ReplyToQueue)) { + $this->ReplyToQueue[$address] = $params; + + return true; + } + + return false; + } + + //Immediately add standard addresses without IDN. + return call_user_func_array([$this, 'addAnAddress'], $params); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addAnAddress($kind, $address, $name = '') + { + if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) { + $error_message = sprintf( + '%s: %s', + $this->lang('Invalid recipient kind'), + $kind + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if (!static::validateAddress($address)) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if ('Reply-To' !== $kind) { + if (!array_key_exists(strtolower($address), $this->all_recipients)) { + $this->{$kind}[] = [$address, $name]; + $this->all_recipients[strtolower($address)] = true; + + return true; + } + } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) { + $this->ReplyTo[strtolower($address)] = [$address, $name]; + + return true; + } + + return false; + } + + /** + * Parse and validate a string containing one or more RFC822-style comma-separated email addresses + * of the form "display name
    " into an array of name/address pairs. + * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. + * Note that quotes in the name part are removed. + * + * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation + * + * @param string $addrstr The address list string + * @param bool $useimap Whether to use the IMAP extension to parse the list + * + * @return array + */ + public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591) + { + $addresses = []; + if ($useimap && function_exists('imap_rfc822_parse_adrlist')) { + //Use this built-in parser if it's available + $list = imap_rfc822_parse_adrlist($addrstr, ''); + // Clear any potential IMAP errors to get rid of notices being thrown at end of script. + imap_errors(); + foreach ($list as $address) { + if ( + '.SYNTAX-ERROR.' !== $address->host && + static::validateAddress($address->mailbox . '@' . $address->host) + ) { + //Decode the name part if it's present and encoded + if ( + property_exists($address, 'personal') && + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + defined('MB_CASE_UPPER') && + preg_match('/^=\?.*\?=$/s', $address->personal) + ) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $address->personal = str_replace('_', '=20', $address->personal); + //Decode the name + $address->personal = mb_decode_mimeheader($address->personal); + mb_internal_encoding($origCharset); + } + + $addresses[] = [ + 'name' => (property_exists($address, 'personal') ? $address->personal : ''), + 'address' => $address->mailbox . '@' . $address->host, + ]; + } + } + } else { + //Use this simpler parser + $list = explode(',', $addrstr); + foreach ($list as $address) { + $address = trim($address); + //Is there a separate name part? + if (strpos($address, '<') === false) { + //No separate name, just use the whole thing + if (static::validateAddress($address)) { + $addresses[] = [ + 'name' => '', + 'address' => $address, + ]; + } + } else { + list($name, $email) = explode('<', $address); + $email = trim(str_replace('>', '', $email)); + $name = trim($name); + if (static::validateAddress($email)) { + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + //If this name is encoded, decode it + if (defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $name)) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $name = str_replace('_', '=20', $name); + //Decode the name + $name = mb_decode_mimeheader($name); + mb_internal_encoding($origCharset); + } + $addresses[] = [ + //Remove any surrounding quotes and spaces from the name + 'name' => trim($name, '\'" '), + 'address' => $email, + ]; + } + } + } + } + + return $addresses; + } + + /** + * Set the From and FromName properties. + * + * @param string $address + * @param string $name + * @param bool $auto Whether to also set the Sender address, defaults to true + * + * @throws Exception + * + * @return bool + */ + public function setFrom($address, $name = '', $auto = true) + { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + //Don't validate now addresses with IDN. Will be done in send(). + $pos = strrpos($address, '@'); + if ( + (false === $pos) + || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported()) + && !static::validateAddress($address)) + ) { + $error_message = sprintf( + '%s (From): %s', + $this->lang('invalid_address'), + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto && empty($this->Sender)) { + $this->Sender = $address; + } + + return true; + } + + /** + * Return the Message-ID header of the last email. + * Technically this is the value from the last time the headers were created, + * but it's also the message ID of the last sent message except in + * pathological cases. + * + * @return string + */ + public function getLastMessageID() + { + return $this->lastMessageID; + } + + /** + * Check that a string looks like an email address. + * Validation patterns supported: + * * `auto` Pick best pattern automatically; + * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0; + * * `pcre` Use old PCRE implementation; + * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; + * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. + * * `noregex` Don't use a regex: super fast, really dumb. + * Alternatively you may pass in a callable to inject your own validator, for example: + * + * ```php + * PHPMailer::validateAddress('user@example.com', function($address) { + * return (strpos($address, '@') !== false); + * }); + * ``` + * + * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. + * + * @param string $address The email address to check + * @param string|callable $patternselect Which pattern to use + * + * @return bool + */ + public static function validateAddress($address, $patternselect = null) + { + if (null === $patternselect) { + $patternselect = static::$validator; + } + //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603 + if (is_callable($patternselect) && !is_string($patternselect)) { + return call_user_func($patternselect, $address); + } + //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 + if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) { + return false; + } + switch ($patternselect) { + case 'pcre': //Kept for BC + case 'pcre8': + /* + * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL + * is based. + * In addition to the addresses allowed by filter_var, also permits: + * * dotless domains: `a@b` + * * comments: `1234 @ local(blah) .machine .example` + * * quoted elements: `'"test blah"@example.org'` + * * numeric TLDs: `a@b.123` + * * unbracketed IPv4 literals: `a@192.168.0.1` + * * IPv6 literals: 'first.last@[IPv6:a1::]' + * Not all of these will necessarily work for sending! + * + * @see http://squiloople.com/2009/12/20/email-address-validation/ + * @copyright 2009-2010 Michael Rushton + * Feel free to use and redistribute this code. But please keep this copyright notice. + */ + return (bool) preg_match( + '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . + '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . + '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . + '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . + '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . + '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . + '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . + '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', + $address + ); + case 'html5': + /* + * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. + * + * @see https://html.spec.whatwg.org/#e-mail-state-(type=email) + */ + return (bool) preg_match( + '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . + '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', + $address + ); + case 'php': + default: + return filter_var($address, FILTER_VALIDATE_EMAIL) !== false; + } + } + + /** + * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the + * `intl` and `mbstring` PHP extensions. + * + * @return bool `true` if required functions for IDN support are present + */ + public static function idnSupported() + { + return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding'); + } + + /** + * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. + * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. + * This function silently returns unmodified address if: + * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) + * - Conversion to punycode is impossible (e.g. required PHP functions are not available) + * or fails for any reason (e.g. domain contains characters not allowed in an IDN). + * + * @see PHPMailer::$CharSet + * + * @param string $address The email address to convert + * + * @return string The encoded address in ASCII form + */ + public function punyencodeAddress($address) + { + //Verify we have required functions, CharSet, and at-sign. + $pos = strrpos($address, '@'); + if ( + !empty($this->CharSet) && + false !== $pos && + static::idnSupported() + ) { + $domain = substr($address, ++$pos); + //Verify CharSet string is a valid one, and domain properly encoded in this CharSet. + if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) { + //Convert the domain from whatever charset it's in to UTF-8 + $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet); + //Ignore IDE complaints about this line - method signature changed in PHP 5.4 + $errorcode = 0; + if (defined('INTL_IDNA_VARIANT_UTS46')) { + //Use the current punycode standard (appeared in PHP 7.2) + $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_UTS46); + } elseif (defined('INTL_IDNA_VARIANT_2003')) { + //Fall back to this old, deprecated/removed encoding + $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); + } else { + //Fall back to a default we don't know about + $punycode = idn_to_ascii($domain, $errorcode); + } + if (false !== $punycode) { + return substr($address, 0, $pos) . $punycode; + } + } + } + + return $address; + } + + /** + * Create a message and send it. + * Uses the sending method specified by $Mailer. + * + * @throws Exception + * + * @return bool false on error - See the ErrorInfo property for details of the error + */ + public function send() + { + try { + if (!$this->preSend()) { + return false; + } + + return $this->postSend(); + } catch (Exception $exc) { + $this->mailHeader = ''; + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Prepare a message for sending. + * + * @throws Exception + * + * @return bool + */ + public function preSend() + { + if ( + 'smtp' === $this->Mailer + || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0)) + ) { + //SMTP mandates RFC-compliant line endings + //and it's also used with mail() on Windows + static::setLE(self::CRLF); + } else { + //Maintain backward compatibility with legacy Linux command line mailers + static::setLE(PHP_EOL); + } + //Check for buggy PHP versions that add a header with an incorrect line break + if ( + 'mail' === $this->Mailer + && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017) + || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103)) + && ini_get('mail.add_x_header') === '1' + && stripos(PHP_OS, 'WIN') === 0 + ) { + trigger_error($this->lang('buggy_php'), E_USER_WARNING); + } + + try { + $this->error_count = 0; //Reset errors + $this->mailHeader = ''; + + //Dequeue recipient and Reply-To addresses with IDN + foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { + $params[1] = $this->punyencodeAddress($params[1]); + call_user_func_array([$this, 'addAnAddress'], $params); + } + if (count($this->to) + count($this->cc) + count($this->bcc) < 1) { + throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL); + } + + //Validate From, Sender, and ConfirmReadingTo addresses + foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) { + $this->$address_kind = trim($this->$address_kind); + if (empty($this->$address_kind)) { + continue; + } + $this->$address_kind = $this->punyencodeAddress($this->$address_kind); + if (!static::validateAddress($this->$address_kind)) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $address_kind, + $this->$address_kind + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + } + + //Set whether the message is multipart/alternative + if ($this->alternativeExists()) { + $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE; + } + + $this->setMessageType(); + //Refuse to send an empty message unless we are specifically allowing it + if (!$this->AllowEmpty && empty($this->Body)) { + throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL); + } + + //Trim subject consistently + $this->Subject = trim($this->Subject); + //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) + $this->MIMEHeader = ''; + $this->MIMEBody = $this->createBody(); + //createBody may have added some headers, so retain them + $tempheaders = $this->MIMEHeader; + $this->MIMEHeader = $this->createHeader(); + $this->MIMEHeader .= $tempheaders; + + //To capture the complete message when using mail(), create + //an extra header list which createHeader() doesn't fold in + if ('mail' === $this->Mailer) { + if (count($this->to) > 0) { + $this->mailHeader .= $this->addrAppend('To', $this->to); + } else { + $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + $this->mailHeader .= $this->headerLine( + 'Subject', + $this->encodeHeader($this->secureHeader($this->Subject)) + ); + } + + //Sign with DKIM if enabled + if ( + !empty($this->DKIM_domain) + && !empty($this->DKIM_selector) + && (!empty($this->DKIM_private_string) + || (!empty($this->DKIM_private) + && static::isPermittedPath($this->DKIM_private) + && file_exists($this->DKIM_private) + ) + ) + ) { + $header_dkim = $this->DKIM_Add( + $this->MIMEHeader . $this->mailHeader, + $this->encodeHeader($this->secureHeader($this->Subject)), + $this->MIMEBody + ); + $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE . + static::normalizeBreaks($header_dkim) . static::$LE; + } + + return true; + } catch (Exception $exc) { + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Actually send a message via the selected mechanism. + * + * @throws Exception + * + * @return bool + */ + public function postSend() + { + try { + //Choose the mailer and send through it + switch ($this->Mailer) { + case 'sendmail': + case 'qmail': + return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); + case 'smtp': + return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); + case 'mail': + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + default: + $sendMethod = $this->Mailer . 'Send'; + if (method_exists($this, $sendMethod)) { + return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); + } + + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + } + } catch (Exception $exc) { + if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) { + $this->smtp->reset(); + } + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + } + + return false; + } + + /** + * Send mail using the $Sendmail program. + * + * @see PHPMailer::$Sendmail + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function sendmailSend($header, $body) + { + if ($this->Mailer === 'qmail') { + $this->edebug('Sending with qmail'); + } else { + $this->edebug('Sending with sendmail'); + } + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) { + if ($this->Mailer === 'qmail') { + $sendmailFmt = '%s -f%s'; + } else { + $sendmailFmt = '%s -oi -f%s -t'; + } + } else { + //allow sendmail to choose a default envelope sender. It may + //seem preferable to force it to use the From header as with + //SMTP, but that introduces new problems (see + //), and + //it has historically worked this way. + $sendmailFmt = '%s -oi -t'; + } + + $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); + $this->edebug('Sendmail path: ' . $this->Sendmail); + $this->edebug('Sendmail command: ' . $sendmail); + $this->edebug('Envelope sender: ' . $this->Sender); + $this->edebug("Headers: {$header}"); + + if ($this->SingleTo) { + foreach ($this->SingleToArray as $toAddr) { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + $this->edebug("To: {$toAddr}"); + fwrite($mail, 'To: ' . $toAddr . "\n"); + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $addrinfo = static::parseAddresses($toAddr, true, $this->charSet); + $this->doCallback( + ($result === 0), + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + } else { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $this->doCallback( + ($result === 0), + $this->to, + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + + return true; + } + + /** + * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. + * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. + * + * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report + * + * @param string $string The string to be validated + * + * @return bool + */ + protected static function isShellSafe($string) + { + //Future-proof + if ( + escapeshellcmd($string) !== $string + || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) + ) { + return false; + } + + $length = strlen($string); + + for ($i = 0; $i < $length; ++$i) { + $c = $string[$i]; + + //All other characters have a special meaning in at least one common shell, including = and +. + //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. + //Note that this does permit non-Latin alphanumeric characters based on the current locale. + if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { + return false; + } + } + + return true; + } + + /** + * Check whether a file path is of a permitted type. + * Used to reject URLs and phar files from functions that access local file paths, + * such as addAttachment. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function isPermittedPath($path) + { + //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 + return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); + } + + /** + * Check whether a file path is safe, accessible, and readable. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function fileIsAccessible($path) + { + if (!static::isPermittedPath($path)) { + return false; + } + $readable = file_exists($path); + //If not a UNC path (expected to start with \\), check read permission, see #2069 + if (strpos($path, '\\\\') !== 0) { + $readable = $readable && is_readable($path); + } + return $readable; + } + + /** + * Send mail using the PHP mail() function. + * + * @see http://www.php.net/manual/en/book.mail.php + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function mailSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + + $toArr = []; + foreach ($this->to as $toaddr) { + $toArr[] = $this->addrFormat($toaddr); + } + $to = implode(', ', $toArr); + + $params = null; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + if (!empty($this->Sender) && static::validateAddress($this->Sender)) { + if (self::isShellSafe($this->Sender)) { + $params = sprintf('-f%s', $this->Sender); + } + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + } + $result = false; + if ($this->SingleTo && count($toArr) > 1) { + foreach ($toArr as $toAddr) { + $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); + $addrinfo = static::parseAddresses($toAddr, true, $this->charSet); + $this->doCallback( + $result, + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + } + } else { + $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); + $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []); + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if (!$result) { + throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL); + } + + return true; + } + + /** + * Get an instance to use for SMTP operations. + * Override this function to load your own SMTP implementation, + * or set one with setSMTPInstance. + * + * @return SMTP + */ + public function getSMTPInstance() + { + if (!is_object($this->smtp)) { + $this->smtp = new SMTP(); + } + + return $this->smtp; + } + + /** + * Provide an instance to use for SMTP operations. + * + * @return SMTP + */ + public function setSMTPInstance(SMTP $smtp) + { + $this->smtp = $smtp; + + return $this->smtp; + } + + /** + * Send mail via SMTP. + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * + * @see PHPMailer::setSMTPInstance() to use a different class. + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function smtpSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + $bad_rcpt = []; + if (!$this->smtpConnect($this->SMTPOptions)) { + throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + //Sender already validated in preSend() + if ('' === $this->Sender) { + $smtp_from = $this->From; + } else { + $smtp_from = $this->Sender; + } + if (!$this->smtp->mail($smtp_from)) { + $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); + throw new Exception($this->ErrorInfo, self::STOP_CRITICAL); + } + + $callbacks = []; + //Attempt to send to all recipients + foreach ([$this->to, $this->cc, $this->bcc] as $togroup) { + foreach ($togroup as $to) { + if (!$this->smtp->recipient($to[0], $this->dsn)) { + $error = $this->smtp->getError(); + $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']]; + $isSent = false; + } else { + $isSent = true; + } + + $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]]; + } + } + + //Only send the DATA command if we have viable recipients + if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) { + throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL); + } + + $smtp_transaction_id = $this->smtp->getLastTransactionID(); + + if ($this->SMTPKeepAlive) { + $this->smtp->reset(); + } else { + $this->smtp->quit(); + $this->smtp->close(); + } + + foreach ($callbacks as $cb) { + $this->doCallback( + $cb['issent'], + [[$cb['to'], $cb['name']]], + [], + [], + $this->Subject, + $body, + $this->From, + ['smtp_transaction_id' => $smtp_transaction_id] + ); + } + + //Create error message for any bad addresses + if (count($bad_rcpt) > 0) { + $errstr = ''; + foreach ($bad_rcpt as $bad) { + $errstr .= $bad['to'] . ': ' . $bad['error']; + } + throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE); + } + + return true; + } + + /** + * Initiate a connection to an SMTP server. + * Returns false if the operation failed. + * + * @param array $options An array of options compatible with stream_context_create() + * + * @throws Exception + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @return bool + */ + public function smtpConnect($options = null) + { + if (null === $this->smtp) { + $this->smtp = $this->getSMTPInstance(); + } + + //If no options are provided, use whatever is set in the instance + if (null === $options) { + $options = $this->SMTPOptions; + } + + //Already connected? + if ($this->smtp->connected()) { + return true; + } + + $this->smtp->setTimeout($this->Timeout); + $this->smtp->setDebugLevel($this->SMTPDebug); + $this->smtp->setDebugOutput($this->Debugoutput); + $this->smtp->setVerp($this->do_verp); + $hosts = explode(';', $this->Host); + $lastexception = null; + + foreach ($hosts as $hostentry) { + $hostinfo = []; + if ( + !preg_match( + '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/', + trim($hostentry), + $hostinfo + ) + ) { + $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry)); + //Not a valid host entry + continue; + } + //$hostinfo[1]: optional ssl or tls prefix + //$hostinfo[2]: the hostname + //$hostinfo[3]: optional port number + //The host string prefix can temporarily override the current setting for SMTPSecure + //If it's not specified, the default value is used + + //Check the host name is a valid name or IP address before trying to use it + if (!static::isValidHost($hostinfo[2])) { + $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]); + continue; + } + $prefix = ''; + $secure = $this->SMTPSecure; + $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure); + if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) { + $prefix = 'ssl://'; + $tls = false; //Can't have SSL and TLS at the same time + $secure = static::ENCRYPTION_SMTPS; + } elseif ('tls' === $hostinfo[1]) { + $tls = true; + //TLS doesn't use a prefix + $secure = static::ENCRYPTION_STARTTLS; + } + //Do we need the OpenSSL extension? + $sslext = defined('OPENSSL_ALGO_SHA256'); + if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) { + //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled + if (!$sslext) { + throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL); + } + } + $host = $hostinfo[2]; + $port = $this->Port; + if ( + array_key_exists(3, $hostinfo) && + is_numeric($hostinfo[3]) && + $hostinfo[3] > 0 && + $hostinfo[3] < 65536 + ) { + $port = (int) $hostinfo[3]; + } + if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { + try { + if ($this->Helo) { + $hello = $this->Helo; + } else { + $hello = $this->serverHostname(); + } + $this->smtp->hello($hello); + //Automatically enable TLS encryption if: + //* it's not disabled + //* we have openssl extension + //* we are not already using SSL + //* the server offers STARTTLS + if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) { + $tls = true; + } + if ($tls) { + if (!$this->smtp->startTLS()) { + throw new Exception($this->lang('connect_host')); + } + //We must resend EHLO after TLS negotiation + $this->smtp->hello($hello); + } + if ( + $this->SMTPAuth && !$this->smtp->authenticate( + $this->Username, + $this->Password, + $this->AuthType, + $this->oauth + ) + ) { + throw new Exception($this->lang('authenticate')); + } + + return true; + } catch (Exception $exc) { + $lastexception = $exc; + $this->edebug($exc->getMessage()); + //We must have connected, but then failed TLS or Auth, so close connection nicely + $this->smtp->quit(); + } + } + } + //If we get here, all connection attempts have failed, so close connection hard + $this->smtp->close(); + //As we've caught all exceptions, just report whatever the last one was + if ($this->exceptions && null !== $lastexception) { + throw $lastexception; + } + + return false; + } + + /** + * Close the active SMTP session if one exists. + */ + public function smtpClose() + { + if ((null !== $this->smtp) && $this->smtp->connected()) { + $this->smtp->quit(); + $this->smtp->close(); + } + } + + /** + * Set the language for error messages. + * The default language is English. + * + * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") + * Optionally, the language code can be enhanced with a 4-character + * script annotation and/or a 2-character country annotation. + * @param string $lang_path Path to the language file directory, with trailing separator (slash).D + * Do not set this from user input! + * + * @return bool Returns true if the requested language was loaded, false otherwise. + */ + public function setLanguage($langcode = 'en', $lang_path = '') + { + //Backwards compatibility for renamed language codes + $renamed_langcodes = [ + 'br' => 'pt_br', + 'cz' => 'cs', + 'dk' => 'da', + 'no' => 'nb', + 'se' => 'sv', + 'rs' => 'sr', + 'tg' => 'tl', + 'am' => 'hy', + ]; + + if (array_key_exists($langcode, $renamed_langcodes)) { + $langcode = $renamed_langcodes[$langcode]; + } + + //Define full set of translatable strings in English + $PHPMAILER_LANG = [ + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' . + ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' . + ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'data_not_accepted' => 'SMTP Error: data not accepted.', + 'empty_message' => 'Message body empty', + 'encoding' => 'Unknown encoding: ', + 'execute' => 'Could not execute: ', + 'extension_missing' => 'Extension missing: ', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'from_failed' => 'The following From address failed: ', + 'instantiate' => 'Could not instantiate mail function.', + 'invalid_address' => 'Invalid address: ', + 'invalid_header' => 'Invalid header name or value', + 'invalid_hostentry' => 'Invalid hostentry: ', + 'invalid_host' => 'Invalid host: ', + 'mailer_not_supported' => ' mailer is not supported.', + 'provide_address' => 'You must provide at least one recipient email address.', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'signing' => 'Signing Error: ', + 'smtp_code' => 'SMTP code: ', + 'smtp_code_ex' => 'Additional SMTP info: ', + 'smtp_connect_failed' => 'SMTP connect() failed.', + 'smtp_detail' => 'Detail: ', + 'smtp_error' => 'SMTP server error: ', + 'variable_set' => 'Cannot set or reset variable: ', + ]; + if (empty($lang_path)) { + //Calculate an absolute path so it can work if CWD is not here + $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; + } + + //Validate $langcode + $foundlang = true; + $langcode = strtolower($langcode); + if ( + !preg_match('/^(?P[a-z]{2})(?P + + + + + +
    + + + +
    + + +
    +
    +

    Der PlanetenwegSeit Juli 2010 verfügt die Stadt Welzheim über eine neue touristische Attraktion, + nämlich über einen so genannten Planetenweg. Auf ihm ist es im wahrsten Sinne des Wortes möglich, die + Dimensionen unserer näheren kosmischen Heimat, des Sonnensystems, anschaulich zu erwandern. Solche + Planetenwege oder –pfade sind nicht nur lehrreich, sondern auch der Gesundheit zuträglich. Man bewegt sich + in frischer Luft und erwandert dabei die gigantischen Dimensionen unseres Sonnensystems.

    +

    Planetenwege sind gewissermaßen maßstabsgetreue Modelle unseres Sonnensystems. Vom Zentralgestirn, nämlich + unserer Sonne ausgehend, sind sie in maßstabsgetreuen Abständen als „Planetenstationen“ aufgestellt. Mit + zunehmender Entfernung von der Sonne werden die Abstände von Station zu Station immer größer und die Gehzeit + wird immer länger vor allem, wenn man langsam aber stetig müder wird.

    +

    Der Welzheimer Planetenweg führt vom Parkplatz Laufenmühle hinauf an der Kesselgrotte vorbei zur Sternwarte + Welzheim. Die Positionen der Planeten sind durch Tafeln markiert, auf denen die wichtigsten Eigenschaften + und Kenndaten der einzelnen Wandelgestirne vermerkt sind. Acht große Planeten umkreisen unsere Sonne als + Zentralgestirn. In ihrem Abstand von der Sonne aufgezählt heißen sie:  Merkur, + Venus, Erde, Mars, Jupiter, + Saturn, Uranus und Neptun. Man kann sich die Reihenfolge + leicht durch folgenden Merkspruch einprägen: Mein Vater Erklärt + Mir Jeden Sonntag Unseren + Nachthimmel. Die Anfangsbuchstaben der Worte in diesem Satz entsprechen den + Anfangsbuchstaben der Planeten in ihrer Reihenfolge von der Sonne.

    +

    Auf dem rund zwei Kilometer langen Welzheimer Planetenpfad sind die Planetentafeln maßstabsgetreu in ihrem + Abstand vom Zentralgestirn, der Sonne, aufgestellt. Die Sonne ist dabei bei der Sternwarte Welzheim + lokalisiert. Die zweitausend Meter Länge des Planetenweges entsprechen in der Natur rund viereinhalb + Milliarden Kilometer. Die Tafel des fernsten Planeten, Neptun, steht am Parkplatz Laufenmühle, von wo man + starten kann. Neptun ist dreißig Mal weiter von der Sonne entfernt als die Erde. Nach einem relativ langen + Wegstück trifft man auf die Tafel des Planeten Uranus, die bei einem Brunnen steht, der inzwischen + „Uranus-Brunnen“ getauft wurde. Damit hat man bereits ein Drittel des Planetenpfades zurückgelegt. + Anschließend geht es steil bergan bis zum Planeten Saturn, der in zehnfacher Distanz Erde – Sonne das + Zentralgestirn umkreist. Damit sind bereits zwei Drittel des Weges zur Sonne und zur Sternwarte absolviert. + Bei einer Rastbank in der Siedlung Lettenstich stößt man auf die Tafel des Riesenplaneten Jupiter. Er + umkreist die Sonne in fünffachem Erdabstand einmal in zwölf Jahren. Weiter marschiert man am Waldrand + entlang in Richtung Sternwarte und stößt bald auf die Marstafel. Mars ist der äußere Nachbarplanet der Erde. + Nach wenigen Metern erreicht man schließlich die Tafel unseres Heimatplaneten. Ihr zur Seite steht noch die + Tafel unseres Erdmondes. Auch hier kann man kurz verweilen, ausruhen und die Texte der Tafeln studieren. + Auch enthält jede Tafel ein eindrucksvolles Bild des jeweiligen Planeten. Von der Erde ist es nun nicht mehr + weit zu den Tafeln von Venus, Merkur und der Sonne direkt bei der Sternwarte. Hinzu kommen zwei ansprechende + Tafeln, an denen man den aktuellen Sternenhimmel nach Datum und Uhrzeit selbst einstellen kann sowie die + Entstehung der Mondphasen anschaulich erklärt bekommt. Legt man den Planetenweg in einer halben Stunde + zurück, so entspricht dies in der Natur der achtfachen Lichtgeschwindigkeit!

    +

    Der Planetenweg ist erreichbar über die Landstraße 1080 von Rudersberg nach Welzheim. Beim Parkplatz + Laufenmühle stößt man auf die erste Tafel, die dem Planeten Neptun gewidmet ist.

    +

    Nähere Informationen zum Planetenweg mit seinen acht Stationen enthält ein Prospekt, den wir Ihnen hier zum + Download bereitstellen.

    +

    Machen Sie mit uns einen virtuellen Spaziergang von der Sternwarte zur Laufenmühle entlang dem + Planetenweg und zurück über das Edenbachtal.

    +

    +

    +
    Sternwarte Welzheim mit den Tafeln Planetenweg und Sonne
    +
    Sternwarte Welzheim
    +
    +
    +
    Planetenweg: Start Sternwarte +
    +
    Start Sternwarte
    +
    +
    +
    Merkur
    +
    Merkur
    +
    +
    +
    Venus
    +
    Venus
    +
    +

    +
    +

    +

    +
    Venus
    +
    Venus
    +
    +
    +
    Erde und Mond +
    +
    Erde und Mond
    +
    +
    +
    Mars
    +
    Mars
    +
    +
    +
    Entlang des Planetenweges
    +
    Entlang des Planetenweges
    +
    +

    +
    +

    +

    +
    Jupiter lädt ein zur Pause
    +
    Jupiter lädt ein zur Pause
    +
    +
    +
    Saturn
    +
    Saturn
    +
    +
    +
    Kesselgrotte +
    +
    Kesselgrotte
    +
    +
    +
    Erfrischung bei Uranus
    +
    Erfrischung bei Uranus
    +
    +

    +
    +

    +

    +
    Neptun weit draußen im All oder im Welzheimer Wald bei der Laufenmühle
    +
    Neptun weit draußen im All
    +
    +
    +
    Rückweg durch das Edenbachtal +
    +
    Rückweg durch das Edenbachtal
    +
    +
    +
    Rückweg durch das Edenbachtal +
    +
    Rückweg durch das Edenbachtal
    +
    +

    + Bilder: Stefan Seip
    +
    + Bilder von der offiziellen Einweihung des Planetenweges +
    + +
    +
    + + + diff --git a/html/sternwarte/planetenweg_eroeffnung.php b/html/sternwarte/planetenweg_eroeffnung.php new file mode 100755 index 0000000..0ca56de --- /dev/null +++ b/html/sternwarte/planetenweg_eroeffnung.php @@ -0,0 +1,98 @@ + + + + +Sternwarte Welzheim + + + + + + + + + + +
    + + +
    + + +
    + +
    +

    Die offizielle Einweihung des Planetenweges

    +

    Bilder der Einweihung vom 24.07.2010

    +
    +
    Einweihung des Planetenpfades
    +
     
    +
    + + +
    +
    Einweihung des Planetenpfades
    +
     
    +
    + + +
    +
    Einweihung des Planetenpfades
    +
     
    +
    + + +
    +
    Einweihung des Planetenpfades
    +
     
    +

    +
    Einweihung des Planetenpfades
    +
     
    +
    + +
    +
    Einweihung des Planetenpfades
    +
     
    +
    +
    +
    Einweihung des Planetenpfades
    +
     
    +
    +
    +
    Einweihung des Planetenpfades
    +
     
    +

    +
    Einweihung des Planetenpfades
    +
     
    +
    + +
    +
    Einweihung des Planetenpfades
    +
     
    +
    +
    +
    Einweihung des Planetenpfades
    +
     
    +
    +
    +
    Einweihung des Planetenpfades
    +
     
    +

    +
    Einweihung des Planetenpfades
    +
     
    +
    + +
    + +
    +
    + +
    + + diff --git a/html/sternwarte/rechts.php b/html/sternwarte/rechts.php new file mode 100755 index 0000000..25441d0 --- /dev/null +++ b/html/sternwarte/rechts.php @@ -0,0 +1,31 @@ +
    +

    Nächste Führung

    +

    + + (Führungen finden nur bei klarem Wetter statt) + +

    + +

    Aktuell

    +

    Partielle Mondfinsternis am 31.12.2009
    +Sonderfhrung um 18.30 Uhr

    +

    Aktuelle Himmelsergeinisse

    + +

    + + +

    + + + + +

    Astronomisches Jahr 2009

    + +
    + \ No newline at end of file diff --git a/html/sternwarte/rsh_excludes b/html/sternwarte/rsh_excludes new file mode 100644 index 0000000..479a639 --- /dev/null +++ b/html/sternwarte/rsh_excludes @@ -0,0 +1,20 @@ +video +wetter +kalender +phpmailer +intern/statistik/ +intern/sofue +checkfuehrung +HILFSProgramme +.git +DOCKER +HWeather +beoanswer +intern/anmeld/ +.idea +.DS_Store +.gitignore +.htaccess +wetterDBsave +OBSOLETE + diff --git a/html/sternwarte/skythumb1.jpg b/html/sternwarte/skythumb1.jpg new file mode 100644 index 0000000..5116d29 Binary files /dev/null and b/html/sternwarte/skythumb1.jpg differ diff --git a/html/sternwarte/sofi.php b/html/sternwarte/sofi.php new file mode 100755 index 0000000..a989945 --- /dev/null +++ b/html/sternwarte/sofi.php @@ -0,0 +1,91 @@ + + + + + + + + +Sternwarte Welzheim + + + + + + + + + + + + + +
    + + + + + +
    + + + + + +
    + + + +
    + +

    + + + + +

    +

    Der Schatten des Mondes fällt auf Welzheim
    + Sonnenfinsternis am Freitag, 20. März 2015

    +

    + + + + +

    +

    Die Sternwarte Welzheim lädt zum Besuch ein!

    +

    Herausragendes Himmelsereignis ist in diesem Monat eine totale Sonnenfinsternis. Am Freitag, 20. März tritt um 10:36 Uhr die Neumondphase ein. Der Mond kreuzt die Erdbahnebene von Nord nach Süd. Somit schiebt sich der dunkle Neumond vor die Sonne und bedeckt sie. Dabei fällt der Schatten des Mondes auf Teile der Erdoberfläche und verfinstert sie mehr oder minder stark. In den Vormittags- und Mittagsstunden ist die Sonnenfinsternis in ihren partiellen Phasen zu beobachten. In Welzheim beginnt dieses kosmische Schattenspiel um 9:29 Uhr. Zum Höhepunkt der Finsternis um 10:37 Uhr werden 71,4% der Sonnenscheibenfläche vom Neumond bedeckt. Die Finsternis endet in Welzheim um 11:49 Uhr.

    +

    Während in Europa und Nordwestafrika die Sonne nur teilweise verfinstert wird, so wird sie in der schmalen Zone, die der Kernschatten des Mondes überstreicht, völlig verdeckt. Es wird in der Totalitätszone so dunkel, dass man bei klarem Wetter Sterne sehen kann. Um die total verfinsterte Sonne leuchtet ein heller Strahlenkranz, die Korona. Sie ist die äußerste Atmosphärenschicht der Sonne und mit Temperaturen über eine Million Grad auch viel heißer als die Sonnenoberfläche.

    +

    Die Kernschattenspitze des Mondes berührt erstmals die Erdoberfläche im Nordatlantik, zieht in nordöstlicher Richtung zwischen den Britischen Inseln und Island hindurch, geht über die Färöer-Inseln und Spitzbergen. Sie verlässt die Erde schließlich in der Arktis nahe dem Nordpol. Zum Höhepunkt der totalen Verfinsterung um 10:46 Uhr zwischen Island und Skandinavien dauert die Totalität zwei Minuten und 47 Sekunden. Dies gilt für die Position auf der Zentrallinie der nur 463 Kilometer breiten Totalitätszone.

    +

    Die nächste von Welzheim aus beobachtbare Sonnenfinsternis findet erst am 10. Juni 2021 statt.

    +

    Die Sternwarte Welzheim ist bei wolkenlosem Himmel zur Beobachtung der Sonnenfinsternis am Freitag, 20. März 2015 in der Zeit von 9:00 bis 12:00 Uhr geöffnet.

    +

    Aus Anlass des bundesweiten „Tag der Astronomie“ wird am Samstag, 21. März 2015 bei jeder Wetterlage um 16 Uhr im Rahmen des „Tag der offenen Tür“ eine Sonderführung angeboten, an der Jung und Alt teilnehmen können. Es werden die Teleskope der Sternwarte sowie sonstige technische Einrichtungen vorgestellt sowie die Arbeit der Astronomen erläutert.

    +

    Bei sternklarem Himmel findet um 20 Uhr eine Sternführung am Großen Refraktor statt. Die Beobachtung der Planeten Venus und Jupiter bildet den Höhepunkt der Führung.

    +

    Text: Hans-Ulrich Keller +
    + + +

    +
    + +
    + + + +
    + + + + + diff --git a/html/sternwarte/sofianmeldung.php b/html/sternwarte/sofianmeldung.php new file mode 100644 index 0000000..c3c3279 --- /dev/null +++ b/html/sternwarte/sofianmeldung.php @@ -0,0 +1,492 @@ + + + + + Sternwarte Welzheim + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    + + + + id des Führungsdatums in der Datenbank-Tabelle + // Return: Datum/zeit-String + function holDate($fid) { + global $db; + $sql_sel = "SELECT uhrzeit FROM sofizeit where id = '$fid'"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + $ret = substr($data['uhrzeit'],0,5); + return $ret; + } + + // für die SoFi die Zeitslots mit der jeweiligen Anzahl der Besucher aus der DB hole + // Parameter - + // Return: Array mit den Daten + function getNextFuehrungen() { + global $db; + $sql_sel = "SELECT * FROM sofizeit order by uhrzeit ASC"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; + } + + // 'select'-Tag für die Führungen bauen + // Paramter: + // $fuehrungen -> Array mit den kommenden Führungen + // $maxP -> max. zugelassen Anzahl Besucher + // $selected -> + // Return: String mit dem HTML-Code + function bauNextFuehrungen($fuehrungen, $maxP, $selected) { + $r = "" . + ""; + return $r; + } + + // Zählen, wieviele Personen zu einem Führungstermin angemeldet sind + // Parameter: + // $fid -> id des Führungsdatum + // Return: Anzahl der Personen + function getCountsPerDate($fdate) { + global $db; + $sql_stmt = "SELECT besucher FROM sofizeit WHERE id='$fdate'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data['besucher']; + } + + // prüfen, og der User schon eine Buchung gemacht hat + // Geprüft wird die Email-Adresse. Es werden nur Buchungen in + // Zukunft geprüft. + function isDoppelBuchung($email) { + global $db; + $ret = []; + $ret['doppelt'] = false; + $now = date('Ymd'); + $sql_stmt = "SELECT * FROM anmeldungen WHERE email = '$email' AND fdatum >= $now"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data; + } + + // die kompletten Daten eines Teilnehmers anhand der ID ais der DB holen + + ?> + + +
    + '; + $stern_errors++; + } +// if (trim($stern_strasse) == '') { +// $stern_error_msg .= 'Bitte geben Sie eine Straße ein.
    '; +// $stern_errors ++; +// } +// +// if (trim($stern_plz) == '') { +// $stern_error_msg .= 'Bitte geben Sie eine Postleitzahl ein.
    '; +// $stern_errors ++; +// } +// if (! preg_match("/^[0-9]{5}$/", $stern_plz)) { +// $stern_error_msg .= 'Bitte geben Sie bei der Postleitzahl mindestens fünf Ziffern und keine Buchstaben ein.
    '; +// $stern_errors ++; +// } +// if (trim($stern_ort) == '') { +// $stern_error_msg .= 'Bitte geben Sie einen Ort ein.
    '; +// $stern_errors ++; +// } + if (!preg_match("/^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}/", + strtolower($stern_mail))) { + $stern_error_msg .= 'Bitte geben Sie eine gültige E-Mail-Adresse ein.
    '; + $stern_errors++; + } + $belegt = getCountsPerDate($stern_fdlink); + $rest = $maxBesucher-$belegt; + if((trim($stern_teil) + $belegt) > $maxBesucher) { + if ($rest <= 0) { + $stern_error_msg .= "Die Führung ist ausgebucht, $andererTermin
    "; + } else { + $stern_error_msg .= "Die Führung ist schon mit $belegt Personen belegt, es "; + if ($rest == 1) { + $stern_error_msg .= "kann nur noch 1 Person "; + } else { + $stern_error_msg .= "können höchstens noch $rest Personen "; + } + $stern_error_msg .= "angemeldet werden.
    "; + } + $stern_errors++; + } + + $teilnehmer = isDoppelBuchung($stern_mail); + if($teilnehmer != null) { + $stern_error_msg = "Dies ist eine Doppelbuchung. Sie wird nicht gespeichert.

    + Wenn Sie Ihre ursprüngliche Buchung ändern oder stornieren wollen, so senden Sie bitte eine Email an anmeldung@sternwarte.de
    +

    Abbruch

    "; + $stern_errors++; + } + + $nun = new DateTime("now"); + $oct24 = new DateTime("2022-10-24"); + if( $nun >= $oct24) { + $stern_error_msg .= "Die Anmeldung muss spätestens bis zum 24.10.2022 erfolgen."; + $stern_errors++; + } + + if ($stern_errors == 0) { + $sql_stmt = "INSERT INTO sofibesucher (name, vorname, strasse, plz, stadt, telefon, email, anzahl, fid, remarks, angemeldet)" . + " values('$stern_name', '$stern_vorname', '$stern_strasse', '$stern_plz', '$stern_ort', '$stern_tel'," . + "'$stern_mail', '$stern_teil', '$stern_fdlink', '$stern_remarks', CURDATE())"; + $ins = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $sql_stmt = "UPDATE sofizeit SET besucher = besucher + '$stern_teil' WHERE id = '$stern_fdlink'"; + $ins = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + + $person = $stern_teil == 1 ? "Person" : "Personen"; + $body = "\r\nName, Vorname: $stern_name, $stern_vorname \r\n" . + "Strasse: $stern_strasse \r\n" . + "Ort: $stern_plz $stern_ort \r\n" . + "Telefon: $stern_tel \r\n" . + "E-mail: $stern_mail \r\n" . + "Gewünschter Termin: $stern_zeit \r\n" . + "Personen: $stern_teil \r\n" . + "Bemerkungen: $stern_remarks \r\n"; + $bodya_txt = "Sehr geehrte Dame, sehr geehrter Herr, \r\n\r\n" . + "hiermit bestätigen wir Ihre Anmeldung zur Sonnenfinsternis-Führung am 25. Oktober 2022 " . + "auf der Sternwarte Welzheim für\r\n\r\n" . + "$stern_vorname $stern_name um $stern_zeit Uhr " . + "für $stern_teil $person." . + "\r\n\r\n" . + "Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit. \r\n". + "Ohne diese Bestätigung erfolgt ausnahmslos k e i n Einlass.\r\n\r\n" . + "Die Führung findet NUR bei klarem Himmel statt. Falls der Himmel bedeckt ist " . + "und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Beginn der Finsternis " . + "eine Email.\r\n\r\n" . + "Allen Teilnehmern/-innen wird dringend empfohlen, eine FFP2-Maske, die Mund und Nase " . + "bedeckt, zu tragen.\r\n\r\n" . + "Sollten Sie Fragen haben oder die Anmeldung stornieren wollen, senden Sie bitte eine Email" . + "an anmeldung@sternwarte-welzheim.de \r\n\r\n" . + "Mit freundlichen Grüßen\r\n\r\n" . + "Beobachterteam der Sternwarte Welzheim\r\n\r\n" . + "www.sternwarte-welzheim.de"; + $bodya_html = "

    Sehr geehrte Dame, sehr geehrter Herr,

    " . + "

    hiermit bestätigen wir Ihre Anmeldung zur Sonnenfinsternis-Führung am 25. Oktober 2022 " . + "auf der Sternwarte Welzheim für

    " . + "

    $stern_vorname $stern_name um $stern_zeit Uhr " . + "für $stern_teil $person.

    " . + "

    Bitte bringen Sie diese Bestätigung als Ausdruck oder digital zur Führung mit.
    ". + "Ohne diese Bestätigung erfolgt ausnahmslos kein Einlass.

    " . + "

    Die Führung findet nur bei klarem Himmel statt. Falls der Himmel bedeckt ist " . + "und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Beginn der Finsternis " . + "eine Email.

    " . + "

    Allen Teilnehmern/-innen wird dringend empfohlen, eine FFP2-Maske, die Mund und Nase " . + "bedeckt, zu tragen.

    " . + "

    Sollten Sie Fragen haben oder die Anmeldung stornieren wollen, senden Sie bitte eine Email" . + " an anmeldung@sternwarte-welzheim.de

    " . + "

    Mit freundlichen Grüßen
    " . + "Beobachterteam der Sternwarte Welzheim
    " . + "www.sternwarte-welzheim.de"; + + // Mail an den Anfragenden + mb_internal_encoding('UTF-8'); + $betreff = "Anmeldung zur Sonnenfinsternis-Führung auf der Sternwarte Welzheim"; + $betreff = mb_encode_mimeheader($betreff, 'UTF-8', 'Q'); + sendmail($betreff, $defaultabsender, $bodya_txt, [], ['anmeldung@sternwarte-welzheim.de'], [$stern_mail], $bodya_html); + + // Mail an einige BEOs und an die Liste + $beoliste = array( + //"andrea.ess@t-online.de", + //"sonderfuehrung@sternwarte-welzheim.de", + //"martin.gertz@gmx.de", + // "schittenhelm.klaus@gmx.de", + // "planetarium@stuttgart.de", + //"info@planetarium-stuttgart.de", + //"HUK@observatory-stuttgart.de", + "anmeldung@sternwarte-welzheim.de", + ); + $betreffBeo = "Anmeldung zur SoFi-Führung um $stern_zeit"; + $betreffBeo = mb_encode_mimeheader($betreffBeo, 'UTF-8', 'Q'); + sendmail($betreffBeo, $defaultabsender, $body, $beoliste, [], ["rexfue@gmail.com"]); + + $stern_meldung = "

    Vielen Dank für Ihre Anmeldung.

    + Wir freuen uns über Ihren Besuch auf der Sternwarte Welzheim zur Sonnenfinsternis
    +

    " . "am 25. Oktober 2022 um $stern_zeit" . + " Uhr mit $stern_teil $person. +

    + Wir haben Ihnen die Anmelde-Bestätigung per Email zugesandt (bitte sehen Sie ggf. auch in Ihrem Spam-Ordner nach).

    +

    Zurück

    "; + // Antwortseite + ?> + + ' . $stern_error_msg . '
    '; + } + // Wenn ein Fehler aufgetreten ist ($errors != 0), folgt jetzt der default Teil + // d.h. das Eingabeformular wird nochmals angezeigt mit einer Fehlermeldung. + // ---------------------------------------------------------------------------- + default: + ?> +
    +

    Anmeldung zur partiellen Sonnenfinsternis am 25. Oktober

    +

    Diese partielle Sonnenfinsternis dauert in Welzheim von 11:13 Uhr bis 13:11 Uhr. + Zur Beobachtung führen wir Zeitscheiben ein, für die Sie sich jeweils anmelden können. + Jede Zeitscheibe hat eine Dauer von 30min, in dieser Zeit können Sie einen Blick durch das Fernrohr werfen.
    + Außerhalb Ihrer gebuchten Zeitscheibe können Sie selbstverständlich vor der Sternwarte + die Finsternis weiter beobachten. +

    +

    + ACHTUNG:
    Niemals direkt und ungeschützt in die Sonne sehen! Schwere Augenschäden bis + zur vollkommenen Erblindung drohen!
    Schon gar nicht ein Fernglas oder Teleskop auf die Sonne richten, + wenn es nicht über spezielle Filter oder entsprechende Sonnenbeobachtungseinrichtungen verfügt. Sonnenbrillen, + berußte Gläser, geschwärzte Filme, CDs, Solarienbrillen, Verpackungsfolien, Neutral- oder Polarisationsfilter + bieten keinen ausreichenden Schutz. Im Fachhandel gibt es spezielle Sonnensichtbrillen (auch „Sofi-Brillen“ genannt) + zu beziehen, die nur zwei bis drei Euro kosten. +

    +
    +

    + Wegen der Corona-Pandemie dürfen nur angemeldeten Personen an einer Führung in der + Sternwarte Welzheim teilnehmen. Bitte geben Sie unten Ihre Kontaktdaten an. + Nach Maßgabe der aktuellen Corona-Verordnung werden Ihre Daten vier Wochen gespeichert + und anschließend gelöscht. +

    +

    + An einer Führung dürfen nur maximal Personen teilnehmen. + Sollte die von Ihnen ausgewählte Führung bereits ausgebucht sein, wählen Sie bitte + einen anderen Termin. +

    +

    + Wenn Sie alle Felder ausgefüllt und abgeschickt haben (mit dem "Anmeldung senden"-Knopf), + erhalten Sie eine Anmeldebestätigung per e-mail. Diese bitte unbedingt zur Führung + ausgedruckt oder in digitaler Form mitbringen! + +

    Ohne die mitgebrachte Anmeldebestätigung erfolgt ausnahmslos + k e i n Einlass. +
    +

    +

    + Allen Teilnehmern/-innen wird dringend empfohlen, eine + FFP2-Maske, die Mund und Nase bedeckt, zu tragen. +

    +
    +

    + Bitte beachten Sie, dass der Weg zur Sternwarte Welzheim mit + Kraftfahrzeugen nicht befahren werden darf. Sie können + Ihre Fahrzeuge auf dem Parkplatz der Sternwarte abstellen. Von hier + führt ein 430 m langer Fußweg zur Sternwarte. +

    +

    Die Fernrohre in den Beobachtungskuppeln sind nur über Treppen zu + erreichen. Es besteht leider keine Möglichkeit, Rollstühle in die + Kuppeln mitzunehmen. Für Kleinkinder sind Sternführungen nicht + geeignet.

    +

    Betrieb und Arbeit auf der Sternwarte erfolgen ehrenamtlich. + Unterhalt und Aktivitäten auf der Sternwarte sind nur durch + Ihre Unterstützung möglich. Wir bitten daher um eine ensprechende Spende. +

    +

    + +

    + Anmeldung: + (Alle Felder mit '*' müssen ausgefüllt werden)
    +
    + +
    +
    + + +
    +
    Bitte beachten Sie, dass eine + Anmeldung muss bis spätestens 24.Oktober 2022 erfolgt sein muss!
    + Schon belegte Termine können nicht ausgewählt werden (sie werden grau dargestellt). +
    +

    + + +
    + + +
    +
    + + +
    + + + +
    + + +
    +
    + + +
    +
    + + + " id="teil" class="textfeld20"/>
    +
    + +
    + +
    +
    +
    + + Die Führung findet nur bei klarem Wetter statt.
    +

    + Sollten Sie eine Änderung oder Stornierung ihrer Anmeldung wünschen, senden Sie bitte eine E-mail an anmeldung@sternwarte-welzheim.de. + Wenn Sie an dem gebuchten Termin verhindert sind, bitten wir Sie, rechtzeitig eine Abmeldung zu senden. +

    +

    + Das Betreten der Sternwarte erfolgt auf eigene + Gefahr. Die Sternführung wird von ehrenamtlichen + Kräften durchgeführt. Bei Ausfall einer Führung kann kein Schadenersatz + geleistet werden. +

    + +
    + + +
    + +

    +

    + Hinweis zum Datenschutz: Datenschutzerklärung +

    +

    Letzte Änderungen: 2022-08-17 rxf

    + +
    +
    + + +
    + +
    + + +
    + + + diff --git a/html/sternwarte/sonderfuehrungen.php b/html/sternwarte/sonderfuehrungen.php new file mode 100644 index 0000000..647ab2e --- /dev/null +++ b/html/sternwarte/sonderfuehrungen.php @@ -0,0 +1,532 @@ + + + + + Sternwarte Welzheim + + + + + + + + + +
    + + + +
    + + +
    +
    +
    + Bitte geben Sie eine gültige Empfänger-Adresse ein.'; + * $stern_errors++; + * } + */ + if (trim($stern_name) == '') { + $stern_error_msg .= 'Bitte geben Sie Ihren Namen ein.
    '; + $stern_errors++; + } + /* if (trim($stern_vorname) == '') { + $stern_error_msg .= 'Bitte geben Sie Ihren Vornamen ein.
    '; + $stern_errors ++; + } + */ + if (trim($stern_strasse) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Straße ein.
    '; + $stern_errors ++; + } + + if (trim($stern_plz) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Postleitzahl ein.
    '; + $stern_errors ++; + } + if (! preg_match("/^[0-9]{5}$/", $stern_plz)) { + $stern_error_msg .= 'Bitte geben Sie bei der Postleitzahl mindestens fünf Ziffern und keine Buchstaben ein.
    '; + $stern_errors ++; + } + if (trim($stern_ort) == '') { + $stern_error_msg .= 'Bitte geben Sie einen Ort ein.
    '; + $stern_errors ++; + } + if (trim($stern_tel) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Telefonnummer ein.
    '; + $stern_errors ++; + } + if (trim($stern_datum) == '' || ($stern_datum) == '(TT.MM.JJJJ)') { + $stern_error_msg .= 'Bitte geben Sie Ihren Wunschtermin mit Uhrzeit ein.
    '; + $stern_errors++; + } + if (trim($stern_uhr) == '') { + $stern_error_msg .= 'Bitte geben Sie Ihren Wunschtermin mit Uhrzeit ein.
    '; + $stern_errors++; + } + $lower_email = strtolower($stern_mail); + if (preg_match("/^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}/", $lower_email) === 0) { + $stern_error_msg .= "Bitte geben Sie eine gültige E-Mail-Adresse ein.
    "; + $stern_errors++; + } + if (trim($stern_teil) == '') { + $stern_error_msg .= 'Bitte geben Sie die Anzahl an Personen ein.
    '; + $stern_errors++; + } + if (trim($stern_teil) > 30) { + $stern_error_msg .= 'Höchstzahl der Teilnehmer/-innen überschritten, bitte korrigieren Sie Ihre Eingabe.
    '; + $stern_errors++; + } + if (trim($stern_kenntnis) == '') { + $stern_error_msg .= 'Bitte akzeptieren Sie die Bedingungen unseres Merkblattes.
    '; + $stern_errors++; + } + /* if (trim($stern_allwett) == '') { + $stern_error_msg .= 'Bitte Art der Führung (Allwetter ja/nein) ankreuzen.
    '; + $stern_errors ++; + } + */ + if ($stern_errors == 0) { + $stern_terminuhr = $stern_datum . " " . $stern_uhr; + $body = "\n\n Name, Vorname: $stern_name, $stern_vorname \n Verein / Organisation : $stern_verein \n Strasse: $stern_strasse \n Ort: $stern_plz $stern_ort \n Telefon: $stern_tel \n E-mail: $stern_mail \n Gewünschter Termin: $stern_datum, $stern_uhr \n Personen: $stern_teil \n\n Weitere Fragen oder Mitteilungen: $stern_mitteilung +\nSpendenbescheinigung: $stern_spende \n"; + // Änderungen rxf + $dti = explode(' ', $stern_terminuhr); + $d1 = explode('.', $dti[1]); + $termin1 = $d1[2] . '-' . $d1[1] . '-' . $d1[0] . ' ' . $dti[2]; + $aktdat = date("Y-m-d H:i:s"); + $sql_stmt = "INSERT INTO SoFue2 (verein, name, vorname, strasse, plz, ort, telefon, " . + "email, wtermin, atermin, anzahl, mitteilung, spende, mitarbeiter, status, anmelde_datum, " . + "bemerkung, erledigt_datum, owtermin, oatermin)" . + " values('$stern_verein', '$stern_name', '$stern_vorname', '$stern_strasse', '$stern_plz', '$stern_ort', '$stern_tel', " . + "'$stern_mail', '$termin1', '1900-01-01', '$stern_teil', '$stern_mitteilung', '$stern_spende', '', '0','$aktdat', " . + "'', '1900-01-01', '$termin1', '1900-01-01')"; + $ins = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + // bis hier + $bodya = "Guten Tag, + +vielen Dank für Ihre Anfrage. Wir freuen uns über Ihr Interesse an der Sternwarte Welzheim und Ihren Wunsch nach einer Sonderführung. + +Wir bemühen uns, Ihnen innerhalb einer Woche Bescheid zu geben, ob einer unserer freien Mitarbeiter/-innen die Sonderführung außerhalb unserer öffentlichen Sternführungen übernehmen kann. + + +Mit freundlichen Grüßen + +Beobachterteam der Sternwarte Welzheim + +................................................................................................ +www.sternwarte-welzheim.de"; + if ($stern_mail != "") { + $mail_from = $stern_mail; + } else { + $mail_from = "noreply@sternwarte-welzheim.de"; + } + $betreff = "Anfrage Sonderführung auf der Sternwarte Welzheim"; + $betreffBeo = "Anfrage für Sonderführung am $stern_terminuhr"; + // Mail an den Anfragenden + sendmail($betreff, $defaultabsender, $bodya, [], ['rexfue@gmail.com'], [$stern_mail]); + // Mail an einige BEOs und an die Liste + $beoliste = array( + "andrea.ess@t-online.de", + "sonderfuehrung@sternwarte-welzheim.de", + "martin.gertz@gmx.de", + "info@planetarium-stuttgart.de", + "HUK@observatory-stuttgart.de", + ); + sendmail($betreffBeo, $defaultabsender, $body, $beoliste, [], ['anmeldungen@sternwarte.rexfue.de'] ); + + $stern_meldung = "

    Vielen Dank für Ihre Anfrage. Wir freuen uns über Ihr Interesse an +der Sternwarte Welzheim und Ihren Wunsch nach einer Sonderführung.

    + + Wir bemühen uns, Ihnen innerhalb einer Woche Bescheid zu geben, ob +einer unserer freien Mitarbeiter/-innen die Sonderführung außerhalb unserer + öffentlichen Sternführungen übernehmen kann."; + // Antwortseite + ?> + + ' . $stern_error_msg . '
    '; + } + // Wenn ein Fehler aufgetreten ist ($errors != 0), folgt jetzt der default Teil + // d.h. das Eingabeformular wird nochmals angezeigt mit einer Fehlermeldung. + // ---------------------------------------------------------------------------- + default: + ?> +

    Sonderführungen auf der Sternwarte Welzheim

    +

    Die Führungen werden von den + ehrenamtlich tätigen Mitgliedern der BEOBACHTERGRUPPE STERNWARTE + WELZHEIM abgehalten. Wenn Sie eine Sonderführung für Ihre Gruppe + wünschen, füllen Sie bitte nachstehendes Formular aus. Sie erhalten + dann innerhalb einer Woche eine Mitteilung, ob Ihrem Wunsch + entsprochen werden kann. +

    +

    Die Führungen auf der Sternwarte Welzheim finden nur bei + sternklarem Himmel statt. Die Gruppengröße ist auf + Personen begrenzt. +

    +

    + Bitte beachten Sie, dass der Weg zur Sternwarte Welzheim mit + Kraftfahrzeugen nicht befahren werden darf. Sie können + Ihre Fahrzeuge auf dem Parkplatz der Sternwarte abstellen. Von hier + führt ein 430 m langer Fußweg zur Sternwarte. Die Temperatur in den + Beobachtungskuppeln entspricht der Außentemperatur. Besonders in + kalten Winternächten ist warme Bekleidung und warmes Schuhwerk + dringend zu empfehlen. +

    +

    Die Fernrohre in den Beobachtungskuppeln sind nur über Treppen zu + erreichen. Es besteht leider keine Möglichkeit, Rollstühle in die + Kuppeln mitzunehmen. Für Kleinkinder sind Sternführungen nicht + geeignet. +

    +

    Betrieb und Arbeit auf der Sternwarte erfolgen ehrenamtlich. + Unterhalt und Aktivitäten auf der Sternwarte werden durch + Spenden ermöglicht. Wir bitten daher bei einer Sonderführung + um eine Spende in Höhe von 3,- € pro Person, mindestens jedoch 50,- €, an die +

    +

    Gesellschaft zur Förderung des Planetariums Stuttgart und der Sternwarte Welzheim e.V.
    + Bankverbindung: Deutsche Bank AG Stuttgart IBAN DE 18 6007 0070 0122 0383 00
    + BIC: DEUTDESSXXX +

    +

    Auf Wunsch kann eine Spendenbescheinigung ausgestellt werden, da + die Planetariumsgesellschaft vom Finanzamt Stuttgart-Körperschaften als gemeinnützig + anerkannt ist.

    +

    +  

    +

    +

    + Unsere Sternwarte bleibt bis voraussichtlich 14. November 2025 wegen neuer technischer Einrichtung + geschlossen.
    Bis dahin können keine Führungen durchgeführt werden. +

    + + Unverbindliche Anfrage zu einer Sonderführung auf der + Sternwarte Welzheim
    +
    +
    + + Die mit einem * gekennzeichneten Felder + sind unbedingt auszufüllen. +

    +
    +
    + +
    + +


    +
    +

    + + + maxlength="120" + name="teil" value="" id="teil" + class="textfeld20"/>
    +

    + CURDATE()"; + // $result = mysqli_query($db, $query) or die (mysqli_error($db)); + // $erg = array(); + // if (mysqli_num_rows($result)) { + // while ($row = mysqli_fetch_assoc($result)) { + // $erg[] = $row['DATE(wtermin)']; + // } + // } + // return $erg; + // } + + // Prüfen, ob an dem Datum eine Sonderführung in der DB steht + function checkSonderFuehrung($d) + { + global $db; + $query = "SELECT * FROM SoFue2 WHERE DATE(wtermin) = '$d'"; + $result = mysqli_query($db, $query) or die (mysqli_error($db)); + $belegt = true; + if (mysqli_num_rows($result)) { + while ($row = mysqli_fetch_assoc($result)) { + if (($row['status'] == 3) || ($row['deleted'] == 1)) { + $belegt = false; + } + } + return $belegt; + } + return false; + } + + // Prüfen, ob an dem Datum eine regläre Führung statt findet + function checkRegulaereFuehrung($d) + { + global $db; + $query = "SELECT id FROM fdatum1 WHERE datum = '$d'"; + $result = mysqli_query($db, $query) or die (mysqli_error($db)); + if ($result->num_rows != 0) { + return true; + } + return false; + } + + // Prüfen, ob an dem Datum ein Kalenderintage vorhanden ist + function checkKalender($d) + { + global $db; + $query = "SELECT id FROM kalender WHERE DATE(start) = '$d'"; + $result = mysqli_query($db, $query) or die (mysqli_error($db)); + if ($result->num_rows != 0) { + return true; + } + return false; + } + + function checkExtraDate($dt) + { + $extradates = [ + '2023-12-24','2023-12-31' + ]; + global $db; + foreach($extradates as $d) { + if ($d == $dt) { + return true; + } + } + return false; + } + + function checkBelegt($td) + { + $y = substr($td, 6); + $m = substr($td, 3, 2); + $d = substr($td, 0, 2); + $dint = intval($y . $m . $d); + if (checkRegulaereFuehrung($dint) == true) { + return true; + } + $dt = $y . "-" . $m . "-" . $d; + if (checkSonderFuehrung($dt)) { + return true; + }; + if (checkKalender($dt)) { + return true; + } + if(checkExtraDate($dt)) { + return true; + } + return false; + } + + function selectTime($uh, $st_uh) + { + $r = ""; + echo $r; + } + + function selectDate($da, $st_da, $wt) + { + $ast = "*"; + $r = " + "; + echo $r; + } + + ?> + + + +
    + + Bitte beachten Sie, dass ein Sonderführungstermin frühestens in 14 Tagen unsererseits organisiert + werden kann. Nicht angezeige Termine sind schon belegt. +

    + Eine Sternführung findet nur bei sternklarem Wetter statt. +

    + Weitere Mitteilungen und Fragen an uns: + + +

    +

    + + Wir wünschen eine Spendenbescheinigung
    />
    /> +

    Das Betreten der Sternwarte erfolgt auf eigene + Gefahr. Die Sternführung ist eine Sonderleistung ehrenamtlicher + Kräfte. Bei Ausfall einer Sonderführung kann kein Schadenersatz + geleistet werden.

    + + +


    +
    + +
    + + +



    Hinweis zum Datenschutz: + Datenschutzerklärung

    +

    Letzte Änderungen: 2025-10-22 rxf

    +
    +
    + + +
    + +
    + + + + + diff --git a/html/sternwarte/sonderfuehrungen.php_404_1 b/html/sternwarte/sonderfuehrungen.php_404_1 new file mode 100644 index 0000000..d86a7e9 --- /dev/null +++ b/html/sternwarte/sonderfuehrungen.php_404_1 @@ -0,0 +1,536 @@ + + + + + Sternwarte Welzheim + + + + + + + + + +
    + + + +
    + + +
    +
    +
    + Bitte geben Sie eine gültige Empfänger-Adresse ein.'; + * $stern_errors++; + * } + */ + if (trim($stern_name) == '') { + $stern_error_msg .= 'Bitte geben Sie Ihren Namen ein.
    '; + $stern_errors++; + } + /* if (trim($stern_vorname) == '') { + $stern_error_msg .= 'Bitte geben Sie Ihren Vornamen ein.
    '; + $stern_errors ++; + } + if (trim($stern_strasse) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Straße ein.
    '; + $stern_errors ++; + } + + if (trim($stern_plz) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Postleitzahl ein.
    '; + $stern_errors ++; + } + if (! preg_match("/^[0-9]{5}$/", $stern_plz)) { + $zvw_error_msg .= 'Bitte geben Sie bei der Postleitzahl mindestens fünf Ziffern und keine Buchstaben ein.
    '; + $zvw_errors ++; + } + if (trim($stern_ort) == '') { + $stern_error_msg .= 'Bitte geben Sie einen Ort ein.
    '; + $stern_errors ++; + } + + if (trim($stern_tel) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Telefonnummer ein.
    '; + $stern_errors ++; + } + */ + if (trim($stern_datum) == '' || ($stern_datum) == '(TT.MM.JJJJ)') { + $stern_error_msg .= 'Bitte geben Sie Ihren Wunschtermin mit Uhrzeit ein.
    '; + $stern_errors++; + } + if (trim($stern_uhr) == '') { + $stern_error_msg .= 'Bitte geben Sie Ihren Wunschtermin mit Uhrzeit ein.
    '; + $stern_errors++; + } + if (preg_match("/^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}/", $stern_mail) === 0) { + $stern_error_msg .= "Bitte geben Sie eine gültige E-Mail-Adresse ein.
    "; + $stern_errors++; + } + if (trim($stern_teil) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Teilnehmerzahl ein.
    '; + $stern_errors++; + } + if (trim($stern_teil) > 30) { + $stern_error_msg .= 'Höchstzahl der Teilnehmer überschritten, bitte korrigieren Sie Ihre Eingabe.
    '; + $stern_errors++; + } + if (trim($stern_kenntnis) == '') { + $stern_error_msg .= 'Bitte akzeptieren Sie die Bedingungen unseres Merkblattes.
    '; + $stern_errors++; + } + /* if (trim($stern_allwett) == '') { + $stern_error_msg .= 'Bitte Art der Führung (Allwetter ja/nein) ankreuzen.
    '; + $stern_errors ++; + } + */ + if ($stern_errors == 0) { + $stern_terminuhr = $stern_datum . " " . $stern_uhr; + $body = "\n\n Name, Vorname: $stern_name, $stern_vorname \n Verein / Organisation : $stern_verein \n Strasse: $stern_strasse \n Ort: $stern_plz $stern_ort \n Telefon: $stern_tel \n E-mail: $stern_mail \n Gewünschter Termin: $stern_datum, $stern_uhr \n Teilnehmerzahl ca.: $stern_teil \n\n Weitere Fragen oder Mitteilungen: $stern_mitteilung +\nSpendenbescheinigung: $stern_spende \n"; + // Änderungen rxf + $dti = explode(' ', $stern_terminuhr); + $d1 = explode('.', $dti[1]); + $termin1 = $d1[2] . '-' . $d1[1] . '-' . $d1[0] . ' ' . $dti[2]; + $aktdat = date("Y-m-d H:i:s"); + $sql_stmt = "INSERT INTO SoFue2 (verein, name, vorname, strasse, plz, ort, telefon, " . + "email, wtermin, atermin, anzahl, mitteilung, spende, mitarbeiter, status, anmelde_datum, " . + "bemerkung, erledigt_datum, owtermin, oatermin)" . + " values('$stern_verein', '$stern_name', '$stern_vorname', '$stern_strasse', '$stern_plz', '$stern_ort', '$stern_tel', " . + "'$stern_mail', '$termin1', '1900-01-01', '$stern_teil', '$stern_mitteilung', '$stern_spende', '', '0','$aktdat', " . + "'', '1900-01-01', '$termin1', '1900-01-01')"; + $ins = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + // bis hier + $bodya = "Sehr geehrte Dame, sehr geehrter Herr, + +vielen Dank für Ihre Anfrage. Wir freuen uns über Ihr Interesse an der Sternwarte Welzheim und Ihren Wunsch nach einer Sonderführung. + +Wir bemühen uns, Ihnen innerhalb einer Woche Bescheid zu geben, ob einer unserer freien Mitarbeiter/-innen die Sonderführung außerhalb unserer öffentlichen Sternführungen übernehmen kann. + + +Mit freundlichen Grüßen + +Beobachterteam der Sternwarte Welzheim + +................................................................................................ +www.sternwarte-welzheim.de"; + if ($stern_mail != "") { + $mail_from = $stern_mail; + } else { + $mail_from = "noreply@sternwarte-welzheim.de"; + } + $betreff = "Anfrage Sonderführung auf der Sternwarte Welzheim"; + $betreffBeo = "Anfrage für Sonderführung in Welzheim am $stern_terminuhr"; + // Mail an den Anfragenden + sendmail($betreff, $defaultabsender, $bodya, [], ['rexfue@gmail.com'], [$stern_mail]); + // Mail an einige BEOs und an die Liste + $beoliste = array( + "andrea.ess@t-online.de", + "sonderfuehrung@sternwarte-welzheim.de", + "martin.gertz@gmx.de", + "info@planetarium-stuttgart.de", + "HUK@observatory-stuttgart.de", + ); + sendmail($betreffBeo, $defaultabsender, $body, $beoliste, [], ["rexfue@gmail.com"] ); + + $stern_meldung = "

    Vielen Dank für Ihre Anfrage. Wir freuen uns über Ihr Interesse an +der Sternwarte Welzheim und Ihren Wunsch nach einer Sonderführung.

    + + Wir bemühen uns, Ihnen innerhalb einer Woche Bescheid zu geben, ob +einer unserer freien Mitarbeiter/-innen die Sonderführung außerhalb unserer + öffentlichen Sternführungen übernehmen kann."; + // Antwortseite + ?> + + ' . $stern_error_msg . '
    '; + } + // Wenn ein Fehler aufgetreten ist ($errors != 0), folgt jetzt der default Teil + // d.h. das Eingabeformular wird nochmals angezeigt mit einer Fehlermeldung. + // ---------------------------------------------------------------------------- + default: + ?> +

    + Sonderführungen auf der Sternwarte Welzheim +

    +

    + Auf der Sternwarte Welzheim können außerhalb der regulären + Sternführungen für Gruppen bis zu maximal Personen + Sonderführungen veranstaltet werden. Die Führungen werden von den + ehrenamtlich tätigen Mitgliedern der BEOBACHTERGRUPPE STERNWARTE + WELZHEIM abgehalten. Wenn Sie eine Sonderführung für Ihre Gruppe + wünschen, füllen Sie bitte nachstehendes Formular aus. Sie erhalten + dann innerhalb einer Woche eine Mitteilung, ob Ihrem Wunsch + entsprochen werden kann. +

    +
    +

    +

    ******* ACHTUNG *******
    + Ab sofort können Sonderführungen in der Sternwarte Welzheim für + Gruppen bis maximal Personen angemeldet werden.
    + Voraussetzung ist, dass der/die Gruppenleiter/-in Name, Anschrift und + Telefon-Nummer bekannt gibt und er/sie diese Daten von allen + Teilnehmern kennt. +

    +

    Zur Zeit git die 2G-Regel, d.h. es haben nur Personen Zutritt, die nachweislich gegen Corona geimpft oder genesen sind. + Ein 2G-Zertifikat muss vorgelegt werden.
    + Aus diesem Grund können auch nur Kinder im schulpflichtigen Alter die Sternwarte besuchen. +

    +

    + Die Hygienevorschriften sind zu beachten: die Teilnehmer müssen eine medizinische Maske, die + Mund und Nase bedeckt, tragen + und den vorgeschriebenen Abstand halten. + Nicht teilnehmen dürfen Personen, die in den letzten vierzehn Tagen Kontakt + mit einem Coronavirus-Infizierten hatten oder Infektionssymptome zeigen. +

    +
    +

    Die Führungen auf der Sternwarte Welzheim finden nur bei + sternklarem Himmel statt.

    +

    + Bitte beachten Sie, dass der Weg zur Sternwarte Welzheim mit + Kraftfahrzeugen nicht befahren werden darf. Sie können + Ihre Fahrzeuge auf dem Parkplatz der Sternwarte abstellen. Von hier + führt ein 430 m langer Fußweg zur Sternwarte. Die Temperatur in den + Beobachtungskuppeln entspricht der Außentemperatur. Besonders in + kalten Winternächten ist warme Bekleidung und warmes Schuhwerk + dringend zu empfehlen. +

    +

    Die Fernrohre in den Beobachtungskuppeln sind nur über Treppen zu + erreichen. Es besteht leider keine Möglichkeit, Rollstühle in die + Kuppeln mitzunehmen. Für Kleinkinder sind Sternführungen nicht + geeignet.

    +

    Betrieb und Arbeit auf der Sternwarte erfolgen ehrenamtlich. + Unterhalt und Aktivitäten auf der Sternwarte werden durch + Spenden ermöglicht. Wir bitten daher bei einer Sonderführung + um eine Spende in Höhe von 3,- € pro Person, mindestens jedoch 50,- €, an die Gesellschaft zur Förderung + des Planetariums Stuttgart und der Sternwarte Welzheim e.V.

    +

    + Bankverbindung: Deutsche Bank AG Stuttgart IBAN DE 18 6007 0070 0122 + 0383 00
    BIC: DEUTDESSXXX
    +

    +

    Auf Wunsch kann eine Spendenbescheinigung ausgestellt werden, da + die Planetariumsgesellschaft vom Finanzamt Stuttgart-Körperschaften als gemeinnützig + anerkannt ist.

    +

    +  

    +

    + Unverbindliche Anfrage zu einer Sonderführung auf der + Sternwarte Welzheim
    +

    +
    + + Die mit einem * gekennzeichneten Felder + sind unbedingt auszufüllen. +

    +
    +
    + +
    + +


    +
    +

    + + + maxlength="120" + name="teil" value="" id="teil" + class="textfeld20"/>
    +

    + CURDATE()"; + $result = mysqli_query($db, $query) or die (mysqli_error($db)); + $erg = array(); + if (mysqli_num_rows($result)) { + while ($row = mysqli_fetch_assoc($result)) { + $erg[] = $row['DATE(wtermin)']; + } + } + return $erg; + } + + // Führungs-Datum prüfen + function checkfdate($d) + { + global $db; +// print $d . " " ; + $query = "SELECT id FROM fdatum1 WHERE datum = '$d'"; + $result = mysqli_query($db, $query) or die (mysqli_error($db)); + if ($result->num_rows != 0) { + return true; + } + return false; + } + + function getBEOSitzung() + { + global $db; + $query = "SELECT DATE(start) from kalender where title like 'BEO%'"; + $result = mysqli_query($db, $query) or die (mysqli_error($db)); + $erg = array(); + if (mysqli_num_rows($result)) { + while ($row = mysqli_fetch_assoc($result)) { + $erg[] = $row['DATE(start)']; + } + } + return $erg; + } + + function checkBelegt($td) + { + $zg = getNextFuehrungen(); + $y = substr($td, 6); + $m = substr($td, 3, 2); + $d = substr($td, 0, 2); + $dint = intval($y . $m . $d); + if (checkfdate($dint) == true) { // falls das ein reguläres Führungsdatum ist, ausgrauen + return true; + } +// print "Y: " . $y . " m: " . $m . " d: " . $d; + $dt = $y . "-" . $m . "-" . $d; +// print "New: " . $dt . " zg[i]: " . $zg[0] . "\r\n"; + foreach ($zg as $onet) { // falls da schon eine Sonderführung ist, auch ausgrauen + if ($onet == $dt) { + return true; + } + } + $beos = getBEOSitzung(); + foreach ($beos as $b) { + if ($b == $dt) { + return true; + } + } + return false; + } + + function selectTime($uh, $st_uh) + { + $r = ""; + echo $r; + } + + function selectDate($da, $st_da, $wt) + { + $ast = "*"; + $r = " + "; + echo $r; + } + + ?> + + + +
    + + Bitte beachten Sie, dass ein Sonderführungstermin frühestens in 14 Tagen unsererseits organisiert + werden kann. Nicht angezeige Termine sind schon belegt. +

    + Eine Sternführung findet nur bei sternklarem Wetter statt. +

    + Weitere Mitteilungen und Fragen an uns: + + +

    +

    + + Wir wünschen eine Spendenbescheinigung
    />
    /> +

    Das Betreten der Sternwarte erfolgt auf eigene + Gefahr. Die Sternführung ist eine Sonderleistung ehrenamtlicher + Kräfte. Bei Ausfall einer Sonderführung kann kein Schadenersatz + geleistet werden.

    + + +


    +
    + +
    + + +



    Hinweis zum Datenschutz: + Datenschutzerklärung

    +

    Letzte Änderungen: 2021-11-29 rxf

    +
    +
    + + +
    + +
    + + + + + diff --git a/html/sternwarte/sonnenfuehrung.php b/html/sternwarte/sonnenfuehrung.php new file mode 100644 index 0000000..bb5c78a --- /dev/null +++ b/html/sternwarte/sonnenfuehrung.php @@ -0,0 +1,491 @@ + + + + + Sternwarte Welzheim + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    + + + + Wochentag + // $dat -> Datum + // $ti -> Uhrzeit + // Return: Datuns/Zeit-String + function buildDate($dat) { + global $weekday, $showTime; + $dat = preg_replace('#^(\d{4})(\d{2})(\d{2})$#', '\3.\2.\1', $dat); + $r = substr($weekday,0,2) . ", " . $dat . " " . $showTime; + return $r; + } + + function holdasdatum($fid) { + global $db; + $sql_sel = "SELECT datum FROM sonnedatum where id = '$fid'"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + $data = $result->fetch_row()[0]; + return intval($data); + } + + // Aus der DB aus der Table 'sonnedatum' den Eintrag für $fid holen + // und als Datum/Zeit-String übergeben + // Parameter: + // $fid -> id des Führungsdatums in der Datenbank-Tabelle + // Return: Datum/zeit-String + function holDate($fid) { + global $db; + $sql_sel = "SELECT datum FROM sonnedatum where id = '$fid'"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + $ret = array(); + $ret[] = 'So'; + $ret[] = $data['datum']; + $ret[] = '11'; + $ret[] = buildDate($data['datum']); + return $ret; + } + + // die Daten der nächsten Führungen für $monthstoadd Monate in ein Array holen + // Parameter - + // Retunrn: Array mit allen Werte aus der Table + function getNextFuehrungen() { + global $db, $vorlauf, $monthstoadd; + $erg = array(); + $toadd = '+' . $vorlauf . 'hour'; + $dt = new DateTime($toadd); + $datum_heute = $dt->format('Ymd'); + $enddatum = new DateTime('now'); + $enddatum->modify($monthstoadd); + $enddatum = $enddatum->format('Ymd'); + $datum_heute = 20251114; //<<<<<<<<<<<<<<<<<<<<<<<<< + $sql_sel = "SELECT * FROM sonnedatum where datum >='$datum_heute' && datum <= '$enddatum' order by datum ASC"; + $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db)); + while ($row = mysqli_fetch_assoc($result)) { + foreach ($row as $key => $value) { + $entry[$key] = $value; + } + $erg[] = $entry; + } + return $erg; + } + + // 'select'-Tag für die Führungen bauen + // Paramter: + // $fuehrungen -> Array mit den kommenden Führungen + // Return: String mit dem HTML-Code + function bauNextFuehrungen($fuehrungen, $maxP, $selected) { + $r = "" . + ""; + return $r; + } + + // Zählen, wieviele Personen zu einem Führungstermin angemeldet sind + // Parameter: + // $fid -> id des Führungsdatum + // Return: Anzahl der Personen + function getCountsPerDate($fdate) { + global $db; + $sql_stmt = "SELECT SUM(anzahl) AS count FROM sonneanmeld WHERE fdatum ='$fdate'"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data['count']; + } + + // prüfen, og der User schon eine Buchung gemacht hat + // Geprüft wird die Email-Adresse. Es werden nur Buchungen in + // Zukunft geprüft. + function isDoppelBuchung($email) { + global $db; + $ret = []; + $ret['doppelt'] = false; + $now = date('Ymd'); + $sql_stmt = "SELECT * FROM sonneanmeld WHERE email = '$email' AND fdatum > $now"; + $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + $data = mysqli_fetch_assoc($result); + return $data; + } + + // die kompletten Daten eines Teilnehmers anhand der ID ais der DB holen + + ?> + + +
    + '; + $stern_errors++; + } + if (trim($stern_strasse) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Straße ein.
    '; + $stern_errors ++; + } + + if (trim($stern_plz) == '') { + $stern_error_msg .= 'Bitte geben Sie eine Postleitzahl ein.
    '; + $stern_errors ++; + } + if (! preg_match("/^[0-9]{5}$/", $stern_plz)) { + $stern_error_msg .= 'Bitte geben Sie bei der Postleitzahl mindestens fünf Ziffern und keine Buchstaben ein.
    '; + $stern_errors ++; + } + if (trim($stern_ort) == '') { + $stern_error_msg .= 'Bitte geben Sie einen Ort ein.
    '; + $stern_errors ++; + } + $stern_mail = trim($stern_mail); + if (!preg_match("/^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}/", + strtolower($stern_mail))) { + $stern_error_msg .= 'Bitte geben Sie eine gültige E-Mail-Adresse ein.
    '; + $stern_errors++; + } + $belegt = getCountsPerDate($stern_datum_date); + $rest = $maxBesucher-$belegt; + if((trim($stern_teil) + $belegt) > $maxBesucher) { + if ($rest <= 0) { + $stern_error_msg .= "Die Führung ist ausgebucht, $andererTermin
    "; + } else { + $stern_error_msg .= "Die Führung ist schon mit $belegt Personen belegt, es "; + if ($rest == 1) { + $stern_error_msg .= "kann nur noch 1 Person "; + } else { + $stern_error_msg .= "können höchstens noch $rest Personen "; + } + $stern_error_msg .= "angemeldet werden.
    "; + } + $stern_errors++; + } + + $teilnehmer = isDoppelBuchung($stern_mail); + if($teilnehmer != null) { + $stern_error_msg = "Dies ist eine Doppelbuchung. Sie wird nicht gespeichert.

    +

    Abbruch

    "; + $stern_errors++; + } + + $nun = strtotime("now"); + list($w,$d,$t,$s) = holDate($stern_fdlink); + $fz = strtotime("$d" . "t" . substr($t,0,2) . "00"); + $dauer = ($fz - $nun) / 3600; + if ($dauer <= $vorlauf) { + $stern_error_msg .= "Die Anmeldung muss spätestens $vorlauf Stunden vor Beginn der Führung erfolgen - $andererTermin.
    "; + $stern_errors++; + } + + if ($stern_errors == 0) { + $sql_stmt = "INSERT INTO sonneanmeld (name, vorname, strasse, plz, stadt, telefon, email, anzahl, fid, remarks, angemeldet, fdatum)" . + " values('$stern_name', '$stern_vorname', '$stern_strasse', '$stern_plz', '$stern_ort', '$stern_tel'," . + "'$stern_mail', '$stern_teil', '$stern_fdlink', '$stern_remarks', CURDATE(), '$stern_datum_date')"; + $ins = mysqli_query($db, $sql_stmt) or die(mysqli_error($db)); + + $person = $stern_teil == 1 ? "Person" : "Personen"; + $body = "\r\nName, Vorname: $stern_name, $stern_vorname \r\n" . + "Strasse: $stern_strasse \r\n" . + "Ort: $stern_plz $stern_ort \r\n" . + "Telefon: $stern_tel \r\n" . + "E-mail: $stern_mail \r\n" . + "Gewünschter Termin: $stern_datum \r\n" . + "Personen: $stern_teil \r\n" . + "Bemerkungen: $stern_remarks \r\n"; + $bodya = "Sehr geehrte Dame, sehr geehrter Herr, \r\n\r\n" . + "hiermit bestätigen wir Ihre Anmeldung zu einer Sonnen-Führung auf der Sternwarte Welzheim für\r\n\r\n" . + "$stern_vorname $stern_name am " . preg_replace("/(\d+) Uhr/","um $0",$stern_datum) . " für $stern_teil $person " . +// $stern_teil == 1 ? "Person" : "Personen" . + ".\r\n\r\n" . + "Die Führung findet NUR bei klarem Himmel statt. Falls der Himmel bedeckt ist \r\n" . + "und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn \r\n" . + "eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden.\r\n\r\n" . + "Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de \r\n\r\n" . + "Mit freundlichen Grüßen\r\n\r\n" . + "Beobachterteam der Sternwarte Welzheim\r\n\r\n" . + "www.sternwarte-welzheim.de"; + $betreff = "Anmeldung zu einer Sonnen-Führung auf der Sternwarte Welzheim"; + $betreffBeo = "Anmeldung zur Sonnen-Führung in Welzheim am $stern_datum"; + mb_internal_encoding('UTF-8'); + $betreff = mb_encode_mimeheader($betreff, 'UTF-8', 'Q'); + // Mail an den Anfragenden + + sendmail($betreff, $defaultabsender, $bodya, [], ['anmeldungen@sternwarte.rexfue.de'], [$stern_mail]); + // Mail an einige BEOs und an die Liste + $beoliste = array( + //"andrea.ess@t-online.de", + //"sonderfuehrung@sternwarte-welzheim.de", + "martin.gertz@gmx.de", + // "planetarium@stuttgart.de", + //"info@planetarium-stuttgart.de", + //"HUK@observatory-stuttgart.de", + "hansdschida1@gmail.com", + "anmeldung@sternwarte-welzheim.de", + ); + sendmail($betreffBeo, $defaultabsender, $body, $beoliste, [], ["rexfue@gmail.com"] ); + $stern_meldung = "

    Vielen Dank für Ihre Anmeldung.

    + Wir freuen uns über Ihren Besuch auf der Sternwarte Welzheim am
    +

    " . + preg_replace('/(\d+) Uhr/','um $0',$stern_datum) . + " mit $stern_teil $person. +

    + Wir haben Ihnen die Anmelde-Bestätigung per Email zugesandt (bitte sehen Sie ggf. auch in Ihrem Spam-Ordner nach).

    +

    Zurück

    "; + // Antwortseite + ?> + + ' . $stern_error_msg . '
    '; + } + // Wenn ein Fehler aufgetreten ist ($errors != 0), folgt jetzt der default Teil + // d.h. das Eingabeformular wird nochmals angezeigt mit einer Fehlermeldung. + // ---------------------------------------------------------------------------- + default: + ?> +

    Anmeldung zu einer Sonnen-Führung auf der Sternwarte Welzheim

    +

    Diese Führung auf der Sternwarte Welzheim findet nur bei + klarem Himmel statt. +

    +

    + Bitte beachten Sie, dass der Weg zur Sternwarte Welzheim mit + Kraftfahrzeugen nicht befahren werden darf. Sie können + Ihre Fahrzeuge auf dem Parkplatz der Sternwarte abstellen. Von hier + führt ein 430 m langer Fußweg zur Sternwarte. +

    +

    Die Fernrohre in den Beobachtungskuppeln sind nur über Treppen zu + erreichen. Es besteht leider keine Möglichkeit, Rollstühle in die + Kuppeln mitzunehmen. Für Kleinkinder sind Sternführungen nicht + geeignet.

    +

    Betrieb und Arbeit auf der Sternwarte erfolgen ehrenamtlich. + Unterhalt und Aktivitäten auf der Sternwarte sind nur durch + Ihre Unterstützung möglich. Wir bitten daher um eine ensprechende Spende. +

    +

    + An einer Führung können nur maximal Personen teilnehmen. + Sollte die von Ihnen ausgewählte Führung bereits ausgebucht sein, wählen Sie bitte + einen anderen Termin. +

    +

    + Sollte die Führung wegen des Wetters ausfallen, erhalten Sie bis + spätestens eine Stunde vor Führungsbeginn eine Email. Wir bitten + Sie, sich dann für einen neuen Termin nochmals anzumelden. + +

    +

    + Wenn Sie alle Felder ausgefüllt und abgeschickt haben (mit dem "Anmeldung senden"-Knopf), + erhalten Sie eine Anmeldebestätigung per e-mail. +

    +

    + +

    +

    + Unsere Sternwarte bleibt bis voraussichtlich 14. November 2025 wegen neuer technischer Einrichtung + geschlossen.
    Bis dahin können keine Führungen durchgeführt werden. +

    + + Anmeldung: + (Alle Felder mit '*' müssen ausgefüllt werden)
    +
    + +
    +
    + + +
    +
    Bitte beachten Sie, dass eine + Anmeldung bis spätestens Stunden vor Führungsbeginn erfolgt sein muss!
    + Schon belegte Termine können nicht ausgewählt werden (sie werden grau dargestellt).

    + +
    + + +
    + + +
    +
    + + +
    + + + +
    + + +
    +
    + + +
    +
    + + + " id="teil" class="textfeld20"/> + (max. Personen) +
    +
    + +
    + +
    +
    +
    + + Eine Sonnenführung findet nur bei klarem Wetter statt.
    +

    + Das Betreten der Sternwarte erfolgt auf eigene + Gefahr. Die Sonnenführung wird von ehrenamtlichen + Kräften durchgeführt. Bei Ausfall einer Führung kann kein Schadenersatz + geleistet werden. +

    + +
    + + +
    + +

    +

    + Hinweis zum Datenschutz: Datenschutzerklärung +

    +

    Letzte Änderungen: 2025-10-22 rxf

    + +
    +
    + + +
    + +
    + + + + + + diff --git a/html/sternwarte/sonnenfuehrungen.php b/html/sternwarte/sonnenfuehrungen.php new file mode 100644 index 0000000..bf4bfd7 --- /dev/null +++ b/html/sternwarte/sonnenfuehrungen.php @@ -0,0 +1,86 @@ + + + + + + + + +Sternwarte Welzheim + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + +
    + + + + + +
    + +

    Sonnenbeobachtungen auf der Sternwarte Welzheim

    +

    Die Sternwarte Welzheim bietet zur Beobachtung der Sonne Führungen an, die in der Regel jeden ersten Sonntag im Monat um 11 Uhr bei klarem Himmel stattfinden.

    +

    Die nächsten Termine
    +
    + 5. Januar 2020
    +
    2. Februar 2020
    + 1. März 2020
    +

    +

    Die Sonne wird im Teleskop sowohl im integralen, also weißen Licht als auch im roten Licht des glühenden Wasserstoffs gezeigt. Dabei lassen sich auch Sturmgebiete beobachten, die als Sonnenflecken in Erscheinung treten. Auch gewaltige Explosionen sind zu erkennen, die Sonnenmaterie weit in das Weltall schleudern. Sie machen sich als Protuberanzen und Filamente bemerkbar. Bei starker Vergrößerung sieht man auch die reiskornartige Struktur der Sonnenoberfläche, die man Granulation nennt. Die Sonnenmaterie brodelt wie kochendes Wasser. Heiße Gaszellen von fast 6000° C steigen auf und platzen unter gewaltigem Getöse, das man aber auf der Erde nicht hören kann, da das Weltraumvakuum den Schall nicht weiterleitet.

    +

    +

    Die Sonne ist der größte und massereichste Körper in unserem Sonnensystem. Erst 109 zu einer kosmischen Perlenschnur aneinander gereihte Erdkugeln ergeben den Sonnendurchmesser von 1 392 500 Kilometer. Die Sonne wiegt so viel wie 333 000 Erdmassen. In ihrem riesigen Gasleib hätten bequem 1 302 000 Erdgloben Platz. Zum überwiegenden Teil setzt sich die Sonne aus Wasserstoff und Helium zusammen. In ihrem Herzen wird bei einer Temperatur von fast 15 Millionen Grad permanent Wasserstoff in Helium fusioniert. Dabei wird ein Teil der Materie in Strahlungsenergie umgewandelt. Der Atommeiler Sonne wird in jeder Sekunde somit um vier Millionen Tonnen leichter.

    +

    Die Sonne ist der Stern des Lebens. Ohne ihr Licht und ihre Wärme könnten Pflanzen, Tiere und Menschen auf der Erde nicht existieren. Die Sonne ist eine gigantische Wettermaschine. Sie bestimmt das Wettergeschehen und das Klima auf der Erde. Außer elektromagnetischen Wellen aller Frequenzen sendet die Sonne auch elektrische geladene Teilchen aus. Dieser Sonnenwind beeinflusst auch das irdische Magnetfeld und erzeugt unter anderem Polarlichter und ist teils für Funkstörungen verantwortlich.

    +

    Die Sonne ist knapp fünf Milliarden Jahre alt. Ihre Leuchtkraft nimmt ständig zu. Die junge Sonne strahlte nur 60% der Energiemenge ab, die sie gegenwärtig aussendet. Eines fernen Tages wird sie der Erde den Feuertod bescheren. Aber in jenen fernen Zeiten wird es längst kein Leben mehr auf unserem Planeten geben.
    +

    + + + + +

    + +
    + + + +
    + + + + + diff --git a/html/sternwarte/sternwarte.php b/html/sternwarte/sternwarte.php new file mode 100755 index 0000000..b7f289d --- /dev/null +++ b/html/sternwarte/sternwarte.php @@ -0,0 +1,88 @@ + + + + + + + + +Sternwarte Welzheim + + + + + + + + + + + + + +
    + + + + + +
    + + + + + +
    + + + +
    + +

    Herzlich willkommen auf der Seite der Sternwarte Welzheim

    + +

    Sternwarte Welzheim mit Sternbild OrionDie Beobachtung des Sternenhimmels ist von unseren lichtüberfluteten Städten aus kaum mehr möglich. Die Staub und Dunstglocken und der Lichtstrom künstlicher Beleuchtung haben in den letzten Jahren stark zugenommen.
    + + Bedingt durch diese Umweltemissionen ist die Aufhellung des Nachthimmels enorm angestiegen und beeinträchtigt astronomische Beobachtungen erheblich. Durch eine Initiative der Stadt Welzheim konnte auf der Markung Langenberg ein geeigneter Standort für eine Sternwarte gefunden werden. Die klimatischen Verhältnisse sind im Welzheimer Wald zur Beobachtung der Gestirne besonders geeignet, die Schadstoffbelastung ist minimal und der Sternenhimmel noch einigermaßen nachtdunkel.
    + + Im Jahre 1989 erfolgte der Beschluss zum Bau der Welzheimer Sternwarte. Die Stadt Welzheim errichtete mit Unterstützung durch das Land Baden-Württemberg und den Rems-Murr-Kreis die Sternwartengebäude samt Kuppeln, während die Landeshauptstadt Stuttgart die Teleskope sowie die technischen Einrichtungen beisteuerte. + +

    + +

    Der Bau der Sternwarte erfolgte in den Jahren 1991 und 1992. Am 6. September 1992 wurde die Sternwarte Welzheim feierlich ihrer Bestimmung übergeben. Sie dient als Beobachtungsstation des Planetariums der Landeshauptstadt Stuttgart und wird von dieser Institution betrieben. Tausende Besucher konnten inzwischen durch die Teleskope der Welzheimer Sternwarte einen Blick auf die Wunder des Kosmos werfen.
    + + Neben den öffentlichen Sternführungen gehört zur Hauptaufgabe des Welzheimer Observatoriums, Himmelsaufnahmen für die Gestaltung der Sternenvorführungen im Stuttgarter Planetarium zu gewinnen. Aktuelles astronomisches Bildmaterial erhöht die Attraktivität der Planetariumsvorführungen und stellt einen verstärkten Anreiz zum Besuch des Stuttgarter Sternentheaters dar. Außerdem werden synoptische Beobachtungen von Gestirnen zur Prüfung der Luft- und Klimaverhältnisse durchgeführt, um die atmosphärischen Bedingungen und ihre eventuellen Änderungen zu erfassen.

    + +

    Die öffentlichen Sternführungen und astronomischen Beobachtungen werden von den ehrenamtlich tätigen Mitgliedern der Beobachtergruppe des Planetariums Stuttgart
    + + durchgeführt.
    + +

    + +

    Bei klarem Wetter finden in der Westkuppel der Sternwarte Welzheim Sternführungen für die Öffentlichkeit statt. Führungs- sowie Besichtigungszeiten.
    + +

    + +
    + +
    + + + +
    + + + + + diff --git a/html/sternwarte/storno/css/bootstrap.min.css b/html/sternwarte/storno/css/bootstrap.min.css new file mode 100644 index 0000000..fcf87cb --- /dev/null +++ b/html/sternwarte/storno/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} diff --git a/html/sternwarte/storno/css/jquery-ui-timepicker-addon.css b/html/sternwarte/storno/css/jquery-ui-timepicker-addon.css new file mode 100755 index 0000000..586a7f0 --- /dev/null +++ b/html/sternwarte/storno/css/jquery-ui-timepicker-addon.css @@ -0,0 +1,30 @@ +.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +.ui-timepicker-div dl { text-align: left; } +.ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; } +.ui-timepicker-div dl dd { margin: 0 10px 10px 40%; } +.ui-timepicker-div td { font-size: 90%; } +.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } +.ui-timepicker-div .ui_tpicker_unit_hide{ display: none; } + +.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input { background: none; color: inherit; border: none; outline: none; border-bottom: solid 1px #555; width: 95%; } +.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus { border-bottom-color: #aaa; } + +.ui-timepicker-rtl{ direction: rtl; } +.ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; } +.ui-timepicker-rtl dl dt{ float: right; clear: right; } +.ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; } + +/* Shortened version style */ +.ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; } +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time, +.ui-timepicker-div.ui-timepicker-oneLine dt { display: none; } +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; } +.ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; } +.ui-timepicker-div.ui-timepicker-oneLine dl dd, +.ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; } +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before, +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; } +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before, +.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; } +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide, +.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; } \ No newline at end of file diff --git a/html/sternwarte/storno/css/jquery-ui.min.css b/html/sternwarte/storno/css/jquery-ui.min.css new file mode 100755 index 0000000..6f24c8f --- /dev/null +++ b/html/sternwarte/storno/css/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2017-09-14 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=redmond&cornerRadiusShadow=8px&offsetLeftShadow=-8px&offsetTopShadow=-8px&thicknessShadow=8px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=aaaaaa&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cd0a0a&fcError=cd0a0a&borderColorError=cd0a0a&bgImgOpacityError=95&bgTextureError=glass&bgColorError=fef1ec&iconColorHighlight=2e83ff&fcHighlight=363636&borderColorHighlight=fad42e&bgImgOpacityHighlight=55&bgTextureHighlight=flat&bgColorHighlight=fbec88&iconColorActive=f9bd01&fcActive=e17009&borderColorActive=79b7e7&bgImgOpacityActive=100&bgTextureActive=inset_hard&bgColorActive=f5f8f9&iconColorHover=217bc0&fcHover=1d5987&borderColorHover=79b7e7&bgImgOpacityHover=75&bgTextureHover=glass&bgColorHover=d0e5f5&iconColorDefault=6da8d5&fcDefault=2e6e9e&borderColorDefault=c5dbec&bgImgOpacityDefault=85&bgTextureDefault=glass&bgColorDefault=dfeffc&iconColorContent=469bdd&fcContent=222222&borderColorContent=a6c9e2&bgImgOpacityContent=100&bgTextureContent=inset_hard&bgColorContent=fcfdfd&iconColorHeader=d8e7f3&fcHeader=ffffff&borderColorHeader=4297d7&bgImgOpacityHeader=55&bgTextureHeader=gloss_wave&bgColorHeader=5c9ccc&cornerRadius=5px&fsDefault=1.1em&fwDefault=bold&ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5dbec}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #4297d7;background:#5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5dbec;background:#dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2e6e9e}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#2e6e9e;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #79b7e7;background:#d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1d5987}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#1d5987;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #79b7e7;background:#f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#e17009}.ui-icon-background,.ui-state-active .ui-icon-background{border:#79b7e7;background-color:#e17009}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#e17009;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fad42e;background:#fbec88;color:#363636}.ui-state-checked{border:1px solid #fad42e;background:#fbec88}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_469bdd_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_d8e7f3_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_217bc0_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_f9bd01_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_6da8d5_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa} \ No newline at end of file diff --git a/html/sternwarte/storno/css/storno.css b/html/sternwarte/storno/css/storno.css new file mode 100644 index 0000000..71d9942 --- /dev/null +++ b/html/sternwarte/storno/css/storno.css @@ -0,0 +1,133 @@ +@CHARSET "UTF-8"; + +.storno { + font-size: 14px; + min-height: 500px; + position: relative; +} + + +h3 { + margin-top: 10px; +} + +h5 { + font-weight: bold; + margin-top: 15px; +} + +.email_enter { + margin-top: 20px; +} + +#email_label { + margin-right: 40px; +} + +#auswahl { + margin-top: 15px; +} + +#gesamtsumme { + margin-top: 5px; + font-size: 85%; +} + +#author { + font-size:90%; + margin: 0 200px 0 150px; + padding-bottom: 8px; +} + +#tabAnmeld, #tnames { + margin: auto; + border-collapse: collapse; +} + +#tnames { + margin-top: 10px; + margin-bottom: 10px; +} + +#names { + display: none; +} + +#absagedialog { + text-align: center; +} + +#absagen, #uebernehmen { + width: 100%; +} + +.det { + border: 1px solid black; + padding-left: 10px; + width: 100%; +} + +.ui-dialog { + max-width: 800px !important; + width: 80% !important; +} + +.findit { + box-shadow: none; + height: 20px; + width: 20px; + border-radius: 10px; + margin-right: 5px; +} + +#anmeldung { + font-weight: bold; +} + +#nixda { + color: red; + padding-bottom: 15px; +} + +#ausgetragen, #umgebucht { + text-align: center; + margin-top: 20px; + font-weight: bold; +} + +#umbuchung { + text-align: center; + margin: auto; +} + + +#lower_text { + display: none; + margin-top: 30px; +} + +.lastchange { + position: absolute; + bottom: 0px; + right: 5px; +} + +.diebuttons { + width: 100%; + margin-top: 20px; +} + +#homebutton { + display: none; + margin-top: 20px; + margin-bottom: 20px; +} + +#aenderung { + margin-top: 20px; +} + +#maxanzahl { + margin-left: 10px; + font-size: 80%; +} diff --git a/html/sternwarte/storno/css/ui.jqgrid.css b/html/sternwarte/storno/css/ui.jqgrid.css new file mode 100755 index 0000000..40eac3d --- /dev/null +++ b/html/sternwarte/storno/css/ui.jqgrid.css @@ -0,0 +1,354 @@ +/*Grid*/ +.ui-jqgrid { + position: relative; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +.ui-jqgrid .ui-jqgrid-view {position: relative;left:0; top: 0; padding: 0; font-size:11px; z-index:100;} +.ui-jqgrid .ui-common-table {border-width: 0px; border-style: none; border-spacing: 0px; padding: 0;} +/* caption*/ +.ui-jqgrid .ui-jqgrid-titlebar {height:19px; padding: .3em .2em .2em .3em; position: relative; font-size: 12px; border-left: 0 none;border-right: 0 none; border-top: 0 none;} +.ui-jqgrid .ui-jqgrid-caption {text-align: left;} +.ui-jqgrid .ui-jqgrid-title { margin: .1em 0 .2em; } +.ui-jqgrid .ui-jqgrid-titlebar-close { position: absolute;top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height:18px; cursor:pointer;} +.ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; } +.ui-jqgrid .ui-jqgrid-titlebar-close:hover { padding: 0; } +/* header*/ +.ui-jqgrid .ui-jqgrid-hdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;} +.ui-jqgrid .ui-jqgrid-hbox {float: left; padding-right: 20px;} +.ui-jqgrid .ui-jqgrid-htable {table-layout:fixed;margin:0;border-collapse: separate;} +.ui-jqgrid .ui-jqgrid-htable th { height: 27px; padding: 0 2px 0 2px;} +.ui-jqgrid .ui-jqgrid-htable th div {overflow: hidden; position:relative;margin: .1em 0em .1em 0em;} +.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none;border-bottom : 0 none;} +.ui-th-column-header, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none; height: 26px;} +.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {border-left : 0 none;} +.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {border-right : 0 none;} +.ui-first-th-ltr {border-right: 1px solid; } +.ui-first-th-rtl {border-left: 1px solid; } +.ui-jqgrid .ui-th-div-ie {white-space: nowrap; zoom :1; height:17px;} +.ui-jqgrid .ui-jqgrid-resize {height:20px !important;position: relative; cursor :e-resize;display: inline;overflow: hidden;} +.ui-jqgrid .ui-grid-ico-sort {overflow:hidden;position:absolute;display:inline; cursor: pointer !important;} +.ui-jqgrid .ui-icon-asc {margin-top:-3px; height:12px;} +.ui-jqgrid .ui-icon-desc {margin-top:3px;margin-left:-1px;height:12px;} +.ui-jqgrid .ui-i-asc {margin-top:0;height:18px;} +.ui-jqgrid .ui-i-desc {margin-top:0;margin-left:12px;height:18px;} +.ui-jqgrid .ui-single-sort-asc {margin-top:0;height:18px;} +.ui-jqgrid .ui-single-sort-desc {margin-top:-1px;height:18px;} +.ui-jqgrid .ui-jqgrid-sortable {cursor:pointer;height:14px} +.ui-jqgrid tr.ui-search-toolbar th { } +.ui-jqgrid .ui-search-table td.ui-search-clear { width:25px;} +.ui-jqgrid tr.ui-search-toolbar td > input { padding-right: 0px; width: 95%;} +.ui-jqgrid tr.ui-search-toolbar select {} +/* body */ +.ui-jqgrid .ui-jqgrid-bdiv {position: relative; margin: 0; padding:0; overflow: auto; text-align:left;z-index: 101;} +.ui-jqgrid .ui-jqgrid-btable {table-layout:fixed; margin:0; outline-style: none; border-collapse: separate;} +.ui-jqgrid tr.jqgrow { outline-style: none; } +.ui-jqgrid tr.jqgroup { outline-style: none; } +.ui-jqgrid tr.jqgrow td {font-weight: normal; overflow: hidden; white-space: pre; height: 23px;padding: 1px 2px 1px 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;} +.ui-jqgrid tr.jqgfirstrow td {padding: 0 2px 0 2px;border-right-width: 1px; border-right-style: solid; height:auto;} +.ui-jqgrid tr.jqgroup td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;} +.ui-jqgrid tr.jqfoot td {font-weight: bold; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;} +.ui-jqgrid tr.ui-row-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;} +.ui-jqgrid tr.ui-row-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;} +.ui-jqgrid td.jqgrid-rownum { padding: 0 2px 0 2px; margin: 0; border: 0 none;} +.ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none; z-index: 99999;} +/* footer */ +.ui-jqgrid .ui-jqgrid-sdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;} +.ui-jqgrid .ui-jqgrid-ftable {table-layout:fixed; margin-bottom:0;border-collapse: separate;} +.ui-jqgrid tr.footrow td {font-weight: bold; overflow: hidden; white-space:nowrap; height: 20px;padding: 0 2px 0 2px;border-top-width: 1px; border-top-color: inherit; border-top-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;} +.ui-jqgrid tr.footrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;} +.ui-jqgrid tr.footrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;} +/* Pager*/ +.ui-jqgrid .ui-jqgrid-pager { border-left: 0 none !important;border-right: 0 none !important; border-bottom: 0 none !important; border-top: 0 none; margin: 0 !important; padding: 0 !important; position: relative; height: auto; min-height: 28px; white-space: nowrap;overflow: hidden;font-size:11px; z-index:101} +.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control, .ui-jqgrid .ui-jqgrid-pager .ui-pager-control {position: relative;border-left: 0;border-bottom: 0;border-top: 0; height: 28px;} +.ui-jqgrid .ui-pg-table {position: relative; padding: 1px 0; width:auto; margin: 0;} +.ui-jqgrid .ui-pg-table td {font-weight:normal; vertical-align:middle; padding:0px 1px;} +.ui-jqgrid .ui-pg-button { height:auto} +.ui-jqgrid .ui-pg-button span { display: block; margin: 2px; float:left;} +.ui-jqgrid .ui-pg-button:hover { padding: 0;} +.ui-jqgrid .ui-state-disabled:hover {padding:0px;} +.ui-jqgrid .ui-pg-input,.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { height:14px;width: auto;font-size:.9em; margin:0;line-height: inherit;border: none; padding: 3px 2px} +.ui-jqgrid .ui-pg-selbox, .ui-jqgrid .ui-jqgrid-toppager .ui-pg-selbox {font-size:.9em; line-height:inherit; display:block; height:19px; margin: 0; padding: 3px 0px; border:none;} +.ui-jqgrid .ui-separator {height: 18px; border-left: 2px solid #ccc ;} +.ui-separator-li {height: 2px; border : none;border-top: 2px solid #ccc ; margin: 0; padding: 0; width:100%} +.ui-jqgrid .dropdownmenu { + padding: 3px 0 3px 0; + margin-left: 4px; +} +.ui-jqgrid .ui-jqgrid-pager .ui-pg-div, +.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div +{padding:1px 0;float:left;position:relative; line-height: 20px;} +.ui-jqgrid .ui-jqgrid-pager .ui-pg-button, +.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button +{ cursor:pointer; } +.ui-jqgrid .ui-jqgrid-pager .ui-pg-div span.ui-icon, +.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div span.ui-icon +{float:left;margin: 2px; width:18px;} +.ui-jqgrid td input, .ui-jqgrid td select, .ui-jqgrid td textarea { margin: 0; padding-top:5px;padding-bottom: 5px;} +.ui-jqgrid td textarea {width:auto;height:auto;} +.ui-jqgrid .ui-jqgrid-toppager {border-left: 0 none !important;border-right: 0 none !important; border-top: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative;white-space: nowrap;overflow: hidden;} +.ui-jqgrid .ui-jqgrid-pager .ui-pager-table, +.ui-jqgrid .ui-jqgrid-toppager .ui-pager-table +{ + width:100%; + table-layout:fixed; + height:100%; +} +.ui-jqgrid .ui-jqgrid-pager .ui-paging-info, +.ui-jqgrid .ui-jqgrid-toppager .ui-paging-info +{ + font-weight: normal; + height:auto; + margin-top:3px; + margin-right:4px; + display: inline; +} +.ui-jqgrid .ui-jqgrid-pager .ui-paging-pager, +.ui-jqgrid .ui-jqgrid-toppager .ui-paging-pager +{ + table-layout:auto; + height:100%; +} +.ui-jqgrid .ui-jqgrid-pager .navtable, +.ui-jqgrid .ui-jqgrid-toppager .navtable +{ + float:left; + table-layout:auto; + height:100%; +} + +/*.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div {padding:1px 0;float:left;position:relative; line-height: 20px; margin-right:3px;} +.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button { cursor:pointer; } +.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div span.ui-icon {float:left;margin: 2px; width:18px;} +*/ + +/*subgrid*/ +.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {display: block;} +.ui-jqgrid .ui-subgrid {margin:0;padding:0; width:100%;} +.ui-jqgrid .ui-subgrid table {table-layout: fixed;} +.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {height:18px;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;} +.ui-jqgrid .ui-subgrid td.subgrid-data {border-top: 0 none !important; border-left: 0 none !important;} +.ui-jqgrid .ui-subgrid td.subgrid-cell {border-width: 0 1px 1px 0;} +.ui-jqgrid .ui-th-subgrid {height:20px;} +/* loading */ +.ui-jqgrid .loading {position: absolute; top: 45%;left: 45%;width: auto;z-index:101;padding: 6px; margin: 5px;text-align: center;font-weight: bold;display: none;border-width: 2px !important; font-size:11px;} +.ui-jqgrid .jqgrid-overlay {display:none;z-index:100;} +/* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */ +* .jqgrid-overlay iframe {position:absolute;top:0;left:0;z-index:-1;} +/* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/ +/* end loading div */ +/* toolbar */ +.ui-jqgrid .ui-userdata {border-left: 0 none; border-right: 0 none; height : 27px;overflow: hidden; } +/*Modal Window */ +.ui-jqdialog { font-size:11px !important; } +.ui-jqdialog { display: none; width: 300px; position: absolute; padding: .2em; font-size:11px; overflow:visible;} +.ui-jqdialog .ui-jqdialog-titlebar { padding: .3em .2em; position: relative; height:20px;} +.ui-jqdialog .ui-jqdialog-title { margin: .3em .2em .2em .2em;} +.ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute; top: 50%; width: 19px; margin: -12px 0 0 0; padding: 1px; height: 18px; cursor:pointer;} + +.ui-jqdialog .ui-jqdialog-titlebar-close span { display: block; margin: 1px; } +.ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 0; } +.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto;} +.ui-jqdialog .ui-jqconfirm {padding: .4em 1em; border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center;} +.ui-jqdialog>.ui-resizable-se { bottom: -3px; right: -3px} +.ui-jqgrid>.ui-resizable-se { bottom: -3px; right: -3px } +/* end Modal window*/ +/* Form edit */ +.ui-jqdialog-content .FormGrid {margin: 0; overflow:auto;position:relative;} +.ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0;} +.ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0;} +.EditTable td input, .EditTable td select, .EditTable td textarea {margin: 0;} +.EditTable td textarea { width:auto; height:auto;} +.ui-jqdialog-content td.EditButton {text-align: right;border-top: 0 none;border-left: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;} +.ui-jqdialog-content td.navButton {text-align: center; border-left: 0 none;border-top: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;} +.ui-jqdialog-content input.FormElement {padding: .5em .3em; margin-bottom: 3px} +.ui-jqdialog-content select.FormElement {padding:.3em; margin-bottom: 3px;} +.ui-jqdialog-content .data-line {padding-top:.1em;border: 0 none;} + +.ui-jqdialog-content .CaptionTD {vertical-align: middle;border: 0 none; padding: 2px;white-space: nowrap;} +.ui-jqdialog-content .DataTD {padding: 2px; border: 0 none; vertical-align: top;} +.ui-jqdialog-content .form-view-data {white-space:pre} +.fm-button { height: 18px; display: inline-block; margin:2px 4px 0 0; padding: .6em .5em .2em .5em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; } +.fm-button-icon-left { padding-left: 1.9em; } +.fm-button-icon-right { padding-right: 1.9em; } +.fm-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px; } +.fm-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px;} +#nData, #pData { float: left; margin:3px;padding: 0; width: 15px; } +.ViewTable { + border-width: 0; + border-style: none; + border-spacing: 1px; + padding: 4px; + table-layout: fixed; +} +.ViewTable .CaptionTD, .ViewTable .DataTD {padding : 4px;} +/* End Eorm edit */ +/*cell edit*/ +.ui-jqgrid .edit-cell { + padding: 4px 0px 4px 4px; +} +.ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td {font-style : normal;border-left: 0 none;} +/* inline edit actions button*/ +.ui-inline-del.ui-state-hover span, .ui-inline-edit.ui-state-hover span, +.ui-inline-save.ui-state-hover span, .ui-inline-cancel.ui-state-hover span { + margin: -1px; +} +.ui-inline-del, .ui-inline-cancel { + margin-left: 8px; +} + +.ui-jqgrid .inline-edit-cell { + padding: 4px 0px 4px 4px; +} +/* Tree Grid */ +.ui-jqgrid .tree-wrap {float: left; position: relative;height: 18px;white-space: nowrap;overflow: hidden;} +.ui-jqgrid .tree-minus {position: absolute; height: 18px; width: 18px; overflow: hidden;} +.ui-jqgrid .tree-plus {position: absolute; height: 18px; width: 18px; overflow: hidden;} +.ui-jqgrid .tree-leaf {position: absolute; height: 18px; width: 18px;overflow: hidden;} +.ui-jqgrid .treeclick {cursor: pointer;} +/* moda dialog */ +* iframe.jqm {position:absolute;top:0;left:0;z-index:-1;} +/* width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/ +.ui-jqgrid-dnd tr td {border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px} +/* RTL Support */ +.ui-jqgrid .ui-jqgrid-caption-rtl {text-align: right;} +.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right;} +.ui-jqgrid .ui-jqgrid-resize-ltr {float: right;margin: -2px -2px -2px 0;} +.ui-jqgrid .ui-jqgrid-resize-rtl {float: left;margin: -2px 0 -1px -3px;} +.ui-jqgrid .ui-sort-rtl {left:0;} +.ui-jqgrid .tree-wrap-ltr {float: left;} +.ui-jqgrid .tree-wrap-rtl {float: right;} +.ui-jqgrid .ui-ellipsis {-moz-text-overflow:ellipsis;text-overflow:ellipsis;} + +/* Toolbar Search Menu , Nav menu*/ +.ui-search-menu, +.ui-nav-menu { + position: absolute; + padding: 2px 5px; + z-index:99999; + -webkit-box-shadow: 7px 7px 5px 0px rgba(50, 50, 50, 0.75); + -moz-box-shadow: 7px 7px 5px 0px rgba(50, 50, 50, 0.75); + box-shadow: 7px 7px 5px 0px rgba(50, 50, 50, 0.75); +} +.ui-search-menu.ui-menu .ui-menu-item, +.ui-nav-menu.ui-menu .ui-menu-item +{ + list-style-image: none; + padding-right: 0; + padding-left: 0; +} +.ui-search-menu.ui-menu .ui-menu-item a, +.ui-nav-menu.ui-menu .ui-menu-item a +{ + display: block; +} +.ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover, +.ui-nav-menu.ui-menu .ui-menu-item a.g-menu-item:hover +{ + margin: -1px; + font-weight: normal; +} +.ui-jqgrid .ui-search-table { padding: 0; border: 0 none; height:20px; width:100%;} +.ui-jqgrid .ui-search-table .ui-search-oper { width:20px; } +a.g-menu-item, a.soptclass, a.clearsearchclass { cursor: pointer; } +.ui-jqgrid .ui-jqgrid-view input, +.ui-jqgrid .ui-jqgrid-view select, +.ui-jqgrid .ui-jqgrid-view textarea, +.ui-jqgrid .ui-jqgrid-view button { + font-size: 11px; +} +.ui-jqgrid .ui-scroll-popup {width: 95px;} +.ui-search-table select, +.ui-search-table input +{ + padding: 4px 3px; +} + +.ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover > .ui-separator { + margin-left: 3px; + margin-right: 3px; +} + +.ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover > .ui-pg-div > .ui-icon { + margin-left: 3px; + margin-right: 3px; +} +/* Column menu */ +.ui-jqgrid .ui-jqgrid-htable .colmenu { + position:absolute; + right:1px; + height:100%; + color : black; +} +.ui-jqgrid .ui-jqgrid-htable .colmenu-rtl { + right:auto; + left : 1px; +} +.ui-jqgrid .ui-jqgrid-htable .colmenuspan { + display:inline-block; +} + +.ui-jqgrid .ui-jqgrid-htable .ui-th-div { + height:17px; + margin-top:5px; + display:inine-block; +} +.column-menu, .ui-search-menu { + padding: 10px 10px; +} +.column-menu .divider { + background-color: #e5e5e5; + height: 1px; + padding:0 0; + margin: 5px 0; + overflow: hidden; +} +.ui-menu-item .ui-common-table .menu_icon { + white-space: pre; + padding-right: 4px; + padding-left: 4px; + width : auto; +} +.ui-menu-item .ui-common-table .menu_icon .ui-icon { + display : inline-block; + position: relative; +} +td.menu_text { + width: auto; + white-space: nowrap; +} +.ui-search-menu .ui-menu-item { + padding : 0 0; +} +.ui-col-menu .ui-menu-item td.menu_text{ + padding-top: 0; + padding-bottom: 0; + padding-left : 1px; +} +.ui-col-menu .ui-menu-item td.menu_icon{ + padding-top: 0; + padding-bottom: 0; + vertical-align: middle; +} +.ui-col-menu .ui-menu-item td.menu_icon input{ + margin: 2px 0; + +} +#search_menu .ui-menu-item div { + margin: 3px 0; + white-space: nowrap; +} + +#search_menu .ui-menu-item div input, +#search_menu .ui-menu-item div select +{ + padding: 3px 2px; +} +#search_menu .search_buttons { + display:inline-block; + width:50%; +} +#column_menu.ui-menu .ui-menu-item { + position :static; +} \ No newline at end of file diff --git a/html/sternwarte/storno/index.php b/html/sternwarte/storno/index.php new file mode 100644 index 0000000..77321bc --- /dev/null +++ b/html/sternwarte/storno/index.php @@ -0,0 +1,117 @@ + + + + + + + Storno + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    +
    +
    +
    +
    Stornierung, Umbuchung oder Änderung einer Anmeldung zur Sternführung
    +
    +
    +
    Hier können Sie Ihre Anmeldung entweder komplett storniere, auf einen anderen (freien) Termin + umbuchen oder die Personenzahl ändern.

    + Zur Suche Ihrer Anmeldung geben Sie bitte unten Ihre E-Mail ein. + +
    +
    +
    + Für diese E-Mail Adresse ist keine Führung angemeldet !
    +
    +
    + Sie sind angemeldet für:

    +
    + 2022-07-12 22:00 Uhr 4 Personen +
    +
    +
    Möchten Sie diese Anmeldung storniern, umbuchen oder die Personenzahl ändern? +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    Die Anmeldung wurde erfolgreich storniert.
    +
    +
    +
    + + + Max. 10 +
    +
    + +
    +
    +
    +
    +
    + Sie erhalten anschließend eine Bestätigungs-Mail. Sollten Sie diese Mail nicht innerhalb 24 Stunden + erhalten, bitten wir + Sie, sich über die E-Mail-Adresse anmeldung@sternwarte-welzheim.de + an uns zu wenden. Bitte sehen Sie vorher auch in Ihren SPAM-Ordner.
    Im Falle von Problemen mit der + Stornierung bzw. Umbuchung oder bei Fragen dazu, + melden Sie sich bitte ebenfalls über diese E-Mail-Adresse. +
    +
    + +
    +

    Letzte Änderungen: VDATE rxf

    +
    + +
    + + + \ No newline at end of file diff --git a/html/sternwarte/storno/js/ajax.js b/html/sternwarte/storno/js/ajax.js new file mode 100755 index 0000000..ac5ed08 --- /dev/null +++ b/html/sternwarte/storno/js/ajax.js @@ -0,0 +1,63 @@ +// Werte vom Server holen +// Übergabe: myURL : dahin geht der Ajax-Call +// cmd : Kommando als String +// param : weiterer Parameter, abh. von Kommando +function doAjaxCall(myURL,cmd, param, answerFunktion) +{ + var myData = { cmd: "0" , params: "0"}; + + myData["cmd"] = cmd; + myData["params"] = param; + + $.ajax( // AJAX-Call + { + + type: "POST", // wir machen eine POST - Abfrage + url: myURL, // an diese Seite auf dem Server + data: myData, // mit diesen Daten (ein Array) + success : function(erg){ // wenn Erfolg, dann + if(erg.charAt(0)=='#') // DEBUG-Meldungen .. + { + alert(erg); // .. ausgeben und .. + erg = erg.substr(erg.lastIndexOf('#')+2); // .. wegblenden + } +// console.log(">" + erg + "<"); + if(typeof answerFunktion === 'function') + answerFunktion(erg); // Antwort auswerten und weiterverarbeiten + }, + error: function(xh,t) { // wenn Error, dann eine Alertbox hinmalen + alert("xh=" + JSON.stringify(xh) + " t=" + t + xh.getAllResponseHeaders() + "\na) " + xh.responseText + "\nb) " + xh.statusText); + }, + }); +} + +// Werte vom Server holen +// Übergabe: myURL : dahin geht der Ajax-Call +// arr : Array mit den Kommandos / Daten +// answeFunktion: Funktion, die nach Erfolg ausgeführt wird +// +function doAjaxCall_arr(myURL,arr, answerFunktion) +{ + $.ajax( // AJAX-Call + { + + type: "POST", // wir machen eine POST - Abfrage + url: myURL, // an diese Seite auf dem Server + data: arr, // mit diesen Daten (ein Array) + success : function(erg){ // wenn Erfolg, dann +// if(erg.charAt(0)=='#') // DEBUG-Meldungen .. +// { +// alert(erg); // .. ausgeben und .. +// erg = erg.substr(erg.lastIndexOf('#')+2); // .. wegblenden +// } + console.log(">" + JSON.stringify(erg) + "<"); + if(answerFunktion) + answerFunktion(erg); // Antwort auswerten und weiterverarbeiten + }, + error: function(xh,t) { // wenn Error, dann eine Alertbox hinmalen +// alert("xh=" + JSON.stringify(xh) + " t=" + t + xh.getAllResponseHeaders() + "\na) " + xh.responseText + "\nb) " + xh.statusText); + console.log("xh=" + JSON.stringify(xh) + " t=" + t + xh.getAllResponseHeaders() + "\na) " + xh.responseText + "\nb) " + xh.statusText); + }, + }); +} + diff --git a/html/sternwarte/storno/js/de.js b/html/sternwarte/storno/js/de.js new file mode 100755 index 0000000..367cd93 --- /dev/null +++ b/html/sternwarte/storno/js/de.js @@ -0,0 +1,78 @@ +//! moment.js locale configuration +//! locale : German [de] +//! author : lluchs : https://github.com/lluchs +//! author: Menelion Elensúle: https://github.com/Oire +//! author : Mikolaj Dadela : https://github.com/mik01aj + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; +} + +var de = moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return de; + +}))); \ No newline at end of file diff --git a/html/sternwarte/storno/js/i18n/grid.locale-ar.js b/html/sternwarte/storno/js/i18n/grid.locale-ar.js new file mode 100755 index 0000000..4d6e732 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-ar.js @@ -0,0 +1,182 @@ +/** + * jqGrid Arabic Translation + * + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["ar"] = { + defaults : { + recordtext: "تسجيل {0} - {1} على {2}", + emptyrecords: "لا يوجد تسجيل", + loadtext: "تحميل...", + savetext: "Saving...", + pgtext : "صفحة {0} على {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "بحث...", + Find: "بحث", + Reset: "إلغاء", + odata: [{ oper:'eq', text:"يساوي"},{ oper:'ne', text:"يختلف"},{ oper:'lt', text:"أقل"},{ oper:'le', text:"أقل أو يساوي"},{ oper:'gt', text:"أكبر"},{ oper:'ge', text:"أكبر أو يساوي"},{ oper:'bw', text:"يبدأ بـ"},{ oper:'bn', text:"لا يبدأ بـ"},{ oper:'in', text:"est dans"},{ oper:'ni', text:"n'est pas dans"},{ oper:'ew', text:"ينته بـ"},{ oper:'en', text:"لا ينته بـ"},{ oper:'cn', text:"يحتوي"},{ oper:'nc', text:"لا يحتوي"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "مع", text: "الكل" }, { op: "أو", text: "لا أحد" }], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" +}, + edit : { + addCaption: "اضافة", + editCaption: "تحديث", + bSubmit: "تثبيث", + bCancel: "إلغاء", + bClose: "غلق", + saveData: "تغيرت المعطيات هل تريد التسجيل ?", + bYes: "نعم", + bNo: "لا", + bExit: "إلغاء", + msg: { + required: "خانة إجبارية", + number: "سجل رقم صحيح", + minValue: "يجب أن تكون القيمة أكبر أو تساوي 0", + maxValue: "يجب أن تكون القيمة أقل أو تساوي 0", + email: "بريد غير صحيح", + integer: "سجل عدد طبييعي صحيح", + url: "ليس عنوانا صحيحا. البداية الصحيحة ('http://' أو 'https://')", + nodefined : " ليس محدد!", + novalue : " قيمة الرجوع مطلوبة!", + customarray : "يجب على الدالة الشخصية أن تنتج جدولا", + customfcheck : "الدالة الشخصية مطلوبة في حالة التحقق الشخصي" + } + }, + view : { + caption: "رأيت التسجيلات", + bClose: "غلق" + }, + del : { + caption: "حذف", + msg: "حذف التسجيلات المختارة ?", + bSubmit: "حذف", + bCancel: "إلغاء" + }, + nav : { + edittext: " ", + edittitle: "تغيير التسجيل المختار", + addtext:" ", + addtitle: "إضافة تسجيل", + deltext: " ", + deltitle: "حذف التسجيل المختار", + searchtext: " ", + searchtitle: "بحث عن تسجيل", + refreshtext: "", + refreshtitle: "تحديث الجدول", + alertcap: "تحذير", + alerttext: "يرجى إختيار السطر", + viewtext: "", + viewtitle: "إظهار السطر المختار", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "إظهار/إخفاء الأعمدة", + bSubmit: "تثبيث", + bCancel: "إلغاء" + }, + errors : { + errcap : "خطأ", + nourl : "لا يوجد عنوان محدد", + norecords: "لا يوجد تسجيل للمعالجة", + model : "عدد العناوين (colNames) <> عدد التسجيلات (colModel)!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "الأحد", "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", + "الأحد", "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت" + ], + monthNames: [ + "جانفي", "فيفري", "مارس", "أفريل", "ماي", "جوان", "جويلية", "أوت", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر", + "جانفي", "فيفري", "مارس", "أفريل", "ماي", "جوان", "جويلية", "أوت", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" + ], + AmPm : ["صباحا","مساءا","صباحا","مساءا"], + S: function (j) {return j == 1 ? 'er' : 'e';}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-bg.js b/html/sternwarte/storno/js/i18n/grid.locale-bg.js new file mode 100755 index 0000000..31e72a0 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-bg.js @@ -0,0 +1,188 @@ +/** + * jqGrid Bulgarian Translation + * Tony Tomov tony@trirand.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["bg"] = { + defaults : { + recordtext: "{0} - {1} от {2}", + emptyrecords: "Няма запис(и)", + loadtext: "Зареждам...", + savetext: "Записвам...", + pgtext : "Стр. {0} от {1}", + pgfirst : "Първа Стр.", + pglast : "Последна Стр.", + pgnext : "Следваща Стр.", + pgprev : "Предишна Стр.", + pgrecs : "Брой записи на Стр.", + showhide: "Свиване/Разтягане на таблицата", + // mobile + pagerCaption : "Таблица::Настр. Страница", + pageText : "Страница:", + recordPage : "Записи на стр.", + nomorerecs : "Няма повече записи...", + scrollPullup: "Издърпайте нагоре за повече...", + scrollPulldown : "Дръпнете надолу за опресняване...", + scrollRefresh : "Освободете за да опресните..." + }, + search : { + caption: "Търсене...", + Find: "Намери", + Reset: "Изчисти", + odata: [{ oper:'eq', text:"равно"},{ oper:'ne', text:"различно"},{ oper:'lt', text:"по-малко"},{ oper:'le', text:"по-малко или="},{ oper:'gt', text:"по-голямо"},{ oper:'ge', text:"по-голямо или ="},{ oper:'bw', text:"започва с"},{ oper:'bn', text:"не започва с"},{ oper:'in', text:"се намира в"},{ oper:'ni', text:"не се намира в"},{ oper:'ew', text:"завършва с"},{ oper:'en', text:"не завършава с"},{ oper:'cn', text:"съдържа"},{ oper:'nc', text:"не съдържа"},{ oper:'nu', text:'е NULL'},{ oper:'nn', text:'не е NULL'}, {oper:'bt', text:'между'}], + groupOps: [ { op: "AND", text: " И " }, { op: "OR", text: "ИЛИ" } ], + operandTitle : "Натисни за избор на операнд.", + resetTitle : "Изчисти стойността", + addsubgrup : "Добави група", + addrule : "Добави правило", + delgroup : "Изтрий група", + delrule : "Изтрий правило" + }, + edit : { + addCaption: "Нов Запис", + editCaption: "Редакция Запис", + bSubmit: "Запиши", + bCancel: "Изход", + bClose: "Затвори", + saveData: "Данните са променени! Да съхраня ли промените?", + bYes : "Да", + bNo : "Не", + bExit : "Отказ", + msg: { + required:"Полето е задължително", + number:"Въведете валидно число!", + minValue:"стойността трябва да е по-голяма или равна от", + maxValue:"стойността трябва да е по-малка или равна от", + email: "не е валиден ел. адрес", + integer: "Въведете валидно цяло число", + date: "Въведете валидна дата", + url: "e невалиден URL. Изискава се префикс('http://' или 'https://')", + nodefined : " е недефинирана!", + novalue : " изисква връщане на стойност!", + customarray : "Потреб. Функция трябва да върне масив!", + customfcheck : "Потребителска функция е задължителна при този тип елемент!" + } + }, + view : { + caption: "Преглед запис", + bClose: "Затвори" + }, + del : { + caption: "Изтриване", + msg: "Да изтрия ли избраният запис?", + bSubmit: "Изтрий", + bCancel: "Отказ" + }, + nav : { + edittext: " ", + edittitle: "Редакция избран запис", + addtext:" ", + addtitle: "Добавяне нов запис", + deltext: " ", + deltitle: "Изтриване избран запис", + searchtext: " ", + searchtitle: "Търсене запис(и)", + refreshtext: "", + refreshtitle: "Обнови таблица", + alertcap: "Предупреждение", + alerttext: "Моля, изберете запис", + viewtext: "", + viewtitle: "Преглед избран запис", + savetext: "", + savetitle: "Съхрани запис", + canceltext: "", + canceltitle : "Отказ редакция", + selectcaption : "Действия..." + }, + col : { + caption: "Избери колони", + bSubmit: "Ок", + bCancel: "Изход" + }, + errors : { + errcap : "Грешка", + nourl : "Няма посочен url адрес", + norecords: "Няма запис за обработка", + model : "Модела не съответства на имената!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:" лв.", defaultValue: '0.00'}, + date : { + dayNames: [ + "Нед", "Пон", "Вт", "Ср", "Чет", "Пет", "Съб", + "Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота" + ], + monthNames: [ + "Яну", "Фев", "Мар", "Апр", "Май", "Юни", "Юли", "Авг", "Сеп", "Окт", "Нов", "Дек", + "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември" + ], + AmPm : ["","","",""], + S: function (j) { + if(j==7 || j==8 || j== 27 || j== 28) { + return 'ми'; + } + return ['ви', 'ри', 'ти'][Math.min((j - 1) % 10, 2)]; + }, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Сортирай възходящо", + sortdesc : "Сортирай низходящо", + columns : "Колони", + filter : "Филтрирай", + grouping : "Групирай по", + ungrouping : "Разгрупиране", + searchTitle : "Търси данни със стойност, която", + freeze : "Неподвижна", + unfreeze : "Отмяна неподвижност", + reorder : "Премести за пренареждане" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-ca.js b/html/sternwarte/storno/js/i18n/grid.locale-ca.js new file mode 100755 index 0000000..c85ab03 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-ca.js @@ -0,0 +1,184 @@ +/** + * jqGrid Catalan Translation + * Traducció jqGrid en Catatà per Faserline, S.L. + * http://www.faserline.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["ca"] = { + defaults : { + recordtext: "Mostrant {0} - {1} de {2}", + emptyrecords: "Sense registres que mostrar", + loadtext: "Carregant...", + savetext: "Saving...", + pgtext : "Pàgina {0} de {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Cerca...", + Find: "Cercar", + Reset: "Buidar", + odata: [{ oper:'eq', text:"equal"},{ oper:'ne', text:"not equal"},{ oper:'lt', text:"less"},{ oper:'le', text:"less or equal"},{ oper:'gt', text:"greater"},{ oper:'ge', text:"greater or equal"},{ oper:'bw', text:"begins with"},{ oper:'bn', text:"does not begin with"},{ oper:'in', text:"is in"},{ oper:'ni', text:"is not in"},{ oper:'ew', text:"ends with"},{ oper:'en', text:"does not end with"},{ oper:'cn', text:"contains"},{ oper:'nc', text:"does not contain"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "tot" }, { op: "OR", text: "qualsevol" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Afegir registre", + editCaption: "Modificar registre", + bSubmit: "Guardar", + bCancel: "Cancelar", + bClose: "Tancar", + saveData: "Les dades han canviat. Guardar canvis?", + bYes : "Yes", + bNo : "No", + bExit : "Cancel", + msg: { + required:"Camp obligatori", + number:"Introdueixi un nombre", + minValue:"El valor ha de ser major o igual que ", + maxValue:"El valor ha de ser menor o igual a ", + email: "no és una direcció de correu vàlida", + integer: "Introdueixi un valor enter", + date: "Introdueixi una data correcta ", + url: "no és una URL vàlida. Prefix requerit ('http://' or 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "Veure registre", + bClose: "Tancar" + }, + del : { + caption: "Eliminar", + msg: "¿Desitja eliminar els registres seleccionats?", + bSubmit: "Eliminar", + bCancel: "Cancelar" + }, + nav : { + edittext: " ", + edittitle: "Modificar fila seleccionada", + addtext:" ", + addtitle: "Agregar nova fila", + deltext: " ", + deltitle: "Eliminar fila seleccionada", + searchtext: " ", + searchtitle: "Cercar informació", + refreshtext: "", + refreshtitle: "Refrescar taula", + alertcap: "Avís", + alerttext: "Seleccioni una fila", + viewtext: " ", + viewtitle: "Veure fila seleccionada", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, +// setcolumns module + col : { + caption: "Mostrar/ocultar columnes", + bSubmit: "Enviar", + bCancel: "Cancelar" + }, + errors : { + errcap : "Error", + nourl : "No s'ha especificat una URL", + norecords: "No hi ha dades per processar", + model : "Les columnes de noms són diferents de les columnes del model" + }, + formatter : { + integer : {thousandsSeparator: ".", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Dg", "Dl", "Dt", "Dc", "Dj", "Dv", "Ds", + "Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte" + ], + monthNames: [ + "Gen", "Febr", "Març", "Abr", "Maig", "Juny", "Jul", "Ag", "Set", "Oct", "Nov", "Des", + "Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd-m-Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: 'show', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-cn.js b/html/sternwarte/storno/js/i18n/grid.locale-cn.js new file mode 100755 index 0000000..0d48545 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-cn.js @@ -0,0 +1,226 @@ +/** + * jqGrid Chinese Translation + * 咖啡兔 yanhonglei@gmail.com + * http://www.kafeitu.me + * + * 花岗岩 marbleqi@163.com + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["cn"] = { + defaults : { + recordtext: "第{0}到第{1}条\u3000共 {2} 条", // 共字前是全角空格 + emptyrecords: "没有记录!", + loadtext: "读取中...", + savetext: "保存中...", + pgtext : "第{0}页\u3000共{1}页", + pgfirst : "第一页", + pglast : "最后一页", + pgnext : "下一页", + pgprev : "上一页", + pgrecs : "每页记录数", + showhide: "切换 展开 折叠 表格", + // mobile + pagerCaption : "表格::页面设置", + pageText : "Page:", + recordPage : "每页记录数", + nomorerecs : "没有更多记录...", + scrollPullup: "加载更多...", + scrollPulldown : "刷新...", + scrollRefresh : "滚动刷新..." + }, + search : { + caption: "搜索...", + Find: "查找", + Reset: "重置", + odata: [{ oper:'eq', text:'等于\u3000\u3000'},{ oper:'ne', text:'不等于\u3000'},{ oper:'lt', text:'小于\u3000\u3000'},{ oper:'le', text:'小于等于'},{ oper:'gt', text:'大于\u3000\u3000'},{ oper:'ge', text:'大于等于'},{ oper:'bw', text:'开头是'},{ oper:'bn', text:'开头不是'},{ oper:'in', text:'属于\u3000\u3000'},{ oper:'ni', text:'不属于'},{ oper:'ew', text:'结尾是'},{ oper:'en', text:'结尾不是'},{ oper:'cn', text:'包含\u3000\u3000'},{ oper:'nc', text:'不包含'},{ oper:'nu', text:'为空'},{ oper:'nn', text:'不为空'}, {oper:'bt', text:'区间'}], + groupOps: [ { op: "AND", text: "满足所有条件" }, { op: "OR", text: "满足任一条件" } ], + operandTitle : "单击进行搜索。", + resetTitle : "重置搜索条件", + addsubgrup : "添加条件组", + addrule : "添加条件", + delgroup : "删除条件组", + delrule : "删除条件" + }, + edit : { + addCaption: "添加记录", + editCaption: "编辑记录", + bSubmit: "提交", + bCancel: "取消", + bClose: "关闭", + saveData: "数据已修改,是否保存?", + bYes : "是", + bNo : "否", + bExit : "取消", + msg: { + required:"此字段必需", + number:"请输入有效数字", + minValue:"输值必须大于等于 ", + maxValue:"输值必须小于等于 ", + email: "这不是有效的e-mail地址", + integer: "请输入有效整数", + date: "请输入有效时间", + url: "无效网址。前缀必须为 ('http://' 或 'https://')", + nodefined : " 未定义!", + novalue : " 需要返回值!", + customarray : "自定义函数需要返回数组!", + customfcheck : "必须有自定义函数!" + } + }, + view : { + caption: "查看记录", + bClose: "关闭" + }, + del : { + caption: "删除", + msg: "删除所选记录?", + bSubmit: "删除", + bCancel: "取消" + }, + nav : { + edittext: "", + edittitle: "编辑所选记录", + addtext:"", + addtitle: "添加新记录", + deltext: "", + deltitle: "删除所选记录", + searchtext: "", + searchtitle: "查找", + refreshtext: "", + refreshtitle: "刷新表格", + alertcap: "注意", + alerttext: "请选择记录", + viewtext: "", + viewtitle: "查看所选记录", + savetext: "", + savetitle: "保存记录", + canceltext: "", + canceltitle : "取消编辑记录", + selectcaption : "操作..." + }, + col : { + caption: "选择列", + bSubmit: "确定", + bCancel: "取消" + }, + errors : { + errcap : "错误", + nourl : "没有设置url", + norecords: "没有需要处理的记录", + model : "colNames 和 colModel 长度不等!" + }, + formatter : { + integer : {thousandsSeparator: ",", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "日", "一", "二", "三", "四", "五", "六", + "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", + ], + monthNames: [ + "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", + "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" + ], + AmPm : ["am","pm","上午","下午"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, + srcformat: 'Y-m-d', + newformat: 'Y-m-d', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid + // and see http://docs.jquery.com/UI/Datepicker/formatDate + // and https://github.com/jquery/globalize#dates for alternative formats used frequently + // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many + // information about date, time, numbers and currency formats used in different countries + // one should just convert the information in PHP format + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + // short date: + // n - Numeric representation of a month, without leading zeros + // j - Day of the month without leading zeros + // Y - A full numeric representation of a year, 4 digits + // example: 3/1/2012 which means 1 March 2012 + ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy" + // long date: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy" + // long date with long time: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt" + // month day: + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd" + // short time (without seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt" + // long time (with seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt" + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + // month with year + // Y - A full numeric representation of a year, 4 digits + // F - A full textual representation of a month + YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "升序排序", + sortdesc : "降序排序", + columns : "列", + filter : "筛选", + grouping : "分类", + ungrouping : "取消分类", + searchTitle : "查找:", + freeze : "冻结", + unfreeze : "取消冻结", + reorder : "重新排序" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-cs.js b/html/sternwarte/storno/js/i18n/grid.locale-cs.js new file mode 100755 index 0000000..8fa7f4a --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-cs.js @@ -0,0 +1,184 @@ +/** + * jqGrid Czech Translation + * Pavel Jirak pavel.jirak@jipas.cz + * doplnil Thomas Wagner xwagne01@stud.fit.vutbr.cz + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["cs"] = { + defaults : { + recordtext: "Zobrazeno {0} - {1} z {2} záznamů", + emptyrecords: "Nenalezeny žádné záznamy", + loadtext: "Načítám...", + savetext: "Saving...", + pgtext : "Strana {0} z {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Vyhledávám...", + Find: "Hledat", + Reset: "Reset", + odata: [{ oper:'eq', text:"rovno"},{ oper:'ne', text:"nerovno"},{ oper:'lt', text:"menší"},{ oper:'le', text:"menší nebo rovno"},{ oper:'gt', text:"větší"},{ oper:'ge', text:"větší nebo rovno"},{ oper:'bw', text:"začíná s"},{ oper:'bn', text:"nezačíná s"},{ oper:'in', text:"je v"},{ oper:'ni', text:"není v"},{ oper:'ew', text:"končí s"},{ oper:'en', text:"nekončí s"},{ oper:'cn', text:"obsahuje"},{ oper:'nc', text:"neobsahuje"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "všech" }, { op: "OR", text: "některého z" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Přidat záznam", + editCaption: "Editace záznamu", + bSubmit: "Uložit", + bCancel: "Storno", + bClose: "Zavřít", + saveData: "Data byla změněna! Uložit změny?", + bYes : "Ano", + bNo : "Ne", + bExit : "Zrušit", + msg: { + required:"Pole je vyžadováno", + number:"Prosím, vložte validní číslo", + minValue:"hodnota musí být větší než nebo rovná ", + maxValue:"hodnota musí být menší než nebo rovná ", + email: "není validní e-mail", + integer: "Prosím, vložte celé číslo", + date: "Prosím, vložte validní datum", + url: "není platnou URL. Vyžadován prefix ('http://' or 'https://')", + nodefined : " není definován!", + novalue : " je vyžadována návratová hodnota!", + customarray : "Custom function mělá vrátit pole!", + customfcheck : "Custom function by měla být přítomna v případě custom checking!" + } + }, + view : { + caption: "Zobrazit záznam", + bClose: "Zavřít" + }, + del : { + caption: "Smazat", + msg: "Smazat vybraný(é) záznam(y)?", + bSubmit: "Smazat", + bCancel: "Storno" + }, + nav : { + edittext: " ", + edittitle: "Editovat vybraný řádek", + addtext:" ", + addtitle: "Přidat nový řádek", + deltext: " ", + deltitle: "Smazat vybraný záznam ", + searchtext: " ", + searchtitle: "Najít záznamy", + refreshtext: "", + refreshtitle: "Obnovit tabulku", + alertcap: "Varování", + alerttext: "Prosím, vyberte řádek", + viewtext: "", + viewtitle: "Zobrazit vybraný řádek", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Zobrazit/Skrýt sloupce", + bSubmit: "Uložit", + bCancel: "Storno" + }, + errors : { + errcap : "Chyba", + nourl : "Není nastavena url", + norecords: "Žádné záznamy ke zpracování", + model : "Délka colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Ne", "Po", "Út", "St", "Čt", "Pá", "So", + "Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota" + ], + monthNames: [ + "Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čvc", "Srp", "Zář", "Říj", "Lis", "Pro", + "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec" + ], + AmPm : ["do","od","DO","OD"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-de.js b/html/sternwarte/storno/js/i18n/grid.locale-de.js new file mode 100755 index 0000000..613a1b8 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-de.js @@ -0,0 +1,231 @@ +/** + * jqGrid German Translation + * Version 1.0.0 (developed for jQuery Grid 3.3.1) + * Olaf Klöppel opensource@blue-hit.de + * http://blue-hit.de/ + * + * Updated for jqGrid 3.8 + * Andreas Flack + * http://www.contentcontrol-berlin.de + * + * Updated for jQuery 4.4 + * Oleg Kiriljuk oleg.kiriljuk@ok-soft-gmbh.com + * the format corresponds now the format from + * https://github.com/jquery/globalize/blob/master/lib/cultures/globalize.culture.de.js + * + * Updated for jqGrid 4.8 + * Tony Tomov + * http://www.guriddo.net + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["de"] = { + defaults : { + recordtext: "Zeige {0} - {1} von {2}", + emptyrecords: "Keine Datensätze vorhanden", + loadtext: "Lädt...", + savetext: "Speichern...", + pgtext : "Seite {0} von {1}", + pgfirst : "erste Seite", + pglast : "letzte Seite", + pgnext : "nächste Seite", + pgprev : "vorherige Seite", + pgrecs : "Datensätze pro Seite", + showhide: "Toggle erweitern reduzieren", + // mobile + pagerCaption : "Grid::Seite Optionen", + pageText : "Seite:", + recordPage : "Ergebnisse pro Seite", + nomorerecs : "Keine weiteren Datensätze...", + scrollPullup: "Ziehen Sie, um mehr zu laden...", + scrollPulldown : "Pulldown zu aktualisieren...", + scrollRefresh : "Lassen Sie zu aktualisieren..." + }, + search : { + caption: "Suche...", + Find: "Suchen", + Reset: "Zurücksetzen", + odata: [{ oper:'eq', text:"gleich"},{ oper:'ne', text:"ungleich"},{ oper:'lt', text:"kleiner"},{ oper:'le', text:"kleiner gleich"},{ oper:'gt', text:"größer"},{ oper:'ge', text:"größer gleich"},{ oper:'bw', text:"beginnt mit"},{ oper:'bn', text:"beginnt nicht mit"},{ oper:'in', text:"ist in"},{ oper:'ni', text:"ist nicht in"},{ oper:'ew', text:"endet mit"},{ oper:'en', text:"endet nicht mit"},{ oper:'cn', text:"enthält"},{ oper:'nc', text:"enthält nicht"}, { oper:'nu', text:"ist Null" }, { oper:'nn', text:"ist nicht Null" }, {oper:'bt', text:'zwischen'}], + groupOps: [{ op: "AND", text: "alle" },{ op: "OR", text: "mindestens eine" }], + operandTitle : "Klicken Sie auf Suchoperation zu wählen.", + resetTitle : "Reset Suche Wert", + addsubgrup : "Gruppe hinzufügen", + addrule : "In der Regel", + delgroup : "Gruppe löschen", + delrule : "Regel löschen" + }, + edit : { + addCaption: "Datensatz hinzufügen", + editCaption: "Datensatz bearbeiten", + bSubmit: "Speichern", + bCancel: "Abbrechen", + bClose: "Schließen", + saveData: "Daten wurden geändert! Änderungen speichern?", + bYes : "ja", + bNo : "nein", + bExit : "abbrechen", + msg: { + required:"Feld ist erforderlich", + number: "Bitte geben Sie eine Zahl ein", + minValue:"Wert muss größer oder gleich sein, als ", + maxValue:"Wert muss kleiner oder gleich sein, als ", + email: "ist keine gültige E-Mail-Adresse", + integer: "Bitte geben Sie eine Ganzzahl ein", + date: "Bitte geben Sie ein gültiges Datum ein", + url: "ist keine gültige URL. Präfix muss eingegeben werden ('http://' oder 'https://')", + nodefined : " ist nicht definiert!", + novalue : " Rückgabewert ist erforderlich!", + customarray : "Benutzerdefinierte Funktion sollte ein Array zurückgeben!", + customfcheck : "Benutzerdefinierte Funktion sollte im Falle der benutzerdefinierten Überprüfung vorhanden sein!" + } + }, + view : { + caption: "Datensatz anzeigen", + bClose: "Schließen" + }, + del : { + caption: "Löschen", + msg: "Ausgewählte Datensätze löschen?", + bSubmit: "Löschen", + bCancel: "Abbrechen" + }, + nav : { + edittext: " ", + edittitle: "Ausgewählte Zeile editieren", + addtext:" ", + addtitle: "Neue Zeile einfügen", + deltext: " ", + deltitle: "Ausgewählte Zeile löschen", + searchtext: " ", + searchtitle: "Datensatz suchen", + refreshtext: "", + refreshtitle: "Tabelle neu laden", + alertcap: "Warnung", + alerttext: "Bitte Zeile auswählen", + viewtext: "", + viewtitle: "Ausgewählte Zeile anzeigen", + savetext: "", + savetitle: "Zeile speihern", + canceltext: "", + canceltitle : "Zeile abbrechen", + selectcaption : "Aktionen..." + }, + col : { + caption: "Spalten auswählen", + bSubmit: "Speichern", + bCancel: "Abbrechen" + }, + errors : { + errcap : "Fehler", + nourl : "Keine URL angegeben", + norecords: "Keine Datensätze zu bearbeiten", + model : "colNames und colModel sind unterschiedlich lang!" + }, + formatter : { + integer : {thousandsSeparator: ".", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "", suffix:" €", defaultValue: '0,00'}, + date : { + dayNames: [ + "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", + "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez", + "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" + ], + AmPm : ["","","",""], + S: function () {return '.';}, // one can also use 'er' instead of '.' but one have to use additional word like 'der' or 'den' before + srcformat: 'Y-m-d', + newformat: 'd.m.Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid + // and see http://docs.jquery.com/UI/Datepicker/formatDate + // and https://github.com/jquery/globalize#dates for alternative formats used frequently + ISO8601Long: "Y-m-d H:i:s", + ISO8601Short: "Y-m-d", + // short date: + // d - Day of the month, 2 digits with leading zeros + // m - Numeric representation of a month, with leading zeros + // Y - A full numeric representation of a year, 4 digits + ShortDate: "d.m.Y", // in jQuery UI Datepicker: "dd.MM.yyyy" + // long date: + // l - A full textual representation of the day of the week + // j - Day of the month without leading zeros + // F - A full textual representation of a month + // Y - A full numeric representation of a year, 4 digits + LongDate: "l, j. F Y", // in jQuery UI Datepicker: "dddd, d. MMMM yyyy" + // long date with long time: + // l - A full textual representation of the day of the week + // j - Day of the month without leading zeros + // F - A full textual representation of a month + // Y - A full numeric representation of a year, 4 digits + // H - 24-hour format of an hour with leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + FullDateTime: "l, j. F Y H:i:s", // in jQuery UI Datepicker: "dddd, d. MMMM yyyy HH:mm:ss" + // month day: + // d - Day of the month, 2 digits with leading zeros + // F - A full textual representation of a month + MonthDay: "d F", // in jQuery UI Datepicker: "dd MMMM" + // short time (without seconds) + // H - 24-hour format of an hour with leading zeros + // i - Minutes with leading zeros + ShortTime: "H:i", // in jQuery UI Datepicker: "HH:mm" + // long time (with seconds) + // H - 24-hour format of an hour with leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + LongTime: "H:i:s", // in jQuery UI Datepicker: "HH:mm:ss" + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + // month with year + // F - A full textual representation of a month + // Y - A full numeric representation of a year, 4 digits + YearMonth: "F Y" // in jQuery UI Datepicker: "MMMM yyyy" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Aufsteigend sortieren", + sortdesc : "Absteigend sortieren", + columns : "Spalte", + filter : "Filter", + grouping : "Gruppiere nach", + ungrouping : "Gruppierung aufheben", + searchTitle : "Erhalten Sie Artikel mit Wert:", + freeze : "Einfrieren", + unfreeze : "Freigeben", + reorder : "Bewegen neu anordnen" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-dk.js b/html/sternwarte/storno/js/i18n/grid.locale-dk.js new file mode 100755 index 0000000..b478553 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-dk.js @@ -0,0 +1,184 @@ +/** + * jqGrid Danish Translation + * Kaare Rasmussen kjs@jasonic.dk + * http://jasonic.dk/blog + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["dk"] = { + defaults : { + recordtext: "View {0} - {1} of {2}", + emptyrecords: "No records to view", + loadtext: "Loading...", + savetext: "Saving...", + pgtext : "Page {0} of {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Søg...", + Find: "Find", + Reset: "Nulstil", + odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Tilføj", + editCaption: "Ret", + bSubmit: "Send", + bCancel: "Annuller", + bClose: "Luk", + saveData: "Data has been changed! Save changes?", + bYes : "Yes", + bNo : "No", + bExit : "Cancel", + msg: { + required:"Felt er nødvendigt", + number:"Indtast venligst et validt tal", + minValue:"værdi skal være større end eller lig med", + maxValue:"værdi skal være mindre end eller lig med", + email: "er ikke en valid email", + integer: "Indtast venligst et validt heltalt", + date: "Indtast venligst en valid datoværdi", + url: "is not a valid URL. Prefix required ('http://' or 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "View Record", + bClose: "Close" + }, + del : { + caption: "Slet", + msg: "Slet valgte række(r)?", + bSubmit: "Slet", + bCancel: "Annuller" + }, + nav : { + edittext: " ", + edittitle: "Rediger valgte række", + addtext:" ", + addtitle: "Tilføj ny række", + deltext: " ", + deltitle: "Slet valgte række", + searchtext: " ", + searchtitle: "Find poster", + refreshtext: "", + refreshtitle: "Indlæs igen", + alertcap: "Advarsel", + alerttext: "Vælg venligst række", + viewtext: "", + viewtitle: "View selected row", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Vis/skjul kolonner", + bSubmit: "Send", + bCancel: "Annuller" + }, + errors : { + errcap : "Fejl", + nourl : "Ingel url valgt", + norecords: "Ingen poster at behandle", + model : "colNames og colModel har ikke samme længde!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Søn", "Man", "Tirs", "Ons", "Tors", "Fre", "Lør", + "Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec", + "Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December" + ], + AmPm : ["","","",""], + S: function (j) {return '.'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "j/n/Y", + LongDate: "l d. F Y", + FullDateTime: "l d F Y G:i:s", + MonthDay: "d. F", + ShortTime: "G:i", + LongTime: "G:i:s", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +// DK +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-el.js b/html/sternwarte/storno/js/i18n/grid.locale-el.js new file mode 100755 index 0000000..f86d29b --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-el.js @@ -0,0 +1,182 @@ +/** + * jqGrid Greek (el) Translation + * Alex Cicovic + * http://www.alexcicovic.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["el"] = { + defaults : { + recordtext: "View {0} - {1} of {2}", + emptyrecords: "No records to view", + loadtext: "Φόρτωση...", + savetext: "Saving...", + pgtext : "Page {0} of {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Αναζήτηση...", + Find: "Εύρεση", + Reset: "Επαναφορά", + odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Εισαγωγή Εγγραφής", + editCaption: "Επεξεργασία Εγγραφής", + bSubmit: "Καταχώρηση", + bCancel: "Άκυρο", + bClose: "Κλείσιμο", + saveData: "Data has been changed! Save changes?", + bYes : "Yes", + bNo : "No", + bExit : "Cancel", + msg: { + required:"Το πεδίο είναι απαραίτητο", + number:"Το πεδίο δέχεται μόνο αριθμούς", + minValue:"Η τιμή πρέπει να είναι μεγαλύτερη ή ίση του ", + maxValue:"Η τιμή πρέπει να είναι μικρότερη ή ίση του ", + email: "Η διεύθυνση e-mail δεν είναι έγκυρη", + integer: "Το πεδίο δέχεται μόνο ακέραιους αριθμούς", + url: "is not a valid URL. Prefix required ('http://' or 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "View Record", + bClose: "Close" + }, + del : { + caption: "Διαγραφή", + msg: "Διαγραφή των επιλεγμένων εγγραφών;", + bSubmit: "Ναι", + bCancel: "Άκυρο" + }, + nav : { + edittext: " ", + edittitle: "Επεξεργασία επιλεγμένης εγγραφής", + addtext:" ", + addtitle: "Εισαγωγή νέας εγγραφής", + deltext: " ", + deltitle: "Διαγραφή επιλεγμένης εγγραφής", + searchtext: " ", + searchtitle: "Εύρεση Εγγραφών", + refreshtext: "", + refreshtitle: "Ανανέωση Πίνακα", + alertcap: "Προσοχή", + alerttext: "Δεν έχετε επιλέξει εγγραφή", + viewtext: "", + viewtitle: "View selected row", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Εμφάνιση / Απόκρυψη Στηλών", + bSubmit: "ΟΚ", + bCancel: "Άκυρο" + }, + errors : { + errcap : "Σφάλμα", + nourl : "Δεν έχει δοθεί διεύθυνση χειρισμού για τη συγκεκριμένη ενέργεια", + norecords: "Δεν υπάρχουν εγγραφές προς επεξεργασία", + model : "Άνισος αριθμός πεδίων colNames/colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", + "Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο" + ], + monthNames: [ + "Ιαν", "Φεβ", "Μαρ", "Απρ", "Μαι", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ", + "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος" + ], + AmPm : ["πμ","μμ","ΠΜ","ΜΜ"], + S: function (j) {return j == 1 || j > 1 ? ['η'][Math.min((j - 1) % 10, 3)] : ''}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-en.js b/html/sternwarte/storno/js/i18n/grid.locale-en.js new file mode 100755 index 0000000..fd97429 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-en.js @@ -0,0 +1,224 @@ +/** + * jqGrid English Translation + * Tony Tomov tony@trirand.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["en"] = { + defaults : { + recordtext: "View {0} - {1} of {2}", + emptyrecords: "No records to view", + loadtext: "Loading...", + savetext: "Saving...", + pgtext : "Page {0} of {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Search...", + Find: "Find", + Reset: "Reset", + odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [{ op: "AND", text: "all" },{ op: "OR", text: "any" }], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Add Record", + editCaption: "Edit Record", + bSubmit: "Submit", + bCancel: "Cancel", + bClose: "Close", + saveData: "Data has been changed! Save changes?", + bYes : "Yes", + bNo : "No", + bExit : "Cancel", + msg: { + required:"Field is required", + number:"Please, enter valid number", + minValue:"value must be greater than or equal to ", + maxValue:"value must be less than or equal to", + email: "is not a valid e-mail", + integer: "Please, enter valid integer value", + date: "Please, enter valid date value", + url: "is not a valid URL. Prefix required ('http://' or 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + + } + }, + view : { + caption: "View Record", + bClose: "Close" + }, + del : { + caption: "Delete", + msg: "Delete selected record(s)?", + bSubmit: "Delete", + bCancel: "Cancel" + }, + nav : { + edittext: "", + edittitle: "Edit selected row", + addtext:"", + addtitle: "Add new row", + deltext: "", + deltitle: "Delete selected row", + searchtext: "", + searchtitle: "Find records", + refreshtext: "", + refreshtitle: "Reload Grid", + alertcap: "Warning", + alerttext: "Please, select row", + viewtext: "", + viewtitle: "View selected row", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Select columns", + bSubmit: "Ok", + bCancel: "Cancel" + }, + errors : { + errcap : "Error", + nourl : "No url is set", + norecords: "No records to process", + model : "Length of colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: ",", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat", + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, + srcformat: 'Y-m-d', + newformat: 'n/j/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid + // and see http://docs.jquery.com/UI/Datepicker/formatDate + // and https://github.com/jquery/globalize#dates for alternative formats used frequently + // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many + // information about date, time, numbers and currency formats used in different countries + // one should just convert the information in PHP format + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + // short date: + // n - Numeric representation of a month, without leading zeros + // j - Day of the month without leading zeros + // Y - A full numeric representation of a year, 4 digits + // example: 3/1/2012 which means 1 March 2012 + ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy" + // long date: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy" + // long date with long time: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt" + // month day: + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd" + // short time (without seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt" + // long time (with seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt" + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + // month with year + // Y - A full numeric representation of a year, 4 digits + // F - A full textual representation of a month + YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-es.js b/html/sternwarte/storno/js/i18n/grid.locale-es.js new file mode 100755 index 0000000..8a7646c --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-es.js @@ -0,0 +1,186 @@ +/** + * jqGrid Spanish Translation + * Traduccion jqGrid en Español por Yamil Bracho + * Traduccion corregida y ampliada por Faserline, S.L. + * http://www.faserline.com + * Traduccion corregida y ampliada por Fernán Castro Asensio + * Traducción corregida y ampliada por Luis Sánchez + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["es"] = { + defaults : { + recordtext: "Mostrando {0} - {1} de {2}", + emptyrecords: "Sin registros que mostrar", + loadtext: "Cargando...", + savetext: "Guardando...", + pgtext : "Página {0} de {1}", + pgfirst : "Primera página", + pglast : "Última página", + pgnext : "Siguiente página", + pgprev : "Anterior página", + pgrecs : "Registros por página", + showhide: "Alternar Contraer Expandir Grid", + // mobile + pagerCaption : "Grid::Configurar página", + pageText : "Página:", + recordPage : "Registros por página", + nomorerecs : "No más registros...", + scrollPullup: "Arrastrar arriba para cargar más...", + scrollPulldown : "Arrastrar arriba para refrescar...", + scrollRefresh : "Soltar para refrescar..." + }, + search : { + caption: "Búsqueda...", + Find: "Buscar", + Reset: "Limpiar", + odata: [{ oper:'eq', text:"igual "},{ oper:'ne', text:"no igual a"},{ oper:'lt', text:"menor que"},{ oper:'le', text:"menor o igual que"},{ oper:'gt', text:"mayor que"},{ oper:'ge', text:"mayor o igual a"},{ oper:'bw', text:"empiece por"},{ oper:'bn', text:"no empiece por"},{ oper:'in', text:"está en"},{ oper:'ni', text:"no está en"},{ oper:'ew', text:"termina por"},{ oper:'en', text:"no termina por"},{ oper:'cn', text:"contiene"},{ oper:'nc', text:"no contiene"},{ oper:'nu', text:'es nulo'},{ oper:'nn', text:'no es nulo'}, {oper:'bt', text:'entre'}], + groupOps: [ { op: "AND", text: "todo" }, { op: "OR", text: "cualquier" } ], + operandTitle : "Clic para seleccionar la operación de búsqueda.", + resetTitle : "Reiniciar valores de búsqueda", + addsubgrup : "Agregar subgrupo", + addrule : "Agregar regla", + delgroup : "Borrar grupo", + delrule : "Borrar regla" + }, + edit : { + addCaption: "Agregar registro", + editCaption: "Modificar registro", + bSubmit: "Guardar", + bCancel: "Cancelar", + bClose: "Cerrar", + saveData: "Se han modificado los datos, ¿guardar cambios?", + bYes : "Si", + bNo : "No", + bExit : "Cancelar", + msg: { + required:"Campo obligatorio", + number:"Introduzca un número", + minValue:"El valor debe ser mayor o igual a ", + maxValue:"El valor debe ser menor o igual a ", + email: "no es una dirección de correo válida", + integer: "Introduzca un valor entero", + date: "Introduzca una fecha correcta ", + url: "no es una URL válida. Prefijo requerido ('http://' or 'https://')", + nodefined : " no está definido.", + novalue : " valor de retorno es requerido.", + customarray : "La función personalizada debe devolver un array.", + customfcheck : "La función personalizada debe estar presente en el caso de validación personalizada." + } + }, + view : { + caption: "Consultar registro", + bClose: "Cerrar" + }, + del : { + caption: "Eliminar", + msg: "¿Desea eliminar los registros seleccionados?", + bSubmit: "Eliminar", + bCancel: "Cancelar" + }, + nav : { + edittext: " ", + edittitle: "Modificar fila seleccionada", + addtext:" ", + addtitle: "Agregar nueva fila", + deltext: " ", + deltitle: "Eliminar fila seleccionada", + searchtext: " ", + searchtitle: "Buscar información", + refreshtext: "", + refreshtitle: "Recargar datos", + alertcap: "Aviso", + alerttext: "Seleccione una fila", + viewtext: "", + viewtitle: "Ver fila seleccionada", + savetext: "", + savetitle: "Guardar fila", + canceltext: "", + canceltitle : "Cancelar edición de fila", + selectcaption : "Acciones..." + }, + col : { + caption: "Mostrar/ocultar columnas", + bSubmit: "Enviar", + bCancel: "Cancelar" + }, + errors : { + errcap : "Error", + nourl : "No se ha especificado una URL", + norecords: "No hay datos para procesar", + model : "Las columnas de nombres son diferentes de las columnas del modelo" + }, + formatter : { + integer : {thousandsSeparator: ".", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", + "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" + ], + monthNames: [ + "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic", + "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd-m-Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Ordenar ascendentemente", + sortdesc : "Ordenar descendientemente", + columns : "Columnas", + filter : "Filtrar", + grouping : "Agrupar por", + ungrouping : "Desagrupar", + searchTitle : "Obtener elementos con un valor que:", + freeze : "Congelar", + unfreeze : "Descongelar", + reorder : "Mover para reordenar" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-fa.js b/html/sternwarte/storno/js/i18n/grid.locale-fa.js new file mode 100755 index 0000000..e3e7763 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-fa.js @@ -0,0 +1,201 @@ +/** + * jqGrid Persian Translation + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["fa"] = { + defaults: { + recordtext: "نمابش {0} - {1} از {2}", + emptyrecords: "رکوردی یافت نشد", + loadtext: "بارگزاري...", + savetext: "Saving...", + pgtext: "صفحه {0} از {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search: { + caption: "جستجو...", + Find: "يافته ها", + Reset: "از نو", + odata: [{ oper:'eq', text:"برابر"},{ oper:'ne', text:"نا برابر"},{ oper:'lt', text:"به"},{ oper:'le', text:"کوچکتر"},{ oper:'gt', text:"از"},{ oper:'ge', text:"بزرگتر"},{ oper:'bw', text:"شروع با"},{ oper:'bn', text:"شروع نشود با"},{ oper:'in', text:"نباشد"},{ oper:'ni', text:"عضو این نباشد"},{ oper:'ew', text:"اتمام با"},{ oper:'en', text:"تمام نشود با"},{ oper:'cn', text:"حاوی"},{ oper:'nc', text:"نباشد حاوی"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [{ + op: "AND", + text: "کل" + }, + { + op: "OR", + text: "مجموع" + }], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit: { + addCaption: "اضافه کردن رکورد", + editCaption: "ويرايش رکورد", + bSubmit: "ثبت", + bCancel: "انصراف", + bClose: "بستن", + saveData: "دیتا تعییر کرد! ذخیره شود؟", + bYes: "بله", + bNo: "خیر", + bExit: "انصراف", + msg: { + required: "فيلدها بايد ختما پر شوند", + number: "لطفا عدد وعتبر وارد کنيد", + minValue: "مقدار وارد شده بايد بزرگتر يا مساوي با", + maxValue: "مقدار وارد شده بايد کوچکتر يا مساوي", + email: "پست الکترونيک وارد شده معتبر نيست", + integer: "لطفا يک عدد صحيح وارد کنيد", + date: "لطفا يک تاريخ معتبر وارد کنيد", + url: "این آدرس صحیح نمی باشد. پیشوند نیاز است ('http://' یا 'https://')", + nodefined: " تعریف نشده!", + novalue: " مقدار برگشتی اجباری است!", + customarray: "تابع شما باید مقدار آرایه داشته باشد!", + customfcheck: "برای داشتن متد دلخواه شما باید سطون با چکینگ دلخواه داشته باشید!" + } + }, + view: { + caption: "نمایش رکورد", + bClose: "بستن" + }, + del: { + caption: "حذف", + msg: "از حذف گزينه هاي انتخاب شده مطمئن هستيد؟", + bSubmit: "حذف", + bCancel: "ابطال" + }, + nav: { + edittext: " ", + edittitle: "ويرايش رديف هاي انتخاب شده", + addtext: " ", + addtitle: "افزودن رديف جديد", + deltext: " ", + deltitle: "حذف ردبف هاي انتیاب شده", + searchtext: " ", + searchtitle: "جستجوي رديف", + refreshtext: "", + refreshtitle: "بازيابي مجدد صفحه", + alertcap: "اخطار", + alerttext: "لطفا يک رديف انتخاب کنيد", + viewtext: "", + viewtitle: "نمایش رکورد های انتخاب شده", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col: { + caption: "نمايش/عدم نمايش ستون", + bSubmit: "ثبت", + bCancel: "انصراف" + }, + errors: { + errcap: "خطا", + nourl: "هيچ آدرسي تنظيم نشده است", + norecords: "هيچ رکوردي براي پردازش موجود نيست", + model: "طول نام ستون ها محالف ستون هاي مدل مي باشد!" + }, + formatter: { + integer: { + thousandsSeparator: " ", + defaultValue: "0" + }, + number: { + decimalSeparator: ".", + thousandsSeparator: " ", + decimalPlaces: 2, + defaultValue: "0.00" + }, + currency: { + decimalSeparator: ".", + thousandsSeparator: " ", + decimalPlaces: 2, + prefix: "", + suffix: "", + defaultValue: "0" + }, + date: { + dayNames: ["يک", "دو", "سه", "چهار", "پنج", "جمع", "شنب", "يکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], + monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "ژانويه", "فوريه", "مارس", "آوريل", "مه", "ژوئن", "ژوئيه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "December"], + AmPm: ["ب.ظ", "ب.ظ", "ق.ظ", "ق.ظ"], + S: function (b) { + return b < 11 || b > 13 ? ["st", "nd", "rd", "th"][Math.min((b - 1) % 10, 3)] : "th" + }, + srcformat: "Y-m-d", + newformat: "d/m/Y", + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks: { + ISO8601Long: "Y-m-d H:i:s", + ISO8601Short: "Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit: false, + userLocalTime : false + }, + baseLinkUrl: "", + showAction: "نمايش", + target: "", + checkbox: { + disabled: true + }, + idName: "id" + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } + }; +})); \ No newline at end of file diff --git a/html/sternwarte/storno/js/i18n/grid.locale-fi.js b/html/sternwarte/storno/js/i18n/grid.locale-fi.js new file mode 100755 index 0000000..c5fc8e5 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-fi.js @@ -0,0 +1,185 @@ +/** + * jqGrid (fi) Finnish Translation + * Jukka Inkeri awot.fi 2010-05-19 + * Alex Grönholm alex.gronholm@nextday.fi 2011-05-18 + * http://awot.fi + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["fi"] = { + defaults: { + recordtext: "Rivit {0} - {1} / {2}", + emptyrecords: "Ei näytettäviä", + loadtext: "Haetaan...", + savetext: "Saving...", + pgtext: "Sivu {0} / {1}", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search: { + caption: "Etsi...", + Find: "Etsi", + Reset: "Tyhjennä", + odata: [{ oper:'eq', text:"on"},{ oper:'ne', text:"ei ole"},{ oper:'lt', text:"pienempi"},{ oper:'le', text:"pienempi tai yhtäsuuri"},{ oper:'gt', text:"suurempi"},{ oper:'ge', text:"suurempi tai yhtäsuuri"},{ oper:'bw', text:"alkaa"},{ oper:'bn', text:"ei ala"},{ oper:'in', text:"joukossa"},{ oper:'ni', text:"ei joukossa"},{ oper:'ew', text:"loppuu"},{ oper:'en', text:"ei lopu"},{ oper:'cn', text:"sisältää"},{ oper:'nc', text:"ei sisällä"},{ oper:'nu', text:"on tyhjä"},{ oper:'nn', text:"ei ole tyhjä"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "kaikki" }, { op: "OR", text: "mikä tahansa" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit: { + addCaption: "Uusi rivi", + editCaption: "Muokkaa riviä", + bSubmit: "OK", + bCancel: "Peru", + bClose: "Sulje", + saveData: "Tietoja muutettu! Tallennetaanko?", + bYes: "Kyllä", + bNo: "Ei", + bExit: "Peru", + msg: { + required: "pakollinen", + number: "Anna kelvollinen nro", + minValue: "arvon oltava suurempi tai yhtäsuuri kuin ", + maxValue: "arvon oltava pienempi tai yhtäsuuri kuin ", + email: "ei ole kelvollinen säpostiosoite", + integer: "Anna kelvollinen kokonaisluku", + date: "Anna kelvollinen pvm", + url: "Ei ole kelvollinen linkki(URL). Alku oltava ('http://' tai 'https://')", + nodefined: " ei ole määritelty!", + novalue: " paluuarvo vaaditaan!", + customarray: "Oman funktion tulee palauttaa jono!", + customfcheck: "Oma funktio on määriteltävä räätälöityä tarkastusta varten!" + } + }, + view: { + caption: "Näytä rivi", + bClose: "Sulje" + }, + del: { + caption: "Poista", + msg: "Poista valitut rivit?", + bSubmit: "Poista", + bCancel: "Peru" + }, + nav: { + edittext: "", + edittitle: "Muokkaa valittua riviä", + addtext: "", + addtitle: "Uusi rivi", + deltext: "", + deltitle: "Poista valittu rivi", + searchtext: "", + searchtitle: "Etsi tietoja", + refreshtext: "", + refreshtitle: "Lataa uudelleen", + alertcap: "Varoitus", + alerttext: "Valitse rivi", + viewtext: "", + viewtitle: "Näyta valitut rivit", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col: { + caption: "Valitse sarakkeet", + bSubmit: "OK", + bCancel: "Peru" + }, + errors : { + errcap: "Virhe", + nourl: "URL on asettamatta", + norecords: "Ei muokattavia tietoja", + model: "Pituus colNames <> colModel!" + }, + formatter: { + integer: {thousandsSeparator: "", defaultValue: '0'}, + number: {decimalSeparator:",", thousandsSeparator: "", decimalPlaces: 2, defaultValue: '0,00'}, + currency: {decimalSeparator:",", thousandsSeparator: "", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date: { + dayNames: [ + "Su", "Ma", "Ti", "Ke", "To", "Pe", "La", + "Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai" + ], + monthNames: [ + "Tam", "Hel", "Maa", "Huh", "Tou", "Kes", "Hei", "Elo", "Syy", "Lok", "Mar", "Jou", + "Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu" + ], + AmPm: ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd.m.Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks: { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "d.m.Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox: {disabled:true}, + idName: 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +// FI +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-fr.js b/html/sternwarte/storno/js/i18n/grid.locale-fr.js new file mode 100755 index 0000000..2d521a1 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-fr.js @@ -0,0 +1,182 @@ +/** + * jqGrid French Translation + * Tony Tomov tony@trirand.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["fr"] = { + defaults : { + recordtext: "Enregistrements {0} - {1} sur {2}", + emptyrecords: "Aucun enregistrement à afficher", + loadtext: "Chargement...", + savetext: "Sauvegarde en cours...", + pgtext : "Page {0} de {1}", + pgfirst : "Première page", + pglast : "Dernière page", + pgnext : "Page suivante", + pgprev : "Page précédente", + pgrecs : "Enregistrements par page", + showhide: "Réduire/Agrandir la grille", + // mobile + pagerCaption : "Grille::Options de pagination", + pageText : "Page:", + recordPage: "Enregistrements par page", + nomorerecs : "Plus de données...", + scrollPullup: "Glisser vers le haut pour charger plus de données...", + scrollPulldown : "Glisser vers le bas pour rafraîchir...", + scrollRefresh : "Relâcher pour rafraîchir..." + }, + search : { + caption: "Recherche...", + Find: "Chercher", + Reset: "Réinitialiser", + odata: [{ oper:'eq', text:"égal"},{ oper:'ne', text:"différent"},{ oper:'lt', text:"inférieur"},{ oper:'le', text:"inférieur ou égal"},{ oper:'gt', text:"supérieur"},{ oper:'ge', text:"supérieur ou égal"},{ oper:'bw', text:"commence par"},{ oper:'bn', text:"ne commence pas par"},{ oper:'in', text:"est dans"},{ oper:'ni', text:"n'est pas dans"},{ oper:'ew', text:"finit par"},{ oper:'en', text:"ne finit pas par"},{ oper:'cn', text:"contient"},{ oper:'nc', text:"ne contient pas"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'entre'}], + groupOps: [ { op: "AND", text: "tous" }, { op: "OR", text: "au moins un" } ], + operandTitle : "Cliquer pour sélectionner l'opérateur.", + resetTitle : "Réinitialiser la valeur de recherche", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Ajouter", + editCaption: "Éditer", + bSubmit: "Valider", + bCancel: "Annuler", + bClose: "Fermer", + saveData: "Les données ont changé ! Enregistrer les modifications ?", + bYes: "Oui", + bNo: "Non", + bExit: "Annuler", + msg: { + required: "Champ obligatoire", + number: "Saisissez un nombre correct", + minValue: "La valeur doit être supérieure ou égale à", + maxValue: "La valeur doit être inférieure ou égale à", + email: "n'est pas un email valide", + integer: "Saisissez un entier valide", + url: "n'est pas une adresse valide. Préfixe requis ('http://' or 'https://')", + nodefined : " n'est pas défini!", + novalue : " la valeur de retour est requise!", + customarray : "Une fonction personnalisée devrait retourner un tableau (array)!", + customfcheck : "Une fonction personnalisée devrait être présente dans le cas d'une vérification personnalisée!" + } + }, + view : { + caption: "Voir les enregistrements", + bClose: "Fermer" + }, + del : { + caption: "Supprimer", + msg: "Supprimer les enregistrements sélectionnés ?", + bSubmit: "Supprimer", + bCancel: "Annuler" + }, + nav : { + edittext: " ", + edittitle: "Editer la ligne sélectionnée", + addtext:" ", + addtitle: "Ajouter une ligne", + deltext: " ", + deltitle: "Supprimer la ligne sélectionnée", + searchtext: " ", + searchtitle: "Chercher un enregistrement", + refreshtext: "", + refreshtitle: "Recharger le tableau", + alertcap: "Avertissement", + alerttext: "Veuillez sélectionner une ligne", + viewtext: "", + viewtitle: "Afficher la ligne sélectionnée", + savetext: "", + savetitle: "Sauvegarder la ligne", + canceltext: "", + canceltitle : "Annuler l'édition de la ligne", + selectcaption : "Actions..." + }, + col : { + caption: "Afficher/Masquer les colonnes", + bSubmit: "Valider", + bCancel: "Annuler" + }, + errors : { + errcap : "Erreur", + nourl : "Aucune adresse n'est paramétrée", + norecords: "Aucun enregistrement à traiter", + model : "Nombre de titres (colNames) <> Nombre de données (colModel)!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", + "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" + ], + monthNames: [ + "Jan", "Fév", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Déc", + "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Décembre" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j == 1 ? 'er' : 'e';}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Trier en ordre croissant", + sortdesc: "Trier en ordre décroissant", + columns : "Colonnes", + filter : "Filtrer", + grouping : "Grouper par", + ungrouping : "Séparer", + searchTitle : "Prendre les items avec la valeur:", + freeze : "Figer", + unfreeze : "Relâcher", + reorder : "Déplacer pour changer l'ordre" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-gl.js b/html/sternwarte/storno/js/i18n/grid.locale-gl.js new file mode 100755 index 0000000..012cbb6 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-gl.js @@ -0,0 +1,182 @@ +/** + * jqGrid Galician Translation + * Translated by Jorge Barreiro + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["gl"] = { + defaults : { + recordtext: "Amosando {0} - {1} de {2}", + emptyrecords: "Sen rexistros que amosar", + loadtext: "Cargando...", + pgtext : "Páxina {0} de {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Búsqueda...", + Find: "Buscar", + Reset: "Limpar", + odata: [{ oper:'eq', text:"igual "},{ oper:'ne', text:"diferente a"},{ oper:'lt', text:"menor que"},{ oper:'le', text:"menor ou igual que"},{ oper:'gt', text:"maior que"},{ oper:'ge', text:"maior ou igual a"},{ oper:'bw', text:"empece por"},{ oper:'bn', text:"non empece por"},{ oper:'in', text:"está en"},{ oper:'ni', text:"non está en"},{ oper:'ew', text:"termina por"},{ oper:'en', text:"non termina por"},{ oper:'cn', text:"contén"},{ oper:'nc', text:"non contén"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "todo" }, { op: "OR", text: "calquera" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Engadir rexistro", + editCaption: "Modificar rexistro", + bSubmit: "Gardar", + bCancel: "Cancelar", + bClose: "Pechar", + saveData: "Modificáronse os datos, quere gardar os cambios?", + bYes : "Si", + bNo : "Non", + bExit : "Cancelar", + msg: { + required:"Campo obrigatorio", + number:"Introduza un número", + minValue:"O valor debe ser maior ou igual a ", + maxValue:"O valor debe ser menor ou igual a ", + email: "non é un enderezo de correo válido", + integer: "Introduza un valor enteiro", + date: "Introduza unha data correcta ", + url: "non é unha URL válida. Prefixo requerido ('http://' ou 'https://')", + nodefined : " non está definido.", + novalue : " o valor de retorno é obrigatorio.", + customarray : "A función persoalizada debe devolver un array.", + customfcheck : "A función persoalizada debe estar presente no caso de ter validación persoalizada." + } + }, + view : { + caption: "Consultar rexistro", + bClose: "Pechar" + }, + del : { + caption: "Eliminar", + msg: "Desexa eliminar os rexistros seleccionados?", + bSubmit: "Eliminar", + bCancel: "Cancelar" + }, + nav : { + edittext: " ", + edittitle: "Modificar a fila seleccionada", + addtext:" ", + addtitle: "Engadir unha nova fila", + deltext: " ", + deltitle: "Eliminar a fila seleccionada", + searchtext: " ", + searchtitle: "Buscar información", + refreshtext: "", + refreshtitle: "Recargar datos", + alertcap: "Aviso", + alerttext: "Seleccione unha fila", + viewtext: "", + viewtitle: "Ver fila seleccionada", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Mostrar/ocultar columnas", + bSubmit: "Enviar", + bCancel: "Cancelar" + }, + errors : { + errcap : "Erro", + nourl : "Non especificou unha URL", + norecords: "Non hai datos para procesar", + model : "As columnas de nomes son diferentes das columnas de modelo" + }, + formatter : { + integer : {thousandsSeparator: ".", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Do", "Lu", "Ma", "Me", "Xo", "Ve", "Sa", + "Domingo", "Luns", "Martes", "Mércoles", "Xoves", "Vernes", "Sábado" + ], + monthNames: [ + "Xan", "Feb", "Mar", "Abr", "Mai", "Xuñ", "Xul", "Ago", "Set", "Out", "Nov", "Dec", + "Xaneiro", "Febreiro", "Marzo", "Abril", "Maio", "Xuño", "Xullo", "Agosto", "Setembro", "Outubro", "Novembro", "Decembro" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd-m-Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-he.js b/html/sternwarte/storno/js/i18n/grid.locale-he.js new file mode 100755 index 0000000..1748bab --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-he.js @@ -0,0 +1,183 @@ +/** + * jqGrid Hebrew Translation + * Shuki Shukrun shukrun.shuki@gmail.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["he"] = { + defaults : { + recordtext: "מציג {0} - {1} מתוך {2}", + emptyrecords: "אין רשומות להציג", + loadtext: "טוען...", + pgtext : "דף {0} מתוך {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "מחפש...", + Find: "חפש", + Reset: "התחל", + odata: [{ oper:'eq', text:"שווה"},{ oper:'ne', text:"לא שווה"},{ oper:'lt', text:"קטן"},{ oper:'le', text:"קטן או שווה"},{ oper:'gt', text:"גדול"},{ oper:'ge', text:"גדול או שווה"},{ oper:'bw', text:"מתחיל ב"},{ oper:'bn', text:"לא מתחיל ב"},{ oper:'in', text:"נמצא ב"},{ oper:'ni', text:"לא נמצא ב"},{ oper:'ew', text:"מסתיים ב"},{ oper:'en', text:"לא מסתיים ב"},{ oper:'cn', text:"מכיל"},{ oper:'nc', text:"לא מכיל"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "הכל" }, { op: "OR", text: "אחד מ" }], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "הוסף רשומה", + editCaption: "ערוך רשומה", + bSubmit: "שלח", + bCancel: "בטל", + bClose: "סגור", + saveData: "נתונים השתנו! לשמור?", + bYes : "כן", + bNo : "לא", + bExit : "בטל", + msg: { + required:"שדה חובה", + number:"אנא, הכנס מספר תקין", + minValue:"ערך צריך להיות גדול או שווה ל ", + maxValue:"ערך צריך להיות קטן או שווה ל ", + email: "היא לא כתובת איימל תקינה", + integer: "אנא, הכנס מספר שלם", + date: "אנא, הכנס תאריך תקין", + url: "הכתובת אינה תקינה. דרושה תחילית ('http://' או 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "הצג רשומה", + bClose: "סגור" + }, + del : { + caption: "מחק", + msg: "האם למחוק את הרשומה/ות המסומנות?", + bSubmit: "מחק", + bCancel: "בטל" + }, + nav : { + edittext: "", + edittitle: "ערוך שורה מסומנת", + addtext:"", + addtitle: "הוסף שורה חדשה", + deltext: "", + deltitle: "מחק שורה מסומנת", + searchtext: "", + searchtitle: "חפש רשומות", + refreshtext: "", + refreshtitle: "טען גריד מחדש", + alertcap: "אזהרה", + alerttext: "אנא, בחר שורה", + viewtext: "", + viewtitle: "הצג שורה מסומנת", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "הצג/הסתר עמודות", + bSubmit: "שלח", + bCancel: "בטל" + }, + errors : { + errcap : "שגיאה", + nourl : "לא הוגדרה כתובת url", + norecords: "אין רשומות לעבד", + model : "אורך של colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "א", "ב", "ג", "ד", "ה", "ו", "ש", + "ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת" + ], + monthNames: [ + "ינו", "פבר", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ", + "ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר" + ], + AmPm : ["לפני הצהרים","אחר הצהרים","לפני הצהרים","אחר הצהרים"], + S: function (j) {return j < 11 || j > 13 ? ['', '', '', ''][Math.min((j - 1) % 10, 3)] : ''}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-hr.js b/html/sternwarte/storno/js/i18n/grid.locale-hr.js new file mode 100755 index 0000000..25e3576 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-hr.js @@ -0,0 +1,218 @@ +/** + * jqGrid Croatian Translation + * Version 1.0.1 (developed for jQuery Grid 4.4) + * msajko@gmail.com + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["hr"] = { + defaults : { + recordtext: "Pregled {0} - {1} od {2}", + emptyrecords: "Nema zapisa", + loadtext: "Učitavam...", + pgtext : "Stranica {0} od {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Traži...", + Find: "Pretraživanje", + Reset: "Poništi", + odata: [{ oper:'eq', text:"jednak"},{ oper:'ne', text:"nije identičan"},{ oper:'lt', text:"manje"},{ oper:'le', text:"manje ili identično"},{ oper:'gt', text:"veće"},{ oper:'ge', text:"veće ili identično"},{ oper:'bw', text:"počinje sa"},{ oper:'bn', text:"ne počinje sa "},{ oper:'in', text:"je u"},{ oper:'ni', text:"nije u"},{ oper:'ew', text:"završava sa"},{ oper:'en', text:"ne završava sa"},{ oper:'cn', text:"sadrži"},{ oper:'nc', text:"ne sadrži"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "I", text: "sve" }, { op: "ILI", text: "bilo koji" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Dodaj zapis", + editCaption: "Promijeni zapis", + bSubmit: "Preuzmi", + bCancel: "Odustani", + bClose: "Zatvri", + saveData: "Podaci su promijenjeni! Preuzmi promijene?", + bYes : "Da", + bNo : "Ne", + bExit : "Odustani", + msg: { + required:"Polje je obavezno", + number:"Molim, unesite ispravan broj", + minValue:"Vrijednost mora biti veća ili identična ", + maxValue:"Vrijednost mora biti manja ili identična", + email: "neispravan e-mail", + integer: "Molim, unjeti ispravan cijeli broj (integer)", + date: "Molim, unjeti ispravan datum ", + url: "neispravan URL. Prefiks je obavezan ('http://' or 'https://')", + nodefined : " nije definiran!", + novalue : " zahtjevan podatak je obavezan!", + customarray : "Opcionalna funkcija trebala bi bili polje (array)!", + customfcheck : "Custom function should be present in case of custom checking!" + + } + }, + view : { + caption: "Otvori zapis", + bClose: "Zatvori" + }, + del : { + caption: "Obriši", + msg: "Obriši označen zapis ili više njih?", + bSubmit: "Obriši", + bCancel: "Odustani" + }, + nav : { + edittext: "", + edittitle: "Promijeni obilježeni red", + addtext: "", + addtitle: "Dodaj novi red", + deltext: "", + deltitle: "Obriši obilježeni red", + searchtext: "", + searchtitle: "Potraži zapise", + refreshtext: "", + refreshtitle: "Ponovo preuzmi podatke", + alertcap: "Upozorenje", + alerttext: "Molim, odaberi red", + viewtext: "", + viewtitle: "Pregled obilježenog reda", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Obilježi kolonu", + bSubmit: "Uredu", + bCancel: "Odustani" + }, + errors : { + errcap : "Greška", + nourl : "Nedostaje URL", + norecords: "Bez zapisa za obradu", + model : "colNames i colModel imaju različitu duljinu!" + }, + formatter : { + integer : {thousandsSeparator: ".", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub", + "Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota" + ], + monthNames: [ + "Sij", "Velj", "Ožu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro", + "Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return ''}, + srcformat: 'Y-m-d', + newformat: 'd.m.Y.', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid + // and see http://docs.jquery.com/UI/Datepicker/formatDate + // and https://github.com/jquery/globalize#dates for alternative formats used frequently + ISO8601Long: "Y-m-d H:i:s", + ISO8601Short: "Y-m-d", + // short date: + // d - Day of the month, 2 digits with leading zeros + // m - Numeric representation of a month, with leading zeros + // Y - A full numeric representation of a year, 4 digits + ShortDate: "d.m.Y.", // in jQuery UI Datepicker: "dd.mm.yy." + // long date: + // l - A full textual representation of the day of the week + // j - Day of the month without leading zeros + // F - A full textual representation of a month + // Y - A full numeric representation of a year, 4 digits + LongDate: "l, j. F Y", // in jQuery UI Datepicker: "dddd, d. MMMM yyyy" + // long date with long time: + // l - A full textual representation of the day of the week + // j - Day of the month without leading zeros + // F - A full textual representation of a month + // Y - A full numeric representation of a year, 4 digits + // H - 24-hour format of an hour with leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + FullDateTime: "l, j. F Y H:i:s", // in jQuery UI Datepicker: "dddd, d. MMMM yyyy HH:mm:ss" + // month day: + // d - Day of the month, 2 digits with leading zeros + // F - A full textual representation of a month + MonthDay: "d F", // in jQuery UI Datepicker: "dd MMMM" + // short time (without seconds) + // H - 24-hour format of an hour with leading zeros + // i - Minutes with leading zeros + ShortTime: "H:i", // in jQuery UI Datepicker: "HH:mm" + // long time (with seconds) + // H - 24-hour format of an hour with leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + LongTime: "H:i:s", // in jQuery UI Datepicker: "HH:mm:ss" + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + // month with year + // F - A full textual representation of a month + // Y - A full numeric representation of a year, 4 digits + YearMonth: "F Y" // in jQuery UI Datepicker: "MMMM yyyy" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-hu.js b/html/sternwarte/storno/js/i18n/grid.locale-hu.js new file mode 100755 index 0000000..57b1d62 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-hu.js @@ -0,0 +1,185 @@ +/** + * jqGrid Hungarian Translation + * Őrszigety Ádám udx6bs@freemail.hu + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ + +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["hu"] = { + defaults : { + recordtext: "Oldal {0} - {1} / {2}", + emptyrecords: "Nincs találat", + loadtext: "Betöltés...", + pgtext : "Oldal {0} / {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Keresés...", + Find: "Keres", + Reset: "Alapértelmezett", + odata: [{ oper:'eq', text:"egyenlő"},{ oper:'ne', text:"nem egyenlő"},{ oper:'lt', text:"kevesebb"},{ oper:'le', text:"kevesebb vagy egyenlő"},{ oper:'gt', text:"nagyobb"},{ oper:'ge', text:"nagyobb vagy egyenlő"},{ oper:'bw', text:"ezzel kezdődik"},{ oper:'bn', text:"nem ezzel kezdődik"},{ oper:'in', text:"tartalmaz"},{ oper:'ni', text:"nem tartalmaz"},{ oper:'ew', text:"végződik"},{ oper:'en', text:"nem végződik"},{ oper:'cn', text:"tartalmaz"},{ oper:'nc', text:"nem tartalmaz"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Új tétel", + editCaption: "Tétel szerkesztése", + bSubmit: "Mentés", + bCancel: "Mégse", + bClose: "Bezárás", + saveData: "A tétel megváltozott! Tétel mentése?", + bYes : "Igen", + bNo : "Nem", + bExit : "Mégse", + msg: { + required:"Kötelező mező", + number:"Kérjük, adjon meg egy helyes számot", + minValue:"Nagyobb vagy egyenlőnek kell lenni mint ", + maxValue:"Kisebb vagy egyenlőnek kell lennie mint", + email: "hibás emailcím", + integer: "Kérjük adjon meg egy helyes egész számot", + date: "Kérjük adjon meg egy helyes dátumot", + url: "nem helyes cím. Előtag kötelező ('http://' vagy 'https://')", + nodefined : " nem definiált!", + novalue : " visszatérési érték kötelező!!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + + } + }, + view : { + caption: "Tétel megtekintése", + bClose: "Bezárás" + }, + del : { + caption: "Törlés", + msg: "Kiválaztott tétel(ek) törlése?", + bSubmit: "Törlés", + bCancel: "Mégse" + }, + nav : { + edittext: "", + edittitle: "Tétel szerkesztése", + addtext:"", + addtitle: "Új tétel hozzáadása", + deltext: "", + deltitle: "Tétel törlése", + searchtext: "", + searchtitle: "Keresés", + refreshtext: "", + refreshtitle: "Frissítés", + alertcap: "Figyelmeztetés", + alerttext: "Kérem válasszon tételt.", + viewtext: "", + viewtitle: "Tétel megtekintése", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Oszlopok kiválasztása", + bSubmit: "Ok", + bCancel: "Mégse" + }, + errors : { + errcap : "Hiba", + nourl : "Nincs URL beállítva", + norecords: "Nincs feldolgozásra váró tétel", + model : "colNames és colModel hossza nem egyenlő!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Va", "Hé", "Ke", "Sze", "Csü", "Pé", "Szo", + "Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat" + ], + monthNames: [ + "Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Szep", "Okt", "Nov", "Dec", + "Január", "Február", "Március", "Áprili", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December" + ], + AmPm : ["de","du","DE","DU"], + S: function (j) {return '.-ik';}, + srcformat: 'Y-m-d', + newformat: 'Y/m/d', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "Y/j/n", + LongDate: "Y. F hó d., l", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "a g:i", + LongTime: "a g:i:s", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "Y, F" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-id.js b/html/sternwarte/storno/js/i18n/grid.locale-id.js new file mode 100755 index 0000000..0b4ecff --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-id.js @@ -0,0 +1,224 @@ +/** + * jqGrid Indonesian Translation + * Tony Tomov tony@trirand.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["id"] = { + defaults : { + recordtext: "Data {0} - {1} dari {2}", + emptyrecords: "Tidak ada data", + loadtext: "Memuat...", + pgtext : "Halaman {0} dari {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Pencarian", + Find: "Cari !", + Reset: "Segarkan", + odata: [{ oper:'eq', text:"sama dengan"},{ oper:'ne', text:"tidak sama dengan"},{ oper:'lt', text:"kurang dari"},{ oper:'le', text:"kurang dari atau sama dengan"},{ oper:'gt', text:"lebih besar"},{ oper:'ge', text:"lebih besar atau sama dengan"},{ oper:'bw', text:"dimulai dengan"},{ oper:'bn', text:"tidak dimulai dengan"},{ oper:'in', text:"di dalam"},{ oper:'ni', text:"tidak di dalam"},{ oper:'ew', text:"diakhiri dengan"},{ oper:'en', text:"tidak diakhiri dengan"},{ oper:'cn', text:"mengandung"},{ oper:'nc', text:"tidak mengandung"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Tambah Data", + editCaption: "Sunting Data", + bSubmit: "Submit", + bCancel: "Tutup", + bClose: "Tutup", + saveData: "Data telah berubah! Simpan perubahan?", + bYes : "Ya", + bNo : "Tidak", + bExit : "Tutup", + msg: { + required:"kolom wajib diisi", + number:"hanya nomer yang diperbolehkan", + minValue:"kolom harus lebih besar dari atau sama dengan", + maxValue:"kolom harus lebih kecil atau sama dengan", + email: "alamat e-mail tidak valid", + integer: "hanya nilai integer yang diperbolehkan", + date: "nilai tanggal tidak valid", + url: "Bukan URL yang valid. Harap gunakan ('http://' or 'https://')", + nodefined : " belum didefinisikan!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + + } + }, + view : { + caption: "Menampilkan data", + bClose: "Tutup" + }, + del : { + caption: "Hapus", + msg: "Hapus data terpilih?", + bSubmit: "Hapus", + bCancel: "Batalkan" + }, + nav : { + edittext: "", + edittitle: "Sunting data terpilih", + addtext:"", + addtitle: "Tambah baris baru", + deltext: "", + deltitle: "Hapus baris terpilih", + searchtext: "", + searchtitle: "Temukan data", + refreshtext: "", + refreshtitle: "Segarkan Grid", + alertcap: "Warning", + alerttext: "Harap pilih baris", + viewtext: "", + viewtitle: "Tampilkan baris terpilih", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Pilih Kolom", + bSubmit: "Ok", + bCancel: "Batal" + }, + errors : { + errcap : "Error", + nourl : "Tidak ada url yang diset", + norecords: "Tidak ada data untuk diproses", + model : "Lebar dari colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: ".", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, defaultValue: '0'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "Rp. ", suffix:"", defaultValue: '0'}, + date : { + dayNames: [ + "Ming", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", + "Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des", + "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, + srcformat: 'Y-m-d', + newformat: 'n/j/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid + // and see http://docs.jquery.com/UI/Datepicker/formatDate + // and https://github.com/jquery/globalize#dates for alternative formats used frequently + // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many + // information about date, time, numbers and currency formats used in different countries + // one should just convert the information in PHP format + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + // short date: + // n - Numeric representation of a month, without leading zeros + // j - Day of the month without leading zeros + // Y - A full numeric representation of a year, 4 digits + // example: 3/1/2012 which means 1 March 2012 + ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy" + // long date: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy" + // long date with long time: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt" + // month day: + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd" + // short time (without seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt" + // long time (with seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt" + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + // month with year + // Y - A full numeric representation of a year, 4 digits + // F - A full textual representation of a month + YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-is.js b/html/sternwarte/storno/js/i18n/grid.locale-is.js new file mode 100755 index 0000000..988063a --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-is.js @@ -0,0 +1,182 @@ +/** + * jqGrid Icelandic Translation + * jtm@hi.is Univercity of Iceland + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["is"] = { + defaults : { + recordtext: "Skoða {0} - {1} af {2}", + emptyrecords: "Engar færslur", + loadtext: "Hleður...", + pgtext : "Síða {0} af {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Leita...", + Find: "Leita", + Reset: "Endursetja", + odata: [{ oper:'eq', text:"sama og"},{ oper:'ne', text:"ekki sama og"},{ oper:'lt', text:"minna en"},{ oper:'le', text:"minna eða jafnt og"},{ oper:'gt', text:"stærra en"},{ oper:'ge', text:"stærra eða jafnt og"},{ oper:'bw', text:"byrjar á"},{ oper:'bn', text:"byrjar ekki á"},{ oper:'in', text:"er í"},{ oper:'ni', text:"er ekki í"},{ oper:'ew', text:"endar á"},{ oper:'en', text:"endar ekki á"},{ oper:'cn', text:"inniheldur"},{ oper:'nc', text:"inniheldur ekki"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "allt" }, { op: "OR", text: "eða" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Bæta við færslu", + editCaption: "Breyta færslu", + bSubmit: "Vista", + bCancel: "Hætta við", + bClose: "Loka", + saveData: "Gögn hafa breyst! Vista breytingar?", + bYes : "Já", + bNo : "Nei", + bExit : "Hætta við", + msg: { + required:"Reitur er nauðsynlegur", + number:"Vinsamlega settu inn tölu", + minValue:"gildi verður að vera meira en eða jafnt og ", + maxValue:"gildi verður að vera minna en eða jafnt og ", + email: "er ekki löglegt email", + integer: "Vinsamlega settu inn tölu", + date: "Vinsamlega setti inn dagsetningu", + url: "er ekki löglegt URL. Vantar ('http://' eða 'https://')", + nodefined : " er ekki skilgreint!", + novalue : " skilagildi nauðsynlegt!", + customarray : "Fall skal skila fylki!", + customfcheck : "Fall skal vera skilgreint!" + } + }, + view : { + caption: "Skoða færslu", + bClose: "Loka" + }, + del : { + caption: "Eyða", + msg: "Eyða völdum færslum ?", + bSubmit: "Eyða", + bCancel: "Hætta við" + }, + nav : { + edittext: " ", + edittitle: "Breyta færslu", + addtext:" ", + addtitle: "Ný færsla", + deltext: " ", + deltitle: "Eyða færslu", + searchtext: " ", + searchtitle: "Leita", + refreshtext: "", + refreshtitle: "Endurhlaða", + alertcap: "Viðvörun", + alerttext: "Vinsamlega veldu færslu", + viewtext: "", + viewtitle: "Skoða valda færslu", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Sýna / fela dálka", + bSubmit: "Vista", + bCancel: "Hætta við" + }, + errors : { + errcap : "Villa", + nourl : "Vantar slóð", + norecords: "Engar færslur valdar", + model : "Lengd colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau", + "Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Oct", "Nóv", "Des", + "Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júný", "Júlý", "Ágúst", "September", "Október", "Nóvember", "Desember" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-it.js b/html/sternwarte/storno/js/i18n/grid.locale-it.js new file mode 100755 index 0000000..e1e2c1c --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-it.js @@ -0,0 +1,185 @@ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["it"] = { + defaults : { + recordtext: "Mostra {0} - {1} di {2}", + emptyrecords: "Non ci sono record da mostrare", + loadtext: "Caricamento...", + savetext: "Salvataggio...", + pgtext : "Pagina {0} di {1}", + pgfirst : "Prima Pagina", + pglast : "Ultima Pagina", + pgnext : "Pagina Successiva", + pgprev : "Pagina Precedente", + pgrecs : "Records per Pagina", + showhide: "Espandi o collassa griglia", + // mobile + pagerCaption : "Griglia::Impostaioni della pagina", + pageText : "Pagina:", + recordPage : "Records per Pagina", + nomorerecs : "Non ci sono altri record...", + scrollPullup: "Trascina verso l'alto per altri...", + scrollPulldown : "Trascina verso il basso per aggiornare...", + scrollRefresh : "Rilascia per aggiornare..." + }, + search : { + caption: "Cerca...", + Find: "Trova", + Reset: "Reset", + odata: [{ oper:'eq', text:'uguale'},{ oper:'ne', text:'diverso'},{ oper:'lt', text:'minore'},{ oper:'le', text:'minore o uguale'},{ oper:'gt', text:'maggiore'},{ oper:'ge', text:'maggiore o uguale'},{ oper:'bw', text:'inizia per'},{ oper:'bn', text:'non inizia per'},{ oper:'in', text:'è in'},{ oper:'ni', text:'non è in'},{ oper:'ew', text:'finisce per'},{ oper:'en', text:'non finisce per'},{ oper:'cn', text:'contiene'},{ oper:'nc', text:'non contiene'},{ oper:'nu', text:'è null'},{ oper:'nn', text:'non è null'}, {oper:'bt', text:'between'}], + groupOps: [{ op: "AND", text: "tutti" },{ op: "OR", text: "ciascuno" }], + operandTitle : "Clicca sull'opzione di ricerca scelta.", + resetTitle : "Resetta valori di ricerca", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Aggiungi Record", + editCaption: "Modifica Record", + bSubmit: "Invia", + bCancel: "Annulla", + bClose: "Chiudi", + saveData: "I dati sono stati modificati! Salvare le modifiche?", + bYes : "Si", + bNo : "No", + bExit : "Annulla", + msg: { + required:"Campo obbligatorio", + number:"Per favore, inserisci un numero valido", + minValue:"il valore deve essere maggiore o uguale a ", + maxValue:"il valore deve essere minore o uguale a ", + email: "non è una e-mail valida", + integer: "Per favore, inserisci un intero valido", + date: "Per favore, inserisci una data valida", + url: "non è un URL valido. Prefissi richiesti ('http://' o 'https://')", + nodefined : " non è definito!", + novalue : " valore di ritorno richiesto!", + customarray : "La funzione personalizzata deve restituire un array!", + customfcheck : "La funzione personalizzata deve essere presente in caso di controlli personalizzati!" + + } + }, + view : { + caption: "Visualizza Record", + bClose: "Chiudi" + }, + del : { + caption: "Cancella", + msg: "Cancellare i record selezionati?", + bSubmit: "Canella", + bCancel: "Annulla" + }, + nav : { + edittext: "", + edittitle: "Modifica riga selezionata", + addtext:"", + addtitle: "Aggiungi riga", + deltext: "", + deltitle: "Cancella riga", + searchtext: "", + searchtitle: "Trova record", + refreshtext: "", + refreshtitle: "Ricarica tabella", + alertcap: "Attenzione", + alerttext: "Per favore, seleziona un record", + viewtext: "", + viewtitle: "Visualizza riga selezionata", + savetext: "", + savetitle: "Salva riga", + canceltext: "", + canceltitle : "Annulla modifica riga", + selectcaption : "Actions..." + }, + col : { + caption: "Seleziona colonne", + bSubmit: "Ok", + bCancel: "Annulla" + }, + errors : { + errcap : "Errore", + nourl : "Nessun url impostato", + norecords: "Non ci sono record da elaborare", + model : "Lunghezza dei colNames <> colModel!" + }, + formatter:{ + integer:{ + thousandsSeparator:".", + defaultValue:"0" + }, + number:{ + decimalSeparator:",", + thousandsSeparator:".", + decimalPlaces:2, + defaultValue:"0,00" + }, + currency:{ + decimalSeparator:",", + thousandsSeparator:".", + decimalPlaces:2, + prefix:"€ ", + suffix:"", + defaultValue:"0,00" + }, + date:{ + dayNames:["Dom","Lun","Mar","Mer","Gio","Ven","Sab","Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"], + monthNames:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic","Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"], + AmPm:["am","pm","AM","PM"], + S:function(b){return b<11||b>13?["st","nd","rd","th"][Math.min((b-1)%10,3)]:"th"}, + srcformat:"Y-m-d", + newformat:"d/m/Y", + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks:{ + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate:"d/m/Y", + LongDate:"l d F Y", + FullDateTime:"l d F Y G:i:s", + MonthDay:"F d", + ShortTime:"H:i", + LongTime:"H:i:s", + SortableDateTime:"Y-m-d\\TH:i:s", + UniversalSortableDateTime:"Y-m-d H:i:sO", + YearMonth:"F, Y" + }, + reformatAfterEdit:false, + userLocalTime : false + }, + baseLinkUrl:"", + showAction:"", + target:"", + checkbox:{ disabled:true}, + idName:"id" + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-ja.js b/html/sternwarte/storno/js/i18n/grid.locale-ja.js new file mode 100755 index 0000000..998d429 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-ja.js @@ -0,0 +1,212 @@ +/** + * jqGrid Japanese Translation + * OKADA Yoshitada okada.dev@sth.jp + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["ja"] = { + defaults : { + recordtext: "{2} \u4EF6\u4E2D {0} - {1} \u3092\u8868\u793A ", + emptyrecords: "\u8868\u793A\u3059\u308B\u30EC\u30B3\u30FC\u30C9\u304C\u3042\u308A\u307E\u305B\u3093", + loadtext: "\u8aad\u307f\u8fbc\u307f\u4e2d...", + pgtext : "{1} \u30DA\u30FC\u30B8\u4E2D {0} \u30DA\u30FC\u30B8\u76EE ", + savetext: "\u4fdd\u5b58\u4e2d...", + pgfirst : "\u6700\u521d\u306e\u30da\u30fc\u30b8\u3078", + pglast : "\u6700\u5f8c\u306e\u30da\u30fc\u30b8\u3078", + pgnext : "\u6b21\u306e\u30da\u30fc\u30b8", + pgprev : "\u524d\u306e\u30da\u30fc\u30b8", + pgrecs : "\u30da\u30fc\u30b8\u5358\u4f4d\u306e\u30ec\u30b3\u30fc\u30c9\u6570", + showhide: "\u30b0\u30ea\u30c3\u30c9\u306e\u5c55\u958b/\u9589\u3058\u8fbc\u307f", + // mobile + pagerCaption : "\u30b0\u30ea\u30c3\u30c9::\u30da\u30fc\u30b8\u8a2d\u5b9a", + pageText : "\u30da\u30fc\u30b8:", + recordPage : "\u30da\u30fc\u30b8\u5358\u4f4d\u306e\u30ec\u30b3\u30fc\u30c9\u6570", + nomorerecs : "\u30ec\u30b3\u30fc\u30c9\u304c\u3042\u308a\u307e\u305b\u3093...", + scrollPullup: "\u4e0a\u306b\u30b9\u30af\u30ed\u30fc\u30eb\u3057\u3066\u8aad\u307f\u8fbc\u307f...", + scrollPulldown : "\u4e0b\u306b\u30b9\u30af\u30ed\u30fc\u30eb\u3057\u3066\u66f4\u65b0...", + scrollRefresh : "\u653e\u3057\u3066\u66f4\u65b0..." + }, + search : { + caption: "\u691c\u7d22...", + Find: "\u691c\u7d22", + Reset: "\u30ea\u30bb\u30c3\u30c8", + odata: [{ oper:'eq', text:"\u6B21\u306B\u7B49\u3057\u3044"}, { oper:'ne', text:"\u6B21\u306B\u7B49\u3057\u304F\u306A\u3044"}, + { oper:'lt', text:"\u6B21\u3088\u308A\u5C0F\u3055\u3044"}, { oper:'le', text:"\u6B21\u306B\u7B49\u3057\u3044\u304B\u5C0F\u3055\u3044"}, + { oper:'gt', text:"\u6B21\u3088\u308A\u5927\u304D\u3044"}, { oper:'ge', text:"\u6B21\u306B\u7B49\u3057\u3044\u304B\u5927\u304D\u3044"}, + { oper:'bw', text:"\u6B21\u3067\u59CB\u307E\u308B"}, { oper:'bn', text:"\u6B21\u3067\u59CB\u307E\u3089\u306A\u3044"}, + { oper:'in', text:"\u6B21\u306B\u542B\u307E\u308C\u308B"}, { oper:'ni', text:"\u6B21\u306B\u542B\u307E\u308C\u306A\u3044"}, + { oper:'ew', text:"\u6B21\u3067\u7D42\u308F\u308B"}, { oper:'en', text:"\u6B21\u3067\u7D42\u308F\u3089\u306A\u3044"}, + { oper:'cn', text:"\u6B21\u3092\u542B\u3080"}, { oper:'nc', text:"\u6B21\u3092\u542B\u307E\u306A\u3044"}, + { oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [{ + op: "AND", + text: "\u3059\u3079\u3066\u306E" + }, + { + op: "OR", + text: "\u3044\u305A\u308C\u304B\u306E" + }], + operandTitle : "\u30af\u30ea\u30c3\u30af\u3057\u3066\u691c\u7d22\u64cd\u4f5c\u3092\u9078\u629e", + resetTitle : "\u691c\u7d22\u5024\u3092\u30ea\u30bb\u30c3\u30c8", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "\u30ec\u30b3\u30fc\u30c9\u8ffd\u52a0", + editCaption: "\u30ec\u30b3\u30fc\u30c9\u7de8\u96c6", + bSubmit: "\u9001\u4fe1", + bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb", + bClose: "\u9589\u3058\u308b", + saveData: "\u30C7\u30FC\u30BF\u304C\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F", + bYes: "\u306F\u3044", + bNo: "\u3044\u3044\u3048", + bExit: "\u30AD\u30E3\u30F3\u30BB\u30EB", + msg: { + required:"\u3053\u306e\u9805\u76ee\u306f\u5fc5\u9808\u3067\u3059\u3002", + number:"\u6b63\u3057\u3044\u6570\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002", + minValue:"\u6b21\u306e\u5024\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002", + maxValue:"\u6b21\u306e\u5024\u4ee5\u4e0b\u3067\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002", + email: "e-mail\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002", + integer: "\u6b63\u3057\u3044\u6574\u6570\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002", + date: "\u6b63\u3057\u3044\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002", + url: "\u306F\u6709\u52B9\u306AURL\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\20\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u304C\u5FC5\u8981\u3067\u3059\u3002 ('http://' \u307E\u305F\u306F 'https://')", + nodefined: " \u304C\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u305B\u3093", + novalue: " \u623B\u308A\u5024\u304C\u5FC5\u8981\u3067\u3059", + customarray: "\u30AB\u30B9\u30BF\u30E0\u95A2\u6570\u306F\u914D\u5217\u3092\u8FD4\u3059\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059", + customfcheck: "\u30AB\u30B9\u30BF\u30E0\u691C\u8A3C\u306B\u306F\u30AB\u30B9\u30BF\u30E0\u95A2\u6570\u304C\u5FC5\u8981\u3067\u3059" + } + }, + view : { + caption: "\u30EC\u30B3\u30FC\u30C9\u3092\u8868\u793A", + bClose: "\u9589\u3058\u308B" + }, + del : { + caption: "\u524a\u9664", + msg: "\u9078\u629e\u3057\u305f\u30ec\u30b3\u30fc\u30c9\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f", + bSubmit: "\u524a\u9664", + bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb" + }, + nav : { + edittext: " ", + edittitle: "\u9078\u629e\u3057\u305f\u884c\u3092\u7de8\u96c6", + addtext:" ", + addtitle: "\u884c\u3092\u65b0\u898f\u8ffd\u52a0", + deltext: " ", + deltitle: "\u9078\u629e\u3057\u305f\u884c\u3092\u524a\u9664", + searchtext: " ", + searchtitle: "\u30ec\u30b3\u30fc\u30c9\u691c\u7d22", + refreshtext: "", + refreshtitle: "\u30b0\u30ea\u30c3\u30c9\u3092\u30ea\u30ed\u30fc\u30c9", + alertcap: "\u8b66\u544a", + alerttext: "\u884c\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002", + viewtext: "", + viewtitle: "\u9078\u629E\u3057\u305F\u884C\u3092\u8868\u793A", + savetext: "", + savetitle: "\u5217\u3092\u4fdd\u5b58", + canceltext: "", + canceltitle : "\u5217\u306e\u7de8\u96c6\u3092\u30ad\u30e3\u30f3\u30bb\u30eb", + selectcaption : "\u30a2\u30af\u30b7\u30e7\u30f3..." + }, + col : { + caption: "\u5217\u3092\u8868\u793a\uff0f\u96a0\u3059", + bSubmit: "\u9001\u4fe1", + bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb" + }, + errors : { + errcap : "\u30a8\u30e9\u30fc", + nourl : "URL\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002", + norecords: "\u51e6\u7406\u5bfe\u8c61\u306e\u30ec\u30b3\u30fc\u30c9\u304c\u3042\u308a\u307e\u305b\u3093\u3002", + model : "colNames\u306e\u9577\u3055\u304ccolModel\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002" + }, + formatter : { + integer: { + thousandsSeparator: ",", + defaultValue: '0' + }, + number: { + decimalSeparator: ".", + thousandsSeparator: ",", + decimalPlaces: 2, + defaultValue: '0.00' + }, + currency: { + decimalSeparator: ".", + thousandsSeparator: ",", + decimalPlaces: 0, + prefix: "", + suffix: "", + defaultValue: '0' + }, + date : { + dayNames: [ + "\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f", + "\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f" + ], + monthNames: [ + "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", + "1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) { return "\u756a\u76ee"; }, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-kr.js b/html/sternwarte/storno/js/i18n/grid.locale-kr.js new file mode 100755 index 0000000..62ebdbb --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-kr.js @@ -0,0 +1,184 @@ +/** + * jqGrid English Translation + * Tony Tomov tony@trirand.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["kr"] = { + defaults : { + recordtext: "보기 {0} - {1} / {2}", + emptyrecords: "표시할 행이 없습니다", + loadtext: "조회중...", + pgtext : "페이지 {0} / {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "검색...", + Find: "찾기", + Reset: "초기화", + odata: [{ oper:'eq', text:"같다"},{ oper:'ne', text:"같지 않다"},{ oper:'lt', text:"작다"},{ oper:'le', text:"작거나 같다"},{ oper:'gt', text:"크다"},{ oper:'ge', text:"크거나 같다"},{ oper:'bw', text:"로 시작한다"},{ oper:'bn', text:"로 시작하지 않는다"},{ oper:'in', text:"내에 있다"},{ oper:'ni', text:"내에 있지 않다"},{ oper:'ew', text:"로 끝난다"},{ oper:'en', text:"로 끝나지 않는다"},{ oper:'cn', text:"내에 존재한다"},{ oper:'nc', text:"내에 존재하지 않는다"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "전부" }, { op: "OR", text: "임의" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "행 추가", + editCaption: "행 수정", + bSubmit: "전송", + bCancel: "취소", + bClose: "닫기", + saveData: "자료가 변경되었습니다! 저장하시겠습니까?", + bYes : "예", + bNo : "아니오", + bExit : "취소", + msg: { + required:"필수항목입니다", + number:"유효한 번호를 입력해 주세요", + minValue:"입력값은 크거나 같아야 합니다", + maxValue:"입력값은 작거나 같아야 합니다", + email: "유효하지 않은 이메일주소입니다", + integer: "유효한 숫자를 입력하세요", + date: "유효한 날짜를 입력하세요", + url: "은 유효하지 않은 URL입니다. 문장앞에 다음단어가 필요합니다('http://' or 'https://')", + nodefined : " 은 정의도지 않았습니다!", + novalue : " 반환값이 필요합니다!", + customarray : "사용자정의 함수는 배열을 반환해야 합니다!", + customfcheck : "Custom function should be present in case of custom checking!" + + } + }, + view : { + caption: "행 조회", + bClose: "닫기" + }, + del : { + caption: "삭제", + msg: "선택된 행을 삭제하시겠습니까?", + bSubmit: "삭제", + bCancel: "취소" + }, + nav : { + edittext: "", + edittitle: "선택된 행 편집", + addtext:"", + addtitle: "행 삽입", + deltext: "", + deltitle: "선택된 행 삭제", + searchtext: "", + searchtitle: "행 찾기", + refreshtext: "", + refreshtitle: "그리드 갱신", + alertcap: "경고", + alerttext: "행을 선택하세요", + viewtext: "", + viewtitle: "선택된 행 조회", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "열을 선택하세요", + bSubmit: "확인", + bCancel: "취소" + }, + errors : { + errcap : "오류", + nourl : "설정된 url이 없습니다", + norecords: "처리할 행이 없습니다", + model : "colNames의 길이가 colModel과 일치하지 않습니다!" + }, + formatter : { + integer : {thousandsSeparator: ",", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat", + "일", "월", "화", "수", "목", "금", "토" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'm-d-Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "Y/j/n", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-lt.js b/html/sternwarte/storno/js/i18n/grid.locale-lt.js new file mode 100755 index 0000000..da81aae --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-lt.js @@ -0,0 +1,184 @@ +/** + * jqGrid Lithuanian Translation + * aur1mas aur1mas@devnet.lt + * http://aur1mas.devnet.lt + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["lt"] = { + defaults : { + recordtext: "Peržiūrima {0} - {1} iš {2}", + emptyrecords: "Įrašų nėra", + loadtext: "Kraunama...", + pgtext : "Puslapis {0} iš {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Paieška...", + Find: "Ieškoti", + Reset: "Atstatyti", + odata: [{ oper:'eq', text:"lygu"},{ oper:'ne', text:"nelygu"},{ oper:'lt', text:"mažiau"},{ oper:'le', text:"mažiau arba lygu"},{ oper:'gt', text:"daugiau"},{ oper:'ge', text:"daugiau arba lygu"},{ oper:'bw', text:"prasideda"},{ oper:'bn', text:"neprasideda"},{ oper:'in', text:"reikšmė yra"},{ oper:'ni', text:"reikšmės nėra"},{ oper:'ew', text:"baigiasi"},{ oper:'en', text:"nesibaigia"},{ oper:'cn', text:"yra sudarytas"},{ oper:'nc', text:"nėra sudarytas"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "visi" }, { op: "OR", text: "bet kuris" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Sukurti įrašą", + editCaption: "Redaguoti įrašą", + bSubmit: "Išsaugoti", + bCancel: "Atšaukti", + bClose: "Uždaryti", + saveData: "Duomenys buvo pakeisti! Išsaugoti pakeitimus?", + bYes : "Taip", + bNo : "Ne", + bExit : "Atšaukti", + msg: { + required:"Privalomas laukas", + number:"Įveskite tinkamą numerį", + minValue:"reikšmė turi būti didesnė arba lygi ", + maxValue:"reikšmė turi būti mažesnė arba lygi", + email: "neteisingas el. pašto adresas", + integer: "Įveskite teisingą sveikąjį skaičių", + date: "Įveskite teisingą datą", + url: "blogas adresas. Nepamirškite pridėti ('http://' arba 'https://')", + nodefined : " nėra apibrėžta!", + novalue : " turi būti gražinama kokia nors reikšmė!", + customarray : "Custom f-ja turi grąžinti masyvą!", + customfcheck : "Custom f-ja tūrėtų būti sukurta, prieš bandant ją naudoti!" + + } + }, + view : { + caption: "Peržiūrėti įrašus", + bClose: "Uždaryti" + }, + del : { + caption: "Ištrinti", + msg: "Ištrinti pažymėtus įrašus(-ą)?", + bSubmit: "Ištrinti", + bCancel: "Atšaukti" + }, + nav : { + edittext: "", + edittitle: "Redaguoti pažymėtą eilutę", + addtext:"", + addtitle: "Pridėti naują eilutę", + deltext: "", + deltitle: "Ištrinti pažymėtą eilutę", + searchtext: "", + searchtitle: "Rasti įrašus", + refreshtext: "", + refreshtitle: "Perkrauti lentelę", + alertcap: "Įspėjimas", + alerttext: "Pasirinkite eilutę", + viewtext: "", + viewtitle: "Peržiūrėti pasirinktą eilutę", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Pasirinkti stulpelius", + bSubmit: "Gerai", + bCancel: "Atšaukti" + }, + errors : { + errcap : "Klaida", + nourl : "Url reikšmė turi būti perduota", + norecords: "Nėra įrašų, kuriuos būtų galima apdoroti", + model : "colNames skaičius <> colModel skaičiui!" + }, + formatter : { + integer : {thousandsSeparator: "", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: "", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:",", thousandsSeparator: "", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Sek", "Pir", "Ant", "Tre", "Ket", "Pen", "Šeš", + "Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis" + ], + monthNames: [ + "Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rugj", "Rugs", "Spa", "Lap", "Gru", + "Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-me.js b/html/sternwarte/storno/js/i18n/grid.locale-me.js new file mode 100755 index 0000000..f9ab02f --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-me.js @@ -0,0 +1,184 @@ +/** + * jqGrid Montenegrian Translation + * Bild Studio info@bild-studio.net + * http://www.bild-studio.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["me"] = { + defaults : { + recordtext: "Pregled {0} - {1} od {2}", + emptyrecords: "Ne postoji nijedan zapis", + loadtext: "Učitivanje...", + pgtext : "Strana {0} od {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Traženje...", + Find: "Traži", + Reset: "Resetuj", + odata: [{ oper:'eq', text:"jednako"},{ oper:'ne', text:"nije jednako"},{ oper:'lt', text:"manje"},{ oper:'le', text:"manje ili jednako"},{ oper:'gt', text:"veće"},{ oper:'ge', text:"veće ili jednako"},{ oper:'bw', text:"počinje sa"},{ oper:'bn', text:"ne počinje sa"},{ oper:'in', text:"je u"},{ oper:'ni', text:"nije u"},{ oper:'ew', text:"završava sa"},{ oper:'en', text:"ne završava sa"},{ oper:'cn', text:"sadrži"},{ oper:'nc', text:"ne sadrži"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "sva" }, { op: "OR", text: "bilo koje" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Dodaj zapis", + editCaption: "Izmjeni zapis", + bSubmit: "Pošalji", + bCancel: "Odustani", + bClose: "Zatvori", + saveData: "Podatak je izmjenjen! Sačuvaj izmjene?", + bYes : "Da", + bNo : "Ne", + bExit : "Odustani", + msg: { + required:"Polje je obavezno", + number:"Unesite ispravan broj", + minValue:"vrijednost mora biti veća od ili jednaka sa ", + maxValue:"vrijednost mora biti manja ili jednaka sa", + email: "nije ispravna email adresa, nije valjda da ne umiješ ukucati mail!?", + integer: "Ne zajebaji se unesi cjelobrojnu vrijednost ", + date: "Unesite ispravan datum", + url: "nije ispravan URL. Potreban je prefiks ('http://' or 'https://')", + nodefined : " nije definisan!", + novalue : " zahtjevana je povratna vrijednost!", + customarray : "Prilagođena funkcija treba da vrati niz!", + customfcheck : "Prilagođena funkcija treba da bude prisutana u slučaju prilagođene provjere!" + + } + }, + view : { + caption: "Pogledaj zapis", + bClose: "Zatvori" + }, + del : { + caption: "Izbrisi", + msg: "Izbrisi izabran(e) zapise(e)?", + bSubmit: "Izbriši", + bCancel: "Odbaci" + }, + nav : { + edittext: "", + edittitle: "Izmjeni izabrani red", + addtext:"", + addtitle: "Dodaj novi red", + deltext: "", + deltitle: "Izbriši izabran red", + searchtext: "", + searchtitle: "Nađi zapise", + refreshtext: "", + refreshtitle: "Ponovo učitaj podatke", + alertcap: "Upozorenje", + alerttext: "Izaberite red", + viewtext: "", + viewtitle: "Pogledaj izabrani red", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Izaberi kolone", + bSubmit: "OK", + bCancel: "Odbaci" + }, + errors : { + errcap : "Greška", + nourl : "Nije postavljen URL", + norecords: "Nema zapisa za obradu", + model : "Dužina modela colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub", + "Nedelja", "Ponedeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec", + "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-nl.js b/html/sternwarte/storno/js/i18n/grid.locale-nl.js new file mode 100755 index 0000000..e812e1b --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-nl.js @@ -0,0 +1,205 @@ +//NETHERLANDS +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["nl"] = { + defaults: + { + recordtext: "regels {0} - {1} van {2}", + emptyrecords: "Geen data gevonden.", + loadtext: "Laden...", + pgtext: "pagina {0} van {1}", + savetext: "Saving...", + pgfirst : "Eerste Pagina", + pglast : "Laatste Pagina", + pgnext : "Volgende Pagina", + pgprev : "Vorige Pagina", + pgrecs : "Records per Pagina", + showhide: "Schakelen Uitklappen Inklappen Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search: + { + caption: "Zoeken...", + Find: "Zoek", + Reset: "Herstellen", + odata: [{ oper:'eq', text:"gelijk aan"},{ oper:'ne', text:"niet gelijk aan"},{ oper:'lt', text:"kleiner dan"},{ oper:'le', text:"kleiner dan of gelijk aan"},{ oper:'gt', text:"groter dan"},{ oper:'ge', text:"groter dan of gelijk aan"},{ oper:'bw', text:"begint met"},{ oper:'bn', text:"begint niet met"},{ oper:'in', text:"is in"},{ oper:'ni', text:"is niet in"},{ oper:'ew', text:"eindigt met"},{ oper:'en', text:"eindigt niet met"},{ oper:'cn', text:"bevat"},{ oper:'nc', text:"bevat niet"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [{ op: "AND", text: "alle" }, { op: "OR", text: "een van de"}], + operandTitle : "Klik om de zoekterm te selecteren.", + resetTitle : "Herstel zoekterm", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit: + { + addCaption: "Nieuw", + editCaption: "Bewerken", + bSubmit: "Opslaan", + bCancel: "Annuleren", + bClose: "Sluiten", + saveData: "Er is data aangepast! Wijzigingen opslaan?", + bYes: "Ja", + bNo: "Nee", + bExit: "Sluiten", + msg: + { + required: "Veld is verplicht", + number: "Voer a.u.b. geldig nummer in", + minValue: "Waarde moet groter of gelijk zijn aan ", + maxValue: "Waarde moet kleiner of gelijk zijn aan", + email: "is geen geldig e-mailadres", + integer: "Voer a.u.b. een geldig getal in", + date: "Voer a.u.b. een geldige waarde in", + url: "is geen geldige URL. Prefix is verplicht ('http://' or 'https://')", + nodefined : " is niet gedefineerd!", + novalue : " return waarde is verplicht!", + customarray : "Aangepaste functie moet array teruggeven!", + customfcheck : "Aangepaste function moet aanwezig zijn in het geval van aangepaste controle!" + } + }, + view: + { + caption: "Tonen", + bClose: "Sluiten" + }, + del: + { + caption: "Verwijderen", + msg: "Verwijder geselecteerde regel(s)?", + bSubmit: "Verwijderen", + bCancel: "Annuleren" + }, + nav: + { + edittext: "", + edittitle: "Bewerken", + addtext: "", + addtitle: "Nieuw", + deltext: "", + deltitle: "Verwijderen", + searchtext: "", + searchtitle: "Zoeken", + refreshtext: "", + refreshtitle: "Vernieuwen", + alertcap: "Waarschuwing", + alerttext: "Selecteer a.u.b. een regel", + viewtext: "", + viewtitle: "Openen", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col: + { + caption: "Tonen/verbergen kolommen", + bSubmit: "OK", + bCancel: "Annuleren" + }, + errors: + { + errcap: "Fout", + nourl: "Er is geen URL gedefinieerd", + norecords: "Geen data om te verwerken", + model: "Lengte van 'colNames' is niet gelijk aan 'colModel'!" + }, + formatter: + { + integer: + { + thousandsSeparator: ".", + defaultValue: "0" + }, + number: + { + decimalSeparator: ",", + thousandsSeparator: ".", + decimalPlaces: 2, + defaultValue: "0.00" + }, + currency: + { + decimalSeparator: ",", + thousandsSeparator: ".", + decimalPlaces: 2, + prefix: "EUR ", + suffix: "", + defaultValue: "0.00" + }, + date: + { + dayNames: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"], + monthNames: ["Jan", "Feb", "Maa", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "October", "November", "December"], + AmPm: ["am", "pm", "AM", "PM"], + S: function(b) { + return b < 11 || b > 13 ? ["st", "nd", "rd", "th"][Math.min((b - 1) % 10, 3)] : "th" + }, + srcformat: "Y-m-d", + newformat: "d/m/Y", + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks: + { + ISO8601Long: "Y-m-d H:i:s", + ISO8601Short: "Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l d F Y G:i:s", + MonthDay: "d F", + ShortTime: "G:i", + LongTime: "G:i:s", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit: false, + userLocalTime : false + }, + baseLinkUrl: "", + showAction: "", + target: "", + checkbox: + { + disabled: true + }, + idName: "id" + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } + }; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-no.js b/html/sternwarte/storno/js/i18n/grid.locale-no.js new file mode 100755 index 0000000..168b90f --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-no.js @@ -0,0 +1,99 @@ +//NORWAY +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["no"] = { + defaults : { + recordtext: "Rad {0} - {1}, totalt {2}", + loadtext: "Laster...", + pgtext: "Side {0} av {1}", + savetext: "Saving...", + pgfirst: "First Page", + pglast: "Last Page", + pgnext: "Next Page", + pgprev: "Previous Page", + pgrecs: "Records per Page", + showhide: "Toggle Expand Collapse Grid", + emptyrecords: "Ingen poster funnet", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + + }, + search : { + caption: "Søk...", + Find: "Finn", + Reset: "Nullstill", + odata: [ + {oper: 'eq', text: "lik"}, + {oper: 'ne', text: "forskjellig fra"}, + {oper: 'lt', text: "mindre enn"}, + {oper: 'le', text: "mindre eller lik"}, + {oper: 'gt', text: "større enn"}, + {oper: 'ge', text: " større eller lik"}, + {oper: 'bw', text: "starter med"}, + {oper: 'ew', text: "slutter med"}, + {oper: 'cn', text: "inneholder"}, + { oper: 'nu', text: 'is null'}, + { oper: 'nn', text: 'is not null'}, + {oper:'bt', text:'between'} + ], + operandTitle: "Click to select search operation.", + resetTitle: "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : {addCaption: "Ny rad", editCaption: "Rediger", bSubmit: "Send", bCancel: "Avbryt", bClose: "Lukk", processData: "Laster...", msg: {required: "Felt er obligatorisk", number: "Legg inn et gyldig tall", minValue: "verdi mø vøre større enn eller lik", maxValue: "verdi må være mindre enn eller lik", email: "er ikke en gyldig e-post adresse", integer: "Legg inn et gyldig heltall", date: "Legg inn en gyldig dato", url: "er ikke en gyldig URL. Prefiks påkrevd ('http://' eller 'https://')", nodefined: " er ikke definert!", novalue: " returverdi er påkrevd!", customarray: "Tilpasset funksjon må returnere en tabell!", customfcheck: "Tilpasset funksjon må eksistere!"}}, + view : {caption: "Åpne post", bClose: "Lukk"}, + del : {caption: "Slett", msg: "Slett valgte rad(er)?", bSubmit: "Slett", bCancel: "Avbryt", processData: "Behandler..."}, + nav : {edittext: " ", edittitle: "Rediger valgte rad(er)", addtext: " ", addtitle: "Legg til ny rad", deltext: " ", deltitle: "Slett valgte rad(er)", searchtext: " ", searchtitle: "Søk", refreshtext: "", refreshtitle: "Oppdater tabell", alertcap: "Advarsel", alerttext: "Velg rad", viewtext: " ", viewtitle: "Åpne valgt rad", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : {caption: "Vis/skjul kolonner", bSubmit: "Utfør", bCancel: "Avbryt"}, + errors : {errcap: "Feil", nourl: "Ingen url er satt", norecords: "Ingen poster å behandle", model: "colNames og colModel har forskjellig lengde!"}, + formatter : {integer: {thousandsSeparator: " ", defaultValue: 0}, number: {decimalSeparator: ",", thousandsSeparator: " ", decimalPlaces: 2, defaulValue: 0}, currency: {decimalSeparator: ",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix: "", defaulValue: 0}, date: {dayNames: ["sø.", "ma.", "ti.", "on.", "to.", "fr.", "lø.", "Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"], monthNames: ["jan.", "feb.", "mars", "april", "mai", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "des.", "januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"], AmPm: ["", "", "", ""], S: function (b) { + return"."; + }, srcformat: "Y-m-d H:i:s", newformat: "Y-m-d H:i:s", parseRe: /[#%\\\/:_;.,\t\s-]/, masks: {ISO8601Long: "Y-m-d H:i:s", ISO8601Short: "Y-m-d", ShortDate: "j.n.Y", LongDate: "l j. F Y", FullDateTime: "l j. F Y kl. G.i.s", MonthDay: "j. F", ShortTime: "H:i", LongTime: "H:i:s", SortableDateTime: "Y-m-d\\TH:i:s", UniversalSortableDateTime: "Y-m-d H:i:sO", YearMonth: "F Y"}, reformatAfterEdit: false, userLocalTime: false}, baseLinkUrl: "", showAction: "show", addParam: "", checkbox: {disabled: true} + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } + +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-pl.js b/html/sternwarte/storno/js/i18n/grid.locale-pl.js new file mode 100755 index 0000000..953ac7d --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-pl.js @@ -0,0 +1,188 @@ +/** + * jqGrid Polish Translation + * Łukasz Schab lukasz@freetree.pl + * http://FreeTree.pl + * + * Updated names, abbreviations, currency and date/time formats for Polish norms (also corresponding with CLDR v21.0.1 --> http://cldr.unicode.org/index) + * Tomasz Pęczek tpeczek@gmail.com + * http://tpeczek.blogspot.com; http://tpeczek.codeplex.com + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["pl"] = { + defaults : { + recordtext: "Pokaż {0} - {1} z {2}", + emptyrecords: "Brak rekordów do pokazania", + loadtext: "Ładowanie...", + pgtext : "Strona {0} z {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Wyszukiwanie...", + Find: "Szukaj", + Reset: "Czyść", + odata: [{ oper:'eq', text:"dokładnie"},{ oper:'ne', text:"różne od"},{ oper:'lt', text:"mniejsze od"},{ oper:'le', text:"mniejsze lub równe"},{ oper:'gt', text:"większe od"},{ oper:'ge', text:"większe lub równe"},{ oper:'bw', text:"zaczyna się od"},{ oper:'bn', text:"nie zaczyna się od"},{ oper:'in', text:"jest w"},{ oper:'ni', text:"nie jest w"},{ oper:'ew', text:"kończy się na"},{ oper:'en', text:"nie kończy się na"},{ oper:'cn', text:"zawiera"},{ oper:'nc', text:"nie zawiera"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "oraz" }, { op: "OR", text: "lub" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Dodaj rekord", + editCaption: "Edytuj rekord", + bSubmit: "Zapisz", + bCancel: "Anuluj", + bClose: "Zamknij", + saveData: "Dane zostały zmienione! Zapisać zmiany?", + bYes: "Tak", + bNo: "Nie", + bExit: "Anuluj", + msg: { + required: "Pole jest wymagane", + number: "Proszę wpisać poprawną liczbę", + minValue: "wartość musi być większa lub równa od", + maxValue: "wartość musi być mniejsza lub równa od", + email: "nie jest poprawnym adresem e-mail", + integer: "Proszę wpisać poprawną liczbę", + date: "Proszę podaj poprawną datę", + url: "jest niewłaściwym adresem URL. Pamiętaj o prefiksie ('http://' lub 'https://')", + nodefined: " niezdefiniowane!", + novalue: " wymagana jest wartość zwracana!", + customarray: "Funkcja niestandardowa powinna zwracać tablicę!", + customfcheck: "Funkcja niestandardowa powinna być obecna w przypadku niestandardowego sprawdzania!" + } + }, + view : { + caption: "Pokaż rekord", + bClose: "Zamknij" + }, + del : { + caption: "Usuń", + msg: "Czy usunąć wybrany rekord(y)?", + bSubmit: "Usuń", + bCancel: "Anuluj" + }, + nav : { + edittext: "", + edittitle: "Edytuj wybrany wiersz", + addtext: "", + addtitle: "Dodaj nowy wiersz", + deltext: "", + deltitle: "Usuń wybrany wiersz", + searchtext: "", + searchtitle: "Wyszukaj rekord", + refreshtext: "", + refreshtitle: "Przeładuj", + alertcap: "Uwaga", + alerttext: "Proszę wybrać wiersz", + viewtext: "", + viewtitle: "Pokaż wybrany wiersz", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Pokaż/Ukryj kolumny", + bSubmit: "Zatwierdź", + bCancel: "Anuluj" + }, + errors : { + errcap: "Błąd", + nourl: "Brak adresu url", + norecords: "Brak danych", + model : "Długość colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:" zł", defaultValue: '0,00'}, + date : { + dayNames: [ + "niedz.", "pon.", "wt.", "śr.", "czw.", "pt.", "sob.", + "niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota" + ], + monthNames: [ + "sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "paź", "lis", "gru", + "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" + ], + AmPm : ["","","",""], + S: function (j) {return '';}, + srcformat: 'Y-m-d', + newformat: 'd.m.Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long: "Y-m-d H:i:s", + ISO8601Short: "Y-m-d", + ShortDate: "d.m.y", + LongDate: "l, j F Y", + FullDateTime: "l, j F Y H:i:s", + MonthDay: "j F", + ShortTime: "H:i", + LongTime: "H:i:s", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); \ No newline at end of file diff --git a/html/sternwarte/storno/js/i18n/grid.locale-pt-br.js b/html/sternwarte/storno/js/i18n/grid.locale-pt-br.js new file mode 100755 index 0000000..44c9629 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-pt-br.js @@ -0,0 +1,192 @@ +/** + * jqGrid Brazilian-Portuguese Translation + * Sergio Righi sergio.righi@gmail.com + * http://curve.com.br + * + * Updated by Jonnas Fonini + * http://fonini.net + * + * + * Updated by Fabio Ferreira da Silva fabio_ferreiradasilva@yahoo.com.br + * + * Updated by Anderson Pimentel anderson.pimentel[at]gmail.com + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["pt-br"] = { + defaults : { + recordtext: "Ver {0} - {1} de {2}", + emptyrecords: "Nenhum registro para visualizar", + loadtext: "Carregando...", + pgtext : "Página {0} de {1}", + savetext: "Salvando...", + pgfirst : "Primeira Página", + pglast : "Última Página", + pgnext : "Próxima Página", + pgprev : "Página Anterior", + pgrecs : "Registros por Página", + showhide: "Mostrar/Ocultar Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Procurar...", + Find: "Procurar", + Reset: "Limpar", + odata: [{ oper:'eq', text:"igual"},{ oper:'ne', text:"diferente"},{ oper:'lt', text:"menor"},{ oper:'le', text:"menor ou igual"},{ oper:'gt', text:"maior"},{ oper:'ge', text:"maior ou igual"},{ oper:'bw', text:"inicia com"},{ oper:'bn', text:"não inicia com"},{ oper:'in', text:"está em"},{ oper:'ni', text:"não está em"},{ oper:'ew', text:"termina com"},{ oper:'en', text:"não termina com"},{ oper:'cn', text:"contém"},{ oper:'nc', text:"não contém"},{ oper:'nu', text:"nulo"},{ oper:'nn', text:"não nulo"}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "todos" },{ op: "OR", text: "qualquer um" } ], + operandTitle : "Clique para escolher a operação de pesquisa.", + resetTitle : "Limpar valor de pesquisa", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Incluir", + editCaption: "Alterar", + bSubmit: "Enviar", + bCancel: "Cancelar", + bClose: "Fechar", + saveData: "Os dados foram alterados! Salvar alterações?", + bYes : "Sim", + bNo : "Não", + bExit : "Cancelar", + msg: { + required:"Campo obrigatório", + number:"Por favor, informe um número válido", + minValue:"valor deve ser igual ou maior que ", + maxValue:"valor deve ser menor ou igual a", + email: "este e-mail não é válido", + integer: "Por favor, informe um valor inteiro", + date: "Por favor, informe uma data válida", + url: "não é uma URL válida. Prefixo obrigatório ('http://' or 'https://')", + nodefined : " não está definido!", + novalue : " um valor de retorno é obrigatório!", + customarray : "Função customizada deve retornar um array!", + customfcheck : "Função customizada deve estar presente em caso de validação customizada!" + } + }, + view : { + caption: "Ver Registro", + bClose: "Fechar" + }, + del : { + caption: "Apagar", + msg: "Apagar registro(s) selecionado(s)?", + bSubmit: "Apagar", + bCancel: "Cancelar" + }, + nav : { + edittext: " ", + edittitle: "Alterar registro selecionado", + addtext:" ", + addtitle: "Incluir novo registro", + deltext: " ", + deltitle: "Apagar registro selecionado", + searchtext: " ", + searchtitle: "Procurar registros", + refreshtext: "", + refreshtitle: "Recarregar tabela", + alertcap: "Aviso", + alerttext: "Por favor, selecione um registro", + viewtext: "", + viewtitle: "Ver linha selecionada", + savetext: "", + savetitle: "Salvar linha", + canceltext: "", + canceltitle : "Cancelar edição da linha", + selectcaption : "Actions..." + }, + col : { + caption: "Mostrar/Esconder Colunas", + bSubmit: "Enviar", + bCancel: "Cancelar" + }, + errors : { + errcap : "Erro", + nourl : "Nenhuma URL definida", + norecords: "Sem registros para exibir", + model : "Comprimento de colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "R$ ", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", + "Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado" + ], + monthNames: [ + "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez", + "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['º', 'º', 'º', 'º'][Math.min((j - 1) % 10, 3)] : 'º'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-pt.js b/html/sternwarte/storno/js/i18n/grid.locale-pt.js new file mode 100755 index 0000000..c3e8014 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-pt.js @@ -0,0 +1,181 @@ +/** + * jqGrid Portuguese Translation + * Traduçã da jqGrid em Portugues por Frederico Carvalho, http://www.eyeviewdesign.pt + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["pt"] = { + defaults : { + recordtext: "View {0} - {1} of {2}", + emptyrecords: "No records to view", + loadtext: "A carregar...", + pgtext : "Página {0} de {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Busca...", + Find: "Procurar", + Reset: "Limpar", + odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Adicionar Registo", + editCaption: "Modificar Registo", + bSubmit: "Submeter", + bCancel: "Cancelar", + bClose: "Fechar", + saveData: "Data has been changed! Save changes?", + bYes : "Yes", + bNo : "No", + bExit : "Cancel", + msg: { + required:"Campo obrigat�rio", + number:"Por favor, introduza um numero", + minValue:"O valor deve ser maior ou igual que", + maxValue:"O valor deve ser menor ou igual a", + email: "N�o � um endere�o de email v�lido", + integer: "Por favor, introduza um numero inteiro", + url: "is not a valid URL. Prefix required ('http://' or 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "View Record", + bClose: "Close" + }, + del : { + caption: "Eliminar", + msg: "Deseja eliminar o(s) registo(s) seleccionado(s)?", + bSubmit: "Eliminar", + bCancel: "Cancelar" + }, + nav : { + edittext: " ", + edittitle: "Modificar registo seleccionado", + addtext:" ", + addtitle: "Adicionar novo registo", + deltext: " ", + deltitle: "Eliminar registo seleccionado", + searchtext: " ", + searchtitle: "Procurar", + refreshtext: "", + refreshtitle: "Actualizar", + alertcap: "Aviso", + alerttext: "Por favor, seleccione um registo", + viewtext: "", + viewtitle: "View selected row", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Mostrar/Ocultar Colunas", + bSubmit: "Enviar", + bCancel: "Cancelar" + }, + errors : { + errcap : "Erro", + nourl : "N�o especificou um url", + norecords: "N�o existem dados para processar", + model : "Tamanho do colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", + "Domingo", "Segunda-Feira", "Ter�a-Feira", "Quarta-Feira", "Quinta-Feira", "Sexta-Feira", "S�bado" + ], + monthNames: [ + "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez", + "Janeiro", "Fevereiro", "Mar�o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['�', '�', '�', '�'][Math.min((j - 1) % 10, 3)] : '�'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-ro.js b/html/sternwarte/storno/js/i18n/grid.locale-ro.js new file mode 100755 index 0000000..265c943 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-ro.js @@ -0,0 +1,195 @@ +/** + * jqGrid Romanian Translation + * Alexandru Emil Lupu contact@alecslupu.ro + * http://www.alecslupu.ro/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["ro"] = { + defaults : { + recordtext: "Vizualizare {0} - {1} din {2}", + emptyrecords: "Nu există înregistrări de vizualizat", + loadtext: "Încărcare...", + pgtext : "Pagina {0} din {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Caută...", + Find: "Caută", + Reset: "Resetare", + odata: [{ oper:'eq', text:"egal"},{ oper:'ne', text:"diferit"},{ oper:'lt', text:"mai mic"},{ oper:'le', text:"mai mic sau egal"},{ oper:'gt', text:"mai mare"},{ oper:'ge', text:"mai mare sau egal"},{ oper:'bw', text:"începe cu"},{ oper:'bn', text:"nu începe cu"},{ oper:'in', text:"se găsește în"},{ oper:'ni', text:"nu se găsește în"},{ oper:'ew', text:"se termină cu"},{ oper:'en', text:"nu se termină cu"},{ oper:'cn', text:"conține"},{ oper:'nc', text:""},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "toate" }, { op: "OR", text: "oricare" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Adăugare înregistrare", + editCaption: "Modificare înregistrare", + bSubmit: "Salvează", + bCancel: "Anulare", + bClose: "Închide", + saveData: "Informațiile au fost modificate! Salvați modificările?", + bYes : "Da", + bNo : "Nu", + bExit : "Anulare", + msg: { + required:"Câmpul este obligatoriu", + number:"Vă rugăm introduceți un număr valid", + minValue:"valoarea trebuie sa fie mai mare sau egală cu", + maxValue:"valoarea trebuie sa fie mai mică sau egală cu", + email: "nu este o adresă de e-mail validă", + integer: "Vă rugăm introduceți un număr valid", + date: "Vă rugăm să introduceți o dată validă", + url: "Nu este un URL valid. Prefixul este necesar('http://' or 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "Vizualizare înregistrare", + bClose: "Închidere" + }, + del : { + caption: "Ștegere", + msg: "Ștergeți înregistrarea (înregistrările) selectate?", + bSubmit: "Șterge", + bCancel: "Anulare" + }, + nav : { + edittext: "", + edittitle: "Modifică rândul selectat", + addtext:"", + addtitle: "Adaugă rând nou", + deltext: "", + deltitle: "Șterge rândul selectat", + searchtext: "", + searchtitle: "Căutare înregistrări", + refreshtext: "", + refreshtitle: "Reîncarcare Grid", + alertcap: "Avertisment", + alerttext: "Vă rugăm să selectați un rând", + viewtext: "", + viewtitle: "Vizualizează rândul selectat", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Arată/Ascunde coloanele", + bSubmit: "Salvează", + bCancel: "Anulare" + }, + errors : { + errcap : "Eroare", + nourl : "Niciun url nu este setat", + norecords: "Nu sunt înregistrări de procesat", + model : "Lungimea colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", + "Duminică", "Luni", "Marți", "Miercuri", "Joi", "Vineri", "Sâmbătă" + ], + monthNames: [ + "Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Noi", "Dec", + "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie" + ], + AmPm : ["am","pm","AM","PM"], + /* + Here is a problem in romanian: + M / F + 1st = primul / prima + 2nd = Al doilea / A doua + 3rd = Al treilea / A treia + 4th = Al patrulea/ A patra + 5th = Al cincilea / A cincea + 6th = Al șaselea / A șasea + 7th = Al șaptelea / A șaptea + .... + */ + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-ru.js b/html/sternwarte/storno/js/i18n/grid.locale-ru.js new file mode 100755 index 0000000..c8196d0 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-ru.js @@ -0,0 +1,185 @@ +/** + * jqGrid Russian Translation v1.0 02.07.2009 (based on translation by Alexey Kanaev v1.1 21.01.2009, http://softcore.com.ru) + * Sergey Dyagovchenko + * http://d.sumy.ua + * Tony Tomov + * http://www.guriddo.net + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["ru"] = { + defaults : { + recordtext: "Просмотр {0} - {1} из {2}", + emptyrecords: "Нет записей для просмотра", + loadtext: "Загрузка...", + pgtext : "Стр. {0} из {1}", + savetext: "Сохранения...", + pgfirst : "Первая", + pglast : "Последняя", + pgnext : "Следующая", + pgprev : "Предыдущая", + pgrecs : "Записей на стр.", + showhide: "Показать/Скрыть таблицу", + // mobile + pagerCaption : "Грид::Параметры страницы", + pageText : "Страница:", + recordPage : "Записей на стр.", + nomorerecs : "Нет больше записей...", + scrollPullup: "Потяните, чтобы загрузить более...", + scrollPulldown : "Потяните вниз чтобы обновить...", + scrollRefresh : "Отпустите, чтобы обновить..." + }, + search : { + caption: "Поиск...", + Find: "Найти", + Reset: "Сброс", + odata: [{ oper:'eq', text:"равно"},{ oper:'ne', text:"не равно"},{ oper:'lt', text:"меньше"},{ oper:'le', text:"меньше или равно"},{ oper:'gt', text:"больше"},{ oper:'ge', text:"больше или равно"},{ oper:'bw', text:"начинается с"},{ oper:'bn', text:"не начинается с"},{ oper:'in', text:"находится в"},{ oper:'ni', text:"не находится в"},{ oper:'ew', text:"заканчивается на"},{ oper:'en', text:"не заканчивается на"},{ oper:'cn', text:"содержит"},{ oper:'nc', text:"не содержит"},{ oper:'nu', text:"равно NULL"},{ oper:'nn', text:"не равно NULL"}, {oper:'bt', text:'между'}], + groupOps: [ { op: "AND", text: "все" }, { op: "OR", text: "любой" }], + operandTitle : "Выбрать поисковую операцию.", + resetTitle : "Сбросить поиск", + addsubgrup : "Добавить группу", + addrule : "Добавить правило", + delgroup : "Удалить группу", + delrule : "Удалить правило" + }, + edit : { + addCaption: "Добавить запись", + editCaption: "Редактировать запись", + bSubmit: "Сохранить", + bCancel: "Отмена", + bClose: "Закрыть", + saveData: "Данные были измененны! Сохранить изменения?", + bYes : "Да", + bNo : "Нет", + bExit : "Отмена", + msg: { + required:"Поле является обязательным", + number:"Пожалуйста, введите правильное число", + minValue:"значение должно быть больше либо равно", + maxValue:"значение должно быть меньше либо равно", + email: "некорректное значение e-mail", + integer: "Пожалуйста, введите целое число", + date: "Пожалуйста, введите правильную дату", + url: "неверная ссылка. Необходимо ввести префикс ('http://' или 'https://')", + nodefined : " не определено!", + novalue : " возвращаемое значение обязательно!", + customarray : "Пользовательская функция должна возвращать массив!", + customfcheck : "Пользовательская функция должна присутствовать в случаи пользовательской проверки!" + } + }, + view : { + caption: "Просмотр записи", + bClose: "Закрыть" + }, + del : { + caption: "Удалить", + msg: "Удалить выбранную запись(и)?", + bSubmit: "Удалить", + bCancel: "Отмена" + }, + nav : { + edittext: " ", + edittitle: "Редактировать выбранную запись", + addtext:" ", + addtitle: "Добавить новую запись", + deltext: " ", + deltitle: "Удалить выбранную запись", + searchtext: " ", + searchtitle: "Найти записи", + refreshtext: "", + refreshtitle: "Обновить таблицу", + alertcap: "Внимание", + alerttext: "Пожалуйста, выберите запись", + viewtext: "", + viewtitle: "Просмотреть выбранную запись", + savetext: "", + savetitle: "Сохранить запись", + canceltext: "", + canceltitle : "Отмена сохранения", + selectcaption : "Действия..." + }, + col : { + caption: "Показать/скрыть столбцы", + bSubmit: "Сохранить", + bCancel: "Отмена" + }, + errors : { + errcap : "Ошибка", + nourl : "URL не установлен", + norecords: "Нет записей для обработки", + model : "Число полей не соответствует числу столбцов таблицы!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", + "Воскресение", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота" + ], + monthNames: [ + "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек", + "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, + srcformat: 'Y-m-d', + newformat: 'd.m.Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n.j.Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y G:i:s", + MonthDay: "F d", + ShortTime: "G:i", + LongTime: "G:i:s", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Сортировка по возрастанию", + sortdesc : "Сортировка по убыванию", + columns : "Колонны", + filter : "Филтрировать", + grouping : "Группа по", + ungrouping : "Разгруппировать", + searchTitle : "Строки со значениями", + freeze : "Закрепление", + unfreeze : "Отмена закрепление", + reorder : "Переместить в порядок" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-sk.js b/html/sternwarte/storno/js/i18n/grid.locale-sk.js new file mode 100755 index 0000000..34b9da8 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-sk.js @@ -0,0 +1,183 @@ +/** + * jqGrid Slovak Translation + * Milan Cibulka + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["sk"] = { + defaults : { + recordtext: "Zobrazených {0} - {1} z {2} záznamov", + emptyrecords: "Neboli nájdené žiadne záznamy", + loadtext: "Načítám...", + pgtext : "Strana {0} z {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Vyhľadávam...", + Find: "Hľadať", + Reset: "Reset", + odata: [{ oper:'eq', text:"rovná sa"},{ oper:'ne', text:"nerovná sa"},{ oper:'lt', text:"menšie"},{ oper:'le', text:"menšie alebo rovnajúce sa"},{ oper:'gt', text:"väčšie"},{ oper:'ge', text:"väčšie alebo rovnajúce sa"},{ oper:'bw', text:"začína s"},{ oper:'bn', text:"nezačína s"},{ oper:'in', text:"je v"},{ oper:'ni', text:"nie je v"},{ oper:'ew', text:"končí s"},{ oper:'en', text:"nekončí s"},{ oper:'cn', text:"obahuje"},{ oper:'nc', text:"neobsahuje"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "všetkých" }, { op: "OR", text: "niektorého z" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Pridať záznam", + editCaption: "Editácia záznamov", + bSubmit: "Uložiť", + bCancel: "Storno", + bClose: "Zavrieť", + saveData: "Údaje boli zmenené! Uložiť zmeny?", + bYes : "Ano", + bNo : "Nie", + bExit : "Zrušiť", + msg: { + required:"Pole je požadované", + number:"Prosím, vložte valídne číslo", + minValue:"hodnota musí býť väčšia ako alebo rovná ", + maxValue:"hodnota musí býť menšia ako alebo rovná ", + email: "nie je valídny e-mail", + integer: "Prosím, vložte celé číslo", + date: "Prosím, vložte valídny dátum", + url: "nie je platnou URL. Požadovaný prefix ('http://' alebo 'https://')", + nodefined : " nie je definovaný!", + novalue : " je vyžadovaná návratová hodnota!", + customarray : "Custom function mala vrátiť pole!", + customfcheck : "Custom function by mala byť prítomná v prípade custom checking!" + } + }, + view : { + caption: "Zobraziť záznam", + bClose: "Zavrieť" + }, + del : { + caption: "Zmazať", + msg: "Zmazať vybraný(é) záznam(y)?", + bSubmit: "Zmazať", + bCancel: "Storno" + }, + nav : { + edittext: " ", + edittitle: "Editovať vybraný riadok", + addtext:" ", + addtitle: "Pridať nový riadek", + deltext: " ", + deltitle: "Zmazať vybraný záznam ", + searchtext: " ", + searchtitle: "Nájsť záznamy", + refreshtext: "", + refreshtitle: "Obnoviť tabuľku", + alertcap: "Varovanie", + alerttext: "Prosím, vyberte riadok", + viewtext: "", + viewtitle: "Zobraziť vybraný riadok", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Zobrazit/Skrýť stĺpce", + bSubmit: "Uložiť", + bCancel: "Storno" + }, + errors : { + errcap : "Chyba", + nourl : "Nie je nastavená url", + norecords: "Žiadne záznamy k spracovaniu", + model : "Dĺžka colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Ne", "Po", "Ut", "St", "Št", "Pi", "So", + "Nedela", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatek", "Sobota" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec", + "Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December" + ], + AmPm : ["do","od","DO","OD"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-sq.js b/html/sternwarte/storno/js/i18n/grid.locale-sq.js new file mode 100755 index 0000000..c976e86 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-sq.js @@ -0,0 +1,217 @@ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["en"] = { + defaults : { + recordtext: "Shfaq {0} - {1}/{2}", + emptyrecords: "Nuk ka rreshta për të shfaqur", + loadtext: "Duke u ngarkuar...", + savetext: "Duke ruajtur...", + pgtext : "Faqja {0}/{1}", + pgfirst : "Faqja e parë", + pglast : "Faqja e fundit", + pgnext : "Faqja tjetër", + pgprev : "Faqja mëparshme", + pgrecs : "Rreshta për faqe", + showhide: "Shpalos ose mbyll tabelën", + // mobile + pagerCaption : "Tabela::Kruskoti i faqes", + pageText : "Faqja:", + recordPage : "Rreshta për faqe", + nomorerecs : "Nuk ka rreshta të tjerë...", + scrollPullup: "Tërhiq për lart për të tjerë...", + scrollPulldown : "Tërqiq për poshtë për rifreskim...", + scrollRefresh : "Lësho për rifreskim..." + }, + search : { + caption: "Kërko...", + Find: "Gjej", + Reset: "Pastro", + odata: [{ oper:'eq', text:'baraz'},{ oper:'ne', text:'jo baraz'},{ oper:'lt', text:'me e vogel'},{ oper:'le', text:'me e vogel ose baraz'},{ oper:'gt', text:'me e madhe'},{ oper:'ge', text:'me e madhe ose baraz'},{ oper:'bw', text:'fillon me'},{ oper:'bn', text:'nuk fillon me'},{ oper:'in', text:'brenda'},{ oper:'ni', text:'jo brenda'},{ oper:'ew', text:'mbaron me'},{ oper:'en', text:'nuk mbaron me'},{ oper:'cn', text:'permban'},{ oper:'nc', text:'nuk permban'},{ oper:'nu', text:'eshte bosh'},{ oper:'nn', text:'nuk eshte bosh'}, {oper:'bt', text:'between'}], + groupOps: [{ op: "AND", text: "te gjithe" },{ op: "OR", text: "cfaredo" }], + operandTitle : "Kliko per te zgjedhur veprimin.", + resetTitle : "Fshi vlerat e kerkimit", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + + }, + edit : { + addCaption: "Shto rresht", + editCaption: "Fshi rresht", + bSubmit: "Vendos", + bCancel: "Anullo", + bClose: "Mbyll", + saveData: "Te dhenat jane ndryshuar! Deshironi ti ruani ndryshimet?", + bYes : "Po", + bNo : "Jo", + bExit : "Anullo", + msg: { + required:"Kjo fushe eshte e detyrueshme", + number:"Ju lutem, vendosni nje numer te vlefshem", + minValue:"vlera duhet te jete me e madhe ose e njejte me ", + maxValue:"vlera duhet te jete me e vogel ose e njejte me", + email: "nuk eshte adrese poste elektronike e vlefshme", + integer: "Ju lutem, vendosni nje numer te plote te vlefshem", + date: "Ju lutem, vendosni nje date te vlefshme", + url: "nuk eshte URL e vlefshme. Nevojitet prefiksi ('http://' ose 'https://')", + nodefined : " nuk eshte percaktuar!", + novalue : " vlera si pergjigje eshte e detyreshme!", + customarray : "Funksioni i personalizuar duhet te ktheje nje array!", + customfcheck : "unksioni i personalizuar duhet te egzistoje ne rast kontrolli te personalizuar!" + + } + }, + view : { + caption: "Shfaq Rreshtin", + bClose: "Mbyll" + }, + del : { + caption: "Fshi", + msg: "Deshironi te fshini rreshtin/rreshtat e zgjedhur?", + bSubmit: "Fshi", + bCancel: "Anullo" + }, + nav : { + edittext: "", + edittitle: "Modifiko rreshtin e zgjedhur", + addtext:"", + addtitle: "Shto rresht te ri", + deltext: "", + deltitle: "Fshi rreshtin e zgjedhur", + searchtext: "", + searchtitle: "Gjej rreshtat", + refreshtext: "", + refreshtitle: "Ringarko listen", + alertcap: "Paralajmerim", + alerttext: "Ju lutem, zgjidh nje rresht", + viewtext: "", + viewtitle: "Shfaq rreshtin e zgjedhur", + savetext: "", + savetitle: "Ruaj rreshtin", + canceltext: "", + canceltitle : "Anullo modifikim rreshti", + selectcaption : "Veprime..." + }, + col : { + caption: "Zgjidh kolona", + bSubmit: "Ok", + bCancel: "Anullo" + }, + errors : { + errcap : "Gabim", + nourl : "Nuk eshte percaktuar asnje URL", + norecords: "Nuk ka rreshta per perpunim", + model : "Gjatesia e emrit te kolones <> modeli i kolones!" + }, + formatter : { + integer : {thousandsSeparator: ",", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Dje", "Hën", "Mar", "Mër", "Enj", "Pre", "Sht", + "Djelë", "Hënë", "Martë", "Mërkurë", "Enjte", "Premte", "Shtunë" + ], + monthNames: [ + "Jan", "Shk", "Mar", "Pri", "Maj", "Qer", "Kor", "Gus", "Sht", "Tet", "Nën", "Dhj", + "Janar", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht", "Shtator", "Tetor", "Nëntor", "Dhjetor" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, + srcformat: 'Y-m-d', + newformat: 'n/j/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid + // and see http://docs.jquery.com/UI/Datepicker/formatDate + // and https://github.com/jquery/globalize#dates for alternative formats used frequently + // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many + // information about date, time, numbers and currency formats used in different countries + // one should just convert the information in PHP format + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + // short date: + // n - Numeric representation of a month, without leading zeros + // j - Day of the month without leading zeros + // Y - A full numeric representation of a year, 4 digits + // example: 3/1/2012 which means 1 March 2012 + ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy" + // long date: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy" + // long date with long time: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt" + // month day: + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd" + // short time (without seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt" + // long time (with seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt" + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + // month with year + // Y - A full numeric representation of a year, 4 digits + // F - A full textual representation of a month + YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-sr-latin.js b/html/sternwarte/storno/js/i18n/grid.locale-sr-latin.js new file mode 100755 index 0000000..453236e --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-sr-latin.js @@ -0,0 +1,184 @@ +/** + * jqGrid Serbian latin Translation + * Bild Studio info@bild-studio.net + * http://www.bild-studio.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["sr-latin"] = { + defaults : { + recordtext: "Pregled {0} - {1} od {2}", + emptyrecords: "Ne postoji nijedan zapis", + loadtext: "Učitavanje…", + pgtext : "Strana {0} od {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Traženje...", + Find: "Traži", + Reset: "Resetuj", + odata: [{ oper:'eq', text:"jednako"},{ oper:'ne', text:"nije jednako"},{ oper:'lt', text:"manje"},{ oper:'le', text:"manje ili jednako"},{ oper:'gt', text:"veće"},{ oper:'ge', text:"veće ili jednako"},{ oper:'bw', text:"počinje sa"},{ oper:'bn', text:"ne počinje sa"},{ oper:'in', text:"je u"},{ oper:'ni', text:"nije u"},{ oper:'ew', text:"završava sa"},{ oper:'en', text:"ne završava sa"},{ oper:'cn', text:"sadrži"},{ oper:'nc', text:"ne sadrži"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "sva" }, { op: "OR", text: "bilo koje" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Dodaj zapis", + editCaption: "Izmeni zapis", + bSubmit: "Pošalji", + bCancel: "Odustani", + bClose: "Zatvori", + saveData: "Podatak je izmenjen! Sačuvaj izmene?", + bYes : "Da", + bNo : "Ne", + bExit : "Odustani", + msg: { + required: "Polje je obavezno", + number: "Unesite ispravan broj", + minValue: "vrednost mora biti veća od ili jednaka sa ", + maxValue: "vrednost mora biti manja ili jednaka sa", + email: "nije ispravna email adresa, nije valjda da ne umeš ukucati mail!?", + integer: "Unesi celobrojnu vrednost ", + date: "Unesite ispravan datum", + url: "nije ispravan URL. Potreban je prefiks ('http://' or 'https://')", + nodefined : " nije definisan!", + novalue : " zahtevana je povratna vrednost!", + customarray : "Prilagođena funkcija treba da vrati niz!", + customfcheck : "Prilagođena funkcija treba da bude prisutana u slučaju prilagođene provere!" + + } + }, + view : { + caption: "Pogledaj zapis", + bClose: "Zatvori" + }, + del : { + caption: "Izbrisi", + msg: "Izbrisi izabran(e) zapise(e)?", + bSubmit: "Izbriši", + bCancel: "Odbaci" + }, + nav : { + edittext: "", + edittitle: "Izmeni izabrani red", + addtext:"", + addtitle: "Dodaj novi red", + deltext: "", + deltitle: "Izbriši izabran red", + searchtext: "", + searchtitle: "Nađi zapise", + refreshtext: "", + refreshtitle: "Ponovo učitaj podatke", + alertcap: "Upozorenje", + alerttext: "Izaberite red", + viewtext: "", + viewtitle: "Pogledaj izabrani red", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Izaberi kolone", + bSubmit: "OK", + bCancel: "Odbaci" + }, + errors : { + errcap : "Greška", + nourl : "Nije postavljen URL", + norecords: "Nema zapisa za obradu", + model : "Dužina modela colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub", + "Nedelja", "Ponedeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec", + "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-sr.js b/html/sternwarte/storno/js/i18n/grid.locale-sr.js new file mode 100755 index 0000000..6fdf860 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-sr.js @@ -0,0 +1,184 @@ +/** + * jqGrid Serbian Translation + * Александар Миловац(Aleksandar Milovac) aleksandar.milovac@gmail.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["sr"] = { + defaults : { + recordtext: "Преглед {0} - {1} од {2}", + emptyrecords: "Не постоји ниједан запис", + loadtext: "Учитавање...", + pgtext : "Страна {0} од {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Тражење...", + Find: "Тражи", + Reset: "Ресетуј", + odata: [{ oper:'eq', text:"једнако"},{ oper:'ne', text:"није једнако"},{ oper:'lt', text:"мање"},{ oper:'le', text:"мање или једнако"},{ oper:'gt', text:"веће"},{ oper:'ge', text:"веће или једнако"},{ oper:'bw', text:"почиње са"},{ oper:'bn', text:"не почиње са"},{ oper:'in', text:"је у"},{ oper:'ni', text:"није у"},{ oper:'ew', text:"завршава са"},{ oper:'en', text:"не завршава са"},{ oper:'cn', text:"садржи"},{ oper:'nc', text:"не садржи"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "И", text: "сви" }, { op: "ИЛИ", text: "сваки" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Додај запис", + editCaption: "Измени запис", + bSubmit: "Пошаљи", + bCancel: "Одустани", + bClose: "Затвори", + saveData: "Податак је измењен! Сачувај измене?", + bYes : "Да", + bNo : "Не", + bExit : "Одустани", + msg: { + required:"Поље је обавезно", + number:"Молим, унесите исправан број", + minValue:"вредност мора бити већа од или једнака са ", + maxValue:"вредност мора бити мања од или једнака са", + email: "није исправна имејл адреса", + integer: "Молим, унесите исправну целобројну вредност ", + date: "Молим, унесите исправан датум", + url: "није исправан УРЛ. Потребан је префикс ('http://' or 'https://')", + nodefined : " није дефинисан!", + novalue : " захтевана је повратна вредност!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + + } + }, + view : { + caption: "Погледај запис", + bClose: "Затвори" + }, + del : { + caption: "Избриши", + msg: "Избриши изабран(е) запис(е)?", + bSubmit: "Ибриши", + bCancel: "Одбаци" + }, + nav : { + edittext: "", + edittitle: "Измени изабрани ред", + addtext:"", + addtitle: "Додај нови ред", + deltext: "", + deltitle: "Избриши изабран ред", + searchtext: "", + searchtitle: "Нађи записе", + refreshtext: "", + refreshtitle: "Поново учитај податке", + alertcap: "Упозорење", + alerttext: "Молим, изаберите ред", + viewtext: "", + viewtitle: "Погледај изабрани ред", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Изабери колоне", + bSubmit: "ОК", + bCancel: "Одбаци" + }, + errors : { + errcap : "Грешка", + nourl : "Није постављен URL", + norecords: "Нема записа за обраду", + model : "Дужина модела colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Нед", "Пон", "Уто", "Сре", "Чет", "Пет", "Суб", + "Недеља", "Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота" + ], + monthNames: [ + "Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Нов", "Дец", + "Јануар", "Фебруар", "Март", "Април", "Мај", "Јун", "Јул", "Август", "Септембар", "Октобар", "Новембар", "Децембар" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-sv.js b/html/sternwarte/storno/js/i18n/grid.locale-sv.js new file mode 100755 index 0000000..213af86 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-sv.js @@ -0,0 +1,183 @@ +/** + * jqGrid Swedish Translation + * Harald Normann harald.normann@wts.se, harald.normann@gmail.com + * http://www.worldteamsoftware.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["sv"] = { + defaults : { + recordtext: "Visar {0} - {1} av {2}", + emptyrecords: "Det finns inga poster att visa", + loadtext: "Laddar...", + pgtext : "Sida {0} av {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Sök Poster - Ange sökvillkor", + Find: "Sök", + Reset: "Nollställ Villkor", + odata: [{ oper:'eq', text:"lika"},{ oper:'ne', text:"ej lika"},{ oper:'lt', text:"mindre"},{ oper:'le', text:"mindre eller lika"},{ oper:'gt', text:"större"},{ oper:'ge', text:"större eller lika"},{ oper:'bw', text:"börjar med"},{ oper:'bn', text:"börjar inte med"},{ oper:'in', text:"tillhör"},{ oper:'ni', text:"tillhör inte"},{ oper:'ew', text:"slutar med"},{ oper:'en', text:"slutar inte med"},{ oper:'cn', text:"innehåller"},{ oper:'nc', text:"innehåller inte"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "alla" }, { op: "OR", text: "eller" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Ny Post", + editCaption: "Redigera Post", + bSubmit: "Spara", + bCancel: "Avbryt", + bClose: "Stäng", + saveData: "Data har ändrats! Spara förändringar?", + bYes : "Ja", + bNo : "Nej", + bExit : "Avbryt", + msg: { + required:"Fältet är obligatoriskt", + number:"Välj korrekt nummer", + minValue:"värdet måste vara större än eller lika med", + maxValue:"värdet måste vara mindre än eller lika med", + email: "är inte korrekt e-post adress", + integer: "Var god ange korrekt heltal", + date: "Var god ange korrekt datum", + url: "är inte en korrekt URL. Prefix måste anges ('http://' or 'https://')", + nodefined : " är inte definierad!", + novalue : " returvärde måste anges!", + customarray : "Custom funktion måste returnera en vektor!", + customfcheck : "Custom funktion måste finnas om Custom kontroll sker!" + } + }, + view : { + caption: "Visa Post", + bClose: "Stäng" + }, + del : { + caption: "Radera", + msg: "Radera markerad(e) post(er)?", + bSubmit: "Radera", + bCancel: "Avbryt" + }, + nav : { + edittext: "", + edittitle: "Redigera markerad rad", + addtext:"", + addtitle: "Skapa ny post", + deltext: "", + deltitle: "Radera markerad rad", + searchtext: "", + searchtitle: "Sök poster", + refreshtext: "", + refreshtitle: "Uppdatera data", + alertcap: "Varning", + alerttext: "Ingen rad är markerad", + viewtext: "", + viewtitle: "Visa markerad rad", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Välj Kolumner", + bSubmit: "OK", + bCancel: "Avbryt" + }, + errors : { + errcap : "Fel", + nourl : "URL saknas", + norecords: "Det finns inga poster att bearbeta", + model : "Antal colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"Kr", defaultValue: '0,00'}, + date : { + dayNames: [ + "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör", + "Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag" + ], + monthNames: [ + "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec", + "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December" + ], + AmPm : ["fm","em","FM","EM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'Y-m-d', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-th.js b/html/sternwarte/storno/js/i18n/grid.locale-th.js new file mode 100755 index 0000000..7eb1b53 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-th.js @@ -0,0 +1,184 @@ +/** + * jqGrid Thai Translation + * Kittituch Manakul m.kittituch@Gmail.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["th"] = { + defaults : { + recordtext: "แสดง {0} - {1} จาก {2}", + emptyrecords: "ไม่พบข้อมูล", + loadtext: "กำลังร้องขอข้อมูล...", + pgtext : "หน้า {0} จาก {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "กำลังค้นหา...", + Find: "ค้นหา", + Reset: "คืนค่ากลับ", + odata: [{ oper:'eq', text:"เท่ากับ"},{ oper:'ne', text:"ไม่เท่ากับ"},{ oper:'lt', text:"น้อยกว่า"},{ oper:'le', text:"ไม่มากกว่า"},{ oper:'gt', text:"มากกกว่า"},{ oper:'ge', text:"ไม่น้อยกว่า"},{ oper:'bw', text:"ขึ้นต้นด้วย"},{ oper:'bn', text:"ไม่ขึ้นต้นด้วย"},{ oper:'in', text:"มีคำใดคำหนึ่งใน"},{ oper:'ni', text:"ไม่มีคำใดคำหนึ่งใน"},{ oper:'ew', text:"ลงท้ายด้วย"},{ oper:'en', text:"ไม่ลงท้ายด้วย"},{ oper:'cn', text:"มีคำว่า"},{ oper:'nc', text:"ไม่มีคำว่า"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "และ", text: "ทั้งหมด" }, { op: "หรือ", text: "ใดๆ" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "เพิ่มข้อมูล", + editCaption: "แก้ไขข้อมูล", + bSubmit: "บันทึก", + bCancel: "ยกเลิก", + bClose: "ปิด", + saveData: "คุณต้องการบันทึการแก้ไข ใช่หรือไม่?", + bYes : "บันทึก", + bNo : "ละทิ้งการแก้ไข", + bExit : "ยกเลิก", + msg: { + required:"ข้อมูลนี้จำเป็น", + number:"กรุณากรอกหมายเลขให้ถูกต้อง", + minValue:"ค่าของข้อมูลนี้ต้องไม่น้อยกว่า", + maxValue:"ค่าของข้อมูลนี้ต้องไม่มากกว่า", + email: "อีเมลล์นี้ไม่ถูกต้อง", + integer: "กรุณากรอกเป็นจำนวนเต็ม", + date: "กรุณากรอกวันที่ให้ถูกต้อง", + url: "URL ไม่ถูกต้อง URL จำเป็นต้องขึ้นต้นด้วย 'http://' หรือ 'https://'", + nodefined : "ไม่ได้ถูกกำหนดค่า!", + novalue : "ต้องการการคืนค่า!", + customarray : "ฟังก์ชันที่สร้างขึ้นต้องส่งค่ากลับเป็นแบบแอเรย์", + customfcheck : "ระบบต้องการฟังก์ชันที่สร้างขึ้นสำหรับการตรวจสอบ!" + + } + }, + view : { + caption: "เรียกดูข้อมูล", + bClose: "ปิด" + }, + del : { + caption: "ลบข้อมูล", + msg: "คุณต้องการลบข้อมูลที่ถูกเลือก ใช่หรือไม่?", + bSubmit: "ต้องการลบ", + bCancel: "ยกเลิก" + }, + nav : { + edittext: "", + edittitle: "แก้ไขข้อมูล", + addtext:"", + addtitle: "เพิ่มข้อมูล", + deltext: "", + deltitle: "ลบข้อมูล", + searchtext: "", + searchtitle: "ค้นหาข้อมูล", + refreshtext: "", + refreshtitle: "รีเฟรช", + alertcap: "คำเตือน", + alerttext: "กรุณาเลือกข้อมูล", + viewtext: "", + viewtitle: "ดูรายละเอียดข้อมูล", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "กรุณาเลือกคอลัมน์", + bSubmit: "ตกลง", + bCancel: "ยกเลิก" + }, + errors : { + errcap : "เกิดความผิดพลาด", + nourl : "ไม่ได้กำหนด URL", + norecords: "ไม่มีข้อมูลให้ดำเนินการ", + model : "จำนวนคอลัมน์ไม่เท่ากับจำนวนคอลัมน์โมเดล!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", + "อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศูกร์", "เสาร์" + ], + monthNames: [ + "ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค.", + "มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฏาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return ''}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-tr.js b/html/sternwarte/storno/js/i18n/grid.locale-tr.js new file mode 100755 index 0000000..a21220d --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-tr.js @@ -0,0 +1,182 @@ +/** + * jqGrid Turkish Translation + * Erhan Gündoğan (erhan@trposta.net) + * http://blog.zakkum.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["tr"] = { + defaults : { + recordtext: "{0}-{1} listeleniyor. Toplam:{2}", + emptyrecords: "Kayıt bulunamadı", + loadtext: "Yükleniyor...", + pgtext : "{0}/{1}. Sayfa", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Arama...", + Find: "Bul", + Reset: "Temizle", + odata: [{ oper:'eq', text:"eşit"},{ oper:'ne', text:"eşit değil"},{ oper:'lt', text:"daha az"},{ oper:'le', text:"daha az veya eşit"},{ oper:'gt', text:"daha fazla"},{ oper:'ge', text:"daha fazla veya eşit"},{ oper:'bw', text:"ile başlayan"},{ oper:'bn', text:"ile başlamayan"},{ oper:'in', text:"içinde"},{ oper:'ni', text:"içinde değil"},{ oper:'ew', text:"ile biten"},{ oper:'en', text:"ile bitmeyen"},{ oper:'cn', text:"içeren"},{ oper:'nc', text:"içermeyen"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "VE", text: "tüm" }, { op: "VEYA", text: "herhangi" }], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Kayıt Ekle", + editCaption: "Kayıt Düzenle", + bSubmit: "Gönder", + bCancel: "İptal", + bClose: "Kapat", + saveData: "Veriler değişti! Kayıt edilsin mi?", + bYes : "Evet", + bNo : "Hayıt", + bExit : "İptal", + msg: { + required:"Alan gerekli", + number:"Lütfen bir numara giriniz", + minValue:"girilen değer daha büyük ya da buna eşit olmalıdır", + maxValue:"girilen değer daha küçük ya da buna eşit olmalıdır", + email: "geçerli bir e-posta adresi değildir", + integer: "Lütfen bir tamsayı giriniz", + url: "Geçerli bir URL değil. ('http://' or 'https://') ön eki gerekli.", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "Kayıt Görüntüle", + bClose: "Kapat" + }, + del : { + caption: "Sil", + msg: "Seçilen kayıtlar silinsin mi?", + bSubmit: "Sil", + bCancel: "İptal" + }, + nav : { + edittext: " ", + edittitle: "Seçili satırı düzenle", + addtext:" ", + addtitle: "Yeni satır ekle", + deltext: " ", + deltitle: "Seçili satırı sil", + searchtext: " ", + searchtitle: "Kayıtları bul", + refreshtext: "", + refreshtitle: "Tabloyu yenile", + alertcap: "Uyarı", + alerttext: "Lütfen bir satır seçiniz", + viewtext: "", + viewtitle: "Seçilen satırı görüntüle", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Sütunları göster/gizle", + bSubmit: "Gönder", + bCancel: "İptal" + }, + errors : { + errcap : "Hata", + nourl : "Bir url yapılandırılmamış", + norecords: "İşlem yapılacak bir kayıt yok", + model : "colNames uzunluğu <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts", + "Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi" + ], + monthNames: [ + "Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara", + "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd/m/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n/j/Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-tw.js b/html/sternwarte/storno/js/i18n/grid.locale-tw.js new file mode 100755 index 0000000..2765589 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-tw.js @@ -0,0 +1,185 @@ +/** + * jqGrid Chinese (Taiwan) Translation for v4.2 + * linquize + * https://github.com/linquize/jqGrid + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["tw"] = { + defaults : { + recordtext: "{0} - {1} 共 {2} 條", + emptyrecords: "沒有記錄", + loadtext: "載入中...", + pgtext : " {0} 共 {1} 頁", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "搜尋...", + Find: "搜尋", + Reset: "重設", + odata: [{ oper:'eq', text:"等於 "},{ oper:'ne', text:"不等於 "},{ oper:'lt', text:"小於 "},{ oper:'le', text:"小於等於 "},{ oper:'gt', text:"大於 "},{ oper:'ge', text:"大於等於 "},{ oper:'bw', text:"開始於 "},{ oper:'bn', text:"不開始於 "},{ oper:'in', text:"在其中 "},{ oper:'ni', text:"不在其中 "},{ oper:'ew', text:"結束於 "},{ oper:'en', text:"不結束於 "},{ oper:'cn', text:"包含 "},{ oper:'nc', text:"不包含 "},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "所有" }, { op: "OR", text: "任一" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "新增記錄", + editCaption: "編輯記錄", + bSubmit: "提交", + bCancel: "取消", + bClose: "關閉", + saveData: "資料已改變,是否儲存?", + bYes : "是", + bNo : "否", + bExit : "取消", + msg: { + required:"此欄必要", + number:"請輸入有效的數字", + minValue:"值必須大於等於 ", + maxValue:"值必須小於等於 ", + email: "不是有效的e-mail地址", + integer: "請輸入有效整数", + date: "請輸入有效時間", + url: "網址無效。前綴必須為 ('http://' 或 'https://')", + nodefined : " 未定義!", + novalue : " 需要傳回值!", + customarray : "自訂函數應傳回陣列!", + customfcheck : "自訂檢查應有自訂函數!" + + } + }, + view : { + caption: "查看記錄", + bClose: "關閉" + }, + del : { + caption: "刪除", + msg: "刪除已選記錄?", + bSubmit: "刪除", + bCancel: "取消" + }, + nav : { + edittext: "", + edittitle: "編輯已選列", + addtext:"", + addtitle: "新增列", + deltext: "", + deltitle: "刪除已選列", + searchtext: "", + searchtitle: "搜尋記錄", + refreshtext: "", + refreshtitle: "重新整理表格", + alertcap: "警告", + alerttext: "請選擇列", + viewtext: "", + viewtitle: "檢視已選列", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "選擇欄", + bSubmit: "確定", + bCancel: "取消" + }, + errors : { + errcap : "錯誤", + nourl : "未設定URL", + norecords: "無需要處理的記錄", + model : "colNames 和 colModel 長度不同!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'}, + currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, + date : { + dayNames: [ + "日", "一", "二", "三", "四", "五", "六", + "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" + ], + monthNames: [ + "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", + "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" + ], + AmPm : ["上午","下午","上午","下午"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, + srcformat: 'Y-m-d', + newformat: 'm-d-Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "Y/j/n", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y g:i:s A", + MonthDay: "F d", + ShortTime: "g:i A", + LongTime: "g:i:s A", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-uk.js b/html/sternwarte/storno/js/i18n/grid.locale-uk.js new file mode 100755 index 0000000..35466c1 --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-uk.js @@ -0,0 +1,183 @@ +/** + * jqGrid Ukrainian Translation v1.0 02.07.2009 + * Sergey Dyagovchenko + * http://d.sumy.ua + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["ua"] = { + defaults : { + recordtext: "Перегляд {0} - {1} з {2}", + emptyrecords: "Немає записів для перегляду", + loadtext: "Завантаження...", + pgtext : "Стор. {0} з {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Пошук...", + Find: "Знайти", + Reset: "Скидання", + odata: [{ oper:'eq', text:"рівно"},{ oper:'ne', text:"не рівно"},{ oper:'lt', text:"менше"},{ oper:'le', text:"менше або рівне"},{ oper:'gt', text:"більше"},{ oper:'ge', text:"більше або рівне"},{ oper:'bw', text:"починається з"},{ oper:'bn', text:"не починається з"},{ oper:'in', text:"знаходиться в"},{ oper:'ni', text:"не знаходиться в"},{ oper:'ew', text:"закінчується на"},{ oper:'en', text:"не закінчується на"},{ oper:'cn', text:"містить"},{ oper:'nc', text:"не містить"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "AND", text: "все" }, { op: "OR", text: "будь-який" }], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Додати запис", + editCaption: "Змінити запис", + bSubmit: "Зберегти", + bCancel: "Відміна", + bClose: "Закрити", + saveData: "До данних були внесені зміни! Зберегти зміни?", + bYes : "Так", + bNo : "Ні", + bExit : "Відміна", + msg: { + required:"Поле є обов'язковим", + number:"Будь ласка, введіть правильне число", + minValue:"значення повинне бути більше або дорівнює", + maxValue:"значення повинно бути менше або дорівнює", + email: "некоректна адреса електронної пошти", + integer: "Будь ласка, введення дійсне ціле значення", + date: "Будь ласка, введення дійсне значення дати", + url: "не дійсний URL. Необхідна приставка ('http://' or 'https://')", + nodefined : " is not defined!", + novalue : " return value is required!", + customarray : "Custom function should return array!", + customfcheck : "Custom function should be present in case of custom checking!" + } + }, + view : { + caption: "Переглянути запис", + bClose: "Закрити" + }, + del : { + caption: "Видалити", + msg: "Видалити обраний запис(и)?", + bSubmit: "Видалити", + bCancel: "Відміна" + }, + nav : { + edittext: " ", + edittitle: "Змінити вибраний запис", + addtext:" ", + addtitle: "Додати новий запис", + deltext: " ", + deltitle: "Видалити вибраний запис", + searchtext: " ", + searchtitle: "Знайти записи", + refreshtext: "", + refreshtitle: "Оновити таблицю", + alertcap: "Попередження", + alerttext: "Будь ласка, виберіть запис", + viewtext: "", + viewtitle: "Переглянути обраний запис", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Показати/Приховати стовпці", + bSubmit: "Зберегти", + bCancel: "Відміна" + }, + errors : { + errcap : "Помилка", + nourl : "URL не задан", + norecords: "Немає записів для обробки", + model : "Число полів не відповідає числу стовпців таблиці!" + }, + formatter : { + integer : {thousandsSeparator: " ", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0,00'}, + currency : {decimalSeparator:",", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0,00'}, + date : { + dayNames: [ + "Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", + "Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота" + ], + monthNames: [ + "Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру", + "Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень" + ], + AmPm : ["am","pm","AM","PM"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th'}, + srcformat: 'Y-m-d', + newformat: 'd.m.Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + ShortDate: "n.j.Y", + LongDate: "l, F d, Y", + FullDateTime: "l, F d, Y G:i:s", + MonthDay: "F d", + ShortTime: "G:i", + LongTime: "G:i:s", + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + YearMonth: "F, Y" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/i18n/grid.locale-vi.js b/html/sternwarte/storno/js/i18n/grid.locale-vi.js new file mode 100755 index 0000000..48a8beb --- /dev/null +++ b/html/sternwarte/storno/js/i18n/grid.locale-vi.js @@ -0,0 +1,224 @@ +/** + * jqGrid Vietnamese Translation + * Lê Đình Dũng dungtdc@gmail.com + * http://trirand.com/blog/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +**/ +/*global jQuery, define */ +(function( factory ) { + "use strict"; + if ( typeof define === "function" && define.amd ) { + // AMD. Register as an anonymous module. + define([ + "jquery", + "../grid.base" + ], factory ); + } else { + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.jgrid = $.jgrid || {}; +if(!$.jgrid.hasOwnProperty("regional")) { + $.jgrid.regional = []; +} +$.jgrid.regional["vi"] = { + defaults : { + recordtext: "View {0} - {1} of {2}", + emptyrecords: "Không có dữ liệu", + loadtext: "Đang nạp dữ liệu...", + pgtext : "Trang {0} trong tổng số {1}", + savetext: "Saving...", + pgfirst : "First Page", + pglast : "Last Page", + pgnext : "Next Page", + pgprev : "Previous Page", + pgrecs : "Records per Page", + showhide: "Toggle Expand Collapse Grid", + // mobile + pagerCaption : "Grid::Page Settings", + pageText : "Page:", + recordPage : "Records per Page", + nomorerecs : "No more records...", + scrollPullup: "Pull up to load more...", + scrollPulldown : "Pull down to refresh...", + scrollRefresh : "Release to refresh..." + }, + search : { + caption: "Tìm kiếm...", + Find: "Tìm", + Reset: "Khởi tạo lại", + odata: [{ oper:'eq', text:"bằng"},{ oper:'ne', text:"không bằng"},{ oper:'lt', text:"bé hơn"},{ oper:'le', text:"bé hơn hoặc bằng"},{ oper:'gt', text:"lớn hơn"},{ oper:'ge', text:"lớn hơn hoặc bằng"},{ oper:'bw', text:"bắt đầu với"},{ oper:'bn', text:"không bắt đầu với"},{ oper:'in', text:"trong"},{ oper:'ni', text:"không nằm trong"},{ oper:'ew', text:"kết thúc với"},{ oper:'en', text:"không kết thúc với"},{ oper:'cn', text:"chứa"},{ oper:'nc', text:"không chứa"},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}, {oper:'bt', text:'between'}], + groupOps: [ { op: "VÀ", text: "tất cả" }, { op: "HOẶC", text: "bất kỳ" } ], + operandTitle : "Click to select search operation.", + resetTitle : "Reset Search Value", + addsubgrup : "Add subgroup", + addrule : "Add rule", + delgroup : "Delete group", + delrule : "Delete rule" + }, + edit : { + addCaption: "Thêm bản ghi", + editCaption: "Sửa bản ghi", + bSubmit: "Gửi", + bCancel: "Hủy bỏ", + bClose: "Đóng", + saveData: "Dữ liệu đã thay đổi! Có lưu thay đổi không?", + bYes : "Có", + bNo : "Không", + bExit : "Hủy bỏ", + msg: { + required:"Trường dữ liệu bắt buộc có", + number:"Hãy điền đúng số", + minValue:"giá trị phải lớn hơn hoặc bằng với ", + maxValue:"giá trị phải bé hơn hoặc bằng", + email: "không phải là một email đúng", + integer: "Hãy điền đúng số nguyên", + date: "Hãy điền đúng ngày tháng", + url: "không phải là URL. Khởi đầu bắt buộc là ('http://' hoặc 'https://')", + nodefined : " chưa được định nghĩa!", + novalue : " giá trị trả về bắt buộc phải có!", + customarray : "Hàm nên trả về một mảng!", + customfcheck : "Custom function should be present in case of custom checking!" + + } + }, + view : { + caption: "Xem bản ghi", + bClose: "Đóng" + }, + del : { + caption: "Xóa", + msg: "Xóa bản ghi đã chọn?", + bSubmit: "Xóa", + bCancel: "Hủy bỏ" + }, + nav : { + edittext: "", + edittitle: "Sửa dòng đã chọn", + addtext:"", + addtitle: "Thêm mới 1 dòng", + deltext: "", + deltitle: "Xóa dòng đã chọn", + searchtext: "", + searchtitle: "Tìm bản ghi", + refreshtext: "", + refreshtitle: "Nạp lại lưới", + alertcap: "Cảnh báo", + alerttext: "Hãy chọn một dòng", + viewtext: "", + viewtitle: "Xem dòng đã chọn", + savetext: "", + savetitle: "Save row", + canceltext: "", + canceltitle : "Cancel row editing", + selectcaption : "Actions..." + }, + col : { + caption: "Chọn cột", + bSubmit: "OK", + bCancel: "Hủy bỏ" + }, + errors : { + errcap : "Lỗi", + nourl : "không url được đặt", + norecords: "Không có bản ghi để xử lý", + model : "Chiều dài của colNames <> colModel!" + }, + formatter : { + integer : {thousandsSeparator: ".", defaultValue: '0'}, + number : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, defaultValue: '0'}, + currency : {decimalSeparator:",", thousandsSeparator: ".", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0'}, + date : { + dayNames: [ + "CN", "T2", "T3", "T4", "T5", "T6", "T7", + "Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy" + ], + monthNames: [ + "Th1", "Th2", "Th3", "Th4", "Th5", "Th6", "Th7", "Th8", "Th9", "Th10", "Th11", "Th12", + "Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai" + ], + AmPm : ["sáng","chiều","SÁNG","CHIỀU"], + S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, + srcformat: 'Y-m-d', + newformat: 'n/j/Y', + parseRe : /[#%\\\/:_;.,\t\s-]/, + masks : { + // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid + // and see http://docs.jquery.com/UI/Datepicker/formatDate + // and https://github.com/jquery/globalize#dates for alternative formats used frequently + // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many + // information about date, time, numbers and currency formats used in different countries + // one should just convert the information in PHP format + ISO8601Long:"Y-m-d H:i:s", + ISO8601Short:"Y-m-d", + // short date: + // n - Numeric representation of a month, without leading zeros + // j - Day of the month without leading zeros + // Y - A full numeric representation of a year, 4 digits + // example: 3/1/2012 which means 1 March 2012 + ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy" + // long date: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy" + // long date with long time: + // l - A full textual representation of the day of the week + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + // Y - A full numeric representation of a year, 4 digits + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt" + // month day: + // F - A full textual representation of a month + // d - Day of the month, 2 digits with leading zeros + MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd" + // short time (without seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt" + // long time (with seconds) + // g - 12-hour format of an hour without leading zeros + // i - Minutes with leading zeros + // s - Seconds, with leading zeros + // A - Uppercase Ante meridiem and Post meridiem (AM or PM) + LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt" + SortableDateTime: "Y-m-d\\TH:i:s", + UniversalSortableDateTime: "Y-m-d H:i:sO", + // month with year + // Y - A full numeric representation of a year, 4 digits + // F - A full textual representation of a month + YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy" + }, + reformatAfterEdit : false, + userLocalTime : false + }, + baseLinkUrl: '', + showAction: '', + target: '', + checkbox : {disabled:true}, + idName : 'id' + }, + colmenu : { + sortasc : "Sort Ascending", + sortdesc : "Sort Descending", + columns : "Columns", + filter : "Filter", + grouping : "Group By", + ungrouping : "Ungroup", + searchTitle : "Get items with value that:", + freeze : "Freeze", + unfreeze : "Unfreeze", + reorder : "Move to reorder" + } +}; +})); diff --git a/html/sternwarte/storno/js/jquery-1.11.0.min.js b/html/sternwarte/storno/js/jquery-1.11.0.min.js new file mode 100755 index 0000000..73f33fb --- /dev/null +++ b/html/sternwarte/storno/js/jquery-1.11.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f +}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
    a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/
    ","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
    ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
    ",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.21",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.ui.progressbar.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
    ").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.21"})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.core.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.21",save:function(a,b){for(var c=0;c").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return b==0?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fade.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.fold.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.highlight.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 +* https://github.com/jquery/jquery-ui +* Includes: jquery.effects.pulsate.js +* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ +(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);; \ No newline at end of file diff --git a/html/sternwarte/wetter/js/jquery-ui-sliderAccess.js b/html/sternwarte/wetter/js/jquery-ui-sliderAccess.js new file mode 100755 index 0000000..473c1e9 --- /dev/null +++ b/html/sternwarte/wetter/js/jquery-ui-sliderAccess.js @@ -0,0 +1,85 @@ +/* + * jQuery UI Slider Access + * By: Trent Richardson [http://trentrichardson.com] + * Version 0.2 + * Last Modified: 12/02/2011 + * + * Copyright 2011 Trent Richardson + * Dual licensed under the MIT and GPL licenses. + * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt + * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt + * + */ + (function($){ + + $.fn.extend({ + sliderAccess: function(options){ + options = options || {}; + options.touchonly = options.touchonly !== undefined? options.touchonly : true; // by default only show it if touch device + + if(options.touchonly === true && !("ontouchend" in document)) + return $(this); + + return $(this).each(function(i,obj){ + var $t = $(this), + o = $.extend({},{ + where: 'after', + step: $t.slider('option','step'), + upIcon: 'ui-icon-plus', + downIcon: 'ui-icon-minus', + text: false, + upText: '+', + downText: '-', + buttonset: true, + buttonsetTag: 'span' + }, options), + $buttons = $('<'+ o.buttonsetTag +' class="ui-slider-access">'+ + ''+ + ''+ + ''); + + $buttons.children('button').each(function(j, jobj){ + var $jt = $(this); + $jt.button({ + text: o.text, + icons: { primary: $jt.data('icon') } + }) + .click(function(e){ + var step = $jt.data('step'), + curr = $t.slider('value'), + newval = curr += step*1, + minval = $t.slider('option','min'), + maxval = $t.slider('option','max'); + + e.preventDefault(); + + if(newval < minval || newval > maxval) + return; + + $t.slider('value', newval); + + $t.slider("option", "slide").call($t, null, { value: newval }); + }); + }); + + // before or after + $t[o.where]($buttons); + + if(o.buttonset){ + $buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset(); + $buttons.eq(0).addClass('ui-corner-left'); + $buttons.eq(1).addClass('ui-corner-right'); + } + + // adjust the width so we don't break the original layout + var bOuterWidth = $buttons.css({ + marginLeft: (o.where == 'after'? 10:0), + marginRight: (o.where == 'before'? 10:0) + }).outerWidth(true) + 5; + var tOuterWidth = $t.outerWidth(true); + $t.css('display','inline-block').width(tOuterWidth-bOuterWidth); + }); + } + }); + +})(jQuery); diff --git a/html/sternwarte/wetter/js/jquery-ui-timepicker-addon.js b/html/sternwarte/wetter/js/jquery-ui-timepicker-addon.js new file mode 100755 index 0000000..f83839e --- /dev/null +++ b/html/sternwarte/wetter/js/jquery-ui-timepicker-addon.js @@ -0,0 +1,1326 @@ +/* +* jQuery timepicker addon +* By: Trent Richardson [http://trentrichardson.com] +* Version 0.9.9 +* Last Modified: 02/05/2012 +* +* Copyright 2012 Trent Richardson +* Dual licensed under the MIT and GPL licenses. +* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt +* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt +* +* HERES THE CSS: +* .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +* .ui-timepicker-div dl { text-align: left; } +* .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +* .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } +* .ui-timepicker-div td { font-size: 90%; } +* .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } +*/ + +(function($) { + +$.extend($.ui, { timepicker: { version: "0.9.9" } }); + +/* Time picker manager. + Use the singleton instance of this class, $.timepicker, to interact with the time picker. + Settings for (groups of) time pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Timepicker() { + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + currentText: 'Now', + closeText: 'Done', + ampm: false, + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + timeFormat: 'hh:mm tt', + timeSuffix: '', + timeOnlyTitle: 'Choose Time', + timeText: 'Time', + hourText: 'Hour', + minuteText: 'Minute', + secondText: 'Second', + millisecText: 'Millisecond', + timezoneText: 'Time Zone' + }; + this._defaults = { // Global defaults for all the datetime picker instances + showButtonPanel: true, + timeOnly: false, + showHour: true, + showMinute: true, + showSecond: false, + showMillisec: false, + showTimezone: false, + showTime: true, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + stepMillisec: 1, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: '+0000', + hourMin: 0, + minuteMin: 0, + secondMin: 0, + millisecMin: 0, + hourMax: 23, + minuteMax: 59, + secondMax: 59, + millisecMax: 999, + minDateTime: null, + maxDateTime: null, + onSelect: null, + hourGrid: 0, + minuteGrid: 0, + secondGrid: 0, + millisecGrid: 0, + alwaysSetTime: true, + separator: ' ', + altFieldTimeOnly: true, + showTimepicker: true, + timezoneIso8609: false, + timezoneList: null, + addSliderAccess: false, + sliderAccessArgs: null + }; + $.extend(this._defaults, this.regional['']); +}; + +$.extend(Timepicker.prototype, { + $input: null, + $altInput: null, + $timeObj: null, + inst: null, + hour_slider: null, + minute_slider: null, + second_slider: null, + millisec_slider: null, + timezone_select: null, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: '+0000', + hourMinOriginal: null, + minuteMinOriginal: null, + secondMinOriginal: null, + millisecMinOriginal: null, + hourMaxOriginal: null, + minuteMaxOriginal: null, + secondMaxOriginal: null, + millisecMaxOriginal: null, + ampm: '', + formattedDate: '', + formattedTime: '', + formattedDateTime: '', + timezoneList: null, + + /* Override the default settings for all instances of the time picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + //######################################################################## + // Create a new Timepicker instance + //######################################################################## + _newInst: function($input, o) { + var tp_inst = new Timepicker(), + inlineSettings = {}; + + for (var attrName in this._defaults) { + var attrValue = $input.attr('time:' + attrName); + if (attrValue) { + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, { + beforeShow: function(input, dp_inst) { + if ($.isFunction(o.beforeShow)) + return o.beforeShow(input, dp_inst, tp_inst); + }, + onChangeMonthYear: function(year, month, dp_inst) { + // Update the time as well : this prevents the time from disappearing from the $input field. + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(o.onChangeMonthYear)) + o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); + }, + onClose: function(dateText, dp_inst) { + if (tp_inst.timeDefined === true && $input.val() != '') + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(o.onClose)) + o.onClose.call($input[0], dateText, dp_inst, tp_inst); + }, + timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); + }); + tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() }); + tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() }); + + if (tp_inst._defaults.timezoneList === null) { + var timezoneList = []; + for (var i = -11; i <= 12; i++) + timezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00'); + if (tp_inst._defaults.timezoneIso8609) + timezoneList = $.map(timezoneList, function(val) { + return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3)); + }); + tp_inst._defaults.timezoneList = timezoneList; + } + + tp_inst.hour = tp_inst._defaults.hour; + tp_inst.minute = tp_inst._defaults.minute; + tp_inst.second = tp_inst._defaults.second; + tp_inst.millisec = tp_inst._defaults.millisec; + tp_inst.ampm = ''; + tp_inst.$input = $input; + + if (o.altField) + tp_inst.$altInput = $(o.altField) + .css({ cursor: 'pointer' }) + .focus(function(){ $input.trigger("focus"); }); + + if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0) + { + tp_inst._defaults.minDate=new Date(); + } + if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0) + { + tp_inst._defaults.maxDate=new Date(); + } + + // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. + if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) + tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); + if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) + tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); + if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) + tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); + if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) + tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); + return tp_inst; + }, + + //######################################################################## + // add our sliders to the calendar + //######################################################################## + _addTimePicker: function(dp_inst) { + var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? + this.$input.val() + ' ' + this.$altInput.val() : + this.$input.val(); + + this.timeDefined = this._parseTime(currDT); + this._limitMinMaxDateTime(dp_inst, false); + this._injectTimePicker(); + }, + + //######################################################################## + // parse the time string from input value or _setTime + //######################################################################## + _parseTime: function(timeString, withDate) { + var regstr = this._defaults.timeFormat.toString() + .replace(/h{1,2}/ig, '(\\d?\\d)') + .replace(/m{1,2}/ig, '(\\d?\\d)') + .replace(/s{1,2}/ig, '(\\d?\\d)') + .replace(/l{1}/ig, '(\\d?\\d?\\d)') + .replace(/t{1,2}/ig, this._getPatternAmpm()) + .replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?') + .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$', + order = this._getFormatPositions(), + ampm = '', + treg; + + if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]); + + if (withDate || !this._defaults.timeOnly) { + // the time should come after x number of characters and a space. + // x = at least the length of text specified by the date format + var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); + // escape special regex characters in the seperator + var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); + regstr = '^.{' + dp_dateFormat.length + ',}?' + this._defaults.separator.replace(specials, "\\$&") + regstr; + } + + treg = timeString.match(new RegExp(regstr, 'i')); + + if (treg) { + if (order.t !== -1) { + if (treg[order.t] === undefined || treg[order.t].length === 0) { + ampm = ''; + this.ampm = ''; + } else { + ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM'; + this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0]; + } + } + + if (order.h !== -1) { + if (ampm == 'AM' && treg[order.h] == '12') + this.hour = 0; // 12am = 0 hour + else if (ampm == 'PM' && treg[order.h] != '12') + this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12 + else this.hour = Number(treg[order.h]); + } + + if (order.m !== -1) this.minute = Number(treg[order.m]); + if (order.s !== -1) this.second = Number(treg[order.s]); + if (order.l !== -1) this.millisec = Number(treg[order.l]); + if (order.z !== -1 && treg[order.z] !== undefined) { + var tz = treg[order.z].toUpperCase(); + switch (tz.length) { + case 1: // Z + tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000'; + break; + case 5: // +hhmm + if (this._defaults.timezoneIso8609) + tz = tz.substring(1) == '0000' + ? 'Z' + : tz.substring(0, 3) + ':' + tz.substring(3); + break; + case 6: // +hh:mm + if (!this._defaults.timezoneIso8609) + tz = tz == 'Z' || tz.substring(1) == '00:00' + ? '+0000' + : tz.replace(/:/, ''); + else if (tz.substring(1) == '00:00') + tz = 'Z'; + break; + } + this.timezone = tz; + } + + return true; + + } + return false; + }, + + //######################################################################## + // pattern for standard and localized AM/PM markers + //######################################################################## + _getPatternAmpm: function() { + var markers = []; + o = this._defaults; + if (o.amNames) + $.merge(markers, o.amNames); + if (o.pmNames) + $.merge(markers, o.pmNames); + markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&') }); + return '(' + markers.join('|') + ')?'; + }, + + //######################################################################## + // figure out position of time elements.. cause js cant do named captures + //######################################################################## + _getFormatPositions: function() { + var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g), + orders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 }; + + if (finds) + for (var i = 0; i < finds.length; i++) + if (orders[finds[i].toString().charAt(0)] == -1) + orders[finds[i].toString().charAt(0)] = i + 1; + + return orders; + }, + + //######################################################################## + // generate and inject html for timepicker into ui datepicker + //######################################################################## + _injectTimePicker: function() { + var $dp = this.inst.dpDiv, + o = this._defaults, + tp_inst = this, + // Added by Peter Medeiros: + // - Figure out what the hour/minute/second max should be based on the step values. + // - Example: if stepMinute is 15, then minMax is 45. + hourMax = parseInt((o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)) ,10), + minMax = parseInt((o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)) ,10), + secMax = parseInt((o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)) ,10), + millisecMax = parseInt((o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)) ,10), + dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, ''); + + // Prevent displaying twice + //if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) { + if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) { + var noDisplay = ' style="display:none;"', + html = '
    ' + + '
    ' + o.timeText + '
    ' + + '
    ' + + '
    ' + o.hourText + '
    ', + hourGridSize = 0, + minuteGridSize = 0, + secondGridSize = 0, + millisecGridSize = 0, + size; + + // Hours + html += '
    '; + if (o.showHour && o.hourGrid > 0) { + html += '
    '; + + for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) { + hourGridSize++; + var tmph = (o.ampm && h > 12) ? h-12 : h; + if (tmph < 10) tmph = '0' + tmph; + if (o.ampm) { + if (h == 0) tmph = 12 +'a'; + else if (h < 12) tmph += 'a'; + else tmph += 'p'; + } + html += ''; + } + + html += '
    ' + tmph + '
    '; + } + html += ''; + + // Minutes + html += '
    ' + o.minuteText + '
    '+ + '
    '; + + if (o.showMinute && o.minuteGrid > 0) { + html += '
    '; + + for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) { + minuteGridSize++; + html += ''; + } + + html += '
    ' + ((m < 10) ? '0' : '') + m + '
    '; + } + html += '
    '; + + // Seconds + html += '
    ' + o.secondText + '
    '+ + '
    '; + + if (o.showSecond && o.secondGrid > 0) { + html += '
    '; + + for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) { + secondGridSize++; + html += ''; + } + + html += '
    ' + ((s < 10) ? '0' : '') + s + '
    '; + } + html += '
    '; + + // Milliseconds + html += '
    ' + o.millisecText + '
    '+ + '
    '; + + if (o.showMillisec && o.millisecGrid > 0) { + html += '
    '; + + for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) { + millisecGridSize++; + html += ''; + } + + html += '
    ' + ((l < 10) ? '0' : '') + l + '
    '; + } + html += '
    '; + + // Timezone + html += '
    ' + o.timezoneText + '
    '; + html += '
    '; + + html += ''; + $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend( + '
    ' + + '
    ' + o.timeOnlyTitle + '
    ' + + '
    '); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({ + orientation: "horizontal", + value: this.hour, + min: o.hourMin, + max: hourMax, + step: o.stepHour, + slide: function(event, ui) { + tp_inst.hour_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + + // Updated by Peter Medeiros: + // - Pass in Event and UI instance into slide function + this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({ + orientation: "horizontal", + value: this.minute, + min: o.minuteMin, + max: minMax, + step: o.stepMinute, + slide: function(event, ui) { + tp_inst.minute_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({ + orientation: "horizontal", + value: this.second, + min: o.secondMin, + max: secMax, + step: o.stepSecond, + slide: function(event, ui) { + tp_inst.second_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({ + orientation: "horizontal", + value: this.millisec, + min: o.millisecMin, + max: millisecMax, + step: o.stepMillisec, + slide: function(event, ui) { + tp_inst.millisec_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function(val, idx) { + return $("