Compare commits

...

55 Commits

Author SHA1 Message Date
ostertun
13ceef37d9 Merge branch 'hotfix/regattas_range' 2020-10-05 14:49:24 +02:00
ostertun
8808d12bf1 gitflow-hotfix-stash: regattas_range 2020-10-05 14:49:00 +02:00
ostertun
c6d5450b0e Merge branch 'hotfix/fix_db_sync_log' 2020-10-05 14:35:22 +02:00
ostertun
cb8a1817ae gitflow-hotfix-stash: fix_db_sync_log 2020-10-05 14:34:56 +02:00
ostertun
acf51ea71c Merge branch 'release/v_1.9' 2020-10-05 13:59:22 +02:00
ostertun
65608cdd5a Release v_1.9 2020-10-05 13:58:26 +02:00
ostertun
d0996fa0c3 Merge branch 'feature/RA-22-add-sites' into develop 2020-10-05 13:57:09 +02:00
ostertun
c9a90eb77c RA-#22 Show info on preloader while first sync 2020-10-05 13:56:47 +02:00
ostertun
754cb6f77d Added edit button to planning 2020-10-05 13:37:31 +02:00
ostertun
5e926f3e75 Add share button on own planning 2020-10-05 13:09:24 +02:00
ostertun
138071769c Added planning_list 2020-10-05 12:57:17 +02:00
ostertun
26d9d83ba2 Added planning_view 2020-10-05 12:26:33 +02:00
ostertun
eaa08ba301 Custom log function => log current time 2020-10-05 11:53:54 +02:00
ostertun
760c05286e RA-#22 Added planning incl setState 2020-10-02 19:26:03 +02:00
ostertun
3f676141d7 Merge branch 'feature/RA-13-dont-show-install-request-window-w' into develop 2020-10-02 17:42:39 +02:00
ostertun
ae9bf02c49 RA-#13 Dont show install promt when welcome banner active 2020-10-02 17:42:33 +02:00
ostertun
c2a482bba1 Fix RA-#10 background color of mobileConsole 2020-10-02 17:19:59 +02:00
ostertun
06266b788d Merge branch 'feature/RA-21-news-mark-unread-news-and-add-pagi' into develop 2020-10-02 14:24:11 +02:00
ostertun
3db5ae1723 RA-#21 News: mark unread and add pagination 2020-10-02 14:24:00 +02:00
ostertun
a45af73c25 Merge branch 'release/v_1.8' 2020-10-02 01:29:43 +02:00
ostertun
b784733b69 Merge branch 'release/v_1.8' into develop 2020-10-02 01:29:43 +02:00
ostertun
f30eac8aa5 Release v_1.8 2020-10-02 01:27:31 +02:00
ostertun
99b624ff92 Merge branch 'feature/RA-4-notifications-ignore-my-regattas' into develop 2020-10-02 01:24:16 +02:00
ostertun
e74ffa9a70 Merge branch 'feature/RA-19-update-url-on-year-change' into develop 2020-10-02 01:24:11 +02:00
ostertun
cbb398988d Merge branch 'feature/RA-20-update-news-badge' into develop 2020-10-02 01:24:00 +02:00
ostertun
856f6c1d66 RA-#20 Update news badge 2020-10-02 01:23:46 +02:00
ostertun
2ea26408be RA-#3 Trigger inputs after programmatically changed 2020-10-02 00:59:34 +02:00
ostertun
fb1ca6d28e RA-#19 Update URL on year change 2020-10-02 00:49:53 +02:00
ostertun
6a5d06325d RA-#4 Notifications: can select "my regattas" channels only when logged in 2020-10-02 00:13:58 +02:00
ostertun
72ac8df460 Merge branch 'feature/dev_buttons' into develop 2020-10-01 23:36:05 +02:00
ostertun
246231fd0e RA-#8 Fix deleteCache 2020-10-01 23:35:49 +02:00
ostertun
3e533f65fc Added show-console-button to preloader 2020-10-01 23:26:22 +02:00
ostertun
2533c3d66a RA-#16 Updated Dev Buttons 2020-10-01 23:25:48 +02:00
ostertun
cacee5a54a RA-#17 Fix padding of body 2020-10-01 22:46:53 +02:00
ostertun
274aa85cf7 Merge branch 'release/v_1.7' 2020-10-01 03:21:20 +02:00
ostertun
4317e4fe87 Release v_1.7
Prepare github repo
small fixes
2020-10-01 03:19:42 +02:00
Timon Ostertun
b7dec825ca Update issue templates 2020-10-01 03:00:38 +02:00
Timon Ostertun
6ca6a79dc3 Update issue templates 2020-10-01 02:59:12 +02:00
Timon Ostertun
d1e5d753b4 Create README.md 2020-10-01 01:03:41 +02:00
Timon Ostertun
7afacc3fff Update issue templates 2020-09-30 23:56:51 +02:00
Timon Ostertun
77ea57d643 RA-#1 Notifications: Badge Icon 2020-09-30 23:24:24 +02:00
Timon Ostertun
a72c462483 RA-#4 Registration open icon is red when deadline expired 2020-09-30 22:46:20 +02:00
Timon Ostertun
b739e6cc4e RA-#7 Fix serviceWorker 2020-09-30 22:45:43 +02:00
Timon Ostertun
eb47cdf016 RA-#7 Removed unnecessary files from cache 2020-09-30 22:25:59 +02:00
Timon Ostertun
12c1a614bb Fix #5 serviceWorker DB access
serviceWorker openes DB only when needed and closes it directly
2020-09-30 16:46:10 +02:00
Timon Ostertun
0fb1bb0462 Added mobile console 2020-09-30 14:36:07 +02:00
Timon Ostertun
1b1176b952 Release v_1.6 2020-09-27 23:18:37 +02:00
Timon Ostertun
00c1c93b80 Added news 2020-09-27 23:17:56 +02:00
Timon Ostertun
876776eb5b Added notifications 2020-09-27 21:54:43 +02:00
Timon Ostertun
a92dc45bb7 Can subscribe to pushes 2020-09-27 14:35:25 +02:00
Timon Ostertun
2bf623733d Release v_1.5 2020-09-27 01:35:43 +02:00
Timon Ostertun
60caf85daa Added add_year, add_boatname 2020-09-27 01:33:45 +02:00
Timon Ostertun
eddcff9e39 Added contact 2020-09-27 00:53:53 +02:00
Timon Ostertun
967ad50755 Moved api backend to main website 2020-09-27 00:05:57 +02:00
Timon Ostertun
a437d05647 Small fixes 2020-09-26 23:42:00 +02:00
48 changed files with 4200 additions and 1957 deletions

View File

@@ -0,0 +1,20 @@
---
name: "[DE] Feature-Anfrage"
about: Schlage eine Idee für dieses Projekt vor
title: ''
labels: enhancement
assignees: ''
---
**Bezieht sich Deine Feature-Anfrage auf ein Problem? Bitte beschreiben.**
Eine klare und präzise Beschreibung des Problems. Z.B. Ich bin immer frustriert, wenn [...]
**Beschreibe die gewünschte Lösung**
Eine klare und präzise Beschreibung dessen, was passieren soll.
**Beschreibe Alternativen, die Du in Betracht gezogen hast**
Eine klare und präzise Beschreibung aller alternativen Lösungen oder Funktionen, die Du in Betracht gezogen hast.
**Zusätzlicher Kontext**
Füge hier weitere Kontexte oder Screenshots zur Feature-Anfrage hinzu.

View File

@@ -0,0 +1,38 @@
---
name: "[DE] Fehlerbericht"
about: Erstelle einen Bericht, um uns zu helfen, die App zu verbessern
title: ''
labels: bug
assignees: ''
---
**Beschreibe den Fehler**
Eine klare und präzise Beschreibung des Fehlers.
**Reproduzierung**
Schritte zum Reproduzieren des Fehlers:
1. Gehe zu '...'
2. Klicke auf '....'
3. Scrolle nach unten zu '....'
4. Sieh den Fehler
**Erwartetes Verhalten**
Eine klare und präzise Beschreibung dessen, was Du erwartet hattest.
**Screenshots**
Füge gegebenenfalls Screenshots hinzu, um Dein Problem zu erklären.
**Desktop (bitte verfolständige die folgenden Informationen):**
- Betriebssystem: [z.B. Windows 10]
- Browser [z.B. chrome, safari]
- Version [z.B. 2.14]
**Smartphone (bitte verfolständige die folgenden Informationen):**
- Gerät: [z.B. iPhone 6]
- Betriebssystem: [z.B. iOS 8.1]
- Browser [z.B. stock browser, safari]
- Version [z.B. 2.14]
**Zusätzlicher Kontext**
Füge hier einen anderen Kontext zum Problem hinzu.

View File

@@ -0,0 +1,38 @@
---
name: "[EN] Bug report"
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. Windows 10]
- Browser [e.g. chrome, safari]
- Version [e.g. 2.14]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone 6]
- OS: [e.g. iOS 8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 2.14]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: "[EN] Feature request"
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -12,7 +12,7 @@ RewriteRule ^(.*)server(.*)$ / [R=301,L,NC]
### CONTENT LOADER ### CONTENT LOADER
# Keep this subfolders untouched # Keep this subfolders untouched
RewriteRule ^(api)($|/) - [L] #RewriteRule ^(api)($|/) - [L]
# Show site # Show site
RewriteRule ^([^\.]*)$ index.php?request=$1 [QSA] RewriteRule ^([^\.]*)$ index.php?request=$1 [QSA]

11
README.md Normal file
View File

@@ -0,0 +1,11 @@
# Regatten.net App
Willkommen im GitHub-Repository unserer neuen Regatten.net App.
Falls sich jemand dafür interessiert, ist hier der gesamte Quellcode unserer neuen App zu finden.
Bitte beachtet, dass diese App einschließlich dem gesamten Quellcode exklusivem Urheberrecht unterliegt. Sie darf also nicht kopiert, verteilt oder verändert werden.
Sollte Interesse an einer Anbindung an unser System bestehen, kontaktiere uns bitte einfach (https://regatten.net/contact)
Der Hauptzweck dieses Repository besteht jedoch darin, Feedback von Euch zu unserer neuen App zu bekommen.
Selbstverständlich könnt Ihr uns auch weiterhin auf anderen Kanälen erreichen, doch für Problem-Meldungen und Verbesserungsvorschläge ist GitHub am besten geeignet.
Wie Du Teil unseres BETA-Programmes wirst, die App installierst und Feedback gibst, erfährst Du in unserem [Wiki](https://github.com/ostertun/RegattenApp/wiki).

View File

@@ -1,8 +0,0 @@
RewriteEngine on
# root directory:
RewriteBase /projects/RegattenApp/api/
# Show site
RewriteRule ^(.*)$ index.php?request=$1 [QSA]

View File

@@ -1,37 +0,0 @@
<?php
// DATABASE Credentials
define('DB_USER', 'regattenwebsite');
define('DB_PASS', 'RBpOv4YYtZKWIGcN');
define('DB_HOST', 'localhost');
define('DB_DATABASE', 'regattenwebsite');
define('DB_CHANGE_TIME', true);
define('DB_USE_UTF8', true); // use utf-8 in DB requests
// DATABASE Table names
define('DB_TABLE_USERS', 'users');
define('DB_TABLE_LOGINS', 'logins');
define('DB_TABLE_KEEPLOGGEDIN', 'keeploggedin');
define('DB_TABLE_RESET', 'rstpw');
define('DB_TABLE_CLUBS', 'regatta_clubs');
define('DB_TABLE_SUFFIX_BOATS', '_boats');
define('DB_TABLE_SUFFIX_SAILORS', '_sailors');
define('DB_TABLE_SUFFIX_PLANNING', '_planning');
define('DB_TABLE_SUFFIX_REGATTAS', '_regattas');
define('DB_TABLE_SUFFIX_RESULTS', '_results');
define('DB_TABLE_TRIM_BOATS', 'trim_boats');
define('DB_TABLE_TRIM_USERS', 'trim_users');
define('DB_TABLE_TRIM_TRIMS', 'trim_trims');
define('DB_TABLE_NEWS', 'news');
define('DB_TABLE_UPDATETIMES', '_updatetimes');
// OUTGOING MAILS - Credentials for outgoing mails
define('MAIL_SMTP_HOST', 'ssl://ostertun.net'); // SMTP Server address
define('MAIL_SMTP_PORT', 465); // port to use
define('MAIL_FROM_ADDRESS', 'no-reply@regatten.net'); // address to send mails from
define('MAIL_USERNAME', MAIL_FROM_ADDRESS); // if true: username
define('MAIL_PASSWORD', 'pVc05j_3'); // & password
?>

View File

@@ -1,157 +0,0 @@
<?php
/*
Mysql Database Support
----------------------
Required defines:
- DB_HOST (STRING)
- DB_USER (STRING)
- DB_PASS (STRING)
- DB_DATABASE (STRING)
- DB_USE_UTF8 (BOOL)
- DB_CHANGE_TIME (BOOL)
Required functions:
- logE (in /_global/log.php)
*/
$mysqli = mysqli_connect(DB_HOST, DB_USER, DB_PASS);
if ($mysqli === false) {
logE("database", "Could not connect to database\n" . mysqli_connect_error);
die('Error: Could not connect to database');
}
mysqli_select_db($mysqli, DB_DATABASE);
if (DB_USE_UTF8) {
mysqli_set_charset($mysqli, 'utf8');
}
function db_get_data($mysqli, $table, $fields = '*', $where = false, $limit = false) {
$rest = '';
if ($where != false) {
$rest .= ' WHERE ' . $where;
}
if ($limit != false) {
$rest .= sprintf(' LIMIT %d', $limit);
}
$query = 'SELECT ' . $fields . ' FROM ' . mysqli_real_escape_string($mysqli, $table) . $rest . ';';
$response = mysqli_query($mysqli, $query);
if ($response !== false) {
$result = array();
if ($response->num_rows > 0) {
$i = 0;
while ($row = $response->fetch_assoc()) {
if (isset($row['id'])) {
$id = $row['id'];
} else {
$id = $i;
$i ++;
}
foreach ($row as $key => $value) {
$result[$id][$key] = $value;
}
}
}
return $result;
} else {
logE("database", "get_data\nInvalid request\n" . $query . "\n" . mysqli_error($mysqli));
return false;
}
}
function db_update_data($mysqli, $table, $data, $where, $limit = false) {
$rest = '';
if ($where != false) {
$rest .= ' WHERE ' . $where;
}
if ($limit != false) {
$rest .= sprintf(' LIMIT %d', $limit);
}
$set = '';
$first = true;
foreach ($data as $key => $value) {
if ($first) {
$first = false;
} else {
$set .= ', ';
}
if ($value === null) {
$set .= '`' . mysqli_real_escape_string($mysqli, $key) . '`=NULL';
} else {
$set .= '`' . mysqli_real_escape_string($mysqli, $key) . '`="' . mysqli_real_escape_string($mysqli, $value) . '"';
}
}
if (defined('DB_CHANGE_TIME')) $set .= ', `changed`=NOW()';
$query = 'UPDATE ' . mysqli_real_escape_string($mysqli, $table) . ' SET ' . $set . $rest . ';';
$response = mysqli_query($mysqli, $query);
if ($response === false) {
logE("database", "update_data\nInvalid request\n" . $query . "\n" . mysqli_error($mysqli));
} elseif (defined('DB_CHANGE_TIME')) {
mysqli_query($mysqli, 'UPDATE `_updatetimes` SET `update`=NOW() WHERE `table`="' . mysqli_real_escape_string($mysqli, $table) . '";');
}
return $response;
}
function db_insert_data($mysqli, $table, $data) {
$fields = '';
$values = '';
$first = true;
foreach ($data as $key => $value) {
if ($first) {
$first = false;
} else {
$fields .= ', ';
$values .= ', ';
}
$fields .= '`' . mysqli_real_escape_string($mysqli, $key) . '`';
if ($value === null) {
$values .= 'NULL';
} else {
$values .= '"' . mysqli_real_escape_string($mysqli, $value) . '"';
}
}
if (defined('DB_CHANGE_TIME')) {
$fields .= ', `changed`';
$values .= ', NOW()';
}
$query = 'INSERT INTO `' . mysqli_real_escape_string($mysqli, $table) . '` (' . $fields . ') VALUES (' . $values . ');';
$response = mysqli_query($mysqli, $query);
if ($response === false) {
logE("database", "insert_data\nInvalid request\n" . $query . "\n" . mysqli_error($mysqli));
} else {
$response = mysqli_insert_id($mysqli);
if (defined('DB_CHANGE_TIME')) {
mysqli_query($mysqli, 'UPDATE `_updatetimes` SET `update`=NOW() WHERE `table`="' . mysqli_real_escape_string($mysqli, $table) . '";');
}
}
return $response;
}
function db_delete_data($mysqli, $table, $where, $limit = false) {
$rest = '';
if ($where != false) {
$rest .= ' WHERE ' . $where;
}
if ($limit != false) {
$rest .= sprintf(' LIMIT %d', $limit);
}
$query = 'DELETE FROM `' . mysqli_real_escape_string($mysqli, $table) . '`' . $rest . ';';
$response = mysqli_query($mysqli, $query);
if ($response === false) {
logE("database", "delete_data\nInvalid request\n" . $query . "\n" . mysqli_error($mysqli));
} elseif (defined('DB_CHANGE_TIME')) {
mysqli_query($mysqli, 'UPDATE `_updatetimes` SET `update`=NOW() WHERE `table`="' . mysqli_real_escape_string($mysqli, $table) . '";');
}
return $response;
}
?>

View File

@@ -1,450 +0,0 @@
<?php
function get_db_entry($mysqli, $table, $id = false, $order = false) {
if ($id === false) {
return db_get_data($mysqli, $table, '*', ($order !== false ? ('1=1 ORDER BY ' . $order) : false));
} else {
$result = db_get_data($mysqli, $table, '*', '`id` = "' . mysqli_real_escape_string($mysqli, $id) . '"', 1);
if (($result === false) or (count($result) != 1))
return false;
else
return array_values($result)[0];
}
}
function get_club($mysqli, $id = false) {
return get_db_entry($mysqli, DB_TABLE_CLUBS, $id, '`kurz` ASC');
}
function get_boat($mysqli, $id = false) {
return get_db_entry($mysqli, BOATCLASS . DB_TABLE_SUFFIX_BOATS, $id, '`sailnumber` ASC');
}
function get_sailor($mysqli, $id = false) {
return get_db_entry($mysqli, BOATCLASS . DB_TABLE_SUFFIX_SAILORS, $id, '`name` ASC');
}
function get_planning($mysqli, $userId = false, $regattaId = false) {
$where = '';
$limit = false;
if ($userId !== false) {
$where .= '(`user`="' . mysqli_real_escape_string($mysqli, $userId) . '")';
}
if (($userId !== false) and ($regattaId !== false)) {
$where .= ' AND ';
$limit = 1;
}
if ($regattaId !== false) {
$where .= '(`regatta`="' . mysqli_real_escape_string($mysqli, $regattaId) . '")';
}
if ($where == '') $where = false;
if ($limit === false) {
return db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_PLANNING, '*', $where);
} else {
$result = db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_PLANNING, '*', $where, 1);
if (($result === false) or (count($result) != 1))
return false;
else
return array_values($result)[0];
}
}
function get_regatta($mysqli, $id = false) {
return get_db_entry($mysqli, BOATCLASS . DB_TABLE_SUFFIX_REGATTAS, $id, '`date` ASC');
}
function get_result($mysqli, $regattaId = false) {
if ($regattaId === false) {
return db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_RESULTS);
} else {
return db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_RESULTS, '*', '`regatta` = "' . mysqli_real_escape_string($mysqli, $regattaId) . '"');
}
}
function get_regattas_range($mysqli, $from, $to) {
return db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_REGATTAS, '*', '(`date` >= "' . date('Y-m-d', $from) . '") AND (`date` <= "' . date('Y-m-d', $to) . '") ORDER BY `date`');
}
function get_regatta_years($mysqli) {
$query = 'SELECT DISTINCT(YEAR(`date`)) as year FROM ' . BOATCLASS . DB_TABLE_SUFFIX_REGATTAS . ' ORDER BY `date`;';
$response = mysqli_query($mysqli, $query);
if ($response !== false) {
$result = array();
if ($response->num_rows > 0) {
while ($row = $response->fetch_assoc()) {
$result[] = $row['year'];
}
}
return $result;
} else {
logE("functions", "get_data\nInvalid request\n" . $query . "\n" . mysqli_error($mysqli));
return false;
}
}
function get_result_calculated($mysqli, $regatta_id) {
$regatta = get_regatta($mysqli, $regatta_id);
if ($regatta === false) {
return false;
}
$results = get_result($mysqli, $regatta_id);
if ($results !== false) {
// *** Replace , with .
foreach ($results as $key => $value) {
for ($i = 1; $i <= $regatta['races']; $i ++) {
$results[$key]['race' . $i] = str_replace(',', '.', $results[$key]['race' . $i]);
}
}
// *** Calculation ***
$gemeldet = count($results);
$sortarray = array();
foreach ($results as $key => $value) {
$results[$key]['finished'] = false;
$results[$key]['values'] = array();
$results[$key]['values_all'] = array();
$results[$key]['texts'] = array();
$copy = array();
for ($i = 1; $i <= $regatta['races']; $i ++) {
if (is_numeric($value['race' . $i])) {
$results[$key]['values'][$i] = $value['race' . $i];
$results[$key]['texts'][$i] = $value['race' . $i];
$copy[$i] = $value['race' . $i];
$results[$key]['finished'] = true;
} else {
switch ($value['race' . $i]) {
// Nicht gestartet
case 'DNC': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Did not come
case 'DNS': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Did not started
// Startfehler
case 'OCS': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // On course site
// Muss v. Hand case 'ZFP': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Z-Flag penalty (20% nach 30.2)
case 'UFD': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Uniform Flag Disqualified (disqu. nach 30.3)
case 'BFD': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Black Flag Disqualified (disqu. nach 30.4)
// Nicht durch Ziel gegangen
case 'DNF': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Did not finish
case 'RET': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Retired (Aufgegeben)
case 'RAF': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Retired after finish
// Disqualifizierun
case 'DSQ': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Disqualified
case 'DNE': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = -1; /*$results[$key]['finished'] = true;*/ break; // Disqualified, not excludable (disqu. kann nach 90.3(b) nicht gestrichen werden)
case 'DGM': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = -2; /*$results[$key]['finished'] = true;*/ break; // Disqualification Gross Missconduct (kann nach 69.1(b)(2) nicht gestr. werden, grobes Fehlverhalten)
// Wiedergutmachung
// Muss v. Hand case 'RDG': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Redress given (Wiedergutmachung gewährt)
// Strafen
// Muss v. Hand case 'SCP': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Wertungsstrafe nach 44.3(a) (20%)
// Muss v. Hand case 'DPI': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Punktstrafe nach Ermessen der Jury
// Unbekannt
default: $results[$key]['values'][$i] = 0; $copy[$i] = 0; break;
}
if ($results[$key]['values'][$i] != 0) {
$results[$key]['texts'][$i] = $value['race' . $i] . ' (' . $results[$key]['values'][$i] . ')';
} else {
$results[$key]['texts'][$i] = $value['race' . $i] . ' (Unknown - 0)';
}
}
}
$results[$key]['values_all'] = $results[$key]['values'];
for ($s = 0; $s < $regatta['streicher']; $s ++) {
$max = max($copy);
for ($i = 1; $i <= $regatta['races']; $i ++) {
if ($copy[$i] == $max) {
$copy[$i] = 0;
break;
}
}
}
$brutto = $netto = 0;
for ($i = 1; $i <= $regatta['races']; $i ++) {
$brutto += $results[$key]['values_all'][$i];
if ($copy[$i] == -1) { $results[$key]['values'][$i] = $gemeldet + 1; }
elseif ($copy[$i] == -2) { $results[$key]['values'][$i] = $gemeldet + 1; }
else { $results[$key]['values'][$i] = $copy[$i]; }
if ($results[$key]['values'][$i] == 0) {
$results[$key]['texts'][$i] = '[' . $results[$key]['texts'][$i] . ']';
}
$netto += $results[$key]['values'][$i];
}
$results[$key]['brutto'] = $brutto;
$results[$key]['netto'] = $netto;
if ($results[$key]['finished']) {
$sortarray[$key] = 0;
} else {
$sortarray[$key] = 1;
}
$sortarray[$key] /*.*/= sprintf("%08.2f", $netto);
$temp = $results[$key]['values'];
sort($temp);
$i = 0;
foreach ($temp as $val) {
if ($i < $regatta['races']) {
$sortarray[$key] .= sprintf("%07.2f", $val);
}
$i ++;
}
for ($i = $regatta['races']; $i > 0; $i --) {
$sortarray[$key] .= sprintf("%07.2f", $results[$key]['values_all'][$i]);
}
$results[$key]['sortvalue'] = $sortarray[$key];
}
array_multisort($sortarray, $results);
$i = 1;
foreach ($results as $key => $value) {
if (($i > 1) and ($sortarray[$key] == $sortarray[$lastkey])) {
$results[$key]['place'] = $results[$lastkey]['place'];
} else {
$results[$key]['place'] = $i;
}
$i ++;
$lastkey = $key;
}
unset ($sortarray);
return $results;
} else {
return false;
}
}
function update_result_cache($mysqli, $regatta_id) {
$regatta = get_regatta($mysqli, $regatta_id);
if ($regatta === false) return;
$results = get_result_calculated($mysqli, $regatta['id']);
if ($results === false) return;
// count finished boats
$fb = 0;
foreach ($results as $result) {
if ($result['finished']) {
$fb ++;
}
}
db_update_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_REGATTAS, ['finishedBoats' => $fb], '`id`="' . $regatta['id'] . '"', 1);
foreach ($results as $result) {
if ($fb == 0) {
$rlp = 0;
} else {
$rlp = 100 * $regatta['rlf'] * (($fb + 1 - $result['place']) / $fb);
}
db_update_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_RESULTS, ['place' => $result['place'], 'rlp' => $rlp], '`id`="' . $result['id'] . '"', 1);
}
}
function get_ranking($mysqli, $from, $to, $jugend = false, $jugstrict = false) {
global $rankNoResults, $_CLASSES;
$rankNoResults = array();
$sailors = get_sailor($mysqli);
$regattas = get_regattas_range($mysqli, $from, $to);
if (($sailors !== false) and ($regattas !== false)) {
foreach ($sailors as $key => $sailor) {
$sailors[$key]['regattas'] = array();
$sailors[$key]['tmp_rlp'] = array();
}
foreach ($regattas as $regatta) {
$date = strtotime($regatta['date']);
// regatta has to be min. 2 days to be ranking-regatta
if ($regatta['length'] < 2) {
continue;
}
$results = get_result($mysqli, $regatta['id']);
if ($results === false) {
continue;
}
if (count($results) <= 0) {
if (strtotime('+' . ($regatta['length']-1) . ' days', $date) <= time()) {
if (!$regatta['canceled']) {
$rankNoResults[] = $regatta;
}
}
continue;
}
// in one race there must be at least 10 boats started
$ok = false;
for ($i = 1; $i <= $regatta['races']; $i ++) {
$temp = 0;
foreach ($results as $result) {
if (($result['race' . $i] != 'DNC') and ($result['race' . $i] != 'DNS')) {
$temp ++;
}
}
if ($temp >= 10) {
$ok = true;
break;
}
}
if (!$ok) {
continue;
}
$fb = $regatta['finishedBoats'];
// add regatta to each sailor
foreach ($results as $result) {
if ($result['rlp'] == 0) {
continue;
}
// check if crew is youth
//if ($jugend) {
// $crew = explode(',', $result['crew']);
// $okay = true;
// foreach ($crew as $sailor) {
// if (($sailor == '') or !isset($sailors[$sailor])) continue;
// $sailor = $sailors[$sailor];
// if ((($sailor['year'] !== null) and ($sailor['year'] < (date('Y', $date) - $_CLASSES[BOATCLASS]['youth-age']))) or
// (($sailor['year'] === null) and ($jugstrict))) {
// $okay = false;
// break;
// }
// }
// if (!$okay) continue;
//}
// calc m
if ($regatta['m'] > 0) {
$m = $regatta['m'];
} elseif ($regatta['races'] <= 4) {
$m = $regatta['races'];
} else {
if (($regatta['length'] > 2) and ($regatta['races'] >= 6)) {
$m = 5;
} else {
$m = 4;
}
}
$rlp = $result['rlp'];
$sailors[$result['steuermann']]['regattas'][$regatta['id']] = array(
'regatta' => $regatta['id'],
'boat' => $result['boat'],
'crew' => $result['crew'],
'place' => $result['place'],
'fb' => $fb,
'rlp' => $rlp,
'used' => 0,
'm' => $m
);
for ($i = 0; $i < $m; $i ++) {
array_push($sailors[$result['steuermann']]['tmp_rlp'], array($regatta['id'], $rlp));
}
}
}
foreach ($sailors as $key => $sailor) {
if ($sailor['german'] == 0) {
unset($sailors[$key]);
} elseif ($jugend) {
if ((($sailor['year'] !== null) and ($sailor['year'] < (date('Y', $to) - $_CLASSES[BOATCLASS]['youth-age']))) or
(($sailor['year'] === null) and ($jugstrict))) {
unset($sailors[$key]);
}
}
}
$sortarray = array();
foreach ($sailors as $key => $sailor) {
// sort rlps desc
$sort = array();
foreach ($sailor['tmp_rlp'] as $key2 => $value) {
$sort[$key2] = $value[1];
}
array_multisort($sort, SORT_DESC, $sailors[$key]['tmp_rlp']);
// calc mean. rlp
$sum = 0;
$cnt = 0;
foreach ($sailors[$key]['tmp_rlp'] as $value) {
$sum += $value[1];
$sailors[$key]['regattas'][$value[0]]['used'] ++;
$cnt ++;
if ($cnt >= 9) {
break;
}
}
unset($sailors[$key]['tmp_rlp']);
if ($cnt > 0) {
$rlp = $sum / $cnt;
$sailors[$key]['rlp'] = $rlp;
$sailors[$key]['m'] = $cnt;
} else {
unset($sailors[$key]);
continue;
}
if ($rlp == 0) {
$sortarray[$key] = $cnt;
} else {
$sortarray[$key] = $cnt * 1000 + $rlp;
}
}
array_multisort($sortarray, SORT_DESC, $sailors);
unset($sortarray);
$i = 1;
foreach ($sailors as $key => $sailor) {
$sailors[$key]['rank'] = $i;
$i ++;
}
return $sailors;
} else {
return false;
}
}
function get_trim_boat($mysqli, $id = false) {
return get_db_entry($mysqli, DB_TABLE_TRIM_BOATS, $id);
}
function get_trim_boat_users($mysqli, $id) {
$result = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`boat` = "' . mysqli_real_escape_string($mysqli, $id) . '"');
if ($result === false)
return false;
else
return $result;
}
function get_trim_user_boats($mysqli, $id) {
$boats = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`user` = "' . mysqli_real_escape_string($mysqli, $id) . '"');
if ($boats === false) {
return false;
} else {
$result = [];
foreach ($boats as $value) {
$result[$value['boat']] = get_trim_boat($mysqli, $value['boat']);
}
return $result;
}
}
function trim_is_boat_user($mysqli, $user, $boat) {
$res = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`user` = "' . mysqli_real_escape_string($mysqli, $user) . '" AND `boat` = "' . mysqli_real_escape_string($mysqli, $boat) . '"');
return ($res !== false) and (count($res) == 1);
}
function get_trim_trim($mysqli, $id = false) {
return get_db_entry($mysqli, DB_TABLE_TRIM_TRIMS, $id);
}
function get_trim_boat_trims($mysqli, $id) {
$result = db_get_data($mysqli, DB_TABLE_TRIM_TRIMS, '*', '`boat` = "' . mysqli_real_escape_string($mysqli, $id) . '"');
if ($result === false) {
return false;
} else {
return $result;
}
}
?>

View File

@@ -1,466 +0,0 @@
<?php
require_once(__DIR__ . '/../server/config.php');
require_once(__DIR__ . '/config.php');
require_once(__DIR__ . '/../server/log.php');
require_once(__DIR__ . '/database.php');
require_once(__DIR__ . '/login.php');
require_once(__DIR__ . '/functions.php');
$request = false;
if (isset($_GET['request'])) {
$request = explode('/', $_GET['request']);
}
if ($request === false) {
$request = array();
}
if (count($request) >= 1) {
$action = array_shift($request);
} else {
$action = '';
}
define('DONE_OKAY', 0);
define('DONE_EMPTY', 1);
define('DONE_DATABASE', 2);
define('DONE_UNAUTHORIZED', 3);
define('DONE_BAD_REQUEST', 4);
define('DONE_CONFLICT', 5);
define('DONE_SERVER_ERROR', 6);
function done($donecode, $content = null) {
switch ($donecode) {
case DONE_OKAY:
header('HTTP/1.0 200 OK');
break;
case DONE_EMPTY:
header('HTTP/1.0 204 No Content');
break;
case DONE_DATABASE:
header('HTTP/1.0 500 Internal Server Error');
if ($content === null) {
$content = array('error' => 'database error');
}
break;
case DONE_UNAUTHORIZED:
header('HTTP/1.0 401 Unauthorized');
if ($content === null) {
$content = array('error' => 'unauthorized');
}
break;
case DONE_BAD_REQUEST:
header('HTTP/1.0 400 Bad Request');
if ($content === null) {
$content = array('error' => 'bad request');
}
break;
case DONE_CONFLICT:
header('HTTP/1.0 409 Conflict');
break;
case DONE_SERVER_ERROR:
header('HTTP/1.0 500 Internal Server Error');
break;
default:
header('HTTP/1.0 500 Internal Server Error');
break;
}
header('Content-Type: application/json');
if ($content !== null) {
echo json_encode($content);
} else {
echo '{ }';
}
exit;
}
if (isset($_REQUEST['auth']['id'], $_REQUEST['auth']['hash'])) {
$user_id = auth_check($mysqli, $_REQUEST['auth']['id'], $_REQUEST['auth']['hash']);
} else {
$user_id = false;
}
function isLoggedIn() {
global $user_id;
return $user_id !== false;
}
function checkLoggedIn() {
if (!isLoggedIn()) done(DONE_UNAUTHORIZED, ['error' => 'permission denied']);
}
function checkRequest($param) {
if (!isset($_REQUEST[$param])) done(DONE_BAD_REQUEST, ['error' => 'missing parameter: ' . $param]);
}
function replaceChanged($array) {
return array_map(function ($entry) {
unset($entry['changed']);
return $entry;
}, $array);
}
$whereString = false;
if (isset($_REQUEST['index'], $_REQUEST['value'])) {
$whereString = '`' . mysqli_real_escape_string($mysqli, $_REQUEST['index']) . '`="' . mysqli_real_escape_string($mysqli, $_REQUEST['value']) . '"';
}
function sendEntries($table) {
global $mysqli, $whereString;
$response = db_get_data($mysqli, $table, '*', $whereString);
if ($response === false) done(DONE_DATABASE);
$keys = array_keys($response);
if (isset($_REQUEST['changed-after'])) {
$response = db_get_data($mysqli, $table, '*', '`changed` > "' . mysqli_real_escape_string($mysqli, date('Y-m-d H:i:s', $_REQUEST['changed-after'])) . '"' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
}
$response = array_values($response);
done(DONE_OKAY, array('data' => replaceChanged($response), 'keys' => $keys));
}
function sendEntry($table) {
global $mysqli;
checkRequest('id');
$response = db_get_data($mysqli, $table, '*', '`id` = "' . mysqli_real_escape_string($mysqli, $_REQUEST['id']) . '"');
if ($response === false) done(DONE_DATABASE);
if (count($response) != 1) done(DONE_BAD_REQUEST, ['error' => 'id not found']);
$response = array_values($response)[0];
unset($response['changed']);
done(DONE_OKAY, ['data' => $response]);
}
switch ($action) {
case 'login':
checkRequest('username');
checkRequest('password');
checkRequest('device');
$auth = auth_login($mysqli, $_REQUEST['username'], $_REQUEST['password'], $_REQUEST['device']);
if ($auth === false) done(DONE_UNAUTHORIZED);
done(DONE_OKAY, $auth);
break;
case 'logout':
checkLoggedIn();
auth_logout($mysqli, $_REQUEST['auth']['id']);
done(DONE_OKAY);
break;
case 'get_update_time':
$times = array();
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . DB_TABLE_CLUBS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['clubs'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . BOATCLASS . DB_TABLE_SUFFIX_BOATS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['boats'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . BOATCLASS . DB_TABLE_SUFFIX_SAILORS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['sailors'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . BOATCLASS . DB_TABLE_SUFFIX_REGATTAS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['regattas'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . BOATCLASS . DB_TABLE_SUFFIX_RESULTS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['results'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . BOATCLASS . DB_TABLE_SUFFIX_PLANNING . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['plannings'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . DB_TABLE_TRIM_BOATS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['trim_boats'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . DB_TABLE_TRIM_USERS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['trim_users'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . DB_TABLE_TRIM_TRIMS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['trim_trims'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
$response = db_get_data($mysqli, DB_TABLE_UPDATETIMES, '`update`', '`table` = "' . DB_TABLE_USERS . '"', 1);
if (($response !== false) and (count($response) > 0)) {
$times['users'] = strtotime(array_values($response)[0]['update']);
} else {
done(DONE_DATABASE);
}
done(DONE_OKAY, $times);
break;
case 'get_clubs':
sendEntries(DB_TABLE_CLUBS);
break;
case 'get_club':
sendEntry(DB_TABLE_CLUBS);
break;
case 'get_boats':
sendEntries(BOATCLASS . DB_TABLE_SUFFIX_BOATS);
break;
case 'get_boat':
sendEntry(BOATCLASS . DB_TABLE_SUFFIX_BOATS);
break;
case 'get_sailors':
sendEntries(BOATCLASS . DB_TABLE_SUFFIX_SAILORS);
break;
case 'get_sailor':
sendEntry(BOATCLASS . DB_TABLE_SUFFIX_SAILORS);
break;
case 'get_years':
$response = get_regatta_years($mysqli);
if ($response === false) done(DONE_DATABASE);
foreach ($response as $key => $value)
$response[$key] = ['year' => $value];
done(DONE_OKAY, ['data' => $response]);
break;
case 'get_regattas':
sendEntries(BOATCLASS . DB_TABLE_SUFFIX_REGATTAS);
break;
case 'get_regatta':
sendEntry(BOATCLASS . DB_TABLE_SUFFIX_REGATTAS);
break;
case 'get_results':
sendEntries(BOATCLASS . DB_TABLE_SUFFIX_RESULTS);
break;
case 'get_result':
sendEntry(BOATCLASS . DB_TABLE_SUFFIX_RESULTS);
break;
case 'get_plannings':
$response = db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_PLANNING, '*', $whereString);
if ($response === false) done(DONE_DATABASE);
$keys = array_keys($response);
if (isset($_REQUEST['changed-after'])) {
$response = db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_PLANNING, '*', '`changed` > "' . mysqli_real_escape_string($mysqli, date('Y-m-d H:i:s', $_REQUEST['changed-after'])) . '"' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
}
$response = array_map(function ($entry) {
global $user_id;
if (($user_id === false) or ($entry['user'] != $user_id)) {
unset($entry['gemeldet'], $entry['bezahlt']);
}
return $entry;
}, $response);
$response = array_values($response);
done(DONE_OKAY, array('data' => replaceChanged($response), 'keys' => $keys));
break;
case 'get_planning':
checkRequest('id');
$response = db_get_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_PLANNING, '*', '`id` = "' . mysqli_real_escape_string($mysqli, $_REQUEST['id']) . '"');
if ($response === false) done(DONE_DATABASE);
if (count($response) != 1) done(DONE_BAD_REQUEST, ['error' => 'id not found']);
$response = array_values($response)[0];
if (($user_id === false) or ($response['user'] != $user_id)) {
unset($response['gemeldet'], $response['bezahlt']);
}
unset($response['changed']);
done(DONE_OKAY, ['data' => $response]);
break;
case 'get_trim_boats':
checkLoggedIn();
$users = db_get_data($mysqli, DB_TABLE_TRIM_USERS, 'boat', '`user`="' . $user_id . '"');
$boats = implode(',', array_column($users, 'boat'));
if ($boats == '') {
done(DONE_OKAY, array('data' => [], 'keys' => []));
}
$response = db_get_data($mysqli, DB_TABLE_TRIM_BOATS, '*', '`id` IN (' . $boats . ')' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
$keys = array_keys($response);
if (isset($_REQUEST['changed-after'])) {
$response = db_get_data($mysqli, DB_TABLE_TRIM_BOATS, '*', '`id` IN (' . $boats . ') AND `changed` > "' . mysqli_real_escape_string($mysqli, date('Y-m-d H:i:s', $_REQUEST['changed-after'])) . '"' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
}
$response = array_values($response);
done(DONE_OKAY, array('data' => replaceChanged($response), 'keys' => $keys));
break;
case 'get_trim_boat':
checkLoggedIn();
checkRequest('id');
$response = db_get_data($mysqli, DB_TABLE_TRIM_BOATS, '*', '`id` = "' . mysqli_real_escape_string($mysqli, $_REQUEST['id']) . '"');
if ($response === false) done(DONE_DATABASE);
if (count($response) != 1) done(DONE_BAD_REQUEST, ['error' => 'id not found']);
$response = array_values($response)[0];
if (count(db_get_data($mysqli, DB_TABLE_TRIM_USERS, 'id', '`user`="' . $user_id . '" AND `boat`="' . $response['id'] . '"')) != 1)
done(DONE_BAD_REQUEST, ['error' => 'id not found']);
unset($response['changed']);
done(DONE_OKAY, ['data' => $response]);
break;
case 'get_trim_users':
checkLoggedIn();
$users = db_get_data($mysqli, DB_TABLE_TRIM_USERS, 'boat', '`user`="' . $user_id . '"');
$boats = implode(',', array_column($users, 'boat'));
if ($boats == '') {
done(DONE_OKAY, array('data' => [], 'keys' => []));
}
$response = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`boat` IN (' . $boats . ')' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
$keys = array_keys($response);
if (isset($_REQUEST['changed-after'])) {
$response = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`boat` IN (' . $boats . ') AND `changed` > "' . mysqli_real_escape_string($mysqli, date('Y-m-d H:i:s', $_REQUEST['changed-after'])) . '"' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
}
$response = array_values($response);
done(DONE_OKAY, array('data' => replaceChanged($response), 'keys' => $keys));
break;
case 'get_trim_user':
checkLoggedIn();
checkRequest('id');
$response = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`id` = "' . mysqli_real_escape_string($mysqli, $_REQUEST['id']) . '"');
if ($response === false) done(DONE_DATABASE);
if (count($response) != 1) done(DONE_BAD_REQUEST, ['error' => 'id not found']);
$response = array_values($response)[0];
if (count(db_get_data($mysqli, DB_TABLE_TRIM_USERS, 'id', '`user`="' . $user_id . '" AND `boat`="' . $response['boat'] . '"')) != 1)
done(DONE_BAD_REQUEST, ['error' => 'id not found']);
unset($response['changed']);
done(DONE_OKAY, ['data' => $response]);
break;
case 'get_trim_trims':
checkLoggedIn();
$users = db_get_data($mysqli, DB_TABLE_TRIM_USERS, 'boat', '`user`="' . $user_id . '"');
$boats = implode(',', array_column($users, 'boat'));
if ($boats == '') {
done(DONE_OKAY, array('data' => [], 'keys' => []));
}
$response = db_get_data($mysqli, DB_TABLE_TRIM_TRIMS, '*', '`boat` IN (' . $boats . ')' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
$keys = array_keys($response);
if (isset($_REQUEST['changed-after'])) {
$response = db_get_data($mysqli, DB_TABLE_TRIM_TRIMS, '*', '`boat` IN (' . $boats . ') AND `changed` > "' . mysqli_real_escape_string($mysqli, date('Y-m-d H:i:s', $_REQUEST['changed-after'])) . '"' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
}
$response = array_values($response);
done(DONE_OKAY, array('data' => replaceChanged($response), 'keys' => $keys));
break;
case 'get_trim_trim':
checkLoggedIn();
checkRequest('id');
$response = db_get_data($mysqli, DB_TABLE_TRIM_TRIMS, '*', '`id` = "' . mysqli_real_escape_string($mysqli, $_REQUEST['id']) . '"');
if ($response === false) done(DONE_DATABASE);
if (count($response) != 1) done(DONE_BAD_REQUEST, ['error' => 'id not found']);
$response = array_values($response)[0];
if (count(db_get_data($mysqli, DB_TABLE_TRIM_USERS, 'id', '`user`="' . $user_id . '" AND `boat`="' . $response['boat'] . '"')) != 1)
done(DONE_BAD_REQUEST, ['error' => 'id not found']);
unset($response['changed']);
done(DONE_OKAY, ['data' => $response]);
break;
case 'get_users':
$followFields = '';
for ($i = 1; $i <= 5; $i ++) $followFields .= ',' . BOATCLASS . '_sailor' . $i . ' AS sailor' . $i;
$response = db_get_data($mysqli, DB_TABLE_USERS, 'id,username,email' . $followFields, $whereString);
if ($response === false) done(DONE_DATABASE);
$keys = array_keys($response);
if (isset($_REQUEST['changed-after'])) {
$response = db_get_data($mysqli, DB_TABLE_USERS, 'id,username,email' . $followFields, '`changed` > "' . mysqli_real_escape_string($mysqli, date('Y-m-d H:i:s', $_REQUEST['changed-after'])) . '"' . ($whereString ? (' AND ' . $whereString) : ''));
if ($response === false) done(DONE_DATABASE);
}
$response = array_map(function ($entry) {
global $user_id;
if ($entry['id'] != $user_id) {
$entry = ['id' => $entry['id'], 'username' => $entry['username']];
}
return $entry;
}, $response);
$response = array_values($response);
done(DONE_OKAY, array('data' => replaceChanged($response), 'keys' => $keys));
break;
case 'get_user':
checkRequest('id');
$followFields = '';
for ($i = 1; $i <= 5; $i ++) $followFields .= ',' . BOATCLASS . '_sailor' . $i . ' AS sailor' . $i;
$response = db_get_data($mysqli, DB_TABLE_USERS, 'id,username,email' . $followFields, '`id` = "' . mysqli_real_escape_string($mysqli, $_REQUEST['id']) . '"');
if ($response === false) done(DONE_DATABASE);
if (count($response) != 1) done(DONE_BAD_REQUEST, ['error' => 'id not found']);
$response = array_values($response)[0];
if ($response['id'] != $user_id) {
$response = ['id' => $response['id'], 'username' => $response['username']];
}
unset($response['changed']);
done(DONE_OKAY, ['data' => $response]);
break;
case 'add_subscription':
checkRequest('subscription');
$data = [
'auth' => PUSH_AUTH,
'subscription' => $_REQUEST['subscription']
];
$ch = curl_init('https://push.ostertun.net/add_subscription');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
if ($result == "OK")
done(DONE_OKAY);
else {
logE('add_subscription', $result);
done(DONE_SERVER_ERROR);
}
break;
case 'remove_subscription':
checkRequest('subscription');
$data = [
'auth' => PUSH_AUTH,
'subscription' => $_REQUEST['subscription']
];
$ch = curl_init('https://push.ostertun.net/remove_subscription');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
if ($result == "OK")
done(DONE_OKAY);
else {
logE('remove_subscription', $result);
done(DONE_SERVER_ERROR);
}
break;
default:
done(DONE_BAD_REQUEST, ['error' => 'action invalid']);
}
?>

View File

@@ -1,107 +0,0 @@
<?php
function get_user($mysqli, $username = null) {
if ($username === null) {
return db_get_data($mysqli, DB_TABLE_USERS);
} else {
$user = db_get_data($mysqli, DB_TABLE_USERS, '*', '`username` = "' . mysqli_real_escape_string($mysqli, $username) . '"', 1);
if (($user === false) or (count($user) != 1)) return false;
return array_values($user)[0];
}
}
function get_user_by_id($mysqli, $user_id) {
$res = db_get_data($mysqli, DB_TABLE_USERS, '*', '`id` = "' . mysqli_real_escape_string($mysqli, $user_id) . '"', 1);
if (($res !== false) and (count($res) == 1)) {
return array_values($res)[0];
}
return false;
}
//function signup($mysqli, $username, $email, $password) {
// if (($username == '') or ($email == '') or ($password == '')) {
// return 1;
// }
// if (get_user($mysqli, $username) !== false) {
// return 1;
// }
// $salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), true));
// $hashpassword = hash('sha512', $password . $salt);
//
// $user = array();
// $user['username'] = $username;
// $user['email'] = $email;
// $user['password'] = $hashpassword;
// $user['salt'] = $salt;
// if (db_insert_data($mysqli, DB_TABLE_USERS, $user) !== false) {
// $values = array();
// $values['USERNAME'] = $username;
// $message = createMail('signup', STRING_SIGNUP_EMAIL_SUBJECT, $values);
// smtp_send_mail(['Regatten.net', MAIL_FROM_ADDRESS], [[$username, $email]], [], [], STRING_SIGNUP_EMAIL_SUBJECT, $message, [['Content-Type', 'text/html; charset="UTF-8"']]);
// // Analytics
// matomo_event('Login', 'SignUp', $username);
// return true;
// } else {
// return 2;
// }
//}
function get_perm($mysqli, $user_id) {
if ($user_id !== false) {
$result = get_user_by_id($mysqli, $user_id);
if ($result !== false) {
return $result[DB_FIELD_PERM];
} else {
return 0;
}
} else {
return 0;
}
}
// ### NEW LOGIN ####################################
function auth_login($mysqli, $username, $password, $device) {
$user = get_user($mysqli, $username);
if ($user === false) {
// User does not exist
return false;
}
$hashpassword = hash('sha512', $password . $user['salt']);
if ($hashpassword !== $user['password']) {
// Password incorrect
return false;
}
// All correct
$auth = [];
$auth['user'] = $user['id'];
$auth['username'] = $user['username'];
$auth['auth'] = str_replace('/', '-', str_replace('+', '_', base64_encode(openssl_random_pseudo_bytes(24))));
$salt = base64_encode(openssl_random_pseudo_bytes(24));
$hash = hash('sha512', $auth['auth'] . $salt);
$data = [
'user' => $user['id'],
'salt' => $salt,
'authhash' => $hash,
'device' => $device
];
$auth['id'] = db_insert_data($mysqli, DB_TABLE_LOGINS, $data);
return $auth;
}
function auth_logout($mysqli, $id) {
db_delete_data($mysqli, DB_TABLE_LOGINS, 'id = "' . mysqli_real_escape_string($mysqli, $id) . '"', 1);
return true;
}
function auth_check($mysqli, $id, $hash) {
$auth = db_get_data($mysqli, DB_TABLE_LOGINS, '*', 'id="' . mysqli_real_escape_string($mysqli, $id) . '"', 1);
if (($auth === false) or (count($auth) != 1)) return false;
$auth = array_values($auth)[0];
$hash = hash('sha512', $hash . $auth['salt']);
if ($hash != $auth['authhash']) return false;
db_update_data($mysqli, DB_TABLE_LOGINS, ['id' => $auth['id']], 'id="' . $auth['id'] . '"', 1); // update changed field => last login
return $auth['user'];
}
?>

View File

@@ -1,9 +1,9 @@
<?php <?php
header('Content-Type: text/javascript'); header('Content-Type: text/javascript');
require_once(__DIR__ . '/../../server/config.php'); require_once(__DIR__ . '/../../server/config.php');
?> ?>
var loaderCount = 2; var loaderCount = 2;
@@ -29,17 +29,17 @@ $(window).on('load',function(){
$(document).ready(function(){ $(document).ready(function(){
'use strict' 'use strict'
var isAJAX = false; //Enables or disable AJAX page transitions and loading. var isAJAX = false; //Enables or disable AJAX page transitions and loading.
var isDevelopment = false; // Enables development mode. Clean cache & Stops BG & Highlights from changing defaults. var isDevelopment = false; // Enables development mode. Clean cache & Stops BG & Highlights from changing defaults.
function init_template(){ function init_template(){
//ADD YOUR CUSTOM JAVASCRIPT CODES HERE! //ADD YOUR CUSTOM JAVASCRIPT CODES HERE!
//Do not put inside HTML files. //Do not put inside HTML files.
//The init_template() function will be triggered when pages open. //The init_template() function will be triggered when pages open.
//Generating Dynamic Styles to decrease CSS size and execute faster loading times. //Generating Dynamic Styles to decrease CSS size and execute faster loading times.
var colorsArray = [ var colorsArray = [
//colors must be in HEX format. //colors must be in HEX format.
@@ -93,24 +93,24 @@ $(document).ready(function(){
["skype","#12A5F4"], ["skype","#12A5F4"],
["instagram","#e1306c"] ["instagram","#e1306c"]
]; ];
//Back Button Scroll Stop //Back Button Scroll Stop
//if ('scrollRestoration' in history) {history.scrollRestoration = 'manual';} //if ('scrollRestoration' in history) {history.scrollRestoration = 'manual';}
//Disable Page Jump on Empty Links. //Disable Page Jump on Empty Links.
$('a').on('click', function(){var attrs = $(this).attr('href'); if(attrs === '#'){return false;}}); $('a').on('click', function(){var attrs = $(this).attr('href'); if(attrs === '#'){return false;}});
//Adding Background for Gradient //Adding Background for Gradient
if(!$('.menu-hider').length){$('#page').append('<div class="menu-hider"><div>');} if(!$('.menu-hider').length){$('#page').append('<div class="menu-hider"><div>');}
/*Menu Extender Function*/ /*Menu Extender Function*/
$.fn.showMenu = function() {$(this).addClass('menu-active'); $('#footer-bar').addClass('footer-menu-hidden');setTimeout(function(){$('.menu-hider').addClass('menu-active');},250);$('body').addClass('modal-open')}; $.fn.showMenu = function() {$(this).addClass('menu-active'); $('#footer-bar').addClass('footer-menu-hidden');setTimeout(function(){$('.menu-hider').addClass('menu-active');},250);$('body').addClass('modal-open')};
$.fn.hideMenu = function() {$(this).removeClass('menu-active'); $('#footer-bar').removeClass('footer-menu-hidden');$('.menu-hider').removeClass('menu-active menu-active-clear');$('body').removeClass('modal-open')}; $.fn.hideMenu = function() {$(this).removeClass('menu-active'); $('#footer-bar').removeClass('footer-menu-hidden');$('.menu-hider').removeClass('menu-active menu-active-clear');$('body').removeClass('modal-open')};
//Add your programatically triggered menus here //Add your programatically triggered menus here
//Menu Required Variables //Menu Required Variables
var menu = $('.menu'), var menu = $('.menu'),
body = $('body'), body = $('body'),
@@ -123,21 +123,21 @@ $(document).ready(function(){
pageContent = $('.page-content'), pageContent = $('.page-content'),
headerAndContent = $('.header, .page-content, #footer-bar'), headerAndContent = $('.header, .page-content, #footer-bar'),
menuDeployer = $('a[data-menu]'); menuDeployer = $('a[data-menu]');
//Menu System //Menu System
menu.each(function(){ menu.each(function(){
var menuHeight = $(this).data('menu-height'); var menuHeight = $(this).data('menu-height');
var menuWidth = $(this).data('menu-width'); var menuWidth = $(this).data('menu-width');
var menuActive = $(this).data('menu-active'); var menuActive = $(this).data('menu-active');
if($(this).hasClass('menu-box-right')){$(this).css("width",menuWidth);} if($(this).hasClass('menu-box-right')){$(this).css("width",menuWidth);}
if($(this).hasClass('menu-box-left')){$(this).css("width",menuWidth);} if($(this).hasClass('menu-box-left')){$(this).css("width",menuWidth);}
if($(this).hasClass('menu-box-bottom')){$(this).css("height",menuHeight);} if($(this).hasClass('menu-box-bottom')){$(this).css("height",menuHeight);}
if($(this).hasClass('menu-box-top')){$(this).css("height",menuHeight);} if($(this).hasClass('menu-box-top')){$(this).css("height",menuHeight);}
if($(this).hasClass('menu-box-modal')){$(this).css({"height":menuHeight, "width":menuWidth});} if($(this).hasClass('menu-box-modal')){$(this).css({"height":menuHeight, "width":menuWidth});}
}); });
//Menu Deploy Click //Menu Deploy Click
menuDeployer.on('click',function(){ menuDeployer.on('click',function(){
menu.removeClass('menu-active'); menu.removeClass('menu-active');
menuHider.addClass('menu-active'); menuHider.addClass('menu-active');
@@ -147,23 +147,23 @@ $(document).ready(function(){
var menuWidth = menuID.data('menu-width'); var menuWidth = menuID.data('menu-width');
var menuHeight = menuID.data('menu-height'); var menuHeight = menuID.data('menu-height');
$('body').addClass('modal-open'); $('body').addClass('modal-open');
if(menuID.hasClass('menu-header-clear')){menuHider.addClass('menu-active-clear');} if(menuID.hasClass('menu-header-clear')){menuHider.addClass('menu-active-clear');}
function menuActivate(){menuID = 'menu-active' ? menuID.addClass('menu-active') : menuID.removeClass('menu-active');} function menuActivate(){menuID = 'menu-active' ? menuID.addClass('menu-active') : menuID.removeClass('menu-active');}
if(menuID.hasClass('menu-box-bottom')){$('#footer-bar').addClass('footer-menu-hidden');} if(menuID.hasClass('menu-box-bottom')){$('#footer-bar').addClass('footer-menu-hidden');}
if(menuEffect === "menu-parallax"){ if(menuEffect === "menu-parallax"){
if(menuID.hasClass('menu-box-bottom')){headerAndContent.css("transform", "translateY("+(menuHeight/5)*(-1)+"px)");} if(menuID.hasClass('menu-box-bottom')){headerAndContent.css("transform", "translateY("+(menuHeight/5)*(-1)+"px)");}
if(menuID.hasClass('menu-box-top')){headerAndContent.css("transform", "translateY("+(menuHeight/5)+"px)");} if(menuID.hasClass('menu-box-top')){headerAndContent.css("transform", "translateY("+(menuHeight/5)+"px)");}
if(menuID.hasClass('menu-box-left')){headerAndContent.css("transform", "translateX("+(menuWidth/5)+"px)");} if(menuID.hasClass('menu-box-left')){headerAndContent.css("transform", "translateX("+(menuWidth/5)+"px)");}
if(menuID.hasClass('menu-box-right')){headerAndContent.css("transform", "translateX("+(menuWidth/5)*(-1)+"px)");} if(menuID.hasClass('menu-box-right')){headerAndContent.css("transform", "translateX("+(menuWidth/5)*(-1)+"px)");}
} }
if(menuEffect === "menu-push"){ if(menuEffect === "menu-push"){
if(menuID.hasClass('menu-box-bottom')){headerAndContent.css("transform", "translateY("+(menuHeight)*(-1)+"px)");} if(menuID.hasClass('menu-box-bottom')){headerAndContent.css("transform", "translateY("+(menuHeight)*(-1)+"px)");}
if(menuID.hasClass('menu-box-top')){headerAndContent.css("transform", "translateY("+(menuHeight)+"px)");} if(menuID.hasClass('menu-box-top')){headerAndContent.css("transform", "translateY("+(menuHeight)+"px)");}
if(menuID.hasClass('menu-box-left')){headerAndContent.css("transform", "translateX("+(menuWidth)+"px)");} if(menuID.hasClass('menu-box-left')){headerAndContent.css("transform", "translateX("+(menuWidth)+"px)");}
if(menuID.hasClass('menu-box-right')){headerAndContent.css("transform", "translateX("+(menuWidth)*(-1)+"px)");} if(menuID.hasClass('menu-box-right')){headerAndContent.css("transform", "translateX("+(menuWidth)*(-1)+"px)");}
} }
if(menuEffect === "menu-push-full"){ if(menuEffect === "menu-push-full"){
if(menuID.hasClass('menu-box-left')){headerAndContent.css("transform", "translateX(100%)");} if(menuID.hasClass('menu-box-left')){headerAndContent.css("transform", "translateX(100%)");}
if(menuID.hasClass('menu-box-right')){headerAndContent.css("transform", "translateX(-100%)");} if(menuID.hasClass('menu-box-right')){headerAndContent.css("transform", "translateX(-100%)");}
} }
menuActivate(); menuActivate();
@@ -204,13 +204,13 @@ $(document).ready(function(){
setTimeout(function(){ setTimeout(function(){
if($('body').hasClass('detect-theme')){$('body').removeClass('detect-theme');} if($('body').hasClass('detect-theme')){$('body').removeClass('detect-theme');}
if($('body').hasClass('theme-light')){ if($('body').hasClass('theme-light')){
eraseCookie('sticky_dark_mode'); eraseCookie('sticky_dark_mode');
darkSwitch.prop('checked', false); darkSwitch.prop('checked', false);
createCookie('sticky_light_mode', true, 1); createCookie('sticky_light_mode', true, 1);
} }
if($('body').hasClass('theme-dark')){ if($('body').hasClass('theme-dark')){
eraseCookie('sticky_light_mode'); eraseCookie('sticky_light_mode');
darkSwitch.prop('checked', true); darkSwitch.prop('checked', true);
createCookie('sticky_dark_mode', true, 1); createCookie('sticky_dark_mode', true, 1);
} }
},150); },150);
@@ -222,7 +222,7 @@ $(document).ready(function(){
//Auto Dark Mode //Auto Dark Mode
function activateDarkMode(){$('body').removeClass('theme-light').addClass('theme-dark'); $('#dark-mode-detected').removeClass('disabled'); eraseCookie('sticky_light_mode'); createCookie('sticky_dark_mode', true, 1);} function activateDarkMode(){$('body').removeClass('theme-light').addClass('theme-dark'); $('#dark-mode-detected').removeClass('disabled'); eraseCookie('sticky_light_mode'); createCookie('sticky_dark_mode', true, 1);}
function activateLightMode(){$('body').removeClass('theme-dark').addClass('theme-light'); $('#dark-mode-detected').removeClass('disabled'); eraseCookie('sticky_dark_mode'); createCookie('sticky_light_mode', true, 1);} function activateLightMode(){$('body').removeClass('theme-dark').addClass('theme-light'); $('#dark-mode-detected').removeClass('disabled'); eraseCookie('sticky_dark_mode'); createCookie('sticky_light_mode', true, 1);}
function activateNoPreference(){$('#manual-mode-detected').removeClass('disabled');} function activateNoPreference(){$('#manual-mode-detected').removeClass('disabled');}
function setColorScheme() { function setColorScheme() {
const isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches const isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches
@@ -244,19 +244,19 @@ $(document).ready(function(){
$('.footer-bar-2 .active-nav, .footer-bar-4 .active-nav, .footer-bar-5 .active-nav').append('<strong></strong>') $('.footer-bar-2 .active-nav, .footer-bar-4 .active-nav, .footer-bar-5 .active-nav').append('<strong></strong>')
} }
} }
//Back Button in Header //Back Button in Header
var backButton = $('.back-button, [data-back-button]'); var backButton = $('.back-button, [data-back-button]');
backButton.on('click', function() { backButton.on('click', function() {
window.history.go(-1); window.history.go(-1);
//return false; //return false;
}); });
//Copyright Year //Copyright Year
var copyrightYear = $('.copyright-year, #copyright-year'); var copyrightYear = $('.copyright-year, #copyright-year');
var dteNow = new Date(); var intYear = dteNow.getFullYear(); var dteNow = new Date(); var intYear = dteNow.getFullYear();
copyrightYear.html(intYear); copyrightYear.html(intYear);
//Back to top Badge //Back to top Badge
var backToTop = $('.back-to-top, [data-back-to-top], .back-to-top-badge, .back-to-top-icon'), var backToTop = $('.back-to-top, [data-back-to-top], .back-to-top-badge, .back-to-top-icon'),
backToTopBadge = $('.back-to-top-badge, .back-to-top-icon'); backToTopBadge = $('.back-to-top-badge, .back-to-top-icon');
@@ -293,7 +293,7 @@ $(document).ready(function(){
show_back_to_top_badge(); show_back_to_top_badge();
show_scroll_ad(); show_scroll_ad();
$('.header-auto-show').addClass('header-active'); $('.header-auto-show').addClass('header-active');
} }
if (footer_reached == true){ if (footer_reached == true){
hide_back_to_top_badge(); hide_back_to_top_badge();
hide_scroll_ad(); hide_scroll_ad();
@@ -333,10 +333,10 @@ $(document).ready(function(){
if(tab.length){activate_tabs()} if(tab.length){activate_tabs()}
//Text Resizer //Text Resizer
$(".text-size-increase").click(function() {$(".text-size-changer *").css("font-size","+=1");}); $(".text-size-increase").click(function() {$(".text-size-changer *").css("font-size","+=1");});
$(".text-size-decrease").click(function() {$(".text-size-changer *").css("font-size","-=1");}); $(".text-size-decrease").click(function() {$(".text-size-changer *").css("font-size","-=1");});
$(".text-size-default").click(function() {$(".text-size-changer *").css("font-size", "");}); $(".text-size-default").click(function() {$(".text-size-changer *").css("font-size", "");});
//Search Menu Functions //Search Menu Functions
function search_menu(){ function search_menu(){
$('[data-search]').on('keyup', function() { $('[data-search]').on('keyup', function() {
@@ -387,15 +387,15 @@ $(document).ready(function(){
//Owl Carousel Sliders //Owl Carousel Sliders
setTimeout(function(){ setTimeout(function(){
$('.user-slider').owlCarousel({loop:false, margin:20, nav:false, lazyLoad:true, items:1, autoplay: false, dots:false, autoplayTimeout:4000}); $('.user-slider').owlCarousel({loop:false, margin:20, nav:false, lazyLoad:true, items:1, autoplay: false, dots:false, autoplayTimeout:4000});
$('.single-slider').owlCarousel({loop:true, margin:20, nav:false, lazyLoad:true, items:1, autoplay: true, autoplayTimeout:4000}); $('.single-slider').owlCarousel({loop:true, margin:20, nav:false, lazyLoad:true, items:1, autoplay: true, autoplayTimeout:4000});
$('.cover-slider').owlCarousel({loop:true, margin:0, nav:false, lazyLoad:true, items:1, autoplay: true, autoplayTimeout:6000}); $('.cover-slider').owlCarousel({loop:true, margin:0, nav:false, lazyLoad:true, items:1, autoplay: true, autoplayTimeout:6000});
$('.double-slider').owlCarousel({loop:true, margin:20, nav:false, lazyLoad:false, items:2, autoplay: true, autoplayTimeout:4000}); $('.double-slider').owlCarousel({loop:true, margin:20, nav:false, lazyLoad:false, items:2, autoplay: true, autoplayTimeout:4000});
$('.task-slider').owlCarousel({loop:true, margin:20, nav:false, stagePadding:50, lazyLoad:true, items:2, autoplay: false, autoplayTimeout:4000}); $('.task-slider').owlCarousel({loop:true, margin:20, nav:false, stagePadding:50, lazyLoad:true, items:2, autoplay: false, autoplayTimeout:4000});
$('.next-slide, .next-slide-arrow, .next-slide-text, .cover-next').on('click',function(){$(this).parent().find('.owl-carousel').trigger('next.owl.carousel');}); $('.next-slide, .next-slide-arrow, .next-slide-text, .cover-next').on('click',function(){$(this).parent().find('.owl-carousel').trigger('next.owl.carousel');});
$('.prev-slide, .prev-slide-arrow, .prev-slide-text, .cover-prev').on('click',function(){$(this).parent().find('.owl-carousel').trigger('prev.owl.carousel');}); $('.prev-slide, .prev-slide-arrow, .prev-slide-text, .cover-prev').on('click',function(){$(this).parent().find('.owl-carousel').trigger('prev.owl.carousel');});
$('.next-slide-user').on('click',function(){$(this).closest('.owl-carousel').trigger('next.owl.carousel');}); $('.next-slide-user').on('click',function(){$(this).closest('.owl-carousel').trigger('next.owl.carousel');});
$('.prev-slide-user').on('click',function(){$(this).closest('.owl-carousel').trigger('prev.owl.carousel');}); $('.prev-slide-user').on('click',function(){$(this).closest('.owl-carousel').trigger('prev.owl.carousel');});
},10); },10);
setTimeout(function(){ setTimeout(function(){
$('.owl-prev, .owl-next').addClass('bg-highlight'); $('.owl-prev, .owl-next').addClass('bg-highlight');
@@ -428,20 +428,20 @@ $(document).ready(function(){
//Toast, Snackbars and Notifications //Toast, Snackbars and Notifications
$('[data-toast]').on('click',function(){ $('[data-toast]').on('click',function(){
$('.toast, .snackbar-toast, .notification').toast('hide'); $('.toast, .snackbar-toast, .notification').toast('hide');
$('#'+$(this).data('toast')).toast('show'); $('#'+$(this).data('toast')).toast('show');
return false; return false;
}); });
$('[data-dismiss]').on('click',function(){ $('[data-dismiss]').on('click',function(){
var thisData = $(this).data('dismiss'); var thisData = $(this).data('dismiss');
$('#'+thisData).toast('hide'); $('#'+thisData).toast('hide');
}); });
//Tooltips //Tooltips
$(function () { $(function () {
$('[data-toggle="tooltip"]').tooltip() $('[data-toggle="tooltip"]').tooltip()
}) })
//Cancel Collapse Jump on Click //Cancel Collapse Jump on Click
if($('[data-toggle="collapse"]').length){ if($('[data-toggle="collapse"]').length){
$('[data-toggle="collapse"]').on('click',function(e){ $('[data-toggle="collapse"]').on('click',function(e){
@@ -467,10 +467,10 @@ $(document).ready(function(){
$('#'+thisID).prop('checked', false); $('#'+thisID).prop('checked', false);
} else { } else {
$('#'+thisID).prop('checked', true); $('#'+thisID).prop('checked', true);
} }
}) })
//Working Hours //Working Hours
var businessHours = $('.business-hours'); var businessHours = $('.business-hours');
function activate_business_hours(){ function activate_business_hours(){
if(businessHours.length){ if(businessHours.length){
@@ -501,7 +501,7 @@ $(document).ready(function(){
}, },
openClass:"bg-green1-dark is-business-opened", openClass:"bg-green1-dark is-business-opened",
closedClass:"bg-red2-dark is-business-closed" closedClass:"bg-red2-dark is-business-closed"
}); });
if(businessHours.hasClass('is-business-opened')){ if(businessHours.hasClass('is-business-opened')){
$('.show-business-opened').removeClass('disabled'); $('.show-business-opened').removeClass('disabled');
$('.show-business-closed').addClass('disabled'); $('.show-business-closed').addClass('disabled');
@@ -540,7 +540,7 @@ $(document).ready(function(){
})(document, window.navigator, "standalone") })(document, window.navigator, "standalone")
} }
ath(); ath();
//Add to Home Banners //Add to Home Banners
$('.simulate-android-badge').on('click',function(){$('.add-to-home').removeClass('add-to-home-ios').addClass('add-to-home-visible add-to-home-android');}); $('.simulate-android-badge').on('click',function(){$('.add-to-home').removeClass('add-to-home-ios').addClass('add-to-home-visible add-to-home-android');});
$('.simulate-iphone-badge').on('click',function(){$('.add-to-home').removeClass('add-to-home-android').addClass('add-to-home-visible add-to-home-ios');}); $('.simulate-iphone-badge').on('click',function(){$('.add-to-home').removeClass('add-to-home-android').addClass('add-to-home-visible add-to-home-ios');});
@@ -549,16 +549,16 @@ $(document).ready(function(){
$('.simulate-ios-banner').on('click',function(){$('#menu-install-pwa-ios, .menu-hider').addClass('menu-active')}) $('.simulate-ios-banner').on('click',function(){$('#menu-install-pwa-ios, .menu-hider').addClass('menu-active')})
//Extending Card Features //Extending Card Features
function card_extender(){ function card_extender(){
/*Set Page Content to Min 100vh*/ /*Set Page Content to Min 100vh*/
if($('.is-on-homescreen').length){ if($('.is-on-homescreen').length){
var windowHeight = screen.height; var windowHeight = screen.height;
$('.page-content, #page').css('min-height', windowHeight); $('.page-content, #page').css('min-height', windowHeight);
} }
if(!$('.is-on-homescreen').length){ if(!$('.is-on-homescreen').length){
var windowHeight = window.innerHeight var windowHeight = window.innerHeight
$('.page-content, #page').css('min-height', windowHeight); $('.page-content, #page').css('min-height', windowHeight);
} }
$('[data-card-height]').each(function(){ $('[data-card-height]').each(function(){
var cardHeight = $(this).data('card-height'); var cardHeight = $(this).data('card-height');
@@ -567,8 +567,8 @@ $(document).ready(function(){
$(this).css('height', cardHeight); $(this).css('height', cardHeight);
if(cardHeight == "cover"){ if(cardHeight == "cover"){
if(header.length && menuFooter.length){ if(header.length && menuFooter.length){
$(this).css('height', windowHeight -headerHeight - footerHeight) $(this).css('height', windowHeight -headerHeight - footerHeight)
$('.map-full, .map-full iframe').css('height', windowHeight - headerHeight - footerHeight +14) $('.map-full, .map-full iframe').css('height', windowHeight - headerHeight - footerHeight +14)
} else { } else {
$(this).css('height', windowHeight) $(this).css('height', windowHeight)
$('.map-full, .map-full iframe').css('height', windowHeight) $('.map-full, .map-full iframe').css('height', windowHeight)
@@ -581,20 +581,20 @@ $(document).ready(function(){
$(window).resize(function(){ $(window).resize(function(){
card_extender(); card_extender();
}); });
//Show Map //Show Map
$('.show-map, .hide-map').on('click',function(){ $('.show-map, .hide-map').on('click',function(){
$('.map-full .caption').toggleClass('deactivate-map'); $('.map-full .caption').toggleClass('deactivate-map');
$('.map-but-1, .map-but-2').toggleClass('deactivate-map'); $('.map-but-1, .map-but-2').toggleClass('deactivate-map');
$('.map-full .hide-map').toggleClass('activate-map'); $('.map-full .hide-map').toggleClass('activate-map');
}); });
//Card Hovers //Card Hovers
$('.card-scale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-scale-image');}); $('.card-scale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-scale-image');});
$('.card-grayscale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-grayscale-image');}); $('.card-grayscale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-grayscale-image');});
$('.card-rotate').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-rotate-image');}); $('.card-rotate').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-rotate-image');});
$('.card-blur').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-blur-image');}); $('.card-blur').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('card-blur-image');});
$('.card-hide').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('.card-center, .card-bottom, .card-top, .card-overlay').toggleClass('card-hide-image');}); $('.card-hide').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('.card-center, .card-bottom, .card-top, .card-overlay').toggleClass('card-hide-image');});
@@ -605,7 +605,7 @@ $(document).ready(function(){
var readingSeconds = readingWords % 60 var readingSeconds = readingWords % 60
$('.reading-progress-words').append(readingWords); $('.reading-progress-words').append(readingWords);
$('.reading-progress-time').append(readingMinutes + ':' + readingSeconds); $('.reading-progress-time').append(readingMinutes + ':' + readingSeconds);
}); });
//Timed Ads //Timed Ads
if($('[data-auto-show-ad]').length){ if($('[data-auto-show-ad]').length){
@@ -614,7 +614,7 @@ $(document).ready(function(){
$('[data-auto-show-ad]').trigger('click'); $('[data-auto-show-ad]').trigger('click');
},time*1000); },time*1000);
} }
$('[data-timed-ad]').on('click', function(){ $('[data-timed-ad]').on('click', function(){
var counter = $(this).data('timed-ad'); var counter = $(this).data('timed-ad');
var adwin = $('#'+$(this).data('menu')); var adwin = $('#'+$(this).data('menu'));
menuHider.addClass('no-click'); menuHider.addClass('no-click');
@@ -686,10 +686,10 @@ $(document).ready(function(){
}) })
//Caption Hovers //Caption Hovers
$('.caption-scale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-scale-image');}); $('.caption-scale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-scale-image');});
$('.caption-grayscale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-grayscale-image');}); $('.caption-grayscale').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-grayscale-image');});
$('.caption-rotate').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-rotate-image');}); $('.caption-rotate').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-rotate-image');});
$('.caption-blur').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-blur-image');}); $('.caption-blur').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('img').toggleClass('caption-blur-image');});
$('.caption-hide').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('.caption-center, .caption-bottom, .caption-top, .caption-overlay').toggleClass('caption-hide-image');}); $('.caption-hide').unbind().bind('mouseenter mouseleave touchstart touchend',function(){$(this).find('.caption-center, .caption-bottom, .caption-top, .caption-overlay').toggleClass('caption-hide-image');});
//File Upload //File Upload
@@ -733,8 +733,8 @@ $(document).ready(function(){
//Age Verification //Age Verification
var checkAge = $('.check-age'); var checkAge = $('.check-age');
function activate_age_checker(){ function activate_age_checker(){
console.log('active'); log('active');
$(".check-age").on('click',function(){ $(".check-age").on('click',function(){
var dateBirghtDay = $("#date-birth-day").val(); var dateBirghtDay = $("#date-birth-day").val();
var dateBirthMonth = $("#date-birth-month").val(); var dateBirthMonth = $("#date-birth-month").val();
var dateBirthYear = $("#date-birth-year").val(); var dateBirthYear = $("#date-birth-year").val();
@@ -747,7 +747,7 @@ $(document).ready(function(){
setDate.setFullYear(mydate.getFullYear() + age, dateBirthMonth-1, dateBirghtDay); setDate.setFullYear(mydate.getFullYear() + age, dateBirthMonth-1, dateBirghtDay);
if ((currdate - setDate) > 0){ if ((currdate - setDate) > 0){
console.log("above 18"); log("above 18");
$('#menu-age').removeClass('menu-active') $('#menu-age').removeClass('menu-active')
$('#menu-age-okay').addClass('menu-active'); $('#menu-age-okay').addClass('menu-active');
}else{ }else{
@@ -756,7 +756,7 @@ $(document).ready(function(){
} }
return true; return true;
}); });
} }
if(checkAge.length){activate_age_checker();} if(checkAge.length){activate_age_checker();}
@@ -816,11 +816,11 @@ $(document).ready(function(){
var spanValue = $(this).parent().find('span').text(); var spanValue = $(this).parent().find('span').text();
if($(this).val() != spanValue && $(this).val() != ""){ if($(this).val() != spanValue && $(this).val() != ""){
$(this).parent().find('span').addClass('input-style-1-active').removeClass('input-style-1-inactive'); $(this).parent().find('span').addClass('input-style-1-active').removeClass('input-style-1-inactive');
} }
if($(this).val() === ""){ if($(this).val() === ""){
$(this).parent().find('span').removeClass('input-style-1-inactive input-style-1-active'); $(this).parent().find('span').removeClass('input-style-1-inactive input-style-1-active');
} }
}); });
$('.input-required input, .input-required select, .input-required textarea').on('focusout',function(){ $('.input-required input, .input-required select, .input-required textarea').on('focusout',function(){
var spanValue = $(this).parent().find('span').text(); var spanValue = $(this).parent().find('span').text();
if($(this).val() === ""){ if($(this).val() === ""){
@@ -833,17 +833,17 @@ $(document).ready(function(){
if(getValue === "default"){ if(getValue === "default"){
$(this).parent().find('em').html(invalidIcon) $(this).parent().find('em').html(invalidIcon)
$(this).parent().find('span').removeClass('input-style-1-inactive input-style-1-active'); $(this).parent().find('span').removeClass('input-style-1-inactive input-style-1-active');
} }
if(getValue != "default"){ if(getValue != "default"){
$(this).parent().find('em').html(validIcon) $(this).parent().find('em').html(validIcon)
} }
}); });
$('.input-required input[type="email"]').on('focusout',function(){if (emailValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}}); $('.input-required input[type="email"]').on('focusout',function(){if (emailValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}});
$('.input-required input[type="tel"]').on('focusout',function(){if (phoneValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}}); $('.input-required input[type="tel"]').on('focusout',function(){if (phoneValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}});
$('.input-required input[type="password"]').on('focusout',function(){if (passwordValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}}); $('.input-required input[type="password"]').on('focusout',function(){if (passwordValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}});
$('.input-required input[type="url"]').on('focusout',function(){if (urlValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}}); $('.input-required input[type="url"]').on('focusout',function(){if (urlValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}});
$('.input-required input[type="name"]').on('focusout',function(){if (nameValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}}); $('.input-required input[type="name"]').on('focusout',function(){if (nameValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}});
$('.input-required textarea').on('focusout',function(){if (textareaValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}}); $('.input-required textarea').on('focusout',function(){if (textareaValidator.test($(this).val())){$(this).parent().find('em').html(validIcon);}else{if($(this).val() === ""){$(this).parent().find('em').html("(required)");}else{$(this).parent().find('em').html(invalidIcon);}}});
//Set Today Date to Date Inputs //Set Today Date to Date Inputs
Date.prototype.toDateInputValue = (function() { Date.prototype.toDateInputValue = (function() {
@@ -880,7 +880,7 @@ $(document).ready(function(){
$('.online-message').addClass('online-message-active'); $('.online-message').addClass('online-message-active');
$('.offline-message').removeClass('offline-message-active'); $('.offline-message').removeClass('offline-message-active');
setTimeout(function(){$('.online-message').removeClass('online-message-active');},2000); setTimeout(function(){$('.online-message').removeClass('online-message-active');},2000);
} }
$('.simulate-offline').on('click',function(){isOffline();}) $('.simulate-offline').on('click',function(){isOffline();})
$('.simulate-online').on('click',function(){isOnline();}) $('.simulate-online').on('click',function(){isOnline();})
@@ -889,11 +889,11 @@ $(document).ready(function(){
function updateOnlineStatus(event) { function updateOnlineStatus(event) {
var condition = navigator.onLine ? "online" : "offline"; var condition = navigator.onLine ? "online" : "offline";
isOnline(); isOnline();
console.log( 'Connection: Online'); log( 'Connection: Online');
} }
function updateOfflineStatus(event) { function updateOfflineStatus(event) {
isOffline(); isOffline();
console.log( 'Connection: Offline'); log( 'Connection: Offline');
} }
window.addEventListener('online', updateOnlineStatus); window.addEventListener('online', updateOnlineStatus);
window.addEventListener('offline', updateOfflineStatus); window.addEventListener('offline', updateOfflineStatus);
@@ -901,14 +901,14 @@ $(document).ready(function(){
//QR Generator //QR Generator
var generateQR = $('.generate-qr-result, .generate-qr-auto'); var generateQR = $('.generate-qr-result, .generate-qr-auto');
function activate_qr_generator(){ function activate_qr_generator(){
//QR Code Generator //QR Code Generator
var qr_auto_link = window.location.href; var qr_auto_link = window.location.href;
var qr_api_address = 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data='; var qr_api_address = 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=';
$('.generate-qr-auto').attr('src', qr_api_address+qr_auto_link) $('.generate-qr-auto').attr('src', qr_api_address+qr_auto_link)
$('.generate-qr-button').on('click',function(){ $('.generate-qr-button').on('click',function(){
if($(this).parent().find('.fa').hasClass('fa-exclamation-triangle')){ if($(this).parent().find('.fa').hasClass('fa-exclamation-triangle')){
console.log('Invalid URL'); log('Invalid URL');
} else { } else {
var get_qr_url = $('.generate-qr-input').val(); var get_qr_url = $('.generate-qr-input').val();
if(!get_qr_url == ''){ if(!get_qr_url == ''){
@@ -960,10 +960,10 @@ $(document).ready(function(){
}); });
//Filterable //Filterable
if($('.gallery-filter').length > 0){$('.gallery-filter').filterizr(); $('.gallery-filter-active').addClass('color-highlight');} if($('.gallery-filter').length > 0){$('.gallery-filter').filterizr(); $('.gallery-filter-active').addClass('color-highlight');}
$('.gallery-filter-controls li').on('click',function(){ $('.gallery-filter-controls li').on('click',function(){
$('.gallery-filter-controls li').removeClass('gallery-filter-active color-highlight'); $('.gallery-filter-controls li').removeClass('gallery-filter-active color-highlight');
$(this).addClass('gallery-filter-active color-highlight'); $(this).addClass('gallery-filter-active color-highlight');
}); });
//Gallery Views // Added in 2.0 //Gallery Views // Added in 2.0
@@ -982,7 +982,7 @@ $(document).ready(function(){
galleryViewControls.removeClass('color-highlight'); galleryViewControls.removeClass('color-highlight');
$(this).addClass('color-highlight'); $(this).addClass('color-highlight');
galleryViews.removeClass().addClass('gallery-views gallery-view-2'); galleryViews.removeClass().addClass('gallery-views gallery-view-2');
}); });
galleryView3.on('click',function(){ galleryView3.on('click',function(){
galleryViewControls.removeClass('color-highlight'); galleryViewControls.removeClass('color-highlight');
$(this).addClass('color-highlight'); $(this).addClass('color-highlight');
@@ -1064,7 +1064,7 @@ $(document).ready(function(){
}) })
}); });
//Charts //Charts
if($('.chart').length > 0){ if($('.chart').length > 0){
var loadJS = function(url, implementationCode, location){ var loadJS = function(url, implementationCode, location){
@@ -1075,7 +1075,7 @@ $(document).ready(function(){
location.appendChild(scriptTag); location.appendChild(scriptTag);
}; };
var call_charts_to_page = function(){ var call_charts_to_page = function(){
var walletChart = $('#wallet-chart'); var walletChart = $('#wallet-chart');
var pieChart = $('#pie-chart'); var pieChart = $('#pie-chart');
var doughnutChart = $('#doughnut-chart'); var doughnutChart = $('#doughnut-chart');
@@ -1100,9 +1100,9 @@ $(document).ready(function(){
legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},}, legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},},
tooltips:{enabled:true}, animation:{duration:1500} tooltips:{enabled:true}, animation:{duration:1500}
} }
}); });
} }
if(pieChart.length){ if(pieChart.length){
var pieDemoChart = new Chart(pieChart, { var pieDemoChart = new Chart(pieChart, {
type: 'pie', type: 'pie',
@@ -1119,7 +1119,7 @@ $(document).ready(function(){
legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},}, legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},},
tooltips:{enabled:true}, animation:{duration:1500} tooltips:{enabled:true}, animation:{duration:1500}
} }
}); });
} }
if(doughnutChart.length){ if(doughnutChart.length){
@@ -1138,7 +1138,7 @@ $(document).ready(function(){
legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},}, legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},},
tooltips:{enabled:true}, animation:{duration:1500}, layout:{ padding: {bottom: 30}} tooltips:{enabled:true}, animation:{duration:1500}, layout:{ padding: {bottom: 30}}
} }
}); });
} }
if(polarChart.length){ if(polarChart.length){
@@ -1157,7 +1157,7 @@ $(document).ready(function(){
legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},}, legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},},
tooltips:{enabled:true}, animation:{duration:1500}, layout:{ padding: {bottom: 30}} tooltips:{enabled:true}, animation:{duration:1500}, layout:{ padding: {bottom: 30}}
} }
}); });
} }
if (verticalChart.length){ if (verticalChart.length){
@@ -1182,7 +1182,7 @@ $(document).ready(function(){
legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},}, legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},},
title: {display: false} title: {display: false}
} }
}); });
} }
if(horizontalChart.length){ if(horizontalChart.length){
@@ -1206,7 +1206,7 @@ $(document).ready(function(){
legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},}, legend: {display: true, position:'bottom', labels:{fontSize:13, padding:15,boxWidth:12},},
title: {display: false} title: {display: false}
} }
}); });
} }
if(lineChart.length){ if(lineChart.length){
@@ -1214,11 +1214,11 @@ $(document).ready(function(){
type: 'line', type: 'line',
data: { data: {
labels: [2000,2005,2010,2015,2010], labels: [2000,2005,2010,2015,2010],
datasets: [{ datasets: [{
data: [500,400,300,200,300], data: [500,400,300,200,300],
label: "Desktop Web", label: "Desktop Web",
borderColor: "#D8334A" borderColor: "#D8334A"
}, { }, {
data: [0,100,300,400,500], data: [0,100,300,400,500],
label: "Mobile Web", label: "Mobile Web",
borderColor: "#4A89DC" borderColor: "#4A89DC"
@@ -1234,11 +1234,11 @@ $(document).ready(function(){
} }
} }
loadJS('<?php echo SERVER_ADDR; ?>/client/scripts/charts.js', call_charts_to_page, document.body); loadJS('<?php echo SERVER_ADDR; ?>/client/scripts/charts.js', call_charts_to_page, document.body);
} }
//Local Error Message //Local Error Message
if (window.location.protocol === "file:"){$('a').on('mouseover',function(){console.log("You are seeing these errors because your file is on your local computer. For real life simulations please use a Live Server or a Local Server such as AMPPS or WAMPP or simulate a Live Preview using a Code Editor like http://brackets.io (it's 100% free) - PWA functions and AJAX Page Transitions will only work in these scenarios.");});} if (window.location.protocol === "file:"){$('a').on('mouseover',function(){log("You are seeing these errors because your file is on your local computer. For real life simulations please use a Live Server or a Local Server such as AMPPS or WAMPP or simulate a Live Preview using a Code Editor like http://brackets.io (it's 100% free) - PWA functions and AJAX Page Transitions will only work in these scenarios.");});}
//Style Generator //Style Generator
@@ -1248,21 +1248,21 @@ $(document).ready(function(){
//HEX to RGBA Converter //HEX to RGBA Converter
function HEXtoRGBA(hex){ function HEXtoRGBA(hex){
var c; var c;
if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){ if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){
c= hex.substring(1).split(''); c= hex.substring(1).split('');
if(c.length== 3){c= [c[0], c[0], c[1], c[1], c[2], c[2]];} if(c.length== 3){c= [c[0], c[0], c[1], c[1], c[2], c[2]];}
c= '0x'+c.join(''); c= '0x'+c.join('');
return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+',0.3)'; return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+',0.3)';
} }
} }
function highlight_colors(){ function highlight_colors(){
var bodyColor = readCookie('sticky-color-scheme') var bodyColor = readCookie('sticky-color-scheme')
if(bodyColor == undefined){var bodyColor = $('body').data('highlight');} if(bodyColor == undefined){var bodyColor = $('body').data('highlight');}
var bodyBackground = readCookie('sticky-bg-scheme') var bodyBackground = readCookie('sticky-bg-scheme')
if(bodyBackground == undefined){var bodyBackground = $('body').data('background');} if(bodyBackground == undefined){var bodyBackground = $('body').data('background');}
var data = colorsArray.map(colorsArray => colorsArray[0]); var data = colorsArray.map(colorsArray => colorsArray[0]);
if (data.indexOf(bodyColor) > -1) { if (data.indexOf(bodyColor) > -1) {
var highlightLocated = data.indexOf(bodyColor) var highlightLocated = data.indexOf(bodyColor)
@@ -1282,7 +1282,7 @@ $(document).ready(function(){
$('.generated-background').append(bodyBG); $('.generated-background').append(bodyBG);
} }
} }
} }
highlight_colors(); highlight_colors();
//Change Highlight //Change Highlight
@@ -1306,7 +1306,7 @@ $(document).ready(function(){
$('body').append('<style class="generated-highlight"></style>') $('body').append('<style class="generated-highlight"></style>')
$('.generated-highlight').append(highlightColor, highlightBg, highlightNav, highlightBorder); $('.generated-highlight').append(highlightColor, highlightBg, highlightNav, highlightBorder);
} }
}); });
//Change Background //Change Background
$('[data-change-background]').on('click',function(changeColor){ $('[data-change-background]').on('click',function(changeColor){
@@ -1322,15 +1322,15 @@ $(document).ready(function(){
}); });
if (!generatedStyles.length){ if (!generatedStyles.length){
$('body').append('<style class="generated-styles"></style>'); $('body').append('<style class="generated-styles"></style>');
$('.generated-styles').append('/*Generated using JS for lower CSS file Size, Easier Editing & Faster Loading*/'); $('.generated-styles').append('/*Generated using JS for lower CSS file Size, Easier Editing & Faster Loading*/');
colorsArray.forEach(function (colorValue) {$('.generated-styles').append('.bg-'+colorValue[0]+'-light{ background-color: '+colorValue[1]+'!important; color:#FFFFFF!important;} .bg-'+colorValue[0]+'-light i, .bg-'+colorValue[0]+'-dark i{color:#FFFFFF;} .bg-'+colorValue[0]+'-dark{ background-color: '+colorValue[2]+'!important; color:#FFFFFF!important;} .border-'+colorValue[0]+'-light{ border-color:'+colorValue[1]+'!important;} .border-'+colorValue[0]+'-dark{ border-color:'+colorValue[2]+'!important;} .color-'+colorValue[0]+'-light{ color: '+colorValue[1]+'!important;} .color-'+colorValue[0]+'-dark{ color: '+colorValue[2]+'!important;}');}); colorsArray.forEach(function (colorValue) {$('.generated-styles').append('.bg-'+colorValue[0]+'-light{ background-color: '+colorValue[1]+'!important; color:#FFFFFF!important;} .bg-'+colorValue[0]+'-light i, .bg-'+colorValue[0]+'-dark i{color:#FFFFFF;} .bg-'+colorValue[0]+'-dark{ background-color: '+colorValue[2]+'!important; color:#FFFFFF!important;} .border-'+colorValue[0]+'-light{ border-color:'+colorValue[1]+'!important;} .border-'+colorValue[0]+'-dark{ border-color:'+colorValue[2]+'!important;} .color-'+colorValue[0]+'-light{ color: '+colorValue[1]+'!important;} .color-'+colorValue[0]+'-dark{ color: '+colorValue[2]+'!important;}');});
colorsArray.forEach(function (colorFadeValue) {$('.generated-styles').append('.bg-fade-'+colorFadeValue[0]+'-light{ background-color: '+ HEXtoRGBA(colorFadeValue[1]) + '!important; color:#FFFFFF;} .bg-fade-'+colorFadeValue[0]+'-light i, .bg-'+colorFadeValue[0]+'-dark i{color:#FFFFFF;} .bg-fade-'+colorFadeValue[0]+'-dark{ background-color: '+HEXtoRGBA(colorFadeValue[2])+'!important; color:#FFFFFF;} .border-fade-'+colorFadeValue[0]+'-light{ border-color:'+HEXtoRGBA(colorFadeValue[1])+'!important;} .border-fade-'+colorFadeValue[0]+'-dark{ border-color:'+HEXtoRGBA(colorFadeValue[2])+'!important;} .color-fade-'+colorFadeValue[0]+'-light{ color: '+HEXtoRGBA(colorFadeValue[1])+'!important;} .color-fade-'+colorFadeValue[0]+'-dark{ color: '+HEXtoRGBA(colorFadeValue[2])+'!important;}');}); colorsArray.forEach(function (colorFadeValue) {$('.generated-styles').append('.bg-fade-'+colorFadeValue[0]+'-light{ background-color: '+ HEXtoRGBA(colorFadeValue[1]) + '!important; color:#FFFFFF;} .bg-fade-'+colorFadeValue[0]+'-light i, .bg-'+colorFadeValue[0]+'-dark i{color:#FFFFFF;} .bg-fade-'+colorFadeValue[0]+'-dark{ background-color: '+HEXtoRGBA(colorFadeValue[2])+'!important; color:#FFFFFF;} .border-fade-'+colorFadeValue[0]+'-light{ border-color:'+HEXtoRGBA(colorFadeValue[1])+'!important;} .border-fade-'+colorFadeValue[0]+'-dark{ border-color:'+HEXtoRGBA(colorFadeValue[2])+'!important;} .color-fade-'+colorFadeValue[0]+'-light{ color: '+HEXtoRGBA(colorFadeValue[1])+'!important;} .color-fade-'+colorFadeValue[0]+'-dark{ color: '+HEXtoRGBA(colorFadeValue[2])+'!important;}');});
colorsArray.forEach(function (gradientValue) {$('.generated-styles').append('.bg-gradient-'+gradientValue[0]+'{background-image: linear-gradient(to bottom, '+gradientValue[1]+' 0, '+gradientValue[2]+' 100%)}')}); colorsArray.forEach(function (gradientValue) {$('.generated-styles').append('.bg-gradient-'+gradientValue[0]+'{background-image: linear-gradient(to bottom, '+gradientValue[1]+' 0, '+gradientValue[2]+' 100%)}')});
socialColorArray.forEach(function (socialColorValue) {$('.generated-styles').append('.bg-'+socialColorValue[0]+'{background-color:'+socialColorValue[1]+'!important; color:#FFFFFF;} .color-'+socialColorValue[0]+'{color:'+socialColorValue[1]+'!important;}')}); socialColorArray.forEach(function (socialColorValue) {$('.generated-styles').append('.bg-'+socialColorValue[0]+'{background-color:'+socialColorValue[1]+'!important; color:#FFFFFF;} .color-'+socialColorValue[0]+'{color:'+socialColorValue[1]+'!important;}')});
colorsArray.forEach(function (gradientBodyValue) {$('.generated-styles').append('.body-'+gradientBodyValue[0]+'{background-image: linear-gradient(to bottom, '+gradientBodyValue[1]+' 0, '+gradientBodyValue[3]+' 100%)}')}); colorsArray.forEach(function (gradientBodyValue) {$('.generated-styles').append('.body-'+gradientBodyValue[0]+'{background-image: linear-gradient(to bottom, '+gradientBodyValue[1]+' 0, '+gradientBodyValue[3]+' 100%)}')});
} }
function welcomeOk() { function welcomeOk() {
createCookie('sticky_welcome_banner', true, 1); createCookie('sticky_welcome_banner', true, 1);
$('#menu-welcome').hideMenu(); $('#menu-welcome').hideMenu();
@@ -1344,16 +1344,16 @@ $(document).ready(function(){
} }
$('#menu-welcome-a-okay').click(welcomeOk); $('#menu-welcome-a-okay').click(welcomeOk);
showWelcome(); showWelcome();
initRegatten(); initRegatten();
hideLoader(); hideLoader();
} }
//Activating all the plugins //Activating all the plugins
setTimeout(init_template, 0); setTimeout(init_template, 0);
//Activate AJAX Transitions //Activate AJAX Transitions
if(isAJAX === true){ if(isAJAX === true){
$(function(){ $(function(){
'use strict'; 'use strict';
@@ -1361,7 +1361,7 @@ $(document).ready(function(){
prefetch: true, prefetch: true,
prefetchOn: 'mouseover', prefetchOn: 'mouseover',
cacheLength: 100, cacheLength: 100,
scroll: true, scroll: true,
blacklist: '.default-link', blacklist: '.default-link',
forms: 'contactForm', forms: 'contactForm',
onStart: { onStart: {
@@ -1378,7 +1378,7 @@ $(document).ready(function(){
render: function ($container, $newContent) { render: function ($container, $newContent) {
$container.removeClass('is-exiting');// Remove your CSS animation reversing class $container.removeClass('is-exiting');// Remove your CSS animation reversing class
$container.html($newContent);// Inject the new content $container.html($newContent);// Inject the new content
setTimeout(init_template, 0)//Timeout required to properly initiate all JS Functions. setTimeout(init_template, 0)//Timeout required to properly initiate all JS Functions.
$('#preloader').removeClass('preloader-hide'); $('#preloader').removeClass('preloader-hide');
} }
}, },
@@ -1406,5 +1406,5 @@ $(document).ready(function(){
caches.delete(cacheName); caches.delete(cacheName);
}); });
}); });
} }
}); });

View File

@@ -1,4 +1,4 @@
const DB_VERSION = 4; const DB_VERSION = 6;
const USER_ID = localStorage.getItem('auth_user'); const USER_ID = localStorage.getItem('auth_user');
const USER_NAME = localStorage.getItem('auth_username'); const USER_NAME = localStorage.getItem('auth_username');
@@ -20,11 +20,11 @@ var getJSON = function(url, callback) {
callback(xhr.status, xhr.response); callback(xhr.status, xhr.response);
}; };
xhr.ontimeout = function () { xhr.ontimeout = function () {
console.log("getJSON: timeout"); log("getJSON: timeout");
callback(0, null); callback(0, null);
} }
xhr.onerror = function () { xhr.onerror = function () {
console.log("getJSON: error"); log("getJSON: error");
callback(0, null); callback(0, null);
} }
if (USER_ID != null) { if (USER_ID != null) {
@@ -76,7 +76,7 @@ function dbGetData(table, id = null) {
if (code == 200) { if (code == 200) {
resolve(data.data); resolve(data.data);
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
fail(strings.error_network, 5000); fail(strings.error_network, 5000);
resolve([]); resolve([]);
} }
@@ -86,7 +86,7 @@ function dbGetData(table, id = null) {
if (code == 200) { if (code == 200) {
resolve(data.data); resolve(data.data);
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
fail(strings.error_network, 5000); fail(strings.error_network, 5000);
resolve(null); resolve(null);
} }
@@ -108,7 +108,7 @@ function dbGetDataIndex(table, indexName, value) {
if (code == 200) { if (code == 200) {
resolve(data.data); resolve(data.data);
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
fail(strings.error_network, 5000); fail(strings.error_network, 5000);
resolve([]); resolve([]);
} }
@@ -161,19 +161,19 @@ function dbGetResultCalculated(regatta) {
return new Promise(async function(resolve) { return new Promise(async function(resolve) {
var results = await dbGetDataIndex('results', 'regatta', regatta.id); var results = await dbGetDataIndex('results', 'regatta', regatta.id);
if (results.length > 0) { if (results.length > 0) {
var gemeldet = results.length; var gemeldet = results.length;
for (id in results) { for (id in results) {
results[id]['finished'] = false; results[id]['finished'] = false;
results[id]['values'] = []; results[id]['values'] = [];
results[id]['values_all'] = []; results[id]['values_all'] = [];
results[id]['texts'] = []; results[id]['texts'] = [];
var copy = []; var copy = [];
for (var i = 0; i < regatta['races']; i ++) { for (var i = 0; i < regatta['races']; i ++) {
var race = results[id]['race' + (i + 1)].replace(',', '.'); var race = results[id]['race' + (i + 1)].replace(',', '.');
if (!isNaN(race)) { if (!isNaN(race)) {
copy[i] = results[id]['values'][i] = parseFloat(race); copy[i] = results[id]['values'][i] = parseFloat(race);
results[id]['texts'][i] = race; results[id]['texts'][i] = race;
@@ -198,7 +198,7 @@ function dbGetResultCalculated(regatta) {
// Unbekannt // Unbekannt
default: results[id]['values'][i] = 0; copy[i] = 0; break; default: results[id]['values'][i] = 0; copy[i] = 0; break;
} }
if (results[id]['values'][i] != 0) { if (results[id]['values'][i] != 0) {
results[id]['texts'][i] = race + ' (' + results[id]['values'][i] + ')'; results[id]['texts'][i] = race + ' (' + results[id]['values'][i] + ')';
} else { } else {
@@ -206,7 +206,7 @@ function dbGetResultCalculated(regatta) {
} }
} }
} }
results[id]['values_all'] = [...results[id]['values']]; results[id]['values_all'] = [...results[id]['values']];
for (var s = 0; s < regatta['streicher']; s ++) { for (var s = 0; s < regatta['streicher']; s ++) {
var max = Math.max(...copy); var max = Math.max(...copy);
@@ -217,7 +217,7 @@ function dbGetResultCalculated(regatta) {
} }
} }
} }
var brutto = 0; var brutto = 0;
var netto = 0; var netto = 0;
for (var i = 0; i < regatta['races']; i ++) { for (var i = 0; i < regatta['races']; i ++) {
@@ -233,11 +233,11 @@ function dbGetResultCalculated(regatta) {
results[id]['brutto'] = brutto; results[id]['brutto'] = brutto;
results[id]['netto'] = netto; results[id]['netto'] = netto;
} }
compareResultsRaceCount = regatta['races']; compareResultsRaceCount = regatta['races'];
results.sort(compareResults); results.sort(compareResults);
var place = 1; var place = 1;
for (id in results) { for (id in results) {
if ((id > 0) && (compareResults(results[id], results[id - 1]) == 0)) { if ((id > 0) && (compareResults(results[id], results[id - 1]) == 0)) {
@@ -247,9 +247,9 @@ function dbGetResultCalculated(regatta) {
} }
place ++; place ++;
} }
resolve(results); resolve(results);
} else { } else {
resolve([]); resolve([]);
} }
@@ -259,26 +259,26 @@ function dbGetResultCalculated(regatta) {
function dbGetRanking(minDate, maxDate, jugend, jugstrict) { function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
return new Promise(async function(resolve) { return new Promise(async function(resolve) {
var rankNoResults = []; var rankNoResults = [];
var sailors = await dbGetData('sailors'); var sailors = await dbGetData('sailors');
var regattas = await dbGetRegattasRange(minDate, maxDate); var regattas = await dbGetRegattasRange(minDate, maxDate);
var sailorIds = {}; var sailorIds = {};
for (s in sailors) { for (s in sailors) {
sailorIds[sailors[s].id] = s; sailorIds[sailors[s].id] = s;
} }
for (var i in sailors) { for (var i in sailors) {
sailors[i].regattas = {}; sailors[i].regattas = {};
sailors[i].tmp_rlp = []; sailors[i].tmp_rlp = [];
} }
for (var i in regattas) { for (var i in regattas) {
var regatta = regattas[i]; var regatta = regattas[i];
// regatta has to be min. 2 days to be ranking regatta // regatta has to be min. 2 days to be ranking regatta
if (regatta.length < 2) continue; if (regatta.length < 2) continue;
var results = await dbGetDataIndex('results', 'regatta', regatta.id); var results = await dbGetDataIndex('results', 'regatta', regatta.id);
if (results.length <= 0) { if (results.length <= 0) {
if (regatta.dateTo <= getToday()) { if (regatta.dateTo <= getToday()) {
@@ -288,7 +288,7 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
continue; continue;
} }
// in one race there must be at least 10 boats started // in one race there must be at least 10 boats started
var ok = false; var ok = false;
for (var j = 1; j <= regatta.races; j ++) { for (var j = 1; j <= regatta.races; j ++) {
@@ -304,9 +304,9 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
} }
if (!ok) continue; if (!ok) continue;
var fb = regatta.finishedBoats; var fb = regatta.finishedBoats;
// calc m // calc m
var m; var m;
if (regatta.m > 0) { if (regatta.m > 0) {
@@ -320,16 +320,16 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
m = 4; m = 4;
} }
} }
// add regatta to each sailor // add regatta to each sailor
for (var r in results) { for (var r in results) {
var result = results[r]; var result = results[r];
if (result.rlp == 0) continue; if (result.rlp == 0) continue;
// check if crew is youth // check if crew is youth
// TODO: not used // TODO: not used
sailors[sailorIds[result.steuermann]].regattas[regatta.id] = { sailors[sailorIds[result.steuermann]].regattas[regatta.id] = {
regatta: regatta.id, regatta: regatta.id,
boat: result.boat, boat: result.boat,
@@ -345,7 +345,7 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
} }
} }
// remove not german or not youth sailors // remove not german or not youth sailors
for (var i = sailors.length - 1; i >= 0; i --) { for (var i = sailors.length - 1; i >= 0; i --) {
if (sailors[i].german == '0') { if (sailors[i].german == '0') {
@@ -357,13 +357,13 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
} }
} }
for (var i = sailors.length - 1; i >= 0; i --) { for (var i = sailors.length - 1; i >= 0; i --) {
// sort rlps desc // sort rlps desc
sailors[i].tmp_rlp.sort(function (a,b) { sailors[i].tmp_rlp.sort(function (a,b) {
return b[1] - a[1]; return b[1] - a[1];
}); });
// calc mean rlp // calc mean rlp
var sum = 0; var sum = 0;
var cnt = 0; var cnt = 0;
@@ -383,20 +383,40 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
sailors.splice(i, 1); sailors.splice(i, 1);
} }
} }
sailors.sort(function (a,b) { sailors.sort(function (a,b) {
if (a.m != b.m) return b.m - a.m; if (a.m != b.m) return b.m - a.m;
return b.rlp - a.rlp; return b.rlp - a.rlp;
}); });
for (var i = 0; i < sailors.length; i ++) { for (var i = 0; i < sailors.length; i ++) {
sailors[i].rank = (i + 1); sailors[i].rank = (i + 1);
} }
resolve([sailors, rankNoResults]); resolve([sailors, rankNoResults]);
}); });
} }
function dbSettingsGet(key) {
return new Promise(function(resolve) {
if (canUseLocalDB) {
var request = db.transaction('settings').objectStore('settings').get(key);
request.onsuccess = function (event) {
resolve(typeof request.result != 'undefined' ? request.result.value : null);
}
} else {
resolve(null);
}
});
}
function dbSettingsSet(key, value) {
if (canUseLocalDB) {
var os = db.transaction('settings', 'readwrite').objectStore('settings');
os.put({ key: key, value: value});
}
}
async function updateSyncStatus() { // TODO async function updateSyncStatus() { // TODO
// var syncStatus = document.getElementById('syncstatus'); // var syncStatus = document.getElementById('syncstatus');
// var lastSync = await dbGetData('update_times', 'last_sync'); // var lastSync = await dbGetData('update_times', 'last_sync');
@@ -404,7 +424,7 @@ async function updateSyncStatus() { // TODO
// var now = new Date(); // var now = new Date();
// var diff = Math.round((now - lastSync) / 1000); // var diff = Math.round((now - lastSync) / 1000);
// var txt = ''; // var txt = '';
// //
// if (diff < 30) { // 30 sec // if (diff < 30) { // 30 sec
// txt = 'jetzt'; // txt = 'jetzt';
// } else if (diff < 3600) { // 60 min // } else if (diff < 3600) { // 60 min
@@ -417,7 +437,7 @@ async function updateSyncStatus() { // TODO
// diff = Math.round(diff / 86400); // diff = Math.round(diff / 86400);
// txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Tag' : 'Tagen'); // txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Tag' : 'Tagen');
// } // }
// //
// var btn = '<a href="#" onclick="setLoading(true); sync(); return false;"><i class="fas fa-sync"></i> Sync</a>'; // var btn = '<a href="#" onclick="setLoading(true); sync(); return false;"><i class="fas fa-sync"></i> Sync</a>';
// syncStatus.innerHTML = 'Zuletzt aktualisiert: ' + txt + btn; // syncStatus.innerHTML = 'Zuletzt aktualisiert: ' + txt + btn;
} }
@@ -433,6 +453,12 @@ async function runPageScript() {
} }
}; };
updateSyncStatus(); updateSyncStatus();
if (isLoggedIn()) {
var plannings = await dbGetDataIndex('plannings', 'user', USER_ID);
plannings = plannings.map(function (e) { return e.regatta; });
dbSettingsSet('myregattas_' + BOATCLASS, plannings);
}
} }
if (typeof updateSyncStatusTimer == 'undefined') { // TODO if (typeof updateSyncStatusTimer == 'undefined') { // TODO
// var syncStatus = document.getElementById('syncstatus'); // var syncStatus = document.getElementById('syncstatus');
@@ -445,7 +471,7 @@ async function runPageScript() {
} }
// syncStatus.style.display = 'block'; // syncStatus.style.display = 'block';
} }
if (typeof siteScript === 'function') { if (typeof siteScript === 'function') {
siteScript(); siteScript();
} else { } else {
@@ -456,20 +482,20 @@ async function runPageScript() {
function sync() { function sync() {
if (!canUseLocalDB) return false; if (!canUseLocalDB) return false;
if (syncInProgress > 0) return false; if (syncInProgress > 0) return false;
var now = Math.floor(Date.now() / 1000); var now = Math.floor(Date.now() / 1000);
db.transaction('update_times').objectStore('update_times').getAll().onsuccess = function (event) { db.transaction('update_times').objectStore('update_times').getAll().onsuccess = function (event) {
var localTimes = {}; var localTimes = {};
event.target.result.forEach(function (entry) { event.target.result.forEach(function (entry) {
localTimes[entry['table']] = entry['time']; localTimes[entry['table']] = entry['time'];
}); });
syncInProgress = 10; syncInProgress = 11;
var syncOkay = true; var syncOkay = true;
console.log("Sync Start"); log("Sync Start");
$('#i-sync').addClass('fa-spin'); $('#i-sync').addClass('fa-spin');
var interval = window.setInterval(function () { var interval = window.setInterval(function () {
if (syncInProgress <= 0) { if (syncInProgress <= 0) {
window.clearInterval(interval); window.clearInterval(interval);
@@ -477,24 +503,27 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'last_sync', time: now }); osUpdateTimes.put({ table: 'last_sync', time: now });
} }
console.log("Sync Stop"); log("Sync Stop");
setTimeout(function(){ setTimeout(function(){
$('#i-sync').removeClass('fa-spin'); $('#i-sync').removeClass('fa-spin');
}, 500); }, 500);
if (typeof onAfterSync === 'function') {
onAfterSync();
}
removeSyncInfoToPreloader();
runPageScript(); runPageScript();
} }
}, 100); }, 100);
getJSON(QUERY_URL + 'get_update_time', function (code, serverTimes) { getJSON(QUERY_URL + 'get_update_time', function (code, serverTimes) {
if (code == 200) { if (code == 200) {
// CLUBS // CLUBS
if (localTimes['clubs'] < serverTimes['clubs']) { if (localTimes['clubs'] < serverTimes['clubs']) {
getJSON(QUERY_URL + 'get_clubs?changed-after=' + localTimes['clubs'], function (code, data) { getJSON(QUERY_URL + 'get_clubs?changed-after=' + localTimes['clubs'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('clubs', 'readwrite').objectStore('clubs'); var os = db.transaction('clubs', 'readwrite').objectStore('clubs');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -509,24 +538,25 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'clubs', time: serverTimes['clubs'] }); osUpdateTimes.put({ table: 'clubs', time: serverTimes['clubs'] });
syncInProgress --; syncInProgress --;
log('clubs synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("clubs: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('clubs failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
// BOATS // BOATS
if (localTimes['boats'] < serverTimes['boats']) { if (localTimes['boats'] < serverTimes['boats']) {
getJSON(QUERY_URL + 'get_boats?changed-after=' + localTimes['boats'], function (code, data) { getJSON(QUERY_URL + 'get_boats?changed-after=' + localTimes['boats'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('boats', 'readwrite').objectStore('boats'); var os = db.transaction('boats', 'readwrite').objectStore('boats');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -541,24 +571,25 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'boats', time: serverTimes['boats'] }); osUpdateTimes.put({ table: 'boats', time: serverTimes['boats'] });
syncInProgress --; syncInProgress --;
log('boats synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("boats: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('boats failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
// SAILORS // SAILORS
if (localTimes['sailors'] < serverTimes['sailors']) { if (localTimes['sailors'] < serverTimes['sailors']) {
getJSON(QUERY_URL + 'get_sailors?changed-after=' + localTimes['sailors'], function (code, data) { getJSON(QUERY_URL + 'get_sailors?changed-after=' + localTimes['sailors'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('sailors', 'readwrite').objectStore('sailors'); var os = db.transaction('sailors', 'readwrite').objectStore('sailors');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -573,24 +604,25 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'sailors', time: serverTimes['sailors'] }); osUpdateTimes.put({ table: 'sailors', time: serverTimes['sailors'] });
syncInProgress --; syncInProgress --;
log('sailors synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("sailors: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('sailors failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
// REGATTAS // REGATTAS
if (localTimes['regattas'] < serverTimes['regattas']) { if (localTimes['regattas'] < serverTimes['regattas']) {
getJSON(QUERY_URL + 'get_regattas?changed-after=' + localTimes['regattas'], function (code, data) { getJSON(QUERY_URL + 'get_regattas?changed-after=' + localTimes['regattas'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('regattas', 'readwrite').objectStore('regattas'); var os = db.transaction('regattas', 'readwrite').objectStore('regattas');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -617,28 +649,29 @@ function sync() {
osYears.put({ year: y }); osYears.put({ year: y });
} }
} }
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'regattas', time: serverTimes['regattas'] }); osUpdateTimes.put({ table: 'regattas', time: serverTimes['regattas'] });
syncInProgress --; syncInProgress --;
log('regattas synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("regattas: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('regattas failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
// RESULTS // RESULTS
if (localTimes['results'] < serverTimes['results']) { if (localTimes['results'] < serverTimes['results']) {
getJSON(QUERY_URL + 'get_results?changed-after=' + localTimes['results'], function (code, data) { getJSON(QUERY_URL + 'get_results?changed-after=' + localTimes['results'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('results', 'readwrite').objectStore('results'); var os = db.transaction('results', 'readwrite').objectStore('results');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -653,24 +686,25 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'results', time: serverTimes['results'] }); osUpdateTimes.put({ table: 'results', time: serverTimes['results'] });
syncInProgress --; syncInProgress --;
log('results synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("results: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('results failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
// PLANNINGS // PLANNINGS
if (localTimes['plannings'] < serverTimes['plannings']) { if (localTimes['plannings'] < serverTimes['plannings']) {
getJSON(QUERY_URL + 'get_plannings?changed-after=' + localTimes['plannings'], function (code, data) { getJSON(QUERY_URL + 'get_plannings?changed-after=' + localTimes['plannings'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('plannings', 'readwrite').objectStore('plannings'); var os = db.transaction('plannings', 'readwrite').objectStore('plannings');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -685,25 +719,26 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'plannings', time: serverTimes['plannings'] }); osUpdateTimes.put({ table: 'plannings', time: serverTimes['plannings'] });
syncInProgress --; syncInProgress --;
log('plannings synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("plannings: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('plannings failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
if (isLoggedIn()) { if (isLoggedIn()) {
// TRIM_BOATS // TRIM_BOATS
if (localTimes['trim_boats'] < serverTimes['trim_boats']) { if (localTimes['trim_boats'] < serverTimes['trim_boats']) {
getJSON(QUERY_URL + 'get_trim_boats?changed-after=' + localTimes['trim_boats'], function (code, data) { getJSON(QUERY_URL + 'get_trim_boats?changed-after=' + localTimes['trim_boats'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('trim_boats', 'readwrite').objectStore('trim_boats'); var os = db.transaction('trim_boats', 'readwrite').objectStore('trim_boats');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -718,24 +753,25 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'trim_boats', time: serverTimes['trim_boats'] }); osUpdateTimes.put({ table: 'trim_boats', time: serverTimes['trim_boats'] });
syncInProgress --; syncInProgress --;
log('trim_boats synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("trim_boats: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('trim_boats failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
// TRIM_USERS // TRIM_USERS
if (localTimes['trim_users'] < serverTimes['trim_users']) { if (localTimes['trim_users'] < serverTimes['trim_users']) {
getJSON(QUERY_URL + 'get_trim_users?changed-after=' + localTimes['trim_users'], function (code, data) { getJSON(QUERY_URL + 'get_trim_users?changed-after=' + localTimes['trim_users'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('trim_users', 'readwrite').objectStore('trim_users'); var os = db.transaction('trim_users', 'readwrite').objectStore('trim_users');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -750,24 +786,25 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'trim_users', time: serverTimes['trim_users'] }); osUpdateTimes.put({ table: 'trim_users', time: serverTimes['trim_users'] });
syncInProgress --; syncInProgress --;
log('trim_users synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("trim_users: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('trim_users failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
// TRIM_TRIMS // TRIM_TRIMS
if (localTimes['trim_trims'] < serverTimes['trim_trims']) { if (localTimes['trim_trims'] < serverTimes['trim_trims']) {
getJSON(QUERY_URL + 'get_trim_trims?changed-after=' + localTimes['trim_trims'], function (code, data) { getJSON(QUERY_URL + 'get_trim_trims?changed-after=' + localTimes['trim_trims'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('trim_trims', 'readwrite').objectStore('trim_trims'); var os = db.transaction('trim_trims', 'readwrite').objectStore('trim_trims');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -782,28 +819,62 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'trim_trims', time: serverTimes['trim_trims'] }); osUpdateTimes.put({ table: 'trim_trims', time: serverTimes['trim_trims'] });
syncInProgress --; syncInProgress --;
log('trim_trims synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("trim_trims: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('trim_trims failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
} else { } else {
syncInProgress -= 3; syncInProgress -= 3;
} }
// NEWS
if (localTimes['news'] < serverTimes['news']) {
getJSON(QUERY_URL + 'get_news?changed-after=' + localTimes['news'], function (code, data) {
if (code == 200) {
var os = db.transaction('news', 'readwrite').objectStore('news');
data.data.forEach(function (entry) {
os.put(entry);
});
os.openCursor().onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
if (!data.keys.includes(parseInt(cursor.key))) {
os.delete(cursor.key);
}
cursor.continue();
} else {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'news', time: serverTimes['news'] });
syncInProgress --;
log('news synced, remaining:', syncInProgress);
}
};
} else {
log("news: Something went wrong (HTTP " + code + ")");
syncOkay = false;
syncInProgress --;
log('news failed, remaining:', syncInProgress);
}
});
} else {
syncInProgress --;
}
// USERS // USERS
if (localTimes['users'] < serverTimes['users']) { if (localTimes['users'] < serverTimes['users']) {
getJSON(QUERY_URL + 'get_users?changed-after=' + localTimes['users'], function (code, data) { getJSON(QUERY_URL + 'get_users?changed-after=' + localTimes['users'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('users', 'readwrite').objectStore('users'); var os = db.transaction('users', 'readwrite').objectStore('users');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -818,20 +889,22 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'users', time: serverTimes['users'] }); osUpdateTimes.put({ table: 'users', time: serverTimes['users'] });
syncInProgress --; syncInProgress --;
log('users synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("users: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('users failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
syncInProgress --; syncInProgress --;
} }
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress = 0; syncInProgress = 0;
} }
@@ -855,14 +928,14 @@ function initDatabase() {
if (window.indexedDB) { if (window.indexedDB) {
var request = window.indexedDB.open('regatten_app_db_' + BOATCLASS, DB_VERSION); var request = window.indexedDB.open('regatten_app_db_' + BOATCLASS, DB_VERSION);
request.onerror = function (event) { request.onerror = function (event) {
console.log("Cannot open DB: " + event.target.errorCode); log("Cannot open DB: " + event.target);
runPageScript(); runPageScript();
}; };
request.onsuccess = function (event) { request.onsuccess = function (event) {
console.log("Database loaded"); log("Database loaded");
db = event.target.result; db = event.target.result;
db.onversionchange = function (event) { db.onversionchange = function (event) {
if (syncTimer != null) window.clearInterval(syncTimer); if (syncTimer != null) window.clearInterval(syncTimer);
if (updateSyncStatusTimer != null) window.clearInterval(updateSyncStatusTimer); if (updateSyncStatusTimer != null) window.clearInterval(updateSyncStatusTimer);
@@ -871,26 +944,29 @@ function initDatabase() {
db.close(); db.close();
location.reload; location.reload;
} }
db.onerror = function (event) { db.onerror = function (event) {
console.log("DB Error: " + event.target.errorCode); log("DB Error: " + event.target);
}; };
canUseLocalDB = true; canUseLocalDB = true;
if (typeof onDatabaseLoaded == 'function') onDatabaseLoaded();
db.transaction('update_times').objectStore('update_times').get('last_sync').onsuccess = function (event) { db.transaction('update_times').objectStore('update_times').get('last_sync').onsuccess = function (event) {
var lastSync = event.target.result.time; var lastSync = event.target.result.time;
if (lastSync > 0) { if (lastSync > 0) {
runPageScript(); runPageScript();
} else { } else {
addSyncInfoToPreloader();
db.transaction('update_times', 'readwrite').objectStore('update_times').put({ table: 'loggedin', status: isLoggedIn() }); db.transaction('update_times', 'readwrite').objectStore('update_times').put({ table: 'loggedin', status: isLoggedIn() });
} }
}; };
checkSync(); checkSync();
syncTimer = window.setInterval(checkSync, 300000); // 5 min syncTimer = window.setInterval(checkSync, 300000); // 5 min
window.ononline = function () { window.ononline = function () {
checkSync(); checkSync();
} }
@@ -900,11 +976,11 @@ function initDatabase() {
var upgradeTransaction = event.target.transaction; var upgradeTransaction = event.target.transaction;
var oldVersion = event.oldVersion; var oldVersion = event.oldVersion;
var newVersion = event.newVersion; var newVersion = event.newVersion;
console.log("Datenbank Version Upgrade von " + oldVersion + " auf " + newVersion); log("Datenbank Version Upgrade von " + oldVersion + " auf " + newVersion);
if ((oldVersion < 1) && (newVersion >= 1)) { if ((oldVersion < 1) && (newVersion >= 1)) {
console.log('to version 1'); log('to version 1');
var osClubs = db.createObjectStore('clubs', { keyPath: 'id' }); var osClubs = db.createObjectStore('clubs', { keyPath: 'id' });
var osBoats = db.createObjectStore('boats', { keyPath: 'id' }); var osBoats = db.createObjectStore('boats', { keyPath: 'id' });
var osSailors = db.createObjectStore('sailors', { keyPath: 'id' }); var osSailors = db.createObjectStore('sailors', { keyPath: 'id' });
@@ -931,28 +1007,40 @@ function initDatabase() {
osUpdateTimes.add({ table: 'trim_users', time: 0 }); osUpdateTimes.add({ table: 'trim_users', time: 0 });
osUpdateTimes.add({ table: 'trim_trims', time: 0 }); osUpdateTimes.add({ table: 'trim_trims', time: 0 });
} }
if ((oldVersion < 2) && (newVersion >= 2)) { if ((oldVersion < 2) && (newVersion >= 2)) {
console.log('to version 2'); log('to version 2');
var osUsers = db.createObjectStore('users', { keyPath: 'id' }); var osUsers = db.createObjectStore('users', { keyPath: 'id' });
osUsers.createIndex('username', 'username', { unique: true }); osUsers.createIndex('username', 'username', { unique: true });
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.add({ table: 'users', time: 0 }); osUpdateTimes.add({ table: 'users', time: 0 });
} }
if ((oldVersion < 3) && (newVersion >= 3)) { if ((oldVersion < 3) && (newVersion >= 3)) {
console.log('to version 3'); log('to version 3');
var osYears = db.createObjectStore('years', { keyPath: 'year' }); var osYears = db.createObjectStore('years', { keyPath: 'year' });
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.put({ table: 'regattas', time: 0 }); osUpdateTimes.put({ table: 'regattas', time: 0 });
} }
if ((oldVersion < 4) && (newVersion >= 4)) { if ((oldVersion < 4) && (newVersion >= 4)) {
console.log('to version 4'); log('to version 4');
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.add({ table: 'loggedin', status: isLoggedIn() }); osUpdateTimes.add({ table: 'loggedin', status: isLoggedIn() });
} }
if ((oldVersion < 5) && (newVersion >= 5)) {
log('to version 5');
var osPushes = db.createObjectStore('settings', { keyPath: 'key' });
}
if ((oldVersion < 6) && (newVersion >= 6)) {
log('to version 6');
var osNews = db.createObjectStore('news', { keyPath: 'id' });
var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.add({ table: 'news', time: 0 });
}
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.put({ table: 'last_sync', time: 0 }); osUpdateTimes.put({ table: 'last_sync', time: 0 });
} }
@@ -961,8 +1049,7 @@ function initDatabase() {
} }
} }
function resetDb(silent = true) { function resetDb() {
$('#menu-developer').hideMenu();
if (canUseLocalDB) { if (canUseLocalDB) {
showLoader(); showLoader();
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
@@ -976,13 +1063,26 @@ function resetDb(silent = true) {
osUpdateTimes.put({ table: 'trim_boats', time: 0 }); osUpdateTimes.put({ table: 'trim_boats', time: 0 });
osUpdateTimes.put({ table: 'trim_users', time: 0 }); osUpdateTimes.put({ table: 'trim_users', time: 0 });
osUpdateTimes.put({ table: 'trim_trims', time: 0 }); osUpdateTimes.put({ table: 'trim_trims', time: 0 });
osUpdateTimes.put({ table: 'news', time: 0 });
osUpdateTimes.put({ table: 'users', time: 0 }); osUpdateTimes.put({ table: 'users', time: 0 });
console.log('DB update times reset'); log('DB update times reset');
if (!silent)
toastInfo('The database was reset. Please reload or close this tab.<br>At the next visit, a full sync will be performed.');
hideLoader(); hideLoader();
} else {
if (!silent)
toastWarn('Your device does not support storing data locally. All data is fetched directly from our server.<br>As a result, you can not reset your database.');
} }
} }
function addSyncInfoToPreloader() {
var preloader = document.getElementById('preloader');
var div = document.createElement('div');
div.id = 'preloader-sync-info';
div.classList = 'rounded-s shadow-m bg-highlight m-3 p-3';
div.style.position = 'fixed';
div.style.top = 0;
div.style.left = 0;
div.style.right = 0;
div.innerHTML = '<h2 class="color-white">Datenbank SYNC</h2><p class="mb-0 color-white">Um Dir alle n&ouml;tigen Informationen anzeigen zu k&ouml;nnen, m&uuml;ssen wir die Datenbank synchronisieren.<br>Dies kann einen Moment dauern. Bitte habe etwas Geduld. Beim n&auml;chsten &Ouml;ffnen geht es schneller.</p>';
preloader.appendChild(div);
}
function removeSyncInfoToPreloader() {
$('#preloader-sync-info').remove();
}

View File

@@ -27,13 +27,13 @@ function parseDate(string) {
} else { } else {
return null; return null;
} }
if (isNaN(year) || isNaN(month) || isNaN(day)) return null; if (isNaN(year) || isNaN(month) || isNaN(day)) return null;
if (year.toString().length == 2) year = (year < 70 ? 2000 : 1900) + year; if (year.toString().length == 2) year = (year < 70 ? 2000 : 1900) + year;
if ((year < 1970) || (year > 3000)) return null; if ((year < 1970) || (year > 3000)) return null;
if ((month < 1) || (month > 12)) return null; if ((month < 1) || (month > 12)) return null;
if ((day < 1) || (day > 31)) return null; if ((day < 1) || (day > 31)) return null;
var date = new Date(Date.UTC(year, month - 1, day)); var date = new Date(Date.UTC(year, month - 1, day));
return date; return date;
} }
@@ -51,37 +51,37 @@ function formatDate(format, date = null) {
date = new Date(date.valueOf()); date = new Date(date.valueOf());
date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
} }
format = format.replace("M", "%1%"); format = format.replace("M", "%1%");
format = format.replace("F", "%2%"); format = format.replace("F", "%2%");
format = format.replace("D", "%3%"); format = format.replace("D", "%3%");
format = format.replace("l", "%4%"); format = format.replace("l", "%4%");
var tmp = date.getFullYear().toString(); var tmp = date.getFullYear().toString();
var tmp2 = tmp.substr(2); var tmp2 = tmp.substr(2);
format = format.replace("Y", tmp); format = format.replace("Y", tmp);
format = format.replace('y', tmp2); format = format.replace('y', tmp2);
tmp = (date.getMonth() + 1).toString(); tmp = (date.getMonth() + 1).toString();
tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp)); tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp));
format = format.replace('n', tmp); format = format.replace('n', tmp);
format = format.replace('m', tmp2); format = format.replace('m', tmp2);
tmp = date.getDate().toString(); tmp = date.getDate().toString();
tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp)); tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp));
format = format.replace('j', tmp); format = format.replace('j', tmp);
format = format.replace('d', tmp2); format = format.replace('d', tmp2);
tmp = date.getDay(); tmp = date.getDay();
tmp2 = (tmp == 0 ? 7 : tmp); tmp2 = (tmp == 0 ? 7 : tmp);
format = format.replace('w', tmp); format = format.replace('w', tmp);
format = format.replace('N', tmp2); format = format.replace('N', tmp2);
format = format.replace('%1%', strings.months_short[date.getMonth()]); format = format.replace('%1%', strings.months_short[date.getMonth()]);
format = format.replace('%2%', strings.months_long[date.getMonth()]); format = format.replace('%2%', strings.months_long[date.getMonth()]);
format = format.replace('%3%', strings.weekdays_short[date.getDay()]); format = format.replace('%3%', strings.weekdays_short[date.getDay()]);
format = format.replace('%4%', strings.weekdays_long[date.getDay()]); format = format.replace('%4%', strings.weekdays_long[date.getDay()]);
return format; return format;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,44 +1,46 @@
<?php <?php
header('Content-Type: text/javascript'); header('Content-Type: text/javascript');
require_once(__DIR__ . '/../../server/version.php'); require_once(__DIR__ . '/../../server/version.php');
require_once(__DIR__ . '/../../server/config.php'); require_once(__DIR__ . '/../../server/config.php');
?> ?>
//Loading the Service Worker //Loading the Service Worker
var swRegistration = null;
if ('serviceWorker' in navigator) { if ('serviceWorker' in navigator) {
window.addEventListener('load', function() { window.addEventListener('load', async function() {
navigator.serviceWorker.register('<?php echo SERVER_ADDR; ?>/service-worker.js.php'); swRegistration = await navigator.serviceWorker.register('<?php echo SERVER_ADDR; ?>/service-worker.js.php');
if (typeof onServiceWorkerLoaded === 'function') onServiceWorkerLoaded();
}); });
} }
$(document).ready(function(){ $(document).ready(function(){
'use strict' 'use strict'
var pwaVersion = '<?php echo PWA_VERSION; ?>'; //must be identical to _manifest.json version. If not it will create update window loop var pwaVersion = '<?php echo PWA_VERSION; ?>'; //must be identical to _manifest.json version. If not it will create update window loop
var pwaCookie = true; // if set to false, the PWA prompt will appear even if the user selects "maybe later" var pwaCookie = true; // if set to false, the PWA prompt will appear even if the user selects "maybe later"
var pwaNoCache = false; // always keep the cache clear to serve the freshest possible content var pwaNoCache = false; // always keep the cache clear to serve the freshest possible content
$('[data-pwa-version]').data('pwa-version', pwaVersion); $('[data-pwa-version]').data('pwa-version', pwaVersion);
//Creating Cookie System for PWA Hide //Creating Cookie System for PWA Hide
function createCookie(e, t, n) {if (n) {var o = new Date;o.setTime(o.getTime() + n * 365 * 24 * 3600 * 1e3);var r = "; expires=" + o.toGMTString()} else var r = "";document.cookie = e + "=" + t + r + "; path=/"} function createCookie(e, t, n) {if (n) {var o = new Date;o.setTime(o.getTime() + n * 365 * 24 * 3600 * 1e3);var r = "; expires=" + o.toGMTString()} else var r = "";document.cookie = e + "=" + t + r + "; path=/"}
function readCookie(e) {for (var t = e + "=", n = document.cookie.split(";"), o = 0; o < n.length; o++) {for (var r = n[o];" " == r.charAt(0);) r = r.substring(1, r.length);if (0 == r.indexOf(t)) return r.substring(t.length, r.length)}return null} function readCookie(e) {for (var t = e + "=", n = document.cookie.split(";"), o = 0; o < n.length; o++) {for (var r = n[o];" " == r.charAt(0);) r = r.substring(1, r.length);if (0 == r.indexOf(t)) return r.substring(t.length, r.length)}return null}
function eraseCookie(e) {createCookie(e, "", -1)} function eraseCookie(e) {createCookie(e, "", -1)}
//Enabling dismiss button //Enabling dismiss button
setTimeout(function(){ setTimeout(function(){
$('.pwa-dismiss').on('click',function(){ $('.pwa-dismiss').on('click',function(){
console.log('User Closed Add to Home / PWA Prompt') log('User Closed Add to Home / PWA Prompt')
createCookie('Sticky_pwa_rejected_install', true, 1); createCookie('Sticky_pwa_rejected_install', true, 1);
$('body').find('#menu-install-pwa-android, #menu-install-pwa-ios, .menu-hider').removeClass('menu-active'); $('body').find('#menu-install-pwa-android, #menu-install-pwa-ios, .menu-hider').removeClass('menu-active');
}); });
},1500); },1500);
//Detecting Mobile Operating Systems //Detecting Mobile Operating Systems
var isMobile = { var isMobile = {
Android: function() {return navigator.userAgent.match(/Android/i);}, Android: function() {return navigator.userAgent.match(/Android/i);},
@@ -47,37 +49,40 @@ $(document).ready(function(){
}; };
var isInWebAppiOS = (window.navigator.standalone == true); var isInWebAppiOS = (window.navigator.standalone == true);
var isInWebAppChrome = (window.matchMedia('(display-mode: standalone)').matches); var isInWebAppChrome = (window.matchMedia('(display-mode: standalone)').matches);
//Firing PWA prompts for specific versions and when not on home screen. //Firing PWA prompts for specific versions and when not on home screen.
if (isMobile.Android()) { if (isMobile.Android()) {
console.log('Android Detected'); log('Android Detected');
function showInstallPromotion(){ function showInstallPromotion(){
if($('#menu-install-pwa-android, .add-to-home').length){ if($('#menu-install-pwa-android, .add-to-home').length){
console.log('Triggering PWA Menu for Android'); log('Triggering PWA Menu for Android');
if (!readCookie('Sticky_pwa_rejected_install')) { if (!readCookie('Sticky_pwa_rejected_install')) {
setTimeout(function(){ setTimeout(function(){
$('.add-to-home').addClass('add-to-home-visible add-to-home-android'); $('.add-to-home').addClass('add-to-home-visible add-to-home-android');
$('#menu-install-pwa-android, .menu-hider').addClass('menu-active') $('#menu-install-pwa-android, .menu-hider').addClass('menu-active')
},4500); },3000);
} }
} else {
console.log('The div #menu-install-pwa-android was not found. Please add this div to show the install window')
} }
} }
let deferredPrompt; let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => { window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault(); e.preventDefault();
deferredPrompt = e; deferredPrompt = e;
showInstallPromotion(); var welcomActive = $('#menu-welcome').hasClass('menu-active');
if (welcomActive) {
$('#menu-welcome-a-okay').click(showInstallPromotion);
} else {
showInstallPromotion();
}
}); });
$('.pwa-install').on('click',function(e){ $('.pwa-install').on('click',function(e){
deferredPrompt.prompt(); deferredPrompt.prompt();
deferredPrompt.userChoice deferredPrompt.userChoice
.then((choiceResult) => { .then((choiceResult) => {
if (choiceResult.outcome === 'accepted') { if (choiceResult.outcome === 'accepted') {
console.log('User accepted the A2HS prompt'); log('User accepted the A2HS prompt');
} else { } else {
console.log('User dismissed the A2HS prompt'); log('User dismissed the A2HS prompt');
} }
deferredPrompt = null; deferredPrompt = null;
}); });
@@ -85,26 +90,32 @@ $(document).ready(function(){
window.addEventListener('appinstalled', (evt) => { window.addEventListener('appinstalled', (evt) => {
$('#menu-install-pwa-android, .menu-hider').removeClass('menu-active') $('#menu-install-pwa-android, .menu-hider').removeClass('menu-active')
}); });
} }
if (isMobile.iOS()) { if (isMobile.iOS()) {
if(!isInWebAppiOS){ if(!isInWebAppiOS){
console.log('iOS Detected'); log('iOS Detected');
if($('#menu-install-pwa-ios, .add-to-home').length){ if($('#menu-install-pwa-ios, .add-to-home').length){
if (!readCookie('Sticky_pwa_rejected_install')) { if (!readCookie('Sticky_pwa_rejected_install')) {
console.log('Triggering PWA / Add to Home Screen Menu for iOS'); function triggerPwaInstallIos() {
setTimeout(function(){ log('Triggering PWA / Add to Home Screen Menu for iOS');
$('.add-to-home').addClass('add-to-home-visible add-to-home-ios'); setTimeout(function(){
$('#menu-install-pwa-ios, .menu-hider').addClass('menu-active'); $('.add-to-home').addClass('add-to-home-visible add-to-home-ios');
},4500); $('#menu-install-pwa-ios, .menu-hider').addClass('menu-active');
},3000);
}
var welcomActive = $('#menu-welcome').hasClass('menu-active');
if (welcomActive) {
$('#menu-welcome-a-okay').click(triggerPwaInstallIos);
} else {
triggerPwaInstallIos();
}
}; };
} else {
console.log('The div #menu-install-pwa-ios was not found. Please add this div to show the install window')
} }
} }
} }
//Creating Update Modal //Creating Update Modal
function updateModal(){ function updateModal(){
var body = $('body'); var body = $('body');
@@ -114,7 +125,7 @@ $(document).ready(function(){
if(!updateModal.length){ if(!updateModal.length){
body.append('<div id="menu-update"></div>'); body.append('<div id="menu-update"></div>');
setTimeout(function(){ setTimeout(function(){
body.find('#menu-update').load('menu-update.html?ver='+menuUpdate); body.find('#menu-update').load('menu-update.html?ver='+menuUpdate);
},250); },250);
} }
}; };
@@ -123,15 +134,15 @@ $(document).ready(function(){
var counter = 3; var counter = 3;
var interval = setInterval(function() { var interval = setInterval(function() {
counter--; counter--;
console.log(counter); log(counter);
$('.page-update').html('Aktuallisierung in ... '+ counter + ' Sekunden'); $('.page-update').html('Aktuallisierung in ... '+ counter + ' Sekunden');
if (counter == 0) { if (counter == 0) {
clearInterval(interval); clearInterval(interval);
window.location.reload(true) window.location.reload(true)
} }
}, 1000); }, 1000);
caches.delete('workbox-runtime').then(function() { caches.delete('workbox-runtime').then(function() {
console.log('Content Updated - Cache Removed!'); log('Content Updated - Cache Removed!');
}); });
//localStorage.clear(); //localStorage.clear();
sessionStorage.clear() sessionStorage.clear()
@@ -141,34 +152,34 @@ $(document).ready(function(){
}); });
}); });
}; };
//Check Version //Check Version
function check_version(){ function check_version(){
if($('link[data-pwa-version]').length){ if($('link[data-pwa-version]').length){
function versionCheck(){ function versionCheck(){
var dt = new Date(); var dt = new Date();
var maniTimeVersion = dt.getHours() + ":" + dt.getMinutes() + ":" + dt.getSeconds(); var maniTimeVersion = dt.getHours() + ":" + dt.getMinutes() + ":" + dt.getSeconds();
var localVersionNumber = $('link[rel="manifest"]').data('pwa-version'); var localVersionNumber = $('link[rel="manifest"]').data('pwa-version');
var onlineVersionJSON = "<?php echo SERVER_ADDR; ?>/manifest.json.php?ver=" + maniTimeVersion; var onlineVersionJSON = "<?php echo SERVER_ADDR; ?>/manifest.json.php?ver=" + maniTimeVersion;
var onlineVersionNumber = "Connection Offline. Waiting to Reconect"; var onlineVersionNumber = "Connection Offline. Waiting to Reconect";
$.getJSON(onlineVersionJSON, function(onlineData) {onlineVersionNumber = onlineData.version;}); $.getJSON(onlineVersionJSON, function(onlineData) {onlineVersionNumber = onlineData.version;});
setTimeout(function(){ setTimeout(function(){
//console.log(' Checking PWA Content for updates...\n PWA Server Version: ' + onlineVersionNumber + '\n' + ' PWA Cached Version: ' + localVersionNumber); //console.log(' Checking PWA Content for updates...\n PWA Server Version: ' + onlineVersionNumber + '\n' + ' PWA Cached Version: ' + localVersionNumber);
if(onlineVersionNumber != localVersionNumber && onlineVersionNumber != "Connection Offline. Waiting to Reconect"){ if(onlineVersionNumber != localVersionNumber && onlineVersionNumber != "Connection Offline. Waiting to Reconect"){
updateModal(); updateModal();
console.log('New Version of Content Available. Refreshing. On Desktop Browsers a manual refresh maybe required.') log('New Version of Content Available. Refreshing. On Desktop Browsers a manual refresh maybe required.')
setTimeout(function(){ setTimeout(function(){
$('body').find('#menu-update').addClass('menu-active'); $('body').find('#menu-update').addClass('menu-active');
$('.menu-hider').addClass('menu-active-no-click'); $('.menu-hider').addClass('menu-active-no-click');
updateButton(); updateButton();
},500); },500);
} }
if(onlineVersionNumber == localVersionNumber){/*No update required. Versions Identical*/} if(onlineVersionNumber == localVersionNumber){/*No update required. Versions Identical*/}
if(onlineVersionNumber === "undefined"){/*Error Checking for Updates*/} if(onlineVersionNumber === "undefined"){/*Error Checking for Updates*/}
if(onlineVersionNumber === "Finding Online Version..."){ if(onlineVersionNumber === "Finding Online Version..."){
$('.reloadme').addClass('disabled'); $('.reloadme').addClass('disabled');
$('body').find('#menu-update').removeClass('menu-active'); $('body').find('#menu-update').removeClass('menu-active');
$('.menu-hider').removeClass('menu-active-no-click'); $('.menu-hider').removeClass('menu-active-no-click');
} }
},3000); },3000);
} }
@@ -182,15 +193,15 @@ $(document).ready(function(){
if(pwaCookie == false){ if(pwaCookie == false){
eraseCookie('Sticky_pwa_rejected_install'); eraseCookie('Sticky_pwa_rejected_install');
} }
//Reload To Clear Button //Reload To Clear Button
$('body').on('click', '.page-update, .reloadme', function() { $('body').on('click', '.page-update, .reloadme', function() {
location.reload(); location.reload();
}); });
//Check for Version Change if Online If not Kill the Function //Check for Version Change if Online If not Kill the Function
if (navigator.onLine) {check_version();} else {function check_version(){}} if (navigator.onLine) {check_version();} else {function check_version(){}}
//Adding Offline Alerts //Adding Offline Alerts
var offlineAlerts = $('.offline-message'); var offlineAlerts = $('.offline-message');
@@ -198,24 +209,24 @@ $(document).ready(function(){
$('body').append('<p class="offline-message bg-red2-dark color-white center-text uppercase ultrabold">' + strings['inetMsgOffline'] + '</p>'); $('body').append('<p class="offline-message bg-red2-dark color-white center-text uppercase ultrabold">' + strings['inetMsgOffline'] + '</p>');
$('body').append('<p class="online-message bg-green1-dark color-white center-text uppercase ultrabold">' + strings['inetMsgOnline'] + '</p>'); $('body').append('<p class="online-message bg-green1-dark color-white center-text uppercase ultrabold">' + strings['inetMsgOnline'] + '</p>');
} }
//Offline Function Show //Offline Function Show
function isOffline(){ function isOffline(){
$('.offline-message').addClass('offline-message-active'); $('.offline-message').addClass('offline-message-active');
$('.online-message').removeClass('online-message-active'); $('.online-message').removeClass('online-message-active');
setTimeout(function(){$('.offline-message').removeClass('offline-message-active');},2000); setTimeout(function(){$('.offline-message').removeClass('offline-message-active');},2000);
} }
//Online Function Show //Online Function Show
function isOnline(){ function isOnline(){
$('.online-message').addClass('online-message-active'); $('.online-message').addClass('online-message-active');
$('.offline-message').removeClass('offline-message-active'); $('.offline-message').removeClass('offline-message-active');
setTimeout(function(){$('.online-message').removeClass('online-message-active');},2000); setTimeout(function(){$('.online-message').removeClass('online-message-active');},2000);
} }
$('.simulate-offline').on('click',function(){isOffline();}) $('.simulate-offline').on('click',function(){isOffline();})
$('.simulate-online').on('click',function(){isOnline();}) $('.simulate-online').on('click',function(){isOnline();})
//Disable links to other pages if offline. //Disable links to other pages if offline.
//Warning! Enabling offline for iOS can cause issues //Warning! Enabling offline for iOS can cause issues
//To allow offline functionality delete the next 7 lines //To allow offline functionality delete the next 7 lines
@@ -224,27 +235,27 @@ $(document).ready(function(){
if(detectHREF.match(/.html/)){ if(detectHREF.match(/.html/)){
isOffline(); isOffline();
return false; return false;
} }
} }
//Check if Online / Offline //Check if Online / Offline
function updateOnlineStatus(event) { function updateOnlineStatus(event) {
var condition = navigator.onLine ? "online" : "offline"; var condition = navigator.onLine ? "online" : "offline";
isOnline(); isOnline();
console.log( 'Connection: Online'); log( 'Connection: Online');
$("a").off( "click", returnFalse ); $("a").off( "click", returnFalse );
} }
function updateOfflineStatus(event) { function updateOfflineStatus(event) {
isOffline(); isOffline();
$("a").on( "click", returnFalse ); $("a").on( "click", returnFalse );
console.log( 'Connection: Offline'); log( 'Connection: Offline');
} }
window.addEventListener('online', updateOnlineStatus); window.addEventListener('online', updateOnlineStatus);
window.addEventListener('offline', updateOfflineStatus); window.addEventListener('offline', updateOfflineStatus);
if(pwaNoCache == true){ if(pwaNoCache == true){
caches.delete('workbox-runtime').then(function() { caches.delete('workbox-runtime').then(function() {
}); });
localStorage.clear(); localStorage.clear();
sessionStorage.clear() sessionStorage.clear()
@@ -254,6 +265,6 @@ $(document).ready(function(){
}); });
}); });
} }
}); });

View File

@@ -1,16 +1,30 @@
<?php <?php
header('Content-Type: text/javascript'); header('Content-Type: text/javascript');
require_once(__DIR__ . '/../../server/config.php'); require_once(__DIR__ . '/../../server/config.php');
?> ?>
const QUERY_URL = '<?php echo SERVER_ADDR; ?>/api/'; const QUERY_URL = '<?php echo QUERY_URL; ?>';
const BOATCLASS = '<?php echo BOATCLASS; ?>'; const BOATCLASS = '<?php echo BOATCLASS; ?>';
const LINK_PRE = '<?php echo SERVER_ADDR; ?>/'; const LINK_PRE = '<?php echo SERVER_ADDR; ?>/';
const YOUTH_AGE = '<?php echo $_CLASS['youth-age']; ?>'; const YOUTH_AGE = '<?php echo $_CLASS['youth-age']; ?>';
const YOUTH_GERMAN_NAME = '<?php echo $_CLASS['youth-german-name']; ?>'; const YOUTH_GERMAN_NAME = '<?php echo $_CLASS['youth-german-name']; ?>';
const PUSH_SERVER_KEY = '<?php echo PUSH_SERVER_KEY; ?>';
function log() {
var now = new Date();
var hour = now.getHours().toString();
var min = now.getMinutes().toString();
var sec = now.getSeconds().toString();
var millis = now.getMilliseconds().toString();
hour = (hour.length < 2 ? '0' + hour : hour);
min = (min.length < 2 ? '0' + min : min);
sec = (sec.length < 2 ? '0' + sec : sec);
while (millis.length < 3) millis = '0' + millis;
console.log('[' + hour + ':' + min + ':' + sec + '.' + millis + ']', ...arguments);
}
var randomId = function() { return '_' + Math.random().toString(36).substr(2, 9); } var randomId = function() { return '_' + Math.random().toString(36).substr(2, 9); }
@@ -121,8 +135,8 @@ var login = function() {
showLoader(); showLoader();
var username = $('#input-login-username').val(); var username = $('#input-login-username').val();
var password = $('#input-login-password').val(); var password = $('#input-login-password').val();
$('#input-login-username').val(''); $('#input-login-username').val('').trigger('focusin').trigger('focusout');
$('#input-login-password').val(''); $('#input-login-password').val('').trigger('focusin').trigger('focusout');
$.ajax({ $.ajax({
url: QUERY_URL + 'login', url: QUERY_URL + 'login',
method: 'POST', method: 'POST',
@@ -134,13 +148,13 @@ var login = function() {
error: function (xhr, status, error) { error: function (xhr, status, error) {
if (xhr.status == 401) { if (xhr.status == 401) {
toastError('Benutzername oder Passwort falsch'); toastError('Benutzername oder Passwort falsch');
$('#input-login-username').val(username); $('#input-login-username').val(username).trigger('focusin').trigger('focusout');
} else if (xhr.status == 0) { } else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Dich anzumelden'); toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Dich anzumelden');
$('#menu-login').hideMenu(); $('#menu-login').hideMenu();
} else { } else {
console.log('Login: unbekannter Fehler', status, error); log('Login: unbekannter Fehler', status, error);
console.log(xhr); log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000); toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
} }
hideLoader(); hideLoader();
@@ -172,7 +186,7 @@ var logout = function() {
hash: localStorage.getItem('auth_hash') hash: localStorage.getItem('auth_hash')
} }
if ((auth.id === null) || (auth.hash === null)) { if ((auth.id === null) || (auth.hash === null)) {
console.log('Not logged in'); log('Not logged in');
logoutClearStorage(); logoutClearStorage();
return; return;
} }
@@ -184,14 +198,14 @@ var logout = function() {
}, },
error: function (xhr, status, error) { error: function (xhr, status, error) {
if (xhr.status == 401) { if (xhr.status == 401) {
console.log('Not logged in'); log('Not logged in');
logoutClearStorage(); logoutClearStorage();
} else if (xhr.status == 0) { } else if (xhr.status == 0) {
console.log('Could not delete auth from server'); log('Could not delete auth from server');
logoutClearStorage(); logoutClearStorage();
} else { } else {
console.log('Logout: unbekannter Fehler', status, error); log('Logout: unbekannter Fehler', status, error);
console.log(xhr); log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000); toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
hideLoader(); hideLoader();
} }
@@ -202,28 +216,232 @@ var logout = function() {
}); });
} }
function resetCache() { function deleteDb() {
$('#menu-developer').hideMenu();
if (canUseLocalDB) {
showLoader();
var request = window.indexedDB.deleteDatabase('regatten_app_db_' + BOATCLASS);
request.onerror = function (event) {
log('Cannot delete DB: ', event.target.errorCode);
toastError('Beim Löschen der Datenbank ist ein Fehler aufgetreten.<br>Bitte melde diesen Fehler. (Dev-Menu => Problem melden)', 5000);
hideLoader();
}
request.onsuccess = function (event) {
log('DB deleted');
toastInfo('Die Datenbank wurde gelöscht. Die Seite lädt in wenigen Sekunden neu und erstellt damit eine neue Datenbank.', 10000);
hideLoader();
setTimeout(function(){ location.reload(); }, 3000);
}
} else {
toastWarn('Dein Gerät unterstützt kein lokales Speichern der Daten. Alle Daten werden direkt vom Server gezogen.<br>Entsprechend kannst Du die Datenbank auch nicht zurücksetzen.', 10000);
}
}
function deleteCache() {
$('#menu-developer').hideMenu(); $('#menu-developer').hideMenu();
navigator.serviceWorker.getRegistrations().then(function (registrations) { navigator.serviceWorker.getRegistrations().then(function (registrations) {
for (let registration of registrations) { for (let registration of registrations) {
console.log('Unregister sW:', registration); log('Unregister sW:', registration);
registration.unregister(); registration.unregister();
} }
}); });
caches.keys().then((keyList) => { caches.keys().then((keyList) => {
return Promise.all(keyList.map((key) => { return Promise.all(keyList.map((key) => {
console.log('Cache deleted:', key); log('Cache deleted:', key);
return caches.delete(key); return caches.delete(key);
})); }));
}); });
toastInfo('The serviceWorker and the cache were deleted. A new serviceWorker will be generated on the next refresh.'); toastInfo('Der serviceWorker und alle Caches wurden gelöscht. Die Seite lädt in wenigen Sekunden neu und erstellt damit neue Caches.', 10000);
setTimeout(function(){ location.reload(); }, 3000);
}
var pushesPossible = false;
function urlB64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
function pushesSubscribe() {
log('Subscribing');
const applicationServerKey = urlB64ToUint8Array(PUSH_SERVER_KEY);
swRegistration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: applicationServerKey
})
.then(function(subscription) {
pushesUpdateServerSubscription(subscription, true);
updatePushSwitches();
updatePushBadge();
})
.catch(function(err) {
log('Failed to subscribe the user: ', err);
toastError('Da ist leider etwas schief gelaufen. Bitte stelle sicher, dass Du mit dem Internet verbunden bist und versuche es erneut.', 5000);
pushesUnSubscribe(true);
});
}
function pushesUnSubscribe(silent = false) {
log('Unsubscribing');
swRegistration.pushManager.getSubscription()
.then(function(subscription) {
if (subscription) {
pushesUpdateServerSubscription(subscription, false);
subscription.unsubscribe();
$('#menu-pushes').hideMenu();
updatePushBadge();
hideLoader();
}
})
.catch(function(error) {
log('Error unsubscribing', error);
$('#menu-pushes').hideMenu();
if (!silent) toastError('Da ist leider etwas schief gelaufen. Bitte versuche es erneut oder wende Dich an unseren Support.', 5000);
updatePushBadge();
hideLoader();
});
}
function pushesUpdateServerSubscription(subscription, enabled) {
log('updateServer', enabled, subscription);
$.ajax({
url: QUERY_URL + (enabled ? 'add' : 'remove') + '_subscription',
type: 'POST',
data: { subscription: JSON.stringify(subscription) },
success: function (data, textStatus, jqXHR) {
if (!enabled) {
toastOk('Du erhältst ab sofort keine Benachrichtigungen mehr von uns.');
}
hideLoader();
},
error: function (jqXHR, textStatus, errorThrown) {
throw 'Cannot update server subscription';
}
});
}
async function initPushSettings() {
var items = [
['notify_channel_' + BOATCLASS + '_news', true],
['notify_channel_' + BOATCLASS + '_regatta_changed_my', true],
['notify_channel_' + BOATCLASS + '_regatta_changed_all', false],
['notify_channel_' + BOATCLASS + '_result_ready_my', true],
['notify_channel_' + BOATCLASS + '_result_ready_all', true],
['notify_channel_' + BOATCLASS + '_meldeschluss', true]
];
for (var i in items) {
var item = items[i];
if ((await dbSettingsGet(item[0])) == null) dbSettingsSet(item[0], item[1]);
}
}
async function updatePushSwitches() {
$('#switch-pushes-news').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_news'));
$('#switch-pushes-regatta-changed-my').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_regatta_changed_my'));
$('#switch-pushes-regatta-changed-all').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_regatta_changed_all'));
$('#switch-pushes-result-ready-my').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_result_ready_my'));
$('#switch-pushes-result-ready-all').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_result_ready_all'));
$('#switch-pushes-meldeschluss').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_meldeschluss'));
if ($('#switch-pushes').prop('checked')) {
$('#p-pushes-info').show();
$('.a-switch-pushes-channel-all').show();
$('.a-switch-pushes-channel-my').show();
if (!isLoggedIn()) {
$('.a-switch-pushes-channel-my').find('div').remove();
$('.a-switch-pushes-channel-my').find('.badge').text('nicht angemeldet');
}
} else {
$('#p-pushes-info').hide();
$('.a-switch-pushes-channel-all').hide();
$('.a-switch-pushes-channel-my').hide();
}
}
function pushesSubscribeClicked() {
showLoader();
if ($('#switch-pushes').prop('checked')) {
pushesSubscribe();
} else {
pushesUnSubscribe();
}
}
function pushesChannelClicked() {
dbSettingsSet('notify_channel_' + BOATCLASS + '_news', $('#switch-pushes-news').prop('checked'));
dbSettingsSet('notify_channel_' + BOATCLASS + '_regatta_changed_my', $('#switch-pushes-regatta-changed-my').prop('checked'));
dbSettingsSet('notify_channel_' + BOATCLASS + '_regatta_changed_all', $('#switch-pushes-regatta-changed-all').prop('checked'));
dbSettingsSet('notify_channel_' + BOATCLASS + '_result_ready_my', $('#switch-pushes-result-ready-my').prop('checked'));
dbSettingsSet('notify_channel_' + BOATCLASS + '_result_ready_all', $('#switch-pushes-result-ready-all').prop('checked'));
dbSettingsSet('notify_channel_' + BOATCLASS + '_meldeschluss', $('#switch-pushes-meldeschluss').prop('checked'));
}
function pushesOpenMenu() {
$('#menu-settings').hideMenu();
if (!pushesPossible) {
toastWarn('Dein Browser unterst&uuml;tzt leider keine Benachrichtigungen.', 5000);
return;
}
if (Notification.permission == 'denied') {
toastWarn('Benachrichtigungen werden von Deinem Browser blockiert.', 5000);
return;
}
swRegistration.pushManager.getSubscription().then(function(subscription) {
var isSub = (subscription !== null);
$('#switch-pushes').prop('checked', isSub);
updatePushSwitches();
$('#menu-pushes').showMenu();
});
}
function updatePushBadge() {
if (!pushesPossible) return;
if (Notification.permission == 'denied') {
$('#badge-pushes').removeClass('bg-green2-dark').addClass('bg-red2-dark').text('BLOCKED');
return;
}
swRegistration.pushManager.getSubscription().then(function(subscription) {
var isSub = (subscription !== null);
if (isSub) {
$('#badge-pushes').removeClass('bg-red2-dark').addClass('bg-green2-dark').text('AN');
} else {
$('#badge-pushes').removeClass('bg-green2-dark').addClass('bg-red2-dark').text('AUS');
}
});
}
async function updateNewsBadge() {
var newsRead = await dbSettingsGet('news_read_' + BOATCLASS);
if (newsRead === null) dbSettingsSet('news_read_' + BOATCLASS, newsRead = new Date());
var news = await dbGetData('news');
var now = new Date();
var sum = 0;
for (var n in news) {
var newsEntry = news[n];
newsEntry.date = new Date(Date.parse(newsEntry.date));
if (newsEntry.date > now) continue;
if (newsEntry.date < newsRead) continue;
sum ++;
}
updateBadge('more/news', sum);
} }
var initRegatten = function() { var initRegatten = function() {
showLoader(); showLoader();
initDatabase(); initDatabase();
if (isLoggedIn()) { if (isLoggedIn()) {
$('.show-loggedin').show(); $('.show-loggedin').show();
$('.show-notloggedin').hide(); $('.show-notloggedin').hide();
@@ -235,4 +453,51 @@ var initRegatten = function() {
$('.show-loggedin').hide(); $('.show-loggedin').hide();
$('.show-notloggedin').show(); $('.show-notloggedin').show();
} }
}
// Pushes
$('#a-switch-pushes').click(pushesSubscribeClicked);
$('.a-switch-pushes-channel-all').click(pushesChannelClicked);
$('.a-switch-pushes-channel-my').click(pushesChannelClicked);
}
var onServiceWorkerLoaded = function() {
if ((swRegistration !== null) && canUseLocalDB) {
pushesPossible = true;
updatePushBadge();
} else {
$('#badge-pushes').removeClass('bg-green2-dark').addClass('bg-red2-dark').text('NOT SUPPORTED');
}
}
var onDatabaseLoaded = function() {
onServiceWorkerLoaded();
initPushSettings();
updateNewsBadge();
}
var onAfterSync = function() {
updateNewsBadge();
}
// Add console opener to preloader
var addConsoleOpenerToPreloader = function() {
addConsoleOpenerToPreloader = function(){};
var preloader = document.getElementById('preloader');
var button = document.createElement('a');
button.href = '#';
button.classList = 'btn btn-full rounded-s text-uppercase font-900 shadow-m bg-highlight m-3';
button.style.position = 'fixed';
button.style.bottom = 0;
button.style.left = 0;
button.style.right = 0;
button.innerHTML = 'Show Console';
button.onclick = function(){
mobileConsole.displayConsole();
return false;
}
setTimeout(function(){
preloader.appendChild(button);
}, 5000);
}
addConsoleOpenerToPreloader();

View File

@@ -173,6 +173,13 @@
text-align: right; text-align: right;
} }
/*** BLOCKQUOTE ***/
blockquote {
border-left: 0.5em solid rgba(0, 0, 0, 0.125);
font-style: italic;
padding-left: 1em;
}
/*** BLINKING ICONS ***/ /*** BLINKING ICONS ***/
@keyframes fa-blink { @keyframes fa-blink {
0% { opacity: 1; } 0% { opacity: 1; }
@@ -187,4 +194,4 @@
-ms-animation: fa-blink .75s linear infinite; -ms-animation: fa-blink .75s linear infinite;
-o-animation: fa-blink .75s linear infinite; -o-animation: fa-blink .75s linear infinite;
animation: fa-blink .75s linear infinite; animation: fa-blink .75s linear infinite;
} }

View File

@@ -4254,7 +4254,7 @@ code {
} }
/*Contact Form*/ /*Contact Form*/
.menu input[type="text"] { /*.menu input[type="text"] {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
@@ -4271,7 +4271,7 @@ code {
.menu .form-field label { .menu .form-field label {
font-size: 12px; font-size: 12px;
margin-bottom: -10px; margin-bottom: -10px;
} }*/
.form-field span { .form-field span {
position: absolute; position: absolute;

View File

@@ -4,18 +4,18 @@
error_reporting(0); // disable error reporting in browser error_reporting(0); // disable error reporting in browser
define('SEND_ERRORS', true); // send errors via log define('SEND_ERRORS', true); // send errors via log
define('BOATCLASS', 'pirat');
date_default_timezone_set('Europe/Berlin'); date_default_timezone_set('Europe/Berlin');
define('SERVER_PATH', '/subfolder'); // path to root directory define('SERVER_PATH', '/subfolder'); // path to root directory
define('SERVER_ADDR', 'https://' . $_SERVER['SERVER_NAME'] . SERVER_PATH); // path to root directory define('SERVER_ADDR', 'https://' . $_SERVER['SERVER_NAME'] . SERVER_PATH); // path to root directory
define('QUERY_URL', 'http://' . $_SERVER['SERVER_NAME'] . '/api/' . BOATCLASS . '/'); // url to api backend
define('LOGGING_APIKEY', 'xxx'); // Apikey for Logging API -> get from ostertun.net/logging define('LOGGING_APIKEY', 'xxx'); // Apikey for Logging API -> get from ostertun.net/logging
// PUSH SERVER // PUSH
define('PUSH_AUTH', 'xxxxxxx'); // auth string for push.ostertun.net define('PUSH_SERVER_KEY', '');
define('PUSH_SERVERKEY', 'xxxxxxx'); // server key from push.ostertun.net
define('BOATCLASS', 'pirat'); // BOAT CLASS
// BOAT CLASSES
$_CLASS = array( $_CLASS = array(
'name' => 'Pirat', 'name' => 'Pirat',
'desc' => 'eine vom DSV gef&ouml;rderte Jugendmeisterschaftsklasse', 'desc' => 'eine vom DSV gef&ouml;rderte Jugendmeisterschaftsklasse',

View File

@@ -35,6 +35,11 @@
$items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe', 'css-class' => 'border-0']); $items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe', 'css-class' => 'border-0']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-boat', 'title' => 'Boots-Details', 'height' => 200]); $sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-boat', 'title' => 'Boots-Details', 'height' => 200]);
$items = '<p class="mb-2 mt-1" style="line-height: 1.5em;">Bitte trage hier den Bootsnamen ein:</p>';
$items .= $tpl->load('input', ['html-id' => 'input-editboatname', 'placeholder' => 'Bootsname', 'type' => 'text']);
$items .= $tpl->load('button', ['Speichern', '#', 'html-id' => 'button-editboatname']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-editboatname', 'height' => 240]);
$sp['scripts'] .= $scripts->load('pagination', ['pageChange', 'page', 'pageCount', 'pagination']); $sp['scripts'] .= $scripts->load('pagination', ['pageChange', 'page', 'pageCount', 'pagination']);
$sp['scripts'] .= $scripts->load('boats'); $sp['scripts'] .= $scripts->load('boats');

View File

@@ -1,19 +1,38 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Kontakt - Regatten.net ' . $_CLASS['name'];
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = true; $sp['backbutton'] = true;
$sp['activenav'] = 5;
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); // TITLE
$content .= '<p>'; $content = '<h1>Kontakt</h1>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>';
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>'; $sp['output'] .= $tpl->load('card', [$content]);
$content .= 'Wie w&auml;re es mit der Homepage?';
// Info
$content = '<p>';
$content .= 'Du hast eine Frage? Du hast einen Fehler in unserer Software oder in den gespeicherten Daten gefunden? Du willst Regatten.net auch f&uuml;r Deine Bootsklasse nutzen?<br>';
$content .= 'Egal was es ist, lass es uns wissen! Schreibe uns eine Mail an <a href="mailto:info@regatten.net">info@regatten.net</a> oder nutze einfach dieses Kontakt-Formular.<br>';
$content .= 'Wir werden Deine Anfrage so schnell wie m&ouml;glich bearbeiten.';
$content .= '</p>';
$content .= '<p>';
$content .= 'Alternativ erreichst Du uns auch telefonisch unter <a href="tel:+4941039659768">+49 (0) 4103 965 976 8</a><br>';
$content .= 'Mo-Fr: 7-20 Uhr<br>';
$content .= 'Sa: 9-17 Uhr';
$content .= '</p>'; $content .= '</p>';
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']);
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); $sp['output'] .= $tpl->load('card', [$content]);
// Formular
$content = '<h2>Kontakt-Formular</h2>';
$content .= $tpl->load('input', ['html-id' => 'input-name', 'placeholder' => 'Dein Name', 'type' => 'text']);
$content .= $tpl->load('input', ['html-id' => 'input-email', 'placeholder' => 'Email-Adresse', 'type' => 'email']);
$content .= $tpl->load('input', ['html-id' => 'input-subject', 'placeholder' => 'Betreff', 'type' => 'text']);
$content .= $tpl->load('textarea', ['html-id' => 'input-message', 'placeholder' => 'Deine Nachricht']);
$content .= $tpl->load('button', ['Senden', '#', 'html-id' => 'button-send']);
$sp['output'] .= $tpl->load('card', [$content]);
$sp['scripts'] .= $scripts->load('contact');
?> ?>

View File

@@ -1,19 +1,28 @@
<?php <?php
// TODO: Create site $sp['title'] = 'News - Regatten.net ' . $_CLASS['name'];
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = true; $sp['backbutton'] = true;
$sp['activenav'] = 5;
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']);
$content .= '<p>'; // Title
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>'; $content = "<h1>Neuigkeiten</h1>";
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>'; $content .= '<p>Aktuelles der letzten zw&ouml;lf Monate</p>';
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>'; $sp['output'] .= $tpl->load('card', [$content]);
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']); $sp['output'] .= '<div id="news-entries"></div>';
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); // Pagination
$sp['output'] .= $tpl->load('pagination', ['html-id' => 'pagination']);
?>
// Menu
$sp['menus'] .= $tpl->load('menu/modal', ['html-id' => 'menu-news', 'title' => 'Details']);
$sp['scripts'] .= $scripts->load('pagination', ['pageChange', 'page', 'pageCount', 'pagination']);
$cardTemplate = $tpl->load('card', ['%CONTENT%', 'html-id' => '%ID%', 'css-class' => 'card-news']);
$cardTemplate = str_replace("\n", '', $cardTemplate);
$cardTemplate = str_replace("\r", '', $cardTemplate);
$sp['scripts'] .= "<script>const cardTemplate = '" . $cardTemplate . "';</script>";
$sp['scripts'] .= $scripts->load('news');
?>

View File

@@ -1,19 +1,48 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Saison-Planung - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = 'index';
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; $sp['activenav'] = 5;
$sp['backbutton'] = true;
// Title
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $content = '<h1>Saison-Planung</h1>';
$content .= '<p>'; $content .= '<p class="mb-1"><b>Hinweis:</b> Diese Seite kannst nur Du sehen.<br>Wenn Du Deine Saison-Planung teilen möchtest, <a id="a-share-planning">klicke hier</a></p>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>'; $content .= $tpl->load('button', ['<i class="fas fa-edit"></i>&ensp;bearbeiten', LINK_PRE . 'planning_edit']);
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>'; $content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>'; $sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-loggedin']);
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']); // Not loggedin
$content = '<h1>Saison-Planung</h1>';
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); $content .= '<p>Um Deine Saison-Planung zu sehen, musst Du angemeldet sein.<br><a href="#" data-menu="menu-login">Melde Dich hier an</a> oder <a href="#" data-menu="menu-signup">registriere Dich jetzt kostenlos</a>.</p>';
?> $sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-notloggedin']);
// Regattas
$content = '<p id="p-count" class="mb-0"></p>';
$content .= $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text', 'css-class' => 'mt-2']);
$content .= '<div id="div-regattas" class="regattas-list mb-0"></div>';
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas', 'css-class' => 'show-loggedin']);
// Menu
$items = '<p id="menu-item-yourplanning" class="mb-2 mt-1" style="line-height: 1.5em;"></p>';
$items .= $tpl->load('menu/item-icon', ['Status bearbeiten', '#', 'html-id' => 'menu-item-status', 'icon' => 'fa-edit']);
$items .= $tpl->load('menu/item-icon', ['Saison-Planungen', '', 'html-id' => 'menu-item-plannings', 'icon' => 'fa-calendar-alt']);
$items .= $tpl->load('menu/item-icon', ['Ergebnisse', '', 'html-id' => 'menu-item-results', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Bericht', '', 'html-id' => 'menu-item-bericht', 'icon' => 'fa-book']);
$items .= $tpl->load('menu/item-icon', ['Informationen', '', 'html-id' => 'menu-item-info', 'icon' => 'fa-info']);
$items .= $tpl->load('menu/item-icon-badge', ['Meldung', '', 'html-id' => 'menu-item-meldung', 'icon' => 'fa-file-signature', 'badge-id' => 'badge-regatta-meldung']);
$items .= $tpl->load('menu/item-icon', ['offizielle Ergebnisse', '', 'html-id' => 'menu-item-oresults', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-regatta', 'title' => 'Regatta-Details', 'height' => 320]);
// Menu Edit status
$items = $tpl->load('menu/item-switch', ['Gemeldet', 'html-id' => 'switch-status-gemeldet', 'icon' => 'fa-file-signature']);
$items .= $tpl->load('menu/item-switch', ['Bezahlt', 'html-id' => 'switch-status-bezahlt', 'icon' => 'fa-euro-sign', 'css-class' => 'border-0']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-status', 'title' => 'Status bearbeiten', 'height' => 220]);
$sp['scripts'] .= $scripts->load('onRegattaClicked');
$sp['scripts'] .= $scripts->load('planning');
?>

View File

@@ -1,19 +1,21 @@
<?php <?php
// TODO: Create site // TODO: Create site
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; $sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = true; $sp['backbutton'] = true;
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $content = $tpl->load('error', ['404', 'Seite existiert noch nicht']);
$content .= '<p>'; $content .= '<p>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>'; $content .= 'Du kannst die Saison-Planung momentan leider noch nicht in der App bearbeiten.<br>';
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>'; $content .= 'Bis diese Funktion implementiert wurde, erstelle Deine Saison-Planung bitte auf <a target="_blank" href="https://regatten.net/' . BOATCLASS . '/planning_edit">unserer Website</a>.<br>';
$content .= 'Wie w&auml;re es mit der Homepage?'; $content .= 'Deine Saison-Planung wird dann automatisch synchronisiert und ist dann auch in dieser App verf&uuml;gbar.<br>';
$content .= 'Wir arbeiten daran, dass Du Deine Saison-Planung bald auch in der App bearbeiten kannst.<br>';
$content .= '</p>'; $content .= '</p>';
$content .= $tpl->load('button', ['Zur Website', 'https://regatten.net/' . BOATCLASS, 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']); $content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']); $content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']);
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); $sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']);
?> ?>

View File

@@ -1,19 +1,27 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Saison-Planungen - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = 'planning';
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; $sp['activenav'] = 5;
$sp['backbutton'] = true;
// Title
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $content = '<h1>Saison-Planungen</h1>';
$content .= '<p>'; $content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>';
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>'; $sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-loggedin']);
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>'; // Not loggedin
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']); $content = '<h1>Saison-Planungen</h1>';
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']); $content .= '<p>Um die Saison-Planungen anderer zu sehen, musst Du angemeldet sein.<br><a href="#" data-menu="menu-login">Melde Dich hier an</a> oder <a href="#" data-menu="menu-signup">registriere Dich jetzt kostenlos</a>.</p>';
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); $sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-notloggedin']);
?> // Regattas
$content = $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text']);
$content .= '<div id="div-users" class="normal-list mb-0"></div>';
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas', 'css-class' => 'show-loggedin']);
$sp['scripts'] .= $scripts->load('planning_list');
?>

View File

@@ -1,19 +1,36 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Saison-Planung - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = 'planning_list';
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; $sp['activenav'] = 5;
$sp['backbutton'] = true;
// Title
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $content = '<h1>Saison-Planung</h1>';
$content .= '<p>'; $content .= '<p id="p-username" class="mb-1"></p>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>'; $content .= $tpl->load('button', ['<i class="fas fa-share-alt"></i>&ensp;Teilen', '#', 'html-id' => 'button-share']);
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>'; $content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>'; $sp['output'] .= $tpl->load('card', [$content]);
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']); // Regattas
$content = '<p id="p-count" class="mb-0"></p>';
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); $content .= $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text', 'css-class' => 'mt-2']);
$content .= '<div id="div-regattas" class="ranking-detail-list mb-0"></div>';
?>
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas']);
// Menu
$items = '<p id="menu-item-yourplanning" class="mb-2 mt-1" style="line-height: 1.5em;"></p>';
$items .= $tpl->load('menu/item-icon', ['Saison-Planungen', '', 'html-id' => 'menu-item-plannings', 'icon' => 'fa-calendar-alt']);
$items .= $tpl->load('menu/item-icon', ['Ergebnisse', '', 'html-id' => 'menu-item-results', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Bericht', '', 'html-id' => 'menu-item-bericht', 'icon' => 'fa-book']);
$items .= $tpl->load('menu/item-icon', ['Informationen', '', 'html-id' => 'menu-item-info', 'icon' => 'fa-info']);
$items .= $tpl->load('menu/item-icon-badge', ['Meldung', '', 'html-id' => 'menu-item-meldung', 'icon' => 'fa-file-signature', 'badge-id' => 'badge-regatta-meldung']);
$items .= $tpl->load('menu/item-icon', ['offizielle Ergebnisse', '', 'html-id' => 'menu-item-oresults', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-regatta', 'title' => 'Regatta-Details', 'height' => 320]);
$sp['scripts'] .= $scripts->load('onRegattaClicked');
$sp['scripts'] .= $scripts->load('planning_view');
?>

View File

@@ -35,6 +35,11 @@
$items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe', 'css-class' => 'border-0']); $items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe', 'css-class' => 'border-0']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-sailor', 'title' => 'Segler-Details', 'height' => 200]); $sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-sailor', 'title' => 'Segler-Details', 'height' => 200]);
$items = '<p class="mb-2 mt-1" style="line-height: 1.5em;">Bitte trage hier den Jahrgang ein:</p>';
$items .= $tpl->load('input', ['html-id' => 'input-edityear', 'placeholder' => 'Jahrgang', 'type' => 'number']);
$items .= $tpl->load('button', ['Speichern', '#', 'html-id' => 'button-edityear']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-edityear', 'height' => 240]);
$sp['scripts'] .= $scripts->load('pagination', ['pageChange', 'page', 'pageCount', 'pagination']); $sp['scripts'] .= $scripts->load('pagination', ['pageChange', 'page', 'pageCount', 'pagination']);
$sp['scripts'] .= $scripts->load('sailors'); $sp['scripts'] .= $scripts->load('sailors');

View File

@@ -3,27 +3,27 @@
<div class="content mb-0"> <div class="content mb-0">
<div class="divider mb-0"></div> <div class="divider mb-0"></div>
<div class="list-group list-custom-small list-icon-0"> <div class="list-group list-custom-small list-icon-0">
<a href="#" class="shareToFacebook"> <a href="#" class="shareToFacebook" target="_blank">
<i class="font-18 fab fa-facebook color-facebook"></i> <i class="font-18 fab fa-facebook color-facebook"></i>
<span class="font-13">Facebook</span> <span class="font-13">Facebook</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToTwitter"> <a href="#" class="shareToTwitter" target="_blank">
<i class="font-18 fab fa-twitter-square color-twitter"></i> <i class="font-18 fab fa-twitter-square color-twitter"></i>
<span class="font-13">Twitter</span> <span class="font-13">Twitter</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToLinkedIn"> <a href="#" class="shareToLinkedIn" target="_blank">
<i class="font-18 fab fa-linkedin color-linkedin"></i> <i class="font-18 fab fa-linkedin color-linkedin"></i>
<span class="font-13">LinkedIn</span> <span class="font-13">LinkedIn</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToWhatsApp"> <a href="#" class="shareToWhatsApp" target="_blank">
<i class="font-18 fab fa-whatsapp-square color-whatsapp"></i> <i class="font-18 fab fa-whatsapp-square color-whatsapp"></i>
<span class="font-13">WhatsApp</span> <span class="font-13">WhatsApp</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToMail border-0"> <a href="#" class="shareToMail border-0" target="_blank">
<i class="font-18 fa fa-envelope-square color-mail"></i> <i class="font-18 fa fa-envelope-square color-mail"></i>
<span class="font-13">Email</span> <span class="font-13">Email</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
@@ -92,7 +92,7 @@
</div> </div>
</div> </div>
<div id="menu-settings" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="270"> <div id="menu-settings" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="310">
<div class="menu-title"><h1>Einstellungen</h1><p class="color-highlight">&nbsp;</p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div> <div class="menu-title"><h1>Einstellungen</h1><p class="color-highlight">&nbsp;</p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div>
<div class="divider divider-margins mb-n2"></div> <div class="divider divider-margins mb-n2"></div>
<div class="content"> <div class="content">
@@ -110,7 +110,7 @@
<span>Login</span> <span>Login</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" data-menu="menu-signup" class="show-notloggedin border-0"> <a href="#" data-menu="menu-signup" class="show-notloggedin">
<i class="fa font-14 fa-user-plus rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-user-plus rounded-s bg-highlight color-white"></i>
<span>Registrieren</span> <span>Registrieren</span>
<span class="badge bg-red2-dark color-white">FREE</span> <span class="badge bg-red2-dark color-white">FREE</span>
@@ -120,40 +120,125 @@
<span>Account</span> <span>Account</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" onclick="logout();" class="show-loggedin border-0"> <a href="#" onclick="logout();" class="show-loggedin">
<i class="fa font-14 fa-sign-out-alt rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-sign-out-alt rounded-s bg-highlight color-white"></i>
<span>Logout</span> <span>Logout</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" onclick="pushesOpenMenu()" class="border-0">
<i class="fa font-14 fa-bell rounded-s bg-highlight color-white"></i>
<span>Benachrichtigungen</span>
<span id="badge-pushes" class="badge color-white"></span>
<i class="fa fa-angle-right"></i>
</a>
</div> </div>
</div> </div>
</div> </div>
<div id="menu-developer" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="310"> <div id="menu-pushes" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="500">
<div class="menu-title"><h1>Benachrichtigungen</h1><p class="color-highlight">Bleibe immer auf dem aktuellen Stand</p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div>
<div class="divider divider-margins mb-n2"></div>
<div class="content">
<div class="list-group list-custom-small">
<a id="a-switch-pushes" href="#" data-trigger-switch="switch-pushes" class="pb-2">
<i class="fa font-14 fa-bell rounded-s bg-highlight color-white"></i>
<span>Benachrichtigungen aktivieren</span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes">
<label class="custom-control-label" for="switch-pushes"></label>
</div>
</a>
<div class="divider"></div>
<p style="line-height: 1.5em;" id="p-pushes-info">
W&auml;hle hier, &uuml;ber was Du informiert werden m&ouml;chtest.<br>
(meine) bezieht sich auf die Regatten, die in Deiner Saison-Planung sind,<br>
(alle) informiert Dich &uuml;ber alle Regatten
</p>
<a href="#" data-trigger-switch="switch-pushes-news" class="pb-2 a-switch-pushes-channel-all">
<i class="fa font-14 fa-newspaper rounded-s bg-highlight color-white"></i>
<span>Neuigkeiten</span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-news">
<label class="custom-control-label" for="switch-pushes-news"></label>
</div>
</a>
<a href="#" data-trigger-switch="switch-pushes-regatta-changed-my" class="pb-2 a-switch-pushes-channel-my">
<i class="fa font-14 fa-calendar-check rounded-s bg-highlight color-white"></i>
<span>Regatta verschoben (meine)</span>
<span class="badge bg-red2-dark color-white"></span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-regatta-changed-my">
<label class="custom-control-label" for="switch-pushes-regatta-changed-my"></label>
</div>
</a>
<a href="#" data-trigger-switch="switch-pushes-regatta-changed-all" class="pb-2 a-switch-pushes-channel-all">
<i class="fa font-14 fa-calendar-check rounded-s bg-highlight color-white"></i>
<span>Regatta verschoben (alle)</span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-regatta-changed-all">
<label class="custom-control-label" for="switch-pushes-regatta-changed-all"></label>
</div>
</a>
<a href="#" data-trigger-switch="switch-pushes-result-ready-my" class="pb-2 a-switch-pushes-channel-my">
<i class="fa font-14 fa-poll rounded-s bg-highlight color-white"></i>
<span>Ergebnisse verf&uuml;gbar (meine)</span>
<span class="badge bg-red2-dark color-white"></span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-result-ready-my">
<label class="custom-control-label" for="switch-pushes-result-ready-my"></label>
</div>
</a>
<a href="#" data-trigger-switch="switch-pushes-result-ready-all" class="pb-2 a-switch-pushes-channel-all">
<i class="fa font-14 fa-poll rounded-s bg-highlight color-white"></i>
<span>Ergebnisse verf&uuml;gbar (alle)</span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-result-ready-all">
<label class="custom-control-label" for="switch-pushes-result-ready-all"></label>
</div>
</a>
<a href="#" data-trigger-switch="switch-pushes-meldeschluss" class="pb-2 a-switch-pushes-channel-my">
<i class="fa font-14 fa-file-signature rounded-s bg-highlight color-white"></i>
<span>Melde-Erinnerungen</span>
<span class="badge bg-red2-dark color-white"></span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-meldeschluss">
<label class="custom-control-label" for="switch-pushes-meldeschluss"></label>
</div>
</a>
</div>
</div>
</div>
<div id="menu-developer" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="360">
<div class="menu-title"><h1>Entwickler-Optionen</h1><p class="color-highlight">Version <?php echo PWA_VERSION; ?></p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div> <div class="menu-title"><h1>Entwickler-Optionen</h1><p class="color-highlight">Version <?php echo PWA_VERSION; ?></p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div>
<div class="divider divider-margins mb-n2"></div> <div class="divider divider-margins mb-n2"></div>
<div class="content"> <div class="content">
<div class="list-group list-custom-small"> <div class="list-group list-custom-small">
<a href="https://info.ostertun.net/regatten/beta"> <a href="https://github.com/ostertun/RegattenApp/wiki">
<i class="fa font-14 fa-info rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-info rounded-s bg-highlight color-white"></i>
<span>Infos zur BETA</span> <span>App-Wiki</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="javascript:resetDb(false);"> <a href="javascript:deleteDb();">
<i class="fa font-14 fa-database rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-database rounded-s bg-highlight color-white"></i>
<span>Reset Database</span> <span>Reset Database</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="javascript:resetCache();"> <a href="javascript:deleteCache();">
<i class="fa font-14 fa-trash-alt rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-trash-alt rounded-s bg-highlight color-white"></i>
<span>Reset Cache</span> <span>Reset Cache</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="https://report.regatten.net/" class="border-0"> <a href="https://github.com/ostertun/RegattenApp/issues">
<i class="fa font-14 fa-bug rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-bug rounded-s bg-highlight color-white"></i>
<span>Problem melden</span> <span>Problem melden</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" onclick="mobileConsole.displayConsole(); return false;" class="border-0 menu-close">
<i class="fa font-14 fa-terminal rounded-s bg-highlight color-white"></i>
<span>Console anzeigen</span>
<i class="fa fa-angle-right"></i>
</a>
</div> </div>
</div> </div>
</div> </div>
@@ -181,7 +266,7 @@
<p class="text-center"> <p class="text-center">
Momentan kannst Du Dich leider nicht in der App registrieren.<br> Momentan kannst Du Dich leider nicht in der App registrieren.<br>
Das ist aber kein Problem, registriere Dich einfach kostenlos auf unserer Website! Das ist aber kein Problem, registriere Dich einfach kostenlos auf unserer Website!
</p> </p>
<a href="https://regatten.net/de/signup" class="btn btn-center-xl btn-m shadow-xl rounded-s bg-highlight font-900 text-center">Registrieren</a> <a href="https://regatten.net/de/signup" class="btn btn-center-xl btn-m shadow-xl rounded-s bg-highlight font-900 text-center">Registrieren</a>
<p class="text-center font-10 bottom-0">Du kannst Dich danach in dieser App anmelden.</p> <p class="text-center font-10 bottom-0">Du kannst Dich danach in dieser App anmelden.</p>
</div> </div>
@@ -197,7 +282,7 @@
Vielen Dank f&uuml;r Deine Unterst&uuml;tzung! Vielen Dank f&uuml;r Deine Unterst&uuml;tzung!
</p> </p>
<p> <p>
Mehr Informationen findest <a href="https://info.ostertun.net/regatten/beta">hier</a>. Mehr Informationen findest Du <a href="https://info.ostertun.net/regatten/beta">hier</a>.
</p> </p>
<p> <p>
Mit der Nutzung dieser App erkl&auml;rst Du Dich au&szlig;erdem damit einverstanden, dass wir Cookies einsetzen. Mit der Nutzung dieser App erkl&auml;rst Du Dich au&szlig;erdem damit einverstanden, dass wir Cookies einsetzen.
@@ -212,8 +297,8 @@
<h1 class="text-center mt-5 font-900">Update Verfügbar</h1> <h1 class="text-center mt-5 font-900">Update Verfügbar</h1>
<p class="text-center"> <p class="text-center">
Eine neue Version unserer App ist verf&uuml;gbar. Keine Sorge, Du musst nichts machen. Wir aktuallisieren den Inhalt in wenigen Sekunden. Eine neue Version unserer App ist verf&uuml;gbar. Keine Sorge, Du musst nichts machen. Wir aktuallisieren den Inhalt in wenigen Sekunden.
</p> </p>
<a href="#" class="page-update btn btn-center-xl btn-m shadow-xl rounded-s bg-highlight font-900 text-center">Update</a> <a href="#" class="page-update btn btn-center-xl btn-m shadow-xl rounded-s bg-highlight font-900 text-center">Update</a>
<p class="text-center font-10 bottom-0">Die App wird neu laden und das Update ist abgeschlossen.</p> <p class="text-center font-10 bottom-0">Die App wird neu laden und das Update ist abgeschlossen.</p>
</div> </div>
</div> </div>

View File

@@ -1,7 +1,8 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html lang="de"> <html lang="de">
<head> <head>
<script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/mobileconsole.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
@@ -16,36 +17,36 @@
<link rel="icon" type="image/x-icon" href="<?php echo SERVER_ADDR; ?>/client/app/icons/favicon.ico"> <link rel="icon" type="image/x-icon" href="<?php echo SERVER_ADDR; ?>/client/app/icons/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="<?php echo SERVER_ADDR; ?>/client/app/icons/icon-192x192.png"> <link rel="apple-touch-icon" sizes="180x180" href="<?php echo SERVER_ADDR; ?>/client/app/icons/icon-192x192.png">
</head> </head>
<body class="detect-theme" data-background="none" data-highlight="blue2"> <body class="detect-theme" data-background="none" data-highlight="blue2">
<div id="preloader"><div class="spinner-border color-highlight" role="status"></div></div> <div id="preloader"><div class="spinner-border color-highlight" role="status"></div></div>
<div id="page"> <div id="page">
<?php include(__DIR__ . '/headerfooter.php'); ?> <?php include(__DIR__ . '/headerfooter.php'); ?>
<!--start of page content, add your stuff here--> <!--start of page content, add your stuff here-->
<div class="page-content header-clear-medium"> <div class="page-content header-clear-medium">
<?php echo $sp['output']; ?> <?php echo $sp['output']; ?>
</div> </div>
<!--end of page content, off canvas elements here--> <!--end of page content, off canvas elements here-->
<?php include(__DIR__ . '/menus.php'); ?> <?php include(__DIR__ . '/menus.php'); ?>
<?php echo $sp['menus']; ?> <?php echo $sp['menus']; ?>
<?php <?php
if ($site == 'index') { if ($site == 'index') {
include(__DIR__ . '/install.php'); include(__DIR__ . '/install.php');
} }
?> ?>
<!--end of div id page--> <!--end of div id page-->
</div> </div>
<?php echo $sp['scripts']; ?> <?php echo $sp['scripts']; ?>
<script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/jquery.js"></script> <script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/jquery.js"></script>
<script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/bootstrap.min.js"></script> <script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/bootstrap.min.js"></script>
<script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/strings.js.php"></script> <script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/strings.js.php"></script>
@@ -55,5 +56,5 @@
<script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/custom.js.php"></script> <script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/custom.js.php"></script>
<script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/pwa.js.php"></script> <script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/pwa.js.php"></script>
</body> </body>
</html> </html>

View File

@@ -5,19 +5,65 @@ var page = 1;
var pageCount = 0; var pageCount = 0;
const showCount = 25; const showCount = 25;
async function onEditBoatnameClick() {
var id = $('#button-editboatname').attr('data-boat-id');
var name = $('#input-editboatname').val();
if (name != '') {
showLoader();
$.ajax({
url: QUERY_URL + 'add_boatname',
method: 'POST',
data: {
boat: id,
name: name
},
error: function (xhr, status, error) {
if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Bootsnamen zu bearbeiten');
} else {
log('EditBoatname: unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
hideLoader();
},
success: function (data, status, xhr) {
if ('status' in data) {
if (data.status == 'added') {
toastOk('Bootsnamen erfolgreich hinzugefügt');
sync();
} else {
toastInfo('Wir prüfen Deine Anfrage und korrigieren den Bootsnamen schnellstmöglich', 5000);
}
} else {
toastOk('Erfolgreich');
}
hideLoader();
}
});
}
$('#menu-editboatname').hideMenu();
}
async function onListClicked(id) { async function onListClicked(id) {
var boat = await dbGetData('boats', id); var boat = await dbGetData('boats', id);
$('#menu-boat').find('.menu-title').find('p').text(boat.sailnumber); $('#menu-boat').find('.menu-title').find('p').text(boat.sailnumber);
// Edit Boatname // Edit Boatname
// TODO: create menu for edit boatname $('#button-editboatname').attr('data-boat-id', boat.id);
$('#menu-editboatname').find('.menu-title').find('p').text(boat.sailnumber);
if (boat['name'] == '') { if (boat['name'] == '') {
$('#menu-item-boatname').find('span').text('Bootsnamen hinzufügen'); $('#menu-item-boatname').find('span').text('Bootsnamen hinzufügen');
$('#menu-editboatname').find('.menu-title').find('h1').text('Bootsnamen hinzufügen');
$('#input-editboatname').val('');
} else { } else {
$('#menu-item-boatname').find('span').text('Bootsnamen bearbeiten'); $('#menu-item-boatname').find('span').text('Bootsnamen bearbeiten');
$('#menu-editboatname').find('.menu-title').find('h1').text('Bootsnamen bearbeiten');
$('#input-editboatname').val(boat.name);
} }
$('#input-editboatname').trigger('focusin').trigger('focusout');
// club website // club website
var clubwebsite = ''; var clubwebsite = '';
if (boat['club'] != null) { if (boat['club'] != null) {
@@ -30,7 +76,7 @@ async function onListClicked(id) {
} else { } else {
$('#menu-item-clubwebsite').hide(); $('#menu-item-clubwebsite').hide();
} }
$('#menu-boat').showMenu(); $('#menu-boat').showMenu();
$('#menu-boat').scrollTop(0); $('#menu-boat').scrollTop(0);
} }
@@ -43,19 +89,19 @@ function pageChange() {
async function drawList() { async function drawList() {
window.setTimeout(function () { window.setTimeout(function () {
var list = ''; var list = '';
if (displayed.length > 0) { if (displayed.length > 0) {
var offset = (page - 1) * showCount; var offset = (page - 1) * showCount;
var count = (page == pageCount ? (displayed.length % showCount) : showCount); var count = (page == pageCount ? (displayed.length % showCount) : showCount);
if (count == 0) count = showCount; if (count == 0) count = showCount;
for (i = 0; i < count; i ++) { for (i = 0; i < count; i ++) {
list += displayed[i + offset]; list += displayed[i + offset];
} }
} else { } else {
list = '<div><div>Keine Ergebnisse, die der Suche entsprechen</div></div>'; list = '<div><div>Keine Ergebnisse, die der Suche entsprechen</div></div>';
} }
$('#div-list').html(list); $('#div-list').html(list);
}, 0); }, 0);
} }
@@ -86,10 +132,12 @@ var siteScript = async function() {
firstCall = false; firstCall = false;
initPagination(); initPagination();
$('#input-search').on('input', reSearch); $('#input-search').on('input', reSearch);
$('#menu-item-boatname').click(function(){ $('#menu-boat').hideMenu(); $('#menu-editboatname').showMenu(); });
$('#button-editboatname').click(onEditBoatnameClick);
} }
var results = await dbGetData('boats'); var results = await dbGetData('boats');
var count = results.length; var count = results.length;
if (count > 0) { if (count > 0) {
if (count == 1) { if (count == 1) {
@@ -99,51 +147,51 @@ var siteScript = async function() {
} }
$('#div-list').show(); $('#div-list').show();
$('#input-search').parent().show(); $('#input-search').parent().show();
results.sort(function (a, b) { results.sort(function (a, b) {
return a.sailnumber.localeCompare(b.sailnumber); return a.sailnumber.localeCompare(b.sailnumber);
}); });
rows = []; rows = [];
for (id in results) { for (id in results) {
var entry = results[id]; var entry = results[id];
var club = null; var club = null;
if (entry['club'] != null) if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']); club = await dbGetData('clubs', entry['club']);
var row = { keywords: [], content: '' }; var row = { keywords: [], content: '' };
row.keywords.push(entry['sailnumber']); row.keywords.push(entry['sailnumber']);
if (entry['name'] != '') row.keywords.push(entry['name']); if (entry['name'] != '') row.keywords.push(entry['name']);
if (club != null) row.keywords.push(club['kurz'], club['name']); if (club != null) row.keywords.push(club['kurz'], club['name']);
row.content += '<div onclick="onListClicked(' + entry['id'] + ');">'; row.content += '<div onclick="onListClicked(' + entry['id'] + ');">';
// ZEILE 1 // ZEILE 1
// Sailnumber // Sailnumber
row.content += '<div><b>' + entry['sailnumber'] + '</b></div>'; row.content += '<div><b>' + entry['sailnumber'] + '</b></div>';
// ZEILE 2 // ZEILE 2
row.content += '<div>'; row.content += '<div>';
// Name // Name
row.content += '<div>' + entry['name'] + '</div>'; row.content += '<div>' + entry['name'] + '</div>';
// Club // Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>'; row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
row.content += '</div></div>'; row.content += '</div></div>';
rows.push(row); rows.push(row);
} }
reSearch(); reSearch();
} else { } else {
$('#p-count').html('Keine Boote gefunden!'); $('#p-count').html('Keine Boote gefunden!');
$('#div-list').hide(); $('#div-list').hide();
$('#input-search').parent().hide(); $('#input-search').parent().hide();
} }
hideLoader(); hideLoader();
} }

View File

@@ -42,7 +42,7 @@ function addRace() {
var m = parseFloat($('#input-m').val()); var m = parseFloat($('#input-m').val());
var fb = parseFloat($('#input-fb').val()); var fb = parseFloat($('#input-fb').val());
var pl = parseFloat($('#input-pl').val().replace(',', '.')); var pl = parseFloat($('#input-pl').val().replace(',', '.'));
if (isNaN(rlf) || (rlf < 1) || (rlf > 1.6)) { if (isNaN(rlf) || (rlf < 1) || (rlf > 1.6)) {
toastError('RLF ungültig'); toastError('RLF ungültig');
return; return;
@@ -59,7 +59,7 @@ function addRace() {
toastError('pl ungültig'); toastError('pl ungültig');
return; return;
} }
var race = { var race = {
rlf: rlf, rlf: rlf,
m: m, m: m,
@@ -67,12 +67,12 @@ function addRace() {
pl: pl, pl: pl,
rlp: (100 * rlf * ((fb + 1 - pl) / fb)) rlp: (100 * rlf * ((fb + 1 - pl) / fb))
}; };
$('#input-rlf').val(''); $('#input-rlf').val('').trigger('focusin').trigger('focusout');
$('#input-m').val(''); $('#input-m').val('').trigger('focusin').trigger('focusout');
$('#input-fb').val(''); $('#input-fb').val('').trigger('focusin').trigger('focusout');
$('#input-pl').val(''); $('#input-pl').val('').trigger('focusin').trigger('focusout');
races.push(race); races.push(race);
reCalc(); reCalc();
} }
@@ -89,4 +89,4 @@ var siteScript = async function () {
} }
reCalc(); reCalc();
hideLoader(); hideLoader();
} }

49
server/scripts/contact.js Normal file
View File

@@ -0,0 +1,49 @@
function sendMessage() {
var name = $('#input-name').val();
var email = $('#input-email').val();
var subject = $('#input-subject').val();
var message = $('#input-message').val();
if ((name == '') || (email == '') || (subject == '') || (message == '')) {
toastError('Bitte f&uuml;lle alle Felder aus!');
return;
}
showLoader();
$.ajax({
url: QUERY_URL + 'contact',
method: 'POST',
data: {
name: name,
email: email,
subject: subject,
message: message
},
error: function (xhr, status, error) {
if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um eine Nachricht zu versenden');
} else {
log('Contact: unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
hideLoader();
},
success: function (data, status, xhr) {
toastOk('Nachricht erfolgreich versandt!');
$('#input-subject').val('').trigger('focusin').trigger('focusout');
$('#input-message').val('').trigger('focusin').trigger('focusout');
hideLoader();
}
});
}
var siteScript = async function () {
if (isLoggedIn()) {
var user = await dbGetData('users', USER_ID);
$('#input-name').val(user.username).trigger('focusin').trigger('focusout');
$('#input-email').val(user.email).trigger('focusin').trigger('focusout');
}
$('#button-send').click(sendMessage);
hideLoader();
}

View File

@@ -2,12 +2,12 @@ var today;
var siteScript = async function() { var siteScript = async function() {
today = getToday(); today = getToday();
if (isLoggedIn()) { if (isLoggedIn()) {
$('#card-notloggedin').hide(); $('#card-notloggedin').hide();
var user = await dbGetData('users', localStorage.getItem('auth_user')); var user = await dbGetData('users', localStorage.getItem('auth_user'));
// Favorites // Favorites
var watched = []; var watched = [];
for (var i = 1; i <= 5; i ++) { for (var i = 1; i <= 5; i ++) {
@@ -46,11 +46,11 @@ var siteScript = async function() {
$('#p-favorites').show(); $('#p-favorites').show();
} }
$('#card-favorites').show(); $('#card-favorites').show();
// Your next // Your next
var planningsDB = await dbGetDataIndex('plannings', 'user', user.id); var planningsDB = await dbGetDataIndex('plannings', 'user', user.id);
var minDate = getToday(); var minDate = getToday();
minDate.setDate(minDate.getDate() - 1); minDate.setDate(minDate.getDate());
var maxDate = getToday(); var maxDate = getToday();
maxDate.setDate(maxDate.getDate() + 28); maxDate.setDate(maxDate.getDate() + 28);
var regattas = await dbGetRegattasRange(minDate, maxDate); var regattas = await dbGetRegattasRange(minDate, maxDate);
@@ -75,35 +75,35 @@ var siteScript = async function() {
for (i in plannings) { for (i in plannings) {
var planning = plannings[i]; var planning = plannings[i];
var regatta = planning.regatta; var regatta = planning.regatta;
if (regatta['length'] < 1) continue; if (regatta['length'] < 1) continue;
var club = null; var club = null;
if (regatta['club'] != null) if (regatta['club'] != null)
club = await dbGetData('clubs', regatta['club']); club = await dbGetData('clubs', regatta['club']);
var dateFrom = regatta['dateFrom']; var dateFrom = regatta['dateFrom'];
var dateTo = regatta['dateTo']; var dateTo = regatta['dateTo'];
// output // output
list += '<div onclick="onRegattaClicked(' + regatta['id'] + ');">'; list += '<div onclick="onRegattaClicked(' + regatta['id'] + ');">';
// ZEILE 1 // ZEILE 1
// Name // Name
list += '<div><b>' + (regatta['canceled'] == 1 ? '<s>' : '') + regatta['name'] + (regatta['canceled'] == 1 ? '</s>' : '') + '</b></div>'; list += '<div><b>' + (regatta['canceled'] == 1 ? '<s>' : '') + regatta['name'] + (regatta['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2 // ZEILE 2
list += '<div>'; list += '<div>';
// Number // Number
list += '<div>' + ((regatta['number'] != null) ? ('# ' + regatta['number']) : '') + '</div>'; list += '<div>' + ((regatta['number'] != null) ? ('# ' + regatta['number']) : '') + '</div>';
// Club // Club
list += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>'; list += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
// Special // Special
list += '<div>' + regatta['special'] + '</div>'; list += '<div>' + regatta['special'] + '</div>';
// Icons // Icons
var icons = []; var icons = [];
if (regatta['info'] != '') if (regatta['info'] != '')
@@ -120,8 +120,10 @@ var siteScript = async function() {
ms = parseDate(regatta['meldungSchluss']); ms = parseDate(regatta['meldungSchluss']);
} }
var diff = Math.round((ms - today) / 86400000); var diff = Math.round((ms - today) / 86400000);
if ((ms >= today) && (diff < 7)) { if (ms < today) {
color = ' color-red2-dark'; color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
} }
} }
} }
@@ -134,18 +136,18 @@ var siteScript = async function() {
icons.push('<i class="fas fa-times color-red2-dark"></i>'); icons.push('<i class="fas fa-times color-red2-dark"></i>');
} }
list += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>'; list += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>';
list += '</div>'; list += '</div>';
// ZEILE 3 // ZEILE 3
list += '<div>'; list += '<div>';
// Date // Date
list += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>'; list += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
// RLF // RLF
list += '<div>' + parseFloat(regatta['rlf']).toFixed(2) + '</div>'; list += '<div>' + parseFloat(regatta['rlf']).toFixed(2) + '</div>';
list += '</div></div>'; list += '</div></div>';
} }
$('#div-yournext').html(list); $('#div-yournext').html(list);
@@ -161,10 +163,10 @@ var siteScript = async function() {
$('#card-yournext').hide(); $('#card-yournext').hide();
$('#card-notloggedin').show(); $('#card-notloggedin').show();
} }
// Next // Next
var minDate = getToday(); var minDate = getToday();
minDate.setDate(minDate.getDate() - 1); minDate.setDate(minDate.getDate());
var maxDate = getToday(); var maxDate = getToday();
maxDate.setDate(maxDate.getDate() + 14); maxDate.setDate(maxDate.getDate() + 14);
var regattas = await dbGetRegattasRange(minDate, maxDate); var regattas = await dbGetRegattasRange(minDate, maxDate);
@@ -172,35 +174,35 @@ var siteScript = async function() {
list = ''; list = '';
for (i in regattas) { for (i in regattas) {
var regatta = regattas[i]; var regatta = regattas[i];
if (regatta['length'] < 1) continue; if (regatta['length'] < 1) continue;
var club = null; var club = null;
if (regatta['club'] != null) if (regatta['club'] != null)
club = await dbGetData('clubs', regatta['club']); club = await dbGetData('clubs', regatta['club']);
var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']); var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']);
var dateFrom = regatta['dateFrom']; var dateFrom = regatta['dateFrom'];
var dateTo = regatta['dateTo']; var dateTo = regatta['dateTo'];
// output // output
list += '<div onclick="onRegattaClicked(' + regatta['id'] + ');">'; list += '<div onclick="onRegattaClicked(' + regatta['id'] + ');">';
// ZEILE 1 // ZEILE 1
// Name // Name
list += '<div><b>' + (regatta['canceled'] == 1 ? '<s>' : '') + regatta['name'] + (regatta['canceled'] == 1 ? '</s>' : '') + '</b></div>'; list += '<div><b>' + (regatta['canceled'] == 1 ? '<s>' : '') + regatta['name'] + (regatta['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2 // ZEILE 2
list += '<div>'; list += '<div>';
// Number // Number
list += '<div>' + ((regatta['number'] != null) ? ('# ' + regatta['number']) : '') + '</div>'; list += '<div>' + ((regatta['number'] != null) ? ('# ' + regatta['number']) : '') + '</div>';
// Club // Club
list += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>'; list += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
// Special // Special
list += '<div>' + regatta['special'] + '</div>'; list += '<div>' + regatta['special'] + '</div>';
// Icons // Icons
var icons = []; var icons = [];
if (regatta['info'] != '') if (regatta['info'] != '')
@@ -227,8 +229,10 @@ var siteScript = async function() {
ms = parseDate(regatta['meldungSchluss']); ms = parseDate(regatta['meldungSchluss']);
} }
var diff = Math.round((ms - today) / 86400000); var diff = Math.round((ms - today) / 86400000);
if ((ms >= today) && (diff < 7)) { if (ms < today) {
color = ' color-red2-dark'; color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
} }
} }
} }
@@ -241,18 +245,18 @@ var siteScript = async function() {
icons.push('<i class="fas fa-times color-red2-dark"></i>'); icons.push('<i class="fas fa-times color-red2-dark"></i>');
} }
list += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>'; list += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>';
list += '</div>'; list += '</div>';
// ZEILE 3 // ZEILE 3
list += '<div>'; list += '<div>';
// Date // Date
list += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>'; list += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
// RLF // RLF
list += '<div>' + parseFloat(regatta['rlf']).toFixed(2) + '</div>'; list += '<div>' + parseFloat(regatta['rlf']).toFixed(2) + '</div>';
list += '</div></div>'; list += '</div></div>';
} }
$('#div-next').html(list); $('#div-next').html(list);
@@ -262,7 +266,7 @@ var siteScript = async function() {
$('#div-next').hide(); $('#div-next').hide();
$('#p-next').show(); $('#p-next').show();
} }
// Last // Last
var minDate = getToday(); var minDate = getToday();
minDate.setDate(minDate.getDate() - 14); minDate.setDate(minDate.getDate() - 14);
@@ -279,35 +283,35 @@ var siteScript = async function() {
list = ''; list = '';
for (i in regattas) { for (i in regattas) {
var regatta = regattas[i]; var regatta = regattas[i];
if (regatta['length'] < 1) continue; if (regatta['length'] < 1) continue;
var club = null; var club = null;
if (regatta['club'] != null) if (regatta['club'] != null)
club = await dbGetData('clubs', regatta['club']); club = await dbGetData('clubs', regatta['club']);
var dateFrom = regatta['dateFrom']; var dateFrom = regatta['dateFrom'];
var dateTo = regatta['dateTo']; var dateTo = regatta['dateTo'];
// output // output
list += '<div onclick="onRegattaClicked(' + regatta['id'] + ');">'; list += '<div onclick="onRegattaClicked(' + regatta['id'] + ');">';
// ZEILE 1 // ZEILE 1
// Name // Name
list += '<div><b>' + (regatta['canceled'] == 1 ? '<s>' : '') + regatta['name'] + (regatta['canceled'] == 1 ? '</s>' : '') + '</b></div>'; list += '<div><b>' + (regatta['canceled'] == 1 ? '<s>' : '') + regatta['name'] + (regatta['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2 // ZEILE 2
list += '<div>'; list += '<div>';
// Number // Number
list += '<div>' + ((regatta['number'] != null) ? ('# ' + regatta['number']) : '') + '</div>'; list += '<div>' + ((regatta['number'] != null) ? ('# ' + regatta['number']) : '') + '</div>';
// Club // Club
list += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>'; list += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
// Special // Special
list += '<div>' + regatta['special'] + '</div>'; list += '<div>' + regatta['special'] + '</div>';
// Icons // Icons
var icons = []; var icons = [];
if (regatta['info'] != '') if (regatta['info'] != '')
@@ -320,18 +324,18 @@ var siteScript = async function() {
icons.push('<i class="fas fa-poll"></i>'); icons.push('<i class="fas fa-poll"></i>');
} }
list += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>'; list += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>';
list += '</div>'; list += '</div>';
// ZEILE 3 // ZEILE 3
list += '<div>'; list += '<div>';
// Date // Date
list += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>'; list += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
// RLF // RLF
list += '<div>' + parseFloat(regatta['rlf']).toFixed(2) + '</div>'; list += '<div>' + parseFloat(regatta['rlf']).toFixed(2) + '</div>';
list += '</div></div>'; list += '</div></div>';
} }
$('#div-last').html(list); $('#div-last').html(list);
@@ -341,6 +345,6 @@ var siteScript = async function() {
$('#div-last').hide(); $('#div-last').hide();
$('#p-last').show(); $('#p-last').show();
} }
hideLoader(); hideLoader();
} }

88
server/scripts/news.js Normal file
View File

@@ -0,0 +1,88 @@
var firstCall = true;
var rows = [];
var page = 1;
var pageCount = 0;
const showCount = 10;
async function onNewsClicked(id) {
var newsEntry = await dbGetData('news', id);
if (newsEntry == null) return;
$('#menu-news').css('height', '80%');
$('#menu-news').css('width', '90%');
$('#menu-news').find('.menu-title').find('p').text(newsEntry.title);
$('#menu-news').find('.content').addClass('pb-3');
$('#menu-news').find('.content').html(newsEntry.html);
$('#menu-news').showMenu();
}
function pageChange() {
$('h1')[0].scrollIntoView({ behavior: "smooth" });
drawList();
}
function addCard(newsEntry) {
var badge = '';
if (newsEntry.unread) {
badge += '<span class="badge bg-highlight color-white p-1">NEW</span>&ensp;';
}
var content = '<h2>' + badge + newsEntry.title + '</h2>';
content += '<p class="mb-2"><i>' + formatDate('d.m.Y', newsEntry.date) + '</i></p>';
content += '<p class="mb-0">' + newsEntry.description.replace('\n', '<br>') + '</p>';
if (newsEntry.html != '') {
content += '<a class="btn btn-full rounded-s text-uppercase font-900 shadow-m bg-highlight mt-3" href="#" onclick="onNewsClicked(' + newsEntry.id + '); return false;">Mehr lesen</a>';
}
$('#news-entries').append(cardTemplate.replace('%ID%', 'card-news-' + newsEntry.id).replace('%CONTENT%', content));
}
async function drawList() {
$('.card-news').remove();
if (rows.length > 0) {
var offset = (page - 1) * showCount;
var count = (page == pageCount ? (rows.length % showCount) : showCount);
if (count == 0) count = showCount;
for (i = 0; i < count; i ++) {
addCard(rows[i + offset]);
}
}
}
var siteScript = async function() {
if (firstCall) {
firstCall = false;
initPagination();
}
rows = [];
var news = await dbGetData('news');
news.sort(function (a,b) {
return b.date.localeCompare(a.date);
});
var newsRead = await dbSettingsGet('news_read_' + BOATCLASS);
var now = new Date();
var lastYear = new Date();
lastYear.setFullYear(lastYear.getFullYear() - 1);
for (var n in news) {
var newsEntry = news[n];
newsEntry.date = new Date(Date.parse(newsEntry.date));
if (newsEntry.date > now) continue;
if (newsEntry.date < lastYear) break;
newsEntry.unread = (newsEntry.date > newsRead);
rows.push(newsEntry);
}
pageCount = Math.ceil(rows.length / showCount);
if ((page < 1) || (page > pageCount)) {
if (page < 1) {
page = 1;
} else {
page = pageCount;
}
}
drawPagination();
drawList();
dbSettingsSet('news_read_' + BOATCLASS, now);
updateNewsBadge();
hideLoader();
}

View File

@@ -1,11 +1,11 @@
async function onRegattaClicked(id) { async function onRegattaClicked(id) {
var regatta = await dbGetData('regattas', id); var regatta = await dbGetData('regattas', id);
$('#menu-regatta').find('.menu-title').find('p').text(regatta.name); $('#menu-regatta').find('.menu-title').find('p').text(regatta.name);
var dateTo = parseDate(regatta['date']); var dateTo = parseDate(regatta['date']);
dateTo.setDate(dateTo.getDate() + Math.max(parseInt(regatta['length']) - 1, 0)); dateTo.setDate(dateTo.getDate() + Math.max(parseInt(regatta['length']) - 1, 0));
var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']); var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']);
var planning = null; var planning = null;
if (isLoggedIn()) { if (isLoggedIn()) {
@@ -16,7 +16,7 @@ async function onRegattaClicked(id) {
} }
} }
} }
// Your Planning // Your Planning
if (planning != null) { if (planning != null) {
$('#menu-item-yourplanning').show(); $('#menu-item-yourplanning').show();
@@ -32,11 +32,26 @@ async function onRegattaClicked(id) {
crew.push(sailor.name); crew.push(sailor.name);
} }
} }
var status = '';
if (planning.gemeldet == '1') status = 'gemeldet';
if (planning.bezahlt == '1') {
if (status != '') status += ' und ';
status += 'bezahlt';
}
if (status != '') crew.push('<font style="font-style:italic;">' + status + '</font>');
$('#menu-item-yourplanning').html(crew.join('<br>')); $('#menu-item-yourplanning').html(crew.join('<br>'));
} else { } else {
$('#menu-item-yourplanning').hide(); $('#menu-item-yourplanning').hide();
} }
// Planning: Edit Status
if ((planning != null) && (typeof planningEditStatus === 'function')) {
$('#menu-item-status').show();
$('#menu-item-status').attr('onclick', 'planningEditStatus(' + regatta['id'] + ')');
} else {
$('#menu-item-status').hide();
}
// Planning // Planning
if ((plannings.length > 0) && (dateTo >= today)) { if ((plannings.length > 0) && (dateTo >= today)) {
$('#menu-item-plannings').show(); $('#menu-item-plannings').show();
@@ -44,7 +59,7 @@ async function onRegattaClicked(id) {
} else { } else {
$('#menu-item-plannings').hide(); $('#menu-item-plannings').hide();
} }
// Results // Results
var results = await dbGetDataIndex('results', 'regatta', regatta['id']); var results = await dbGetDataIndex('results', 'regatta', regatta['id']);
if (results.length > 0) { if (results.length > 0) {
@@ -53,7 +68,7 @@ async function onRegattaClicked(id) {
} else { } else {
$('#menu-item-results').hide(); $('#menu-item-results').hide();
} }
// Bericht // Bericht
if (regatta['bericht'] != '') { if (regatta['bericht'] != '') {
$('#menu-item-bericht').show(); $('#menu-item-bericht').show();
@@ -62,7 +77,7 @@ async function onRegattaClicked(id) {
} else { } else {
$('#menu-item-bericht').hide(); $('#menu-item-bericht').hide();
} }
// Info // Info
if (regatta['info'] != '') { if (regatta['info'] != '') {
$('#menu-item-info').show(); $('#menu-item-info').show();
@@ -71,7 +86,7 @@ async function onRegattaClicked(id) {
} else { } else {
$('#menu-item-info').hide(); $('#menu-item-info').hide();
} }
// Meldung // Meldung
if ((regatta['meldung'] != '') && (dateTo >= today)) { if ((regatta['meldung'] != '') && (dateTo >= today)) {
$('#menu-item-meldung').show(); $('#menu-item-meldung').show();
@@ -129,7 +144,7 @@ async function onRegattaClicked(id) {
} else { } else {
$('#menu-item-meldung').hide(); $('#menu-item-meldung').hide();
} }
// off. results // off. results
if (regatta['oresults'] != '') { if (regatta['oresults'] != '') {
$('#menu-item-oresults').show(); $('#menu-item-oresults').show();
@@ -138,7 +153,7 @@ async function onRegattaClicked(id) {
} else { } else {
$('#menu-item-oresults').hide(); $('#menu-item-oresults').hide();
} }
// club website // club website
var clubwebsite = ''; var clubwebsite = '';
if (regatta['club'] != null) { if (regatta['club'] != null) {
@@ -151,7 +166,7 @@ async function onRegattaClicked(id) {
} else { } else {
$('#menu-item-clubwebsite').hide(); $('#menu-item-clubwebsite').hide();
} }
$('#menu-regatta').showMenu(); $('#menu-regatta').showMenu();
$('#menu-regatta').scrollTop(0); $('#menu-regatta').scrollTop(0);
} }

314
server/scripts/planning.js Normal file
View File

@@ -0,0 +1,314 @@
async function planningSwitchChanged() {
showLoader();
var id = $('#switch-status-gemeldet').data('regatta');
var gemeldet = $('#switch-status-gemeldet').prop('checked');
var bezahlt = $('#switch-status-bezahlt').prop('checked');
var auth = {
id: localStorage.getItem('auth_id'),
hash: localStorage.getItem('auth_hash')
}
$.ajax({
url: QUERY_URL + 'planning_set_state',
method: 'POST',
data: {
auth: auth,
regatta: id,
gemeldet: gemeldet,
bezahlt: bezahlt
},
error: function (xhr, status, error) {
if (xhr.status == 401) {
console.log('authentification failed');
toastError('Authentifizierung fehlgeschlagen. Versuche es erneut.');
} else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Status zu &auml;ndern');
} else {
console.log('Login: unbekannter Fehler', status, error);
console.log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
$('#menu-status').hideMenu();
hideLoader();
},
success: function (data, status, xhr) {
sync();
hideLoader();
}
});
console.log(id, gemeldet, bezahlt);
hideLoader();
}
async function planningEditStatus(id) {
$('#menu-regatta').hideMenu();
var regatta = await dbGetData('regattas', id);
$('#menu-status').find('.menu-title').find('p').text(regatta.name);
var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']);
var planning = null;
if (isLoggedIn()) {
for (i in plannings) {
if (plannings[i]['user'] == USER_ID) {
planning = plannings[i];
break;
}
}
}
if (planning !== null) {
$('#switch-status-gemeldet').data('regatta', id);
$('#switch-status-gemeldet').prop('checked', planning.gemeldet == '1');
$('#switch-status-bezahlt').prop('checked', planning.bezahlt == '1');
$('#menu-status').showMenu();
}
}
function selectChange() {
var val = $('#select-year').val();
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=' + val);
siteScript();
}
}
function initYear() {
var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year);
}
var firstCall = true;
var rows = [];
var today;
async function drawList () {
window.setTimeout(function () {
var list = '';
rows.forEach(function (entry) {
if (entry == null) {
list += '<div><div align="center" class="color-highlight"><b>Heute ist der ' + formatDate('d.m.Y', today) + '</b></div></div>';
} else if (search($('#input-search').val(), entry.keywords)) {
list += entry.content;
}
});
$('#div-regattas').html(list);
}, 0);
}
var siteScript = async function() {
if (!isLoggedIn()) {
hideLoader();
return;
}
if (firstCall) {
firstCall = false;
initYear();
$('#select-year').change(selectChange);
$('#input-search').on('input', drawList);
$('#switch-status-gemeldet').parent().parent().click(planningSwitchChanged);
$('#switch-status-bezahlt').parent().parent().click(planningSwitchChanged);
}
$('#a-share-planning').attr('href', LINK_PRE + 'planning_view?user=' + USER_ID);
today = getToday();
var selectedYear = $('#select-year').val();
var minDate = parseDate(selectedYear + '-01-01');
var maxDate = parseDate(selectedYear + '-12-31');
var regattas = await dbGetRegattasRange(minDate, maxDate);
var plannings = await dbGetDataIndex('plannings', 'user', USER_ID);
for (var i = regattas.length - 1; i >= 0; i --) {
var entry = regattas[i];
var okay = false;
for (p in plannings) {
if (plannings[p].regatta == entry.id) {
regattas[i].planning = plannings[p];
okay = true;
break;
}
}
if (!okay) {
regattas.splice(i, 1);
}
}
var regattaResults = [];
for (id in regattas) {
var entry = regattas[id];
var results = await dbGetDataIndex('results', 'regatta', entry['id']);
regattaResults[entry['id']] = (results.length > 0);
}
var years = await dbGetData('years');
years.sort(function (a, b) {
if (a['year'] > b['year']) return -1;
if (a['year'] < b['year']) return 1;
return 0;
});
var options = '';
for (id in years) {
var year = years[id]['year'];
options += '<option value="' + year + '">' + year + '</option>';
}
$('#select-year').html(options);
$('#select-year').val(selectedYear);
var count = regattas.length;
if (count > 0) {
if (count == 1) {
$('#p-count').html('Es wurde 1 Regatta gefunden!');
} else {
$('#p-count').html('Es wurden ' + count + ' Regatten gefunden!');
}
$('#div-regattas').show();
$('#input-search').parent().show();
var heute = false;
rows = [];
for (id in regattas) {
var entry = regattas[id];
var club = null;
if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']);
if (entry.planning.steuermann !== null) {
entry.planning.steuermann = (await dbGetData('sailors', entry.planning.steuermann)).name;
}
var crewString = entry.planning.crew.split(',');
entry.planning.crew = [];
for (c in crewString) {
var sailor = await dbGetData('sailors', crewString[c]);
if (sailor !== null) {
entry.planning.crew.push(sailor.name);
}
}
var dateFrom = entry['dateFrom'];
var dateTo = entry['dateTo'];
var row = { keywords: [], content: '' };
row.keywords.push(entry['name']);
if (entry['number'] != null) row.keywords.push(entry['number']);
if (club != null) row.keywords.push(club['kurz'], club['name']);
if (entry.planning.steuermann != null) row.keywords.push(entry.planning.steuermann);
for (c in entry.planning.crew) row.keywords.push(entry.planning.crew[c]);
if (!heute && (today <= dateFrom)) {
rows.push(null);
heute = true;
}
row.content += '<div onclick="onRegattaClicked(' + entry['id'] + ');">';
// ZEILE 1
// Name
row.content += '<div><b>' + (entry['canceled'] == 1 ? '<s>' : '') + entry['name'] + (entry['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2
row.content += '<div>';
// Number
row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>';
// Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
// Special
row.content += '<div>' + entry['special'] + '</div>';
// Icons
var icons = [];
if ((entry['meldung'] != '') && (dateTo >= today) && (entry['meldungOffen'] == '1') && (entry.planning.gemeldet != '1')) {
var color = '';
var planning = null;
if (isLoggedIn()) {
var plannings = await dbGetDataIndex('plannings', 'regatta', entry['id']);
for (id in plannings) {
if (plannings[id]['user'] == USER_ID) {
planning = plannings[id];
break;
}
}
}
if (entry['meldungSchluss'] != null) {
if ((planning == null) || (planning['gemeldet'] == '0')) {
var ms = 0;
if (entry['meldungEarly'] != null) {
ms = parseDate(entry['meldungEarly']);
}
if (ms < today) {
ms = parseDate(entry['meldungSchluss']);
}
var diff = Math.round((ms - today) / 86400000);
if (ms < today) {
color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
}
}
}
if ((planning != null) && (planning['gemeldet'] == '0')) {
color += ' fa-blink';
}
icons.push('<i class="fas fa-file-signature' + color + '"></i>');
}
if (entry['bericht'] != '')
icons.push('<i class="fas fa-book"></i>');
if (entry['canceled'] == '1') {
icons.push('<i class="fas fa-times color-red2-dark"></i>');
} else if (regattaResults[entry['id']]) {
icons.push('<i class="fas fa-poll"></i>');
}
if (entry.planning.gemeldet == '1') {
icons.push('<i class="fas fa-file-signature color-highlight"></i>');
}
if (entry.planning.bezahlt == '1') {
icons.push('<i class="fas fa-euro-sign color-highlight"></i>');
}
row.content += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>';
row.content += '</div>';
// ZEILE 3
row.content += '<div>';
// Date
if (entry['length'] < 1) {
if (formatDate('d.m', dateFrom) == '01.01') {
row.content += '<div><font class="color-red2-dark">Datum noch unklar</font></div>';
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - <font class="color-red2-dark">Datum nicht final</font></div>';
}
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
}
// RLF
row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>';
row.content += '</div></div>';
rows.push(row);
}
if (!heute) {
rows.push(null);
}
drawList();
} else {
$('#p-count').html('Du hast noch keine Regatten in Deiner Saison-Planung!');
$('#div-regattas').hide();
$('#input-search').parent().hide();
}
hideLoader();
}

View File

@@ -0,0 +1,146 @@
async function onUserClicked(id) {
var user = await dbGetData('users', id);
if (user !== null) {
location.href = LINK_PRE + 'planning_view?user=' + user.id;
}
}
function selectChange() {
var val = $('#select-year').val();
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=' + val);
siteScript();
}
}
function initYear() {
var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year);
}
var firstCall = true;
var rows = [];
var today;
async function drawList () {
window.setTimeout(function () {
var list = '';
rows.forEach(function (entry) {
if (search($('#input-search').val(), entry.keywords)) {
list += entry.content;
}
});
$('#div-users').html(list);
}, 0);
}
var siteScript = async function() {
if (!isLoggedIn()) {
hideLoader();
return;
}
if (firstCall) {
firstCall = false;
initYear();
$('#select-year').change(selectChange);
$('#input-search').on('input', drawList);
}
var selectedYear = $('#select-year').val();
var minDate = parseDate(selectedYear + '-01-01');
var maxDate = parseDate(selectedYear + '-12-31');
var regattas = await dbGetRegattasRange(minDate, maxDate);
var plannings = {};
for (var i in regattas) {
var entry = regattas[i];
var planning = await dbGetDataIndex('plannings', 'regatta', entry.id);
for (p in planning) {
if (!(planning[p].user in plannings)) {
plannings[planning[p].user] = {
user: await dbGetData('users', planning[p].user),
regattas: [],
sailors: {}
};
}
plannings[planning[p].user].regattas.push(entry);
var sailor = null;
if (planning[p].steuermann !== null) sailor = await dbGetData('sailors', planning[p].steuermann);
if (sailor !== null) {
if (!(sailor.id in plannings[planning[p].user].sailors)) plannings[planning[p].user].sailors[sailor.id] = sailor.name;
}
var crew = planning[p].crew.split(',');
for (i in crew) {
sailor = await dbGetData('sailors', crew[i]);
if (sailor !== null) {
if (!(sailor.id in plannings[planning[p].user].sailors)) plannings[planning[p].user].sailors[sailor.id] = sailor.name;
}
}
}
}
plannings = Object.values(plannings);
plannings.sort(function(a,b){
return a.user.username.localeCompare(b.user.username);
});
var years = await dbGetData('years');
years.sort(function (a, b) {
if (a['year'] > b['year']) return -1;
if (a['year'] < b['year']) return 1;
return 0;
});
var options = '';
for (id in years) {
var year = years[id]['year'];
options += '<option value="' + year + '">' + year + '</option>';
}
$('#select-year').html(options);
$('#select-year').val(selectedYear);
var count = plannings.length;
if (count > 0) {
$('#input-search').parent().show();
rows = [];
for (id in plannings) {
var entry = plannings[id];
var row = { keywords: [], content: '' };
row.keywords.push(entry.user.username);
for (i in entry.sailors) {
row.keywords.push(entry.sailors[i]);
}
row.content += '<div onclick="onUserClicked(' + entry.user.id + ');">';
// ZEILE 1
row.content += '<div></div>';
// ZEILE 2
row.content += '<div>';
// Name
row.content += '<div>' + entry.user.username + '</div>';
// Count of regattas
row.content += '<div>' + entry.regattas.length + ' Regatten</div>';
row.content += '</div></div>';
rows.push(row);
}
drawList();
} else {
$('#div-users').html('Es hat noch niemand eine Saison-Planung erstellt');
$('#input-search').parent().hide();
}
hideLoader();
}

View File

@@ -0,0 +1,290 @@
function selectChange() {
var val = $('#select-year').val();
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=' + val);
siteScript();
}
}
function initYear() {
var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year);
}
var firstCall = true;
var rows = [];
var today;
async function drawList () {
window.setTimeout(function () {
var list = '';
rows.forEach(function (entry) {
if (entry == null) {
list += '<div><div align="center" class="color-highlight"><b>Heute ist der ' + formatDate('d.m.Y', today) + '</b></div></div>';
} else if (search($('#input-search').val(), entry.keywords)) {
list += entry.content;
}
});
$('#div-regattas').html(list);
}, 0);
}
var siteScript = async function() {
var userid = findGetParameter('user');
var user = null;
if (userid !== null) {
user = await dbGetData('users', userid);
}
if (user === null) {
location.href = LINK_PRE + 'planning_list';
return;
}
$('#p-username').text(user.username);
if (isLoggedIn() && (userid == USER_ID)) {
$('#button-share').show();
$('#button-share').click(function(){
$('#menu-share').showMenu();
});
} else {
$('#button-share').hide();
}
if (firstCall) {
firstCall = false;
initYear();
$('#select-year').change(selectChange);
$('#input-search').on('input', drawList);
}
today = getToday();
var selectedYear = $('#select-year').val();
var minDate = parseDate(selectedYear + '-01-01');
var maxDate = parseDate(selectedYear + '-12-31');
var regattas = await dbGetRegattasRange(minDate, maxDate);
var plannings = await dbGetDataIndex('plannings', 'user', user.id);
for (var i = regattas.length - 1; i >= 0; i --) {
var entry = regattas[i];
var okay = false;
for (p in plannings) {
if (plannings[p].regatta == entry.id) {
regattas[i].planning = plannings[p];
okay = true;
break;
}
}
if (!okay) {
regattas.splice(i, 1);
}
}
var regattaResults = [];
for (id in regattas) {
var entry = regattas[id];
var results = await dbGetDataIndex('results', 'regatta', entry['id']);
regattaResults[entry['id']] = (results.length > 0);
}
var years = await dbGetData('years');
years.sort(function (a, b) {
if (a['year'] > b['year']) return -1;
if (a['year'] < b['year']) return 1;
return 0;
});
var options = '';
for (id in years) {
var year = years[id]['year'];
options += '<option value="' + year + '">' + year + '</option>';
}
$('#select-year').html(options);
$('#select-year').val(selectedYear);
var count = regattas.length;
if (count > 0) {
if (count == 1) {
$('#p-count').html('Es wurde 1 Regatta gefunden!');
} else {
$('#p-count').html('Es wurden ' + count + ' Regatten gefunden!');
}
$('#div-regattas').show();
$('#input-search').parent().show();
var heute = false;
rows = [];
for (id in regattas) {
var entry = regattas[id];
var club = null;
if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']);
if (entry.planning.steuermann !== null) {
entry.planning.steuermann = (await dbGetData('sailors', entry.planning.steuermann)).name;
}
var crewString = entry.planning.crew.split(',');
entry.planning.crew = [];
for (c in crewString) {
var sailor = await dbGetData('sailors', crewString[c]);
if (sailor !== null) {
entry.planning.crew.push(sailor.name);
}
}
var dateFrom = entry['dateFrom'];
var dateTo = entry['dateTo'];
var row = { keywords: [], content: '' };
row.keywords.push(entry['name']);
if (entry['number'] != null) row.keywords.push(entry['number']);
if (club != null) row.keywords.push(club['kurz'], club['name']);
if (entry.planning.steuermann != null) row.keywords.push(entry.planning.steuermann);
for (c in entry.planning.crew) row.keywords.push(entry.planning.crew[c]);
if (!heute && (today <= dateFrom)) {
rows.push(null);
heute = true;
}
row.content += '<div onclick="onRegattaClicked(' + entry['id'] + ');">';
// ZEILE 1
// Name
row.content += '<div><b>' + (entry['canceled'] == 1 ? '<s>' : '') + entry['name'] + (entry['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2
row.content += '<div>';
// Number
row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>';
// Special
row.content += '<div>' + entry['special'] + '</div>';
// Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
row.content += '</div>';
// ZEILE 3
row.content += '<div>';
// Date
if (entry['length'] < 1) {
if (formatDate('d.m', dateFrom) == '01.01') {
row.content += '<div><font class="color-red2-dark">Datum noch unklar</font></div>';
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - <font class="color-red2-dark">Datum nicht final</font></div>';
}
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
}
// RLF
row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>';
row.content += '</div>';
// ZEILE 4
row.content += '<div></div>';
// ZEILE 5
row.content += '<div>';
row.content += '<div>' + entry.planning.steuermann + '</div>';
row.content += '</div>';
// ZEILE 6...
for (var i in entry.planning.crew) {
row.content += '<div>';
row.content += '<div>' + entry.planning.crew[i] + '</div>';
row.content += '</div>';
}
row.content += '</div>';
/*
// ZEILE 2
row.content += '<div>';
// Number
row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>';
// Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
// Special
row.content += '<div>' + entry['special'] + '</div>';
// Icons
var icons = [];
if (entry['info'] != '')
icons.push('<i class="fas fa-info"></i>');
if ((entry['meldung'] != '') && (dateTo >= today) && (entry['meldungOffen'] == '1')) {
var color = '';
if (entry['meldungSchluss'] != null) {
var ms = 0;
if (entry['meldungEarly'] != null) {
ms = parseDate(entry['meldungEarly']);
}
if (ms < today) {
ms = parseDate(entry['meldungSchluss']);
}
var diff = Math.round((ms - today) / 86400000);
if (ms < today) {
color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
}
}
icons.push('<i class="fas fa-file-signature' + color + '"></i>');
}
if (entry['bericht'] != '')
icons.push('<i class="fas fa-book"></i>');
if (entry['canceled'] == '1') {
icons.push('<i class="fas fa-times color-red2-dark"></i>');
} else if (regattaResults[entry['id']]) {
icons.push('<i class="fas fa-poll"></i>');
}
row.content += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>';
row.content += '</div>';
// ZEILE 3
row.content += '<div>';
// Date
if (entry['length'] < 1) {
if (formatDate('d.m', dateFrom) == '01.01') {
row.content += '<div><font class="color-red2-dark">Datum noch unklar</font></div>';
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - <font class="color-red2-dark">Datum nicht final</font></div>';
}
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
}
// RLF
row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>';
row.content += '</div></div>';
*/
rows.push(row);
}
if (!heute) {
rows.push(null);
}
drawList();
} else {
$('#p-count').html(user.username + ' hat noch keine Regatten in seiner/ihrer Saison-Planung!');
$('#div-regattas').hide();
$('#input-search').parent().hide();
}
hideLoader();
}

View File

@@ -11,7 +11,7 @@ async function onRankingClicked(id) {
} }
} }
if (sailor == null) return; if (sailor == null) return;
$('#menu-rank').find('.menu-title').find('p').text(sailor.name); $('#menu-rank').find('.menu-title').find('p').text(sailor.name);
if (lastRanking != null) { if (lastRanking != null) {
var lastRank; var lastRank;
@@ -25,83 +25,83 @@ async function onRankingClicked(id) {
} else { } else {
$('#menu-item-text').hide(); $('#menu-item-text').hide();
} }
list = ''; list = '';
for (var i in sailor.regattas) { for (var i in sailor.regattas) {
var entry = sailor.regattas[i]; var entry = sailor.regattas[i];
var regatta = entry.regatta; var regatta = entry.regatta;
var boat = await dbGetData('boats', entry.boat); var boat = await dbGetData('boats', entry.boat);
var dateFrom = parseDate(regatta.date); var dateFrom = parseDate(regatta.date);
var dateTo = parseDate(regatta.date); var dateTo = parseDate(regatta.date);
dateTo.setDate(dateTo.getDate() + Math.max(parseInt(regatta.length) - 1, 0)); dateTo.setDate(dateTo.getDate() + Math.max(parseInt(regatta.length) - 1, 0));
list += '<div onclick="onDetailClicked(' + regatta.id + ')">'; list += '<div onclick="onDetailClicked(' + regatta.id + ')">';
// ZEILE 1 // ZEILE 1
list += '<div><b>' + regatta.name + '</b></div>'; list += '<div><b>' + regatta.name + '</b></div>';
// ZEILE 2 // ZEILE 2
list += '<div>'; list += '<div>';
// DATE // DATE
list += '<div>' + formatDate('d.m.Y', dateFrom) + ' - ' + formatDate('d.m.Y', dateTo) + '</div>'; list += '<div>' + formatDate('d.m.Y', dateFrom) + ' - ' + formatDate('d.m.Y', dateTo) + '</div>';
// m // m
list += '<div>m: ' + entry.m + '</div>'; list += '<div>m: ' + entry.m + '</div>';
// rlf // rlf
list += '<div>RLF: ' + parseFloat(regatta.rlf).toFixed(2) + '</div>'; list += '<div>RLF: ' + parseFloat(regatta.rlf).toFixed(2) + '</div>';
list += '</div>'; list += '</div>';
// ZEILE 3 // ZEILE 3
list += '<div>'; list += '<div>';
// Place // Place
list += '<div>Platz ' + entry.place + ' / ' + entry.fb + '</div>'; list += '<div>Platz ' + entry.place + ' / ' + entry.fb + '</div>';
// rlp // rlp
var color; var color;
if (entry.used == 0) { color = 'color-red2-dark'; } if (entry.used == 0) { color = 'color-red2-dark'; }
else if (entry.used == entry.m) { color = 'color-green2-dark'; } else if (entry.used == entry.m) { color = 'color-green2-dark'; }
else { color = 'color-yellow2-dark'; } else { color = 'color-yellow2-dark'; }
list += '<div>Punkte: ' + entry.used + ' x <b class="' + color + '">' + parseFloat(entry.rlp).toFixed(2) + '</b></div>'; list += '<div>Punkte: ' + entry.used + ' x <b class="' + color + '">' + parseFloat(entry.rlp).toFixed(2) + '</b></div>';
list += '</div>'; list += '</div>';
// ZEILE 4 // ZEILE 4
list += '<div>'; list += '<div>';
// Sailnumber // Sailnumber
list += '<div>' + boat.sailnumber + '</div>'; list += '<div>' + boat.sailnumber + '</div>';
// Boatname // Boatname
list += '<div>' + boat.name + '</div>'; list += '<div>' + boat.name + '</div>';
list += '</div>'; list += '</div>';
// ZEILE 5... // ZEILE 5...
var crew = entry.crew.split(','); var crew = entry.crew.split(',');
for (var c in crew) { for (var c in crew) {
var cr = await dbGetData('sailors', crew[c]); var cr = await dbGetData('sailors', crew[c]);
if (cr != null) { if (cr != null) {
list += '<div>'; list += '<div>';
// Name // Name
list += '<div>' + cr.name + '</div>'; list += '<div>' + cr.name + '</div>';
// Year // Year
list += '<div>' + ((cr.year != null) ? ('(' + cr.year + ')') : '') + '</div>'; list += '<div>' + ((cr.year != null) ? ('(' + cr.year + ')') : '') + '</div>';
list += '</div>'; list += '</div>';
} }
} }
list += '</div>'; list += '</div>';
} }
$('#div-details').html(list); $('#div-details').html(list);
$('#menu-rank').showMenu(); $('#menu-rank').showMenu();
$('#menu-rank').scrollTop(0); $('#menu-rank').scrollTop(0);
} }
@@ -111,8 +111,8 @@ async function selectChange(callSiteScript = true) {
var year = parseInt($('#select-year').val()); var year = parseInt($('#select-year').val());
if (type == "user") { if (type == "user") {
$('#select-year').parent().hide(); $('#select-year').parent().hide();
$('#input-from').parent().show(); $('#input-from').trigger('focusin').trigger('focusout').parent().show();
$('#input-to').parent().show(); $('#input-to').trigger('focusin').trigger('focusout').parent().show();
$('#input-jugend').parent().parent().show(); $('#input-jugend').parent().parent().show();
$('#input-jugstrict').parent().parent().show(); $('#input-jugstrict').parent().parent().show();
$('#button-show').show(); $('#button-show').show();
@@ -123,7 +123,7 @@ async function selectChange(callSiteScript = true) {
$('#input-jugend').parent().parent().hide(); $('#input-jugend').parent().parent().hide();
$('#input-jugstrict').parent().parent().hide(); $('#input-jugstrict').parent().parent().hide();
$('#button-show').hide(); $('#button-show').hide();
var from, to, jugend, jugstrict; var from, to, jugend, jugstrict;
switch (type) { switch (type) {
case 'year': case 'year':
@@ -168,14 +168,26 @@ async function selectChange(callSiteScript = true) {
} }
break; break;
} }
$('#input-from').val(from); $('#input-from').val(from);
$('#input-to').val(to); $('#input-to').val(to);
$('#input-jugend').prop('checked', jugend); $('#input-jugend').prop('checked', jugend);
$('#input-jugstrict').prop('checked', jugstrict); $('#input-jugstrict').prop('checked', jugstrict);
if (callSiteScript && (typeof siteScript === 'function')) if (callSiteScript && (typeof siteScript === 'function')) {
history.replaceState(null, '', '?type=' + type + '&year=' + year)
siteScript(); siteScript();
}
}
}
function buttonShowPressed() {
if (typeof siteScript === 'function') {
var chboxes = '';
if ($('#input-jugend').prop('checked')) chboxes += '&jugend=on'
if ($('#input-jugstrict').prop('checked')) chboxes += '&jugstrict=on'
history.replaceState(null, '', '?type=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val() + chboxes)
siteScript();
} }
} }
@@ -186,10 +198,23 @@ function initSelects() {
if (year === null) year = new Date().getFullYear(); if (year === null) year = new Date().getFullYear();
$('#select-type').val(type); $('#select-type').val(type);
$('#select-year').html('<option value="' + year + '">' + year + '</option>'); $('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year); $('#select-year').val(year);
if (type == "user") {
var from = findGetParameter('from');
var to = findGetParameter('to');
if (from === null) from = formatDate('Y-m-d')
if (to === null) to = formatDate('Y-m-d')
$('#input-from').val(from).trigger('focusin').trigger('focusout');
$('#input-to').val(to).trigger('focusin').trigger('focusout');
var jugend = findGetParameter('jugend');
var jugstrict = findGetParameter('jugstrict');
$('#input-jugend').prop('checked', jugend !== null);
$('#input-jugstrict').prop('checked', jugstrict !== null);
}
selectChange(false); selectChange(false);
} }
@@ -218,17 +243,17 @@ var siteScript = async function() {
initSelects(); initSelects();
$('#select-type').change(selectChange); $('#select-type').change(selectChange);
$('#select-year').change(selectChange); $('#select-year').change(selectChange);
$('#button-show').click(siteScript); $('#button-show').click(buttonShowPressed);
$('#input-search').on('input', drawList); $('#input-search').on('input', drawList);
} }
var minDate = parseDate($('#input-from').val()); var minDate = parseDate($('#input-from').val());
var maxDate = parseDate($('#input-to').val()); var maxDate = parseDate($('#input-to').val());
var jugend = $('#input-jugend').prop('checked'); var jugend = $('#input-jugend').prop('checked');
var jugstrict = $('#input-jugstrict').prop('checked'); var jugstrict = $('#input-jugstrict').prop('checked');
var dbRanking = await dbGetRanking(minDate, maxDate, jugend, jugstrict); var dbRanking = await dbGetRanking(minDate, maxDate, jugend, jugstrict);
ranking = dbRanking[0]; ranking = dbRanking[0];
lastRanking = null; lastRanking = null;
if (($('#select-type').val() == 'year') || ($('#select-type').val() == 'youth')) { if (($('#select-type').val() == 'year') || ($('#select-type').val() == 'youth')) {
lastRanking = {}; lastRanking = {};
@@ -240,9 +265,9 @@ var siteScript = async function() {
lastRanking[lDbRanking[i].id] = lDbRanking[i].rank; lastRanking[lDbRanking[i].id] = lDbRanking[i].rank;
} }
} }
var selectedYear = $('#select-year').val(); var selectedYear = $('#select-year').val();
var years = await dbGetData('years'); var years = await dbGetData('years');
years.sort(function (a, b) { years.sort(function (a, b) {
if (a['year'] > b['year']) return -1; if (a['year'] > b['year']) return -1;
@@ -256,7 +281,7 @@ var siteScript = async function() {
} }
$('#select-year').html(options); $('#select-year').html(options);
$('#select-year').val(selectedYear); $('#select-year').val(selectedYear);
if (dbRanking[1].length > 0) { if (dbRanking[1].length > 0) {
$('#card-noresults').show(); $('#card-noresults').show();
list = ''; list = '';
@@ -269,18 +294,18 @@ var siteScript = async function() {
} else { } else {
$('#card-noresults').hide(); $('#card-noresults').hide();
} }
var count = ranking.length; var count = ranking.length;
if (count > 0) { if (count > 0) {
$('#input-search').parent().show(); $('#input-search').parent().show();
var dsvEnd = false; var dsvEnd = false;
rows = []; rows = [];
for (id in ranking) { for (id in ranking) {
var entry = ranking[id]; var entry = ranking[id];
for (var i in entry.regattas) { for (var i in entry.regattas) {
entry.regattas[i].regatta = await dbGetData('regattas', entry.regattas[i].regatta); entry.regattas[i].regatta = await dbGetData('regattas', entry.regattas[i].regatta);
} }
@@ -288,26 +313,26 @@ var siteScript = async function() {
entry.regattas.sort(function (a,b) { entry.regattas.sort(function (a,b) {
return a.regatta.date.localeCompare(b.regatta.date); return a.regatta.date.localeCompare(b.regatta.date);
}); });
var club = null; var club = null;
if (entry['club'] != null) if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']); club = await dbGetData('clubs', entry['club']);
var row = { keywords: [], content: '' }; var row = { keywords: [], content: '' };
row.keywords.push(entry['name']); row.keywords.push(entry['name']);
if (entry['year'] != null) row.keywords.push(entry['year']); if (entry['year'] != null) row.keywords.push(entry['year']);
if (club != null) row.keywords.push(club['kurz'], club['name']); if (club != null) row.keywords.push(club['kurz'], club['name']);
if (!dsvEnd && (entry.m < 9)) { if (!dsvEnd && (entry.m < 9)) {
rows.push(null); rows.push(null);
dsvEnd = true; dsvEnd = true;
} }
row.content += '<div onclick="onRankingClicked(' + entry['id'] + ');">'; row.content += '<div onclick="onRankingClicked(' + entry['id'] + ');">';
// ZEILE 1 // ZEILE 1
row.content += '<div>'; row.content += '<div>';
// Rank // Rank
var icon = ''; var icon = '';
if (lastRanking != null) { if (lastRanking != null) {
@@ -321,39 +346,39 @@ var siteScript = async function() {
icon = '<i class="font-16 fas ' + icon + '" style="width: 1.1em; text-align: center;"></i> '; icon = '<i class="font-16 fas ' + icon + '" style="width: 1.1em; text-align: center;"></i> ';
} }
row.content += '<div>' + icon + '<b>' + entry.rank + '.</b></div>'; row.content += '<div>' + icon + '<b>' + entry.rank + '.</b></div>';
// m // m
row.content += '<div>m = ' + entry.m + '</div>'; row.content += '<div>m = ' + entry.m + '</div>';
// rlp // rlp
row.content += '<div>' + entry.rlp.toFixed(3) + '</div>'; row.content += '<div>' + entry.rlp.toFixed(3) + '</div>';
row.content += '</div>'; row.content += '</div>';
// ZEILE 2 // ZEILE 2
row.content += '<div>'; row.content += '<div>';
// Name // Name
row.content += '<div><b>' + entry.name + '</b></div>'; row.content += '<div><b>' + entry.name + '</b></div>';
// Year // Year
row.content += '<div>' + ((entry.year != null) ? ('(' + entry.year + ')') : '') + '</div>'; row.content += '<div>' + ((entry.year != null) ? ('(' + entry.year + ')') : '') + '</div>';
row.content += '</div></div>'; row.content += '</div></div>';
rows.push(row); rows.push(row);
} }
if (!dsvEnd) { if (!dsvEnd) {
rows.push(null); rows.push(null);
} }
drawList(); drawList();
} else { } else {
$('#div-rank').html('Keine Ergebnisse gefunden!'); $('#div-rank').html('Keine Ergebnisse gefunden!');
$('#input-search').parent().hide(); $('#input-search').parent().hide();
} }
hideLoader(); hideLoader();
} }

View File

@@ -39,7 +39,7 @@ var siteScript = async function() {
tbody += '<td>' + (await dbGetData('users', planning.user)).username + '</td>'; tbody += '<td>' + (await dbGetData('users', planning.user)).username + '</td>';
if (planning.steuermann != null) { if (planning.steuermann != null) {
tbody += '<td>' + (await dbGetData('users', planning.user)).username + '</td>'; tbody += '<td>' + (await dbGetData('sailors', planning.steuermann)).name + '</td>';
} else { } else {
tbody += '<td>(noch unklar)</td>'; tbody += '<td>(noch unklar)</td>';
} }

View File

@@ -1,29 +1,47 @@
function selectChange(callSiteScript = true) { function selectChange(callSiteScript = true) {
var val = $('#select-year').val(); var val = $('#select-year').val();
if (val == "user") { if (val == "user") {
$('#input-from').parent().show(); $('#input-from').trigger('focusin').trigger('focusout').parent().show();
$('#input-to').parent().show(); $('#input-to').trigger('focusin').trigger('focusout').parent().show();
$('#button-show').show(); $('#button-show').show();
} else { } else {
$('#input-from').parent().hide(); $('#input-from').parent().hide();
$('#input-to').parent().hide(); $('#input-to').parent().hide();
$('#button-show').hide(); $('#button-show').hide();
$('#input-from').val(val + '-01-01'); $('#input-from').val(val + '-01-01');
$('#input-to').val(val + '-12-31'); $('#input-to').val(val + '-12-31');
if (callSiteScript && (typeof siteScript === 'function')) if (callSiteScript && (typeof siteScript === 'function')) {
history.replaceState(null, '', '?year=' + val);
siteScript(); siteScript();
}
}
}
function buttonShowPressed() {
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val())
siteScript();
} }
} }
function initYear() { function initYear() {
var year = findGetParameter('year'); var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear(); if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>'); $('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year); $('#select-year').val(year);
if (year == "user") {
var from = findGetParameter('from');
var to = findGetParameter('to');
if (from === null) from = formatDate('Y-m-d')
if (to === null) to = formatDate('Y-m-d')
$('#input-from').val(from).trigger('focusin').trigger('focusout');
$('#input-to').val(to).trigger('focusin').trigger('focusout');
}
selectChange(false); selectChange(false);
} }
@@ -50,12 +68,12 @@ var siteScript = async function() {
firstCall = false; firstCall = false;
initYear(); initYear();
$('#select-year').change(selectChange); $('#select-year').change(selectChange);
$('#button-show').click(siteScript); $('#button-show').click(buttonShowPressed);
$('#input-search').on('input', drawList); $('#input-search').on('input', drawList);
} }
today = getToday(); today = getToday();
var minDate = parseDate($('#input-from').val()); var minDate = parseDate($('#input-from').val());
var maxDate = parseDate($('#input-to').val()); var maxDate = parseDate($('#input-to').val());
var regattas = await dbGetRegattasRange(minDate, maxDate); var regattas = await dbGetRegattasRange(minDate, maxDate);
@@ -65,9 +83,9 @@ var siteScript = async function() {
var results = await dbGetDataIndex('results', 'regatta', entry['id']); var results = await dbGetDataIndex('results', 'regatta', entry['id']);
regattaResults[entry['id']] = (results.length > 0); regattaResults[entry['id']] = (results.length > 0);
} }
var selectedYear = $('#select-year').val(); var selectedYear = $('#select-year').val();
var years = await dbGetData('years'); var years = await dbGetData('years');
years.sort(function (a, b) { years.sort(function (a, b) {
if (a['year'] > b['year']) return -1; if (a['year'] > b['year']) return -1;
@@ -81,7 +99,7 @@ var siteScript = async function() {
} }
$('#select-year').html(options); $('#select-year').html(options);
$('#select-year').val(selectedYear); $('#select-year').val(selectedYear);
var count = regattas.length; var count = regattas.length;
if (count > 0) { if (count > 0) {
if (count == 1) { if (count == 1) {
@@ -91,49 +109,49 @@ var siteScript = async function() {
} }
$('#div-regattas').show(); $('#div-regattas').show();
$('#input-search').parent().show(); $('#input-search').parent().show();
var heute = false; var heute = false;
rows = []; rows = [];
for (id in regattas) { for (id in regattas) {
var entry = regattas[id]; var entry = regattas[id];
var club = null; var club = null;
if (entry['club'] != null) if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']); club = await dbGetData('clubs', entry['club']);
var plannings = await dbGetDataIndex('plannings', 'regatta', entry['id']); var plannings = await dbGetDataIndex('plannings', 'regatta', entry['id']);
var dateFrom = entry['dateFrom']; var dateFrom = entry['dateFrom'];
var dateTo = entry['dateTo']; var dateTo = entry['dateTo'];
var row = { keywords: [], content: '' }; var row = { keywords: [], content: '' };
row.keywords.push(entry['name']); row.keywords.push(entry['name']);
if (entry['number'] != null) row.keywords.push(entry['number']); if (entry['number'] != null) row.keywords.push(entry['number']);
if (club != null) row.keywords.push(club['kurz'], club['name']); if (club != null) row.keywords.push(club['kurz'], club['name']);
if (!heute && (today <= dateFrom)) { if (!heute && (today <= dateFrom)) {
rows.push(null); rows.push(null);
heute = true; heute = true;
} }
row.content += '<div onclick="onRegattaClicked(' + entry['id'] + ');">'; row.content += '<div onclick="onRegattaClicked(' + entry['id'] + ');">';
// ZEILE 1 // ZEILE 1
// Name // Name
row.content += '<div><b>' + (entry['canceled'] == 1 ? '<s>' : '') + entry['name'] + (entry['canceled'] == 1 ? '</s>' : '') + '</b></div>'; row.content += '<div><b>' + (entry['canceled'] == 1 ? '<s>' : '') + entry['name'] + (entry['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2 // ZEILE 2
row.content += '<div>'; row.content += '<div>';
// Number // Number
row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>'; row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>';
// Club // Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>'; row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
// Special // Special
row.content += '<div>' + entry['special'] + '</div>'; row.content += '<div>' + entry['special'] + '</div>';
// Icons // Icons
var icons = []; var icons = [];
if (entry['info'] != '') if (entry['info'] != '')
@@ -160,8 +178,10 @@ var siteScript = async function() {
ms = parseDate(entry['meldungSchluss']); ms = parseDate(entry['meldungSchluss']);
} }
var diff = Math.round((ms - today) / 86400000); var diff = Math.round((ms - today) / 86400000);
if ((ms >= today) && (diff < 7)) { if (ms < today) {
color = ' color-red2-dark'; color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
} }
} }
} }
@@ -178,12 +198,12 @@ var siteScript = async function() {
icons.push('<i class="fas fa-poll"></i>'); icons.push('<i class="fas fa-poll"></i>');
} }
row.content += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>'; row.content += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>';
row.content += '</div>'; row.content += '</div>';
// ZEILE 3 // ZEILE 3
row.content += '<div>'; row.content += '<div>';
// Date // Date
if (entry['length'] < 1) { if (entry['length'] < 1) {
if (formatDate('d.m', dateFrom) == '01.01') { if (formatDate('d.m', dateFrom) == '01.01') {
@@ -194,26 +214,26 @@ var siteScript = async function() {
} else { } else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>'; row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
} }
// RLF // RLF
row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>'; row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>';
row.content += '</div></div>'; row.content += '</div></div>';
rows.push(row); rows.push(row);
} }
if (!heute) { if (!heute) {
rows.push(null); rows.push(null);
} }
drawList(); drawList();
} else { } else {
$('#p-count').html('Keine Regatten gefunden!'); $('#p-count').html('Keine Regatten gefunden!');
$('#div-regattas').hide(); $('#div-regattas').hide();
$('#input-search').parent().hide(); $('#input-search').parent().hide();
} }
hideLoader(); hideLoader();
} }

View File

@@ -5,19 +5,65 @@ var page = 1;
var pageCount = 0; var pageCount = 0;
const showCount = 25; const showCount = 25;
async function onEditYearClick() {
var id = $('#button-edityear').attr('data-sailor-id');
var year = $('#input-edityear').val();
if (year != '') {
showLoader();
$.ajax({
url: QUERY_URL + 'add_year',
method: 'POST',
data: {
sailor: id,
year: year
},
error: function (xhr, status, error) {
if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Jahrgang zu bearbeiten');
} else {
log('EditYear: unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
hideLoader();
},
success: function (data, status, xhr) {
if ('status' in data) {
if (data.status == 'added') {
toastOk('Jahrgang erfolgreich hinzugefügt');
sync();
} else {
toastInfo('Wir prüfen Deine Anfrage und korrigieren den Jahrgang schnellstmöglich', 5000);
}
} else {
toastOk('Erfolgreich');
}
hideLoader();
}
});
}
$('#menu-edityear').hideMenu();
}
async function onListClicked(id) { async function onListClicked(id) {
var sailor = await dbGetData('sailors', id); var sailor = await dbGetData('sailors', id);
$('#menu-sailor').find('.menu-title').find('p').text(sailor.name); $('#menu-sailor').find('.menu-title').find('p').text(sailor.name);
// Edit Year // Edit Year
// TODO: create menu for edit year $('#button-edityear').attr('data-sailor-id', sailor.id);
$('#menu-edityear').find('.menu-title').find('p').text(sailor.name);
if (sailor['year'] == null) { if (sailor['year'] == null) {
$('#menu-item-year').find('span').text('Jahrgang hinzufügen'); $('#menu-item-year').find('span').text('Jahrgang hinzufügen');
$('#menu-edityear').find('.menu-title').find('h1').text('Jahrgang hinzufügen');
$('#input-edityear').val('');
} else { } else {
$('#menu-item-year').find('span').text('Jahrgang bearbeiten'); $('#menu-item-year').find('span').text('Jahrgang bearbeiten');
$('#menu-edityear').find('.menu-title').find('h1').text('Jahrgang bearbeiten');
$('#input-edityear').val(sailor.year);
} }
$('#input-edityear').trigger('focusin').trigger('focusout');
// club website // club website
var clubwebsite = ''; var clubwebsite = '';
if (sailor['club'] != null) { if (sailor['club'] != null) {
@@ -30,7 +76,7 @@ async function onListClicked(id) {
} else { } else {
$('#menu-item-clubwebsite').hide(); $('#menu-item-clubwebsite').hide();
} }
$('#menu-sailor').showMenu(); $('#menu-sailor').showMenu();
$('#menu-sailor').scrollTop(0); $('#menu-sailor').scrollTop(0);
} }
@@ -43,19 +89,19 @@ function pageChange() {
async function drawList() { async function drawList() {
window.setTimeout(function () { window.setTimeout(function () {
var list = ''; var list = '';
if (displayed.length > 0) { if (displayed.length > 0) {
var offset = (page - 1) * showCount; var offset = (page - 1) * showCount;
var count = (page == pageCount ? (displayed.length % showCount) : showCount); var count = (page == pageCount ? (displayed.length % showCount) : showCount);
if (count == 0) count = showCount; if (count == 0) count = showCount;
for (i = 0; i < count; i ++) { for (i = 0; i < count; i ++) {
list += displayed[i + offset]; list += displayed[i + offset];
} }
} else { } else {
list = '<div><div>Keine Ergebnisse, die der Suche entsprechen</div></div>'; list = '<div><div>Keine Ergebnisse, die der Suche entsprechen</div></div>';
} }
$('#div-list').html(list); $('#div-list').html(list);
}, 0); }, 0);
} }
@@ -86,10 +132,12 @@ var siteScript = async function() {
firstCall = false; firstCall = false;
initPagination(); initPagination();
$('#input-search').on('input', reSearch); $('#input-search').on('input', reSearch);
$('#menu-item-year').click(function(){ $('#menu-sailor').hideMenu(); $('#menu-edityear').showMenu(); });
$('#button-edityear').click(onEditYearClick);
} }
var results = await dbGetData('sailors'); var results = await dbGetData('sailors');
var count = results.length; var count = results.length;
if (count > 0) { if (count > 0) {
if (count == 1) { if (count == 1) {
@@ -99,51 +147,51 @@ var siteScript = async function() {
} }
$('#div-list').show(); $('#div-list').show();
$('#input-search').parent().show(); $('#input-search').parent().show();
results.sort(function (a, b) { results.sort(function (a, b) {
return a.name.localeCompare(b.name); return a.name.localeCompare(b.name);
}); });
rows = []; rows = [];
for (id in results) { for (id in results) {
var entry = results[id]; var entry = results[id];
var club = null; var club = null;
if (entry['club'] != null) if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']); club = await dbGetData('clubs', entry['club']);
var row = { keywords: [], content: '' }; var row = { keywords: [], content: '' };
row.keywords.push(entry['name']); row.keywords.push(entry['name']);
if (entry['year'] != null) row.keywords.push(entry['year']); if (entry['year'] != null) row.keywords.push(entry['year']);
if (club != null) row.keywords.push(club['kurz'], club['name']); if (club != null) row.keywords.push(club['kurz'], club['name']);
row.content += '<div onclick="onListClicked(' + entry['id'] + ');">'; row.content += '<div onclick="onListClicked(' + entry['id'] + ');">';
// ZEILE 1 // ZEILE 1
// Name // Name
row.content += '<div><b>' + entry['name'] + '</b></div>'; row.content += '<div><b>' + entry['name'] + '</b></div>';
// ZEILE 2 // ZEILE 2
row.content += '<div>'; row.content += '<div>';
// Year // Year
row.content += '<div>' + ((entry['year'] != null) ? (entry['year']) : '') + '</div>'; row.content += '<div>' + ((entry['year'] != null) ? (entry['year']) : '') + '</div>';
// Club // Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>'; row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
row.content += '</div></div>'; row.content += '</div></div>';
rows.push(row); rows.push(row);
} }
reSearch(); reSearch();
} else { } else {
$('#p-count').html('Keine Segler gefunden!'); $('#p-count').html('Keine Segler gefunden!');
$('#div-list').hide(); $('#div-list').hide();
$('#input-search').parent().hide(); $('#input-search').parent().hide();
} }
hideLoader(); hideLoader();
} }

View File

@@ -0,0 +1,8 @@
<a href="#" data-trigger-switch="$$html-id;" class="pb-2 $$css-class;">
<i class="fa font-14 $$icon; rounded-s bg-highlight color-white"></i>
<span>$$0;</span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="$$html-id;">
<label class="custom-control-label" for="$$html-id;"></label>
</div>
</a>

View File

@@ -1,4 +1,4 @@
<div class="input-style input-style-2 input-required $$css-class;"> <div class="input-style input-style-2 input-required $$css-class;">
<span class="color-highlight">$$placeholder;</span> <span class="color-highlight">$$placeholder;</span>
<textarea id="$$html-id;" class="form-control" placeholder="$$placeholder;">$$value;</textarea> <textarea id="$$html-id;" class="form-control pt-3 pb-3" placeholder="$$placeholder;" style="height: 10em; line-height: 1.5em;">$$value;</textarea>
</div> </div>

View File

@@ -1,5 +1,5 @@
<?php <?php
define('PWA_VERSION', '1.4'); define('PWA_VERSION', '1.9.2');
?> ?>

View File

@@ -1,9 +1,9 @@
<?php <?php
header('Content-Type: text/javascript'); header('Content-Type: text/javascript');
require_once(__DIR__ . '/server/config.php'); require_once(__DIR__ . '/server/config.php');
?> ?>
importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js'); importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js');
@@ -41,7 +41,7 @@ workbox.precaching.precacheAndRoute([
return $hash; return $hash;
} }
$hash = md5(getDirHash(__DIR__)); $hash = md5(getDirHash(__DIR__));
$path = __DIR__ . '/server/content/'; $path = __DIR__ . '/server/content/';
$dir = opendir($path); $dir = opendir($path);
while ($file = readdir($dir)) { while ($file = readdir($dir)) {
@@ -50,21 +50,25 @@ workbox.precaching.precacheAndRoute([
echo "\t{url: '$file', revision: '$hash'},\n"; echo "\t{url: '$file', revision: '$hash'},\n";
} }
closedir($dir); closedir($dir);
// ASSETS // ASSETS
$filesToCache = [ $filesToCache = [
'/manifest.json.php', '/manifest.json.php',
]; ];
$dirsToCache = [ $dirsToCache = [
'/client', '/client/app',
'/client/fonts/css',
'/client/fonts/webfonts',
'/client/images',
'/client/scripts',
'/client/styles',
]; ];
function addDir($path) { function addDir($path) {
global $filesToCache; global $filesToCache;
if ($dir = opendir(__DIR__ . $path)) { if ($dir = opendir(__DIR__ . $path)) {
while (($file = readdir($dir)) !== false) { while (($file = readdir($dir)) !== false) {
if ($file == '.') continue; if (substr($file, 0, 1) == '.') continue;
if ($file == '..') continue;
if (is_dir(__DIR__ . $path . '/' . $file)) { if (is_dir(__DIR__ . $path . '/' . $file)) {
addDir($path . '/' . $file); addDir($path . '/' . $file);
} else { } else {
@@ -74,11 +78,11 @@ workbox.precaching.precacheAndRoute([
closedir($dir); closedir($dir);
} }
} }
foreach ($dirsToCache as $path) { foreach ($dirsToCache as $path) {
addDir($path); addDir($path);
} }
foreach ($filesToCache as $file) { foreach ($filesToCache as $file) {
$revision = md5_file(__DIR__ . $file); $revision = md5_file(__DIR__ . $file);
$file = SERVER_ADDR . $file; $file = SERVER_ADDR . $file;
@@ -104,4 +108,205 @@ workbox.routing.registerRoute(
//Learn more about Service Workers and Configurations //Learn more about Service Workers and Configurations
//https://developers.google.com/web/tools/workbox/ //https://developers.google.com/web/tools/workbox/
// DB
function openDb() {
return new Promise(function(resolve) {
if (indexedDB) {
var request = indexedDB.open('regatten_app_db_<?php echo BOATCLASS; ?>');
request.onerror = function (e) {
console.log('[sW] Cannot open DB:', e.targer.errorCode);
resolve(null);
};
request.onupgradeneeded = function (e) {
console.log('[sW] DB does not exist');
e.target.transaction.abort();
resolve(null);
};
request.onsuccess = function (e) {
console.log('[sW] DB loaded');
var db = e.target.result;
db.onerror = function (e) {
console.log('[sW] DB Error:', e);
};
resolve(db);
}
} else {
resolve(null);
}
});
}
function dbSettingsGet(key) {
return new Promise(async function(resolve) {
var db = await openDb();
if (db !== null) {
var request = db.transaction('settings').objectStore('settings').get(key);
request.onsuccess = function (event) {
db.close();
console.log('[sW] DB closed');
resolve(typeof request.result != 'undefined' ? request.result.value : null);
}
} else {
resolve(null);
}
});
}
async function dbSettingsSet(key, value) {
var db = await openDb();
if (db != null) {
var os = db.transaction('settings', 'readwrite').objectStore('settings');
var request = os.put({ key: key, value: value});
request.onerror = function (event) {
console.log('[sW] Error while saving data to DB:', e);
db.close();
console.log('[sW] DB closed');
}
request.onsuccess = function (event) {
db.close();
console.log('[sW] DB closed');
}
}
}
// PUSHES
function getEntry(data, index, defaultValue) {
return ((typeof data[index] !== "undefined") ? data[index] : defaultValue);
}
function isMyRegatta(id) {
return new Promise(async function (resolve) {
var regattas = await dbSettingsGet('myregattas_<?php echo BOATCLASS; ?>');
if (regattas == null) resolve(false);
else resolve(regattas.includes(id.toString()));
});
}
self.addEventListener('push', async function(event) {
console.log('[sW] Push received:', event.data.text());
var data;
try {
data = JSON.parse(event.data.text());
} catch(e) {
console.log(e);
data = undefined;
}
if (typeof data.type !== "undefined") {
switch (data.type) {
case 'notification':
if (typeof data.title === "undefined") break;
if (typeof data.body === "undefined") break;
if (typeof data.channel === "undefined") break;
// check channel
var okay = false;
switch (data.channel) {
case 'news':
if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_news')) okay = true;
break;
case 'regatta_changed':
if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_regatta_changed_all')) okay = true;
else if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_regatta_changed_my')) {
if (await isMyRegatta(getEntry(data, 'id', ''))) okay = true;
}
break;
case 'result_ready':
if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_result_ready_all')) okay = true;
else if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_result_ready_my')) {
if (await isMyRegatta(getEntry(data, 'id', ''))) okay = true;
}
break;
case 'meldeschluss':
if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_meldeschluss')) {
if (await isMyRegatta(getEntry(data, 'id', ''))) okay = true;
}
break;
default:
console.log('Unknown channel:', data.channel);
break;
}
if (!okay) {
console.log('Notification channel not subscribed');
return;
}
const options = {
data: data,
body: data.body,
icon: getEntry(data, 'icon', '<?php echo SERVER_ADDR; ?>/client/app/icons/icon-512x512.png'),
badge: '<?php echo SERVER_ADDR; ?>/client/app/icons/badge-128x128.png',
vibrate: [500,100,500]
};
if ((image = getEntry(data, 'image', null)) !== null) {
options.image = image;
}
// Force refresh on next app open
var db = await openDb();
if (db != null) {
var os = db.transaction('update_times', 'readwrite').objectStore('update_times');
var request = os.put({ table: 'last_sync', time: 0 });
request.onerror = function (event) {
console.log('[sW] Error while saving data to DB:', e);
db.close();
console.log('[sW] DB closed');
}
request.onsuccess = function (event) {
db.close();
console.log('[sW] DB closed');
}
}
console.log('Showing notification');
self.registration.showNotification(data.title, options);
break;
case 'forcesync':
// Force refresh on next app open
var db = await openDb();
if (db != null) {
var os = db.transaction('update_times', 'readwrite').objectStore('update_times');
var request = os.put({ table: 'last_sync', time: 0 });
request.onerror = function (event) {
console.log('[sW] Error while saving data to DB:', e);
db.close();
console.log('[sW] DB closed');
}
request.onsuccess = function (event) {
console.log('[sW] Data successfully saved');
db.close();
console.log('[sW] DB closed');
}
}
break;
default:
console.log('[sW] Push type unknown:', data.type);
break;
}
} else {
console.log('[sW] No push type given!');
}
});
self.addEventListener('notificationclick', function(event) {
var data = event.notification.data;
event.notification.close();
var url = '<?php echo SERVER_ADDR; ?>' + getEntry(data, 'url', '');
event.waitUntil(
clients.openWindow(url)
);
});