|
139 | 139 | @media all and (min-width:550px) { |
140 | 140 | #list{display:block; float:left; width:37%;} |
141 | 141 | #list #items{border-right:1px solid var(--list-right-border-color);} |
| 142 | + #sub-panel{background-color:var(--background-color);} |
142 | 143 | #editor{display:block; float:right; width:63%;} |
143 | 144 | #settings{float:right; width:63%;} |
144 | 145 | .hide-btn img{opacity:0; cursor:default;} |
145 | 146 | } |
146 | 147 | </style> |
147 | 148 | <script type="text/javascript" src="cordova.js"></script> |
148 | 149 | <script type="text/javascript"> |
149 | | - var FirstRun = false; |
150 | | - var DeviceID; |
151 | | - var TabletMode = false; |
| 150 | + let FirstRun = false; |
| 151 | + let DeviceID; |
| 152 | + let TabletMode = false; |
152 | 153 |
|
153 | | - var NotesDB; |
154 | | - var ActionsDB; |
| 154 | + let NotesDB; |
| 155 | + let ActionsDB; |
155 | 156 |
|
156 | | - var CurNoteID = -1; // По умолчанию новая заметка |
157 | | - var LatestNote; |
158 | | - var CurNoteDateTime; |
| 157 | + let CurNoteID = -1; // По умолчанию новая заметка |
| 158 | + let LatestNote; |
| 159 | + let CurNoteDateTime; |
159 | 160 |
|
160 | | - var SyncWait = false; |
| 161 | + let SyncWait = false; |
161 | 162 |
|
162 | | - var UpdateDateTime = true; |
| 163 | + let UpdateDateTime = true; |
163 | 164 |
|
164 | | - var HideFirstNotifyError = true; // На замену navigator.onLine (постоянно стала возвращать true на Android), для iOS ставим true |
| 165 | + let HideFirstNotifyError = true; // На замену navigator.onLine (постоянно стала возвращать true на Android), для iOS ставим true |
165 | 166 |
|
166 | | - var UsedDarkTheme = false; // Для QR (проблемы с CSS) |
| 167 | + let UsedDarkTheme = false; // Для QR (проблемы с CSS) |
167 | 168 |
|
168 | 169 | // Настройки для Android |
169 | | - var ServerIP; |
170 | | - var ServerPort; |
171 | | - var AutoSearchIP = false; |
| 170 | + let ServerAddress; |
| 171 | + let ServerPort; |
| 172 | + let AutoSearchIP = false; |
172 | 173 |
|
173 | | - var FlashLightEnable = false; |
| 174 | + let FlashLightEnable = false; |
174 | 175 |
|
175 | 176 | // Перевод, по умолчанию English |
176 | 177 | let IDS_MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; |
|
183 | 184 |
|
184 | 185 | // Настройки для Android |
185 | 186 | let IDS_SETTINGS = 'Settings'; |
186 | | - let IDS_SYNC_IP = 'IP address'; |
| 187 | + let IDS_SYNC_ADDRESS = 'IP or domain'; |
187 | 188 | let IDS_SYNC_PORT = 'Port'; |
188 | 189 | let IDS_AUTOSEARCH_IP = 'Autosearch IP address'; |
189 | | - let IDS_ABOUT_SYNC = 'IP address and port to sync notes with your PC.'; |
| 190 | + let IDS_ABOUT_SYNC = 'IP and port or domain to sync notes with your PC or web server.'; |
190 | 191 | let IDS_AUTO_SYNC = 'Sync at startup'; |
191 | 192 | let IDS_ABOUT_AUTO_SYNC = 'Automatically sync on app launch.'; |
192 | 193 |
|
|
219 | 220 |
|
220 | 221 | // Настройки для Android |
221 | 222 | IDS_SETTINGS = 'Настройки'; |
222 | | - IDS_SYNC_IP = 'IP адрес'; |
| 223 | + IDS_SYNC_ADDRESS = 'IP или домен'; |
223 | 224 | IDS_SYNC_PORT = 'Порт'; |
224 | 225 | IDS_AUTOSEARCH_IP = 'Автопоиск IP адреса'; |
225 | | - IDS_ABOUT_SYNC = 'IP адрес и порт для синхронизации заметок с вашим ПК.'; |
| 226 | + IDS_ABOUT_SYNC = 'IP адрес и порт или домен для синхронизации заметок, с вашим ПК или веб-сервером.'; |
226 | 227 | IDS_AUTO_SYNC = 'Синхронизация при запуске'; |
227 | 228 | IDS_ABOUT_AUTO_SYNC = 'Автоматическая синхронизация при запуске приложения.'; |
228 | 229 |
|
|
460 | 461 | UsedDarkTheme = true; |
461 | 462 | } |
462 | 463 |
|
| 464 | + function IsDomain(Str){ |
| 465 | + Str = Str.toLowerCase(); |
| 466 | + if (Str.indexOf('http://') == 0 || Str.indexOf('https://') == 0) |
| 467 | + return true; |
| 468 | + else |
| 469 | + return false; |
| 470 | + } |
| 471 | + |
463 | 472 | function SettingsDone() |
464 | 473 | { |
465 | 474 | // IP |
466 | | - let NewIP = document.getElementById('ServerIP').value; |
467 | | - localStorage.setItem('ServerIP', NewIP); |
468 | | - ServerIP = NewIP; |
| 475 | + let NewAddress = document.getElementById('ServerAddress').value; |
| 476 | + localStorage.setItem('ServerAddress', NewAddress); |
| 477 | + if (IsDomain(NewAddress)) |
| 478 | + ServerAddress = NewAddress; |
| 479 | + else |
| 480 | + ServerAddress = 'http://' + NewAddress; |
469 | 481 |
|
470 | 482 | // Port |
471 | 483 | let NewPort = document.getElementById('ServerPort').value; |
|
714 | 726 | DeviceOS = 'Android'; |
715 | 727 | else if (/iPhone|iPod|iPad/i.test(window.navigator.userAgent)) |
716 | 728 | DeviceOS = 'iOS'; |
717 | | - if (/Edg/.test(navigator.userAgent)) |
| 729 | + else if (/Edg/.test(navigator.userAgent)) |
718 | 730 | DeviceOS = 'Windows'; |
719 | 731 |
|
720 | 732 | return DeviceOS + '_' + Math.random().toString(36).substr(2, 9); |
|
753 | 765 | // Первый запуск |
754 | 766 | if (FirstRun) { |
755 | 767 | //console.log('FirstRun'); |
756 | | - GetData('http://' + ServerIP + ':' + ServerPort + '/api/auth?id=' + DeviceID).then(function(responseText) { |
| 768 | + GetData(ServerAddress + ':' + ServerPort + '/api/auth?id=' + DeviceID).then(function(responseText) { |
757 | 769 | if (responseText == 'auth:ok') { |
758 | 770 | //console.log('auth:ok'); |
759 | 771 |
|
760 | 772 | // Получение всех заметок при первом запуске |
761 | 773 | let XMLDoc = document.createElement('div'); |
762 | 774 |
|
763 | | - GetData('http://' + ServerIP + ':' + ServerPort + '/api/notes?id=' + DeviceID).then(function(responseNotes) { |
| 775 | + GetData(ServerAddress + ':' + ServerPort + '/api/notes?id=' + DeviceID).then(function(responseNotes) { |
764 | 776 | XMLDoc.innerHTML = responseNotes; |
765 | 777 |
|
766 | 778 | let NoteItems = XMLDoc.getElementsByTagName('note'); |
|
801 | 813 | } else { // Второй и последующие запуски |
802 | 814 | // Получение действий |
803 | 815 | let XMLDoc = document.createElement('div'); |
804 | | - GetData('http://' + ServerIP + ':' + ServerPort + '/api/actions?id=' + DeviceID).then(function(responseNotes) { |
| 816 | + GetData(ServerAddress + ':' + ServerPort + '/api/actions?id=' + DeviceID).then(function(responseNotes) { |
805 | 817 | XMLDoc.innerHTML = responseNotes; |
806 | 818 |
|
807 | 819 | // Удаляем действия |
808 | | - GetData('http://' + ServerIP + ':' + ServerPort + '/api/received?id=' + DeviceID).then(function(responseStatus) { |
| 820 | + GetData(ServerAddress + ':' + ServerPort + '/api/received?id=' + DeviceID).then(function(responseStatus) { |
809 | 821 |
|
810 | 822 | if (responseStatus == 'ok') { |
811 | 823 | let ActionsItems = XMLDoc.getElementsByTagName('*'); |
|
855 | 867 |
|
856 | 868 | // Генерирация XML действий пользователя и отправка на "сервер" |
857 | 869 | if (FirstRun == false) // При первом запуске отправлять нечего |
858 | | - GetData('http://' + ServerIP + ':' + ServerPort + '/api/auth?id=' + DeviceID).then(function(responseText) { // Проверка авторизации |
| 870 | + GetData(ServerAddress + ':' + ServerPort + '/api/auth?id=' + DeviceID).then(function(responseText) { // Проверка авторизации |
859 | 871 | if (responseText == 'auth:ok') { |
860 | 872 | ActionsDB.transaction(function (tx) { |
861 | 873 | tx.executeSql('SELECT * FROM Actions', [], function (tx, results) { |
|
871 | 883 | XMLAPI += '</actions>'; |
872 | 884 |
|
873 | 885 | // Отправка XML на "сервер" |
874 | | - SendData('http://' + ServerIP + ':' + ServerPort + '/api/syncnotes?id=' + DeviceID, XMLAPI).then(function(responseStatus) { |
| 886 | + SendData(ServerAddress + ':' + ServerPort + '/api/syncnotes?id=' + DeviceID, XMLAPI).then(function(responseStatus) { |
875 | 887 |
|
876 | 888 | if (responseStatus == 'ok') { |
877 | 889 | ActionsDB.transaction(function (tx) { |
|
918 | 930 | function CheckIPStatus(IP){ |
919 | 931 | if (FoundIPAddress) return; |
920 | 932 | //console.log('Check ' + IP); |
921 | | - try { |
922 | | - let xhr = new XMLHttpRequest(); |
923 | | - xhr.onreadystatechange = function () { |
924 | | - if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText == 'ok') { |
925 | | - ServerIP = IP; |
926 | | - Sync(); |
927 | | - FoundIPAddress = true; |
928 | | - //console.log('WORK ' + ServerIP); |
929 | | - } |
930 | | - }; |
931 | | - xhr.open('GET', 'http://' + IP + ':' + ServerPort + '/api/connecttest', true); |
932 | | - xhr.timeout = 500; |
933 | | - xhr.send(); |
934 | | - } catch {} |
| 933 | + GetData('http://' + IP + ':' + ServerPort + '/api/connecttest').then(function(responseText) { // Проверка IP адреса |
| 934 | + if (responseText == 'ok') { |
| 935 | + ServerAddress = 'http://' + IP; |
| 936 | + FoundIPAddress = true; |
| 937 | + Sync(); |
| 938 | + } |
| 939 | + }).catch(function() { |
| 940 | + }); |
935 | 941 | } |
936 | 942 |
|
937 | 943 | // Список наиболее популярных локальных IP адресов |
938 | | - let IPS = ["192.168.0.", "192.168.0.", "192.168.1.", "192.168.1.", "192.168.2.", "192.168.3."]; |
939 | | - let LastAddrs = [ 0, 100, 0, 100, 0, 0]; //Начальный адрес |
| 944 | + let IPs = ['192.168.0.', '192.168.0.', '192.168.1.', '192.168.1.', '192.168.2.', '192.168.3.']; |
| 945 | + let LastAddrs = [ 0, 100, 0, 100, 0, 0]; // Начальный адрес |
940 | 946 |
|
941 | | - for (let i = 0; i < IPS.length; i++) |
| 947 | + for (let i = 0; i < IPs.length; i++) |
942 | 948 | for (let j = 0; j <= 15; j++) |
943 | | - CheckIPStatus(IPS[i] + (LastAddrs[i] + j)); |
| 949 | + CheckIPStatus(IPs[i] + (LastAddrs[i] + j)); |
944 | 950 | } |
945 | 951 |
|
946 | 952 | function SyncAdvance(){ |
|
975 | 981 | document.getElementById('NotesCount').innerHTML = IDS_NOTES + ' (0)'; |
976 | 982 | document.getElementById('NoteTitle').innerHTML = IDS_NEW_NOTE; |
977 | 983 | document.getElementById('SettingsTitle').innerText = IDS_SETTINGS; |
978 | | - document.getElementById('SyncIP').innerText = IDS_SYNC_IP; |
| 984 | + document.getElementById('SyncAddress').innerText = IDS_SYNC_ADDRESS; |
979 | 985 | document.getElementById('SyncPort').innerText = IDS_SYNC_PORT; |
980 | 986 | document.getElementById('AutoSearchIP').innerText = IDS_AUTOSEARCH_IP; |
981 | 987 | document.getElementById('AboutSync').innerText = IDS_ABOUT_SYNC; |
|
1019 | 1025 | ShowNotes(); |
1020 | 1026 |
|
1021 | 1027 | // Настройки, IP |
1022 | | - if (localStorage.getItem('ServerIP') != null) { |
1023 | | - ServerIP = localStorage.getItem('ServerIP'); |
1024 | | - document.getElementById('ServerIP').value = ServerIP; |
| 1028 | + if (localStorage.getItem('ServerAddress') != null) { |
| 1029 | + ServerAddress = localStorage.getItem('ServerAddress'); |
| 1030 | + document.getElementById('ServerAddress').value = ServerAddress; |
| 1031 | + if (IsDomain(ServerAddress) == false) |
| 1032 | + ServerAddress = 'http://' + ServerAddress; |
1025 | 1033 | } else |
1026 | 1034 | ShowSettings(); |
1027 | 1035 |
|
|
1038 | 1046 | } |
1039 | 1047 |
|
1040 | 1048 | // Первый запуск |
1041 | | - if (localStorage.getItem('FirstRun') === null) |
| 1049 | + if (localStorage.getItem('FirstRun') == null) |
1042 | 1050 | FirstRun = true; |
1043 | 1051 | else |
1044 | 1052 | FirstRun = false; |
|
1058 | 1066 | if (window.navigator.onLine) |
1059 | 1067 | SyncAdvance(); |
1060 | 1068 | } else |
1061 | | - HideFirstNotifyError = false; //Android, неработающая navigator.onLine |
| 1069 | + HideFirstNotifyError = false; // Android, неработающая navigator.onLine |
1062 | 1070 |
|
1063 | 1071 | }); |
1064 | 1072 | </script> |
|
1112 | 1120 | <div id="page"> |
1113 | 1121 | <div id="items"> |
1114 | 1122 | <div id="item"> |
1115 | | - <div class="title" id="SyncIP">IP адрес</div> |
1116 | | - <div id="control"><input type="text" id="ServerIP" value="192.168.0.1" placeholder="192.168.0.1"></div> |
| 1123 | + <div class="title" id="SyncAddress">IP или домен</div> |
| 1124 | + <div id="control"><input type="text" id="ServerAddress" oninput="if (IsDomain(this.value)) document.getElementById('ServerPort').value='80';" value="192.168.0.1" placeholder="192.168.0.1"></div> |
1117 | 1125 | </div> |
1118 | 1126 | <div id="item"> |
1119 | 1127 | <div class="title" id="SyncPort">Порт</div> |
|
1160 | 1168 |
|
1161 | 1169 | <div id="AboutThemeTime" class="titlebox"></div> |
1162 | 1170 |
|
1163 | | - <div class="titlebox" style="text-align:center;"><br>EasyNotes<br><span id="LastUpdate"></span> 23.11.21<br>https://r57zone.github.io<br><br><span id="DeviceID"></span></div> |
| 1171 | + <div class="titlebox" style="text-align:center;"><br>EasyNotes<br><span id="LastUpdate"></span> 06.09.22<br>https://r57zone.github.io<br><br><span id="DeviceID"></span></div> |
1164 | 1172 | <br> |
1165 | 1173 | <div id="items"> |
1166 | 1174 | <div id="item"> |
|
0 commit comments