├── LICENSE
├── README.md
├── db
├── .htaccess
└── database.json
├── display
├── css
│ ├── bootstrap.min.css
│ ├── font-awesome.min.css
│ └── style.css
├── fonts
│ ├── Arial
│ │ ├── Arial.eot
│ │ ├── Arial.svg
│ │ ├── Arial.ttf
│ │ ├── Arial.woff
│ │ ├── Arial.woff2
│ │ └── Demo.html
│ ├── FontAwesome.otf
│ ├── OpenSansCondLight
│ │ ├── OpenSansCondLight-bg.png
│ │ ├── OpenSansCondLight-thumb.png
│ │ ├── OpenSansCondLight.eot
│ │ ├── OpenSansCondLight.png
│ │ ├── OpenSansCondLight.ttf
│ │ ├── OpenSansCondLight.woff
│ │ ├── font.css
│ │ ├── index.html
│ │ └── readme.txt
│ ├── Titillium-Web-ExtraLight.ttf.eot
│ ├── Titillium-Web-ExtraLight.ttf.svg
│ ├── Titillium-Web-ExtraLight.ttf.woff
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ ├── fontawesome-webfont.woff
│ └── fontawesome-webfont.woff2
├── img
│ ├── beep.mp3
│ ├── bg-adzan.png
│ ├── bg-kubah.png
│ ├── bg-masjid.png
│ ├── bg-pattern-01.png
│ ├── bg-pattern-02.png
│ ├── bg-sholat.png
│ ├── clock-line.png
│ ├── hadist-line.png
│ ├── pattern01.png
│ └── preloader.gif
├── index.php
├── js
│ ├── PrayTimes.js
│ ├── bootstrap.min.js
│ ├── jquery-3.4.1.min.js
│ ├── jquery.marquee.js
│ ├── main.js
│ └── moment-with-locales.js
├── logo
│ └── 1584790576.png
└── wallpaper
│ ├── 15822524510.jpg
│ ├── 15822524511.jpg
│ └── 15822524740.jpg
├── dist
├── css
│ ├── AdminLTE.min.css
│ ├── _all-skins.min.css
│ ├── bootstrap-datetimepicker.css
│ ├── bootstrap.min.css
│ ├── buttons.dataTables.min.css
│ ├── datatables.min.css
│ └── font-awesome.min.css
├── fonts
│ ├── FontAwesome.otf
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ ├── fontawesome-webfont.woff
│ ├── fontawesome-webfont.woff2
│ ├── glyphicons-halflings-regular.eot
│ ├── glyphicons-halflings-regular.svg
│ ├── glyphicons-halflings-regular.ttf
│ ├── glyphicons-halflings-regular.woff
│ └── glyphicons-halflings-regular.woff2
├── img
│ └── bgTransparent.jpg
└── js
│ ├── adminlte.min.js
│ ├── bootstrap-datetimepicker.min.js
│ ├── bootstrap.min.js
│ ├── datatables.min.js
│ ├── fn.js
│ ├── jquery.min.js
│ ├── moment-with-locales.js
│ └── swipe.js
├── icon.png
├── index.php
├── login.php
├── proses.php
├── readme-image
├── compare.xlsx
├── img1.jpg
├── img2.jpg
├── img3.jpg
├── img4.jpg
├── img5.JPG
├── img6.JPG
├── img7.JPG
└── img8.JPG
└── session.php
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 fahroniganteng
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # DISPLAY MASJID - VERSI 1.0.0
2 |
3 |
4 | Aplikasi display masjid digunakan sebagai media informasi pada masjid dan musholla.
5 |
6 | Aplikasi berbasis web dengan menggunakan bahasa pemrograman PHP dan penyimpanan data dalam file JSON, di design untuk board raspberry pi, penggunaan pada board/device lain mungkin tidak kompatibel atau memerlukan modifikasi program (cek pada menu MATERIAL DAN OS di bawah untuk device yang pernah dicoba).
7 | Aplikasi ini gratis dan open source dibawah lisensi **MIT**
8 |
9 |
10 | ## FITUR
11 |
12 | - **OFFLINE**, tidak memerlukan koneksi internet.
13 | - **STANDALONE**, tidak memerlukan tambahan perangkat jaringan lain seperti router, modem, hub dll.
14 | - Waktu sholat.
15 | - Library perhitungan waktu sholat dari [praytimes.org](http://praytimes.org/).
16 | - Konfigurasi waktu sholat dengan koordinat dan metode perhitungan, sekali setting untuk selamanya.
17 | - MWL : Muslim World League
18 | - ISNA : Islamic Society of North America
19 | - Egypt : Egyptian General Authority of Survey
20 | - Makkah : Umm al-Qura University, Makkah
21 | - Karachi : University of Islamic Sciences, Karachi
22 | - Tehran : Institute of Geophysics, University of Tehran
23 | - Jafari : Shia Ithna Ashari (Ja'fari)
24 | - Manual.
25 |
26 | > Untuk indonesia menggunakan metode dari kemenag, pilih pada manual.
27 | > Cara pengisian ada pada menu admin.
28 | - Terdapat fitur simulasi waktu sholat di menu admin.
29 | Akurasi perhitungan waktu sholat dari library [praytimes.org](http://praytimes.org/) cukup baik, sudah dicoba untuk dibandingkan dengan situs https://jadwalsholat.pkpu.or.id/ dalam kurun waktu 1 tahun (1 januari 2020 sampai 31 desember 2020) untuk wilayah bekasi, dengam koordinat dan metode yang sama, hasilnya selisih perhitungan maksimal hanya 1 menit. (file excel komparasi bisa di lihat [disini](readme-image/compare.xlsx))
30 | - Terdapat menu penyesuaian waktu sholat -60 sampai +60 menit.
31 | Contoh penggunaan : jadwal ditambahkan +2 menit untuk ihtiyati (pengaman), dll.
32 | - Display informasi masjid/musholla, bisa ditambah/diganti.
33 | - Running text, bisa ditambah/diganti.
34 | - Gambar latar belakang (wallpaper) juga bisa ditambah/diganti.
35 | - Logo masjid/musholla bisa diganti.
36 | - Count down menuju waktu sholat.
37 | - Count down iqomah dan suara beep untuk peringatan waktu iqomah akan habis.
38 | Durasi iqomah bisa di setting berbeda pada masing-masing waktu sholat.
39 | - Durasi waktu (timer) count down, sholat, iqomah, khutbah dan wallpaper bisa diatur.
40 | - Display kalem pada waktu sholat dan khutbah agar tidak mengganggu.
41 | - Sholat jum'at (opsional, bisa dimatikan)
42 | - Sholat tarawih (opsional, bisa dimatikan)
43 | - Menu admin mudah digunakan.
44 | Menu admin bisa dijalankan dengan HP (android/iphone), laptop atau device lain secara wireless dengan koneksi wifi.
45 | Menu admin web base, sehingga tidak memerlukan aplikasi tambahan, cukup menggunakan browser yang sudah ada pada HP atau laptop.
46 | - Untuk pengembangan, bisa digunakan untuk beberapa display di dalam masjid/musholla secara wireless, dengan konfigurasi 1 device untuk server dan device lainnya sebagai client.
47 | - 1 device (board raspberry pi) digunakan untuk server dengan setting seperti manual dibawah, dan ditambahkan setting NTP server (broadcast).
48 | - Device lainnya hanya sebagai client yang menampilkan halaman web dari server dengan konfigurasi update waktu (NTP client) ke device server agar waktu yang ditampilkan sama (tidak perlu menambahkan modul RTC pada raspberry client).
49 |
50 |
51 | ### Video
52 | #### 01. Demo dan manual
53 | [](https://youtu.be/odmJeMKmeQw)
54 |
55 | #### 02. Demo Admin (video lama)
56 | [](https://youtu.be/94Yjqq0RiNY)
57 |
58 | #### 03. Instalasi
59 | [](https://youtu.be/HfmVgQ77y5w)
60 |
61 |
62 | ### Overview
63 |
64 | 
65 |
66 |
67 | 
68 |
69 |
70 | 
71 |
72 |
73 | 
74 |
75 | ### Admin menu
76 | 
77 | 
78 | 
79 | 
80 |
81 | ----
82 |
83 | ## MATERIAL DAN OS
84 |
85 | #### Material yang dibutuhkan:
86 | - Raspberry PI 3 model 3B, 3B+ atau Raspberry PI 4 Model B (pada saat tulisan ini dibuat, model terbaru adalah Raspberry PI 4 Model B).
87 | > Aplikasi telah di uji coba pada :
88 | > - Raspberry PI 3 model 3B `OK`.
89 | > - Raspberry PI 3 model 3B+ `OK`.
90 | > - Raspberry PI 4 Model B `OK`.
91 | > - Raspberry PI Zero `Display Lag`.
92 |
93 | **PERINGATAN! Tidak direkomendasikan menggunakan raspberry pi zero**
94 |
95 | - Micro SD, ukuran 8Gb atau lebih besar.
96 | - Aksesoris raspberry (charger, heatsink, casing, fan, dll sesuai kebutuhan)
97 | - Modul RTC
98 | - Display (TV atau monitor)
99 |
100 | > **CATATAN**
101 | > - Aplikasi ini di desain untuk berjalan di board raspberry pi, namun pernah dicoba menggunakan mini PC dengan prosesor intel dual core, ram 1Gb, dengan OS Raspberry PI Desktop, bisa berjalan dengan baik. Namun untuk konfigurasi waktu tidak menggunakan manual disini (karena tidak ada tambahan modul RTC), dan setting waktu di menu admin tidak bisa digunakan, karena pada script PHP mengirim perintah untuk update waktu ke modul RTC, sehingga perlu dilakukan perubahan script pada file proses.php agar dapat digunakan.
102 | > - Untuk OS rasbian sendiri saat ini tersedia untuk prosesor intel dan AMD, sehingga aplikasi display masjid memungkinkan diinstal pada PC yang menggunakan Intel atau AMD dengan sedikit modifikasi pada script update jam.
103 | > - Untuk OS windows aplikasi bisa berjalan, namun menu `update jam`, `restart`, dan `shutdown` tidak bisa digunakan, perlu dilakukan modifikasi pada file proses.php agar dapat digunakan.
104 |
105 | #### Operating system.
106 | OS yang digunakan adalah raspbian (linux debian), pada saat ini dibuat versi terbaru adalah :
107 | - Raspbian Buster
108 | - Version : February 2020
109 | - Release date : 2020-02-13
110 | - Kernel version : 4.19
111 | - Size : 2530 MB
112 |
113 | Download operasi sistem dan cara instalasi operasi sistem bisa dilihat pada website resmi [raspberry PI](https://www.raspberrypi.org/downloads/)
114 | > Biasanya jika anda beli paket modul raspberry sudah terinstal operasi sistem rasbian
115 |
116 |
117 | ## KONFIGURASI RASPBERRY
118 |
119 | #### Konfigurasi awal
120 | Jalankan raspi, pasang keyboard dan mouse lakukan konfigurasi berikut :
121 | - Koneksikan ke jaringan dan cek ip raspberry (IP diperlukan untuk remote)
122 | - Untuk jaringan wifi cek pada `wlan0`, buka terminal ketik perintah :
123 | ```
124 | sudo ifconfig wlan0
125 | ```
126 | - Untuk ethernet port cek pada `eth0`
127 | ```
128 | sudo ifconfig eth0
129 | ```
130 | - Enable SSH dan VNC
131 | - Jika melalui GUI,
132 | - Buka start menu
133 | - Pilih preferensi
134 | - Pilih konfigurasi raspberry pi
135 | - Pilih tab antar muka
136 | - Aktifkan VNC dan SSH
137 | - Jika melalui terminal
138 | - Ketik `sudo raspi-config`
139 | - Pilih interface dan option
140 | - Pilih SSH dan aktifkan
141 | - Pilih VNC dan aktifkan
142 | - Ganti password (defaultnya : raspberry, untuk lebih aman sebaiknya diganti)
143 | - Masuk terminal, ketik `sudo raspi-config`
144 | - Pilih change user password
145 | - Ikuti menu yang tersedia.
146 |
147 | > Default raspbian buster akan muncul wizard konfigurasi (welcome screen) pada saat pertama kali dijalankan.
148 | > Lihat video manual install ya kalo masih bingung (video masih progress upload youtube, link menyusul).
149 |
150 | #### Catatan sebelum memulai instalasi:
151 | - Diperlukan koneksi internet untuk instalasi apache, php, i2c-tools, dnsmasq dan hostapd.
152 | - Pada video tutorial koneksi menggunakan wifi.
153 | - Text editor bawaan raspberry adalah nano
154 | - untuk menyimpan dan keluar dari nano ```CTRL + x```
155 | - untuk mencari text dari nano ```CTRL + w```
156 |
157 | - Jika HDMI tidak muncul di display/monitor (biasanya terjadi pada raspberry pi 4 yang ada 2 slot HDMI)
158 | buka micro sd di PC dengan card reader, edit config.txt hapus komen baris berikut
159 | ```
160 | # uncomment if hdmi display is not detected and composite is being output
161 | hdmi_force_hotplug=1
162 | ```
163 | - Untuk setting display monitor jika tidak pas, lebih besar dari monitor (over scan) bisa disetting juga dari config.txt
164 | ```
165 | # uncomment the following to adjust overscan. Use positive numbers if console
166 | # goes off screen, and negative if there is too much
167 | border
168 | overscan_left=16
169 | overscan_right=16
170 | overscan_top=16
171 | overscan_bottom=16
172 | ```
173 | Jika layar lebih kecil dari monitor (ada border hitam sekeliling monitor) bisa diisi minus
174 | ```
175 | overscan_left=-10
176 | overscan_right=-10
177 | overscan_top=-10
178 | overscan_bottom=-10
179 | ```
180 | dst....
181 |
182 |
183 |
184 | ## MANUAL INSTALASI
185 |
186 | Untuk mempermudah, anda bisa melakukan instalasi melalui remote SSH dan VNC
187 | > Untuk windows bisa menggunakan aplikasi putty & WinSCP.
188 | - Jalankan putty
189 | - Konfigurasi koneksi dengan IP, user dan password yang di setting di atas
190 |
191 | ----
192 |
193 | ### UPDATE OS
194 | - Perintah update.
195 | ```
196 | sudo apt-get update
197 | ```
198 | - Perintah upgrade
199 | ```
200 | sudo apt-get upgrade
201 | ```
202 |
203 | ----
204 |
205 | ### INSTALL APACHE DAN PHP SERVER SERTA INSTALASI WEB
206 | - Instal apache dan PHP.
207 | ```
208 | sudo apt install apache2
209 | sudo apt install php php-mbstring
210 | ```
211 |
212 | - Ganti owner folder html.
213 | Default owner pada `/var/www/html` adalah root (user pi tidak punya akses pada folder tersebut)
214 | ```
215 | sudo chown -R pi:pi /var/www/html
216 | ```
217 | - Copy kan file aplikasi display masjid menggunakan WinSCP ke `/var/www/html`
218 | - Ganti owner ke www-data.
219 | User untuk apache adalah www-data, jadi untuk owner pada semua folder, sub folder dan file di `/var/www/html/` harus diganti ke www-data.
220 | ```
221 | sudo chown -R www-data:www-data /var/www/html/
222 | ```
223 | > Jika anda akan mengcopy kan file kembali dari WinSCP pada folder `/var/www/html/` maka owner harus dikembalikan ke pi :
224 | ```
225 | sudo chown -R pi:pi /var/www/html/
226 | ```
227 |
228 | - Enable rewrite untuk proteksi database.
229 | Penyimpanan data (database) pada aplikasi ini menggunakan file json pada folder db, defaultnya file ini bisa diakses dari halaman website, sehingga user dan password aplikasi bisa terbaca, maka perlu diproteksi agar tidak dapat diakses melalui website.
230 | ```
231 | sudo nano /etc/apache2/sites-enabled/000-default.conf
232 | ```
233 | tambahkan baris berikut:
234 | ```
235 |
236 | AllowOverride All
237 |
238 | ```
239 | - Restart apache server dengan perintah:
240 | ```
241 | sudo systemctl restart apache2
242 | ```
243 | atau
244 | ```
245 | sudo service apache2 restart
246 | ```
247 | - Enable sound permission pada browser chrome.
248 | Pada count down iqomah < 5 detik akan muncul beep, maka perlu di enable permission di chrome agar bisa bunyi.
249 | - Buka browser chrome (di raspberry)
250 | - Alamat http://localhost/display/
251 | - Pilih pada `view site information` --> ada di sebelah address (lihat video / googling aja kalo gak nemu)
252 | - Pilih `site settings`
253 | - Cari `sound`
254 | - Pilih `allow`
255 |
256 | ----
257 |
258 | ### DISABLE SLEEP & CURSOR
259 | Jalankan perintah berikut pada terminal.
260 | ```
261 | sudo nano /etc/lightdm/lightdm.conf
262 | ```
263 | Cari `xserver-command=X`, tambahkan baris berikut
264 | ```
265 | xserver-command=X -s 0 dpms -nocursor
266 | ```
267 |
268 | ----
269 |
270 | ### MEMBUAT AUTO START
271 | Untuk membuat auto start aplikasi display masjid di chrome.
272 | Jalankan perintah berikut pada terminal :
273 | ```
274 | sudo nano /etc/xdg/lxsession/LXDE-pi/autostart
275 | ```
276 |
277 | Tambahkan baris berikut
278 | ```
279 | # chromium-browser --incognito --kiosk http://localhost/display/
280 |
281 | # ada beberapa kasus di chrome yang suka muncul error gagal update
282 | # seperti pada forum raspi : https://www.raspberrypi.org/forums/viewtopic.php?t=264399
283 | # solusi sementara pada saat start tambahkan update sampe setahun
284 |
285 | chromium-browser --check-for-update-interval=31536000 --incognito --kiosk http://localhost/display/
286 |
287 | ```
288 |
289 |
290 |
291 | > Jika menggunakan OS rasbian versi lama, session berada pada `~/.config/lxsession/`, perintah pada terminal:
292 | ```
293 | sudo nano ~/.config/lxsession/LXDE-pi/autostart
294 | ```
295 |
296 |
297 |
298 |
299 | ----
300 |
301 | ### INSTALL RTC
302 | - Pastikan **RTC modul** sudah terpasang pada GPIO raspberry di pin 1,3,5,7,9 (anda bisa cari di internet untuk lebih jelasnya)
303 | - Install i2c-tools, ketik perintah berikut pada terminal:
304 | ```
305 | sudo apt install i2c-tools
306 | ```
307 |
308 | - Ganti lokasi indonesia.
309 | > jika sudah setting pada wizard saat pertama kali menjalankan os raspberry pi, proses ini bisa dilewati.
310 | - Ketik perintah berikut pada terminal:
311 | ```
312 | sudo raspi-config
313 | ```
314 | - pilih di menu :
315 | - 4 Localisation Options
316 | - I2 Change Timezone
317 | - Asia
318 | - Jakarta
319 |
320 | tekan tab untuk ke menu finish
321 |
322 | - Aktifkan i2c
323 | - Ketik perintah berikut pada terminal:
324 | ```
325 | sudo raspi-config
326 | ```
327 | - Pilih di menu :
328 | - 5 Interfacing Options
329 | - P5 I2C
330 | - Pada menu `Would you like the ARM I2C interface to be enabled?`, pilih yes
331 |
332 | - Detect modul RTC
333 | ```
334 | sudo i2cdetect -y 1
335 | ```
336 | jika sudah dipasang dengan benar biasanya akan muncul pada channel 68
337 | ```
338 | 0 1 2 3 4 5 6 7 8 9 a b c d e f
339 | 00: -- -- -- -- -- -- -- -- -- -- -- -- --
340 | 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
341 | 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
342 | 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
343 | 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
344 | 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
345 | 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
346 | 70: -- -- -- -- -- -- -- --
347 | ```
348 |
349 | - Tambahkan konfigurasi RTC pada boot config.
350 | Ketik perintah berikut pada terminal:
351 | ```
352 | sudo nano /boot/config.txt
353 | ```
354 | Tambahkan pada baris terakhir
355 | ```
356 | dtoverlay=i2c-rtc,ds3231
357 | ```
358 |
359 | - Tambahkan module RTC.
360 | Ketik perintah berikut pada terminal:
361 | ```
362 | sudo nano /etc/modules
363 | ```
364 | Tambahkan pada baris terakhir
365 | ```
366 | rtc-ds3231
367 | ```
368 |
369 | - Edit File /lib/udev/hwclock-set.
370 | Ketik perintah berikut pada terminal:
371 | ```
372 | sudo nano /lib/udev/hwclock-set
373 | ```
374 | Berikan Comment pada baris berikut :
375 | ```
376 | #if [ -e /run/systemd/system ] ; then
377 | # exit 0
378 | #fi
379 | ```
380 |
381 | - Lakukan restart raspberry
382 | ```
383 | sudo reboot
384 | ```
385 |
386 |
387 | - Beberapa perintah untuk modul RTC.
388 | - Membaca waktu dari Raspberry
389 | ```
390 | date
391 | ```
392 | - Mengganti Waktu pada Raspberry
393 | ```
394 | sudo date -s “DD MMM YYYY HH:MM:SS”
395 | ```
396 | - Mengganti waktu pada RTC
397 | ```
398 | sudo hwclock --set --date="YYYY-MM-DD HH:MM:SS" --localtime
399 | ```
400 | - Membaca Waktu dari Module RTC
401 | ```
402 | sudo hwclock -r
403 | ```
404 | - Menulis waktu ke Module RTC Dari Raspberry.
405 | ```
406 | sudo hwclock -w
407 | ```
408 | - Menulis waktu Ke Raspberry Dari Module RTC
409 | ```
410 | sudo hwclock -s
411 | ```
412 |
413 | - Lain-lain.
414 | Script PHP update jam pada proses.php adalah:
415 | ```php
416 | /*
417 | format waktu $this->dt adalah YYYY-MM-DD HH:MM:SS
418 | */
419 | private function updateClock(){
420 | //update jam rtc
421 | $update = exec ('sudo hwclock --set --date="'.$this->dt.'" --localtime');
422 | //raspi update dari rtc
423 | exec ('sudo hwclock -s');
424 | if($update)
425 | $this->retError('Error : '.$update);
426 | else
427 | $this->retSuccess();
428 | }
429 | ```
430 | jika menggunakan board selain raspberry pi, lakukan modifikasi pada fungsi diatas
431 |
432 | ----
433 |
434 | ### BERI AKSES PADA APACHE
435 | User untuk apache server adalah www-data, defaultnya tidak memiliki akses apapun ke sistem.
436 | - Akses www-data untuk shutdown, restart, update jam.
437 | Jalan perintah berikut pada terminal:
438 | ```
439 | sudo visudo
440 | ```
441 | tambahkan baris berikut
442 | ```
443 | www-data ALL = NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/hwclock
444 | ```
445 | > editor disini masih menggunakan nano sehingga untuk menyimpan dan keluar masih menggunakan `CTRL + x`
446 |
447 | - Akses untuk cek temperatur
448 | ```
449 | sudo usermod -G video www-data
450 | ```
451 | > code pada PHP nya :
452 | ```php
453 |
457 | ```
458 |
459 | - Restart apache
460 | ```
461 | sudo service apache2 restart
462 | ```
463 |
464 | ----
465 |
466 | ### SET AS ACCESS POINT
467 | Menjadikan raspberry sebagai akses poin wifi untuk admin display masjid.
468 | - Install dnsmasq dan hostapd.
469 | Jalan perintah berikut pada terminal:
470 | ```
471 | sudo apt install dnsmasq hostapd
472 | ```
473 | - Stop service.
474 | Jalan perintah berikut pada terminal:
475 | ```
476 | sudo systemctl stop dnsmasq
477 | sudo systemctl stop hostapd
478 | ```
479 | - Setting IP static pada wireless.
480 | Jalan perintah berikut pada terminal:
481 | ```
482 | sudo nano /etc/dhcpcd.conf
483 | ```
484 | tambahkan baris berikut
485 | ```
486 | interface wlan0
487 | static ip_address=10.10.10.10/24
488 | nohook wpa_supplicant
489 | ```
490 |
491 | - Restart service dhcpcd.
492 | Jalan perintah berikut pada terminal untuk restart dhcp:
493 | ```
494 | sudo service dhcpcd restart
495 | ```
496 | **PERINGATAN! JANGAN JALANKAN RESTART DHCPCD JIKA ANDA KONEKSI KE RASPBERRY VIA REMOTE**
497 | > jangan dijalankan jika via remote, karena akan mematikan koneksi wifi raspberry ke access point.
498 |
499 | - Configuring the DHCP server (dnsmasq).
500 | - Backup dulu config lama.
501 | ```
502 | sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
503 | ```
504 | - Buat config baru
505 | ```
506 | sudo nano /etc/dnsmasq.conf
507 | ```
508 | isikan baris berikut
509 | ```
510 | interface=wlan0
511 | dhcp-range=10.10.10.100,10.10.10.120,255.255.255.0,24h
512 | ```
513 |
514 | - Jalankan service dnsmasq
515 | ```
516 | sudo systemctl start dnsmasq
517 | ```
518 |
519 | - Konfigurasi akses poin
520 | - Konfigurasi hostapd
521 | ```
522 | sudo nano /etc/hostapd/hostapd.conf
523 | ```
524 | isi berikut:
525 | ```
526 | interface=wlan0
527 | driver=nl80211
528 | hw_mode=g
529 | channel=6
530 | ieee80211n=1
531 | wmm_enabled=1
532 | ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
533 | macaddr_acl=0
534 | ignore_broadcast_ssid=0
535 |
536 | # Use WPA2
537 | auth_algs=1
538 | wpa=2
539 | wpa_key_mgmt=WPA-PSK
540 | wpa_pairwise=TKIP
541 | rsn_pairwise=CCMP
542 |
543 | # nama SSID bisa diganti sesuai keinginan anda
544 | ssid=DisplayMasjid
545 |
546 | # password wifi, bisa anda ganti juga
547 | wpa_passphrase=12345678
548 | ```
549 |
550 | - Default hostapd
551 | ```
552 | sudo nano /etc/default/hostapd
553 | ```
554 | cari DAEMON_CONF (`CTRL +w`), hilangkan komen dan isikan berikut
555 | ```
556 | DAEMON_CONF="/etc/hostapd/hostapd.conf"
557 | ```
558 | - Enable hostapd
559 | ```
560 | sudo systemctl unmask hostapd
561 | sudo systemctl enable hostapd
562 | ```
563 | - Start hostapd.
564 | - jika tidak lewat remote bisa jalankan perintah berikut:
565 | ```
566 | sudo systemctl start hostapd
567 | ```
568 | - jika via remote lakukan restart
569 | ```
570 | sudo reboot
571 | ```
572 |
573 | - Setelah restart, raspberry akan menjadi akses point
574 | - SSID : DisplayMasjid
575 | - Password : 12345678
576 | - Alamat ip raspberry : 10.10.10.10
577 |
578 | > Untuk konfigurasi admin display masjid, koneksikan HP/Laptop ke akses poin tesebut dan buka browser dengan alamat http://10.10.10.10/
579 | > - User : admin
580 | > - Password : admin
581 |
582 | - Troubleshoting.
583 | - cara cek hostapd
584 | ```
585 | sudo systemctl status hostapd
586 | ```
587 | - cara cek dnsmasq
588 | ```
589 | sudo systemctl status dnsmasq
590 | ```
591 |
592 | - Jika raspberry tidak menjadi akses point.
593 | - Untuk mengembalikan menjadi client (wifi)
594 | ```
595 | sudo nano /etc/dhcpcd.conf
596 | ```
597 | komen pada baris :
598 | ```
599 | #interface wlan0
600 | #static ip_address=10.10.10.10/24
601 | #nohook wpa_supplicant
602 | ```
603 | - Cek kesalahan pada konfigurasi akses point:
604 | ```
605 | sudo nano /etc/hostapd/hostapd.conf
606 | ```
607 |
608 |
609 | ### LISENSI
610 | MIT license
611 |
612 |
613 |
614 | ### DONASI
615 | Dukung saya
616 | - [Traktir kopi](https://sociabuzz.com/fahroniganteng/tribe)
617 | - [atau Es krim](https://trakteer.id/fahroniganteng/tip)
618 |
--------------------------------------------------------------------------------
/db/.htaccess:
--------------------------------------------------------------------------------
1 | # proteksi database, bek gak iso diakses soko web
2 |
3 | Order allow,deny
4 | Deny from all
5 |
--------------------------------------------------------------------------------
/db/database.json:
--------------------------------------------------------------------------------
1 | {"akses":{"user":"admin","pass":"admin"},"setting":{"nama":"Musholla Ad-Din","lokasi":"Bekasi","latitude":-6.14,"longitude":106.59,"timeZone":7,"dst":"0"},"prayTimesMethod":"0","prayTimesAdjust":{"fajr":20,"dhuhr":"","asr":"Standard","maghrib":"","isha":18},"prayTimesTune":{"fajr":0,"dhuhr":0,"asr":0,"maghrib":0,"isha":0},"prayName":{"fajr":"Subuh","dhuhr":"Dzuhur","asr":"Ashar","maghrib":"Maghrib","isha":"Isya'"},"timeName":{"Hours":"Jam","Minutes":"Menit","Seconds":"Detik"},"dayName":{"Sunday":"Minggu","Monday":"Senin","Tuesday":"Selasa","Wednesday":"Rabu","Thursday":"Kamis","Friday":"Jum'at","Saturday":"Sabtu"},"monthName":{"January":"Januari","February":"Februari","March":"Maret","April":"April","May":"Mei","June":"Juni","July":"Juli","August":"Agustus","September":"September","October":"Oktober","November":"November","December":"Desember"},"timer":{"info":5,"wallpaper":15,"wait_adzan":1,"adzan":3,"sholat":20},"iqomah":{"fajr":10,"dhuhr":10,"asr":10,"maghrib":10,"isha":10},"jumat":{"active":true,"duration":60,"text":"Harap diam saat khotib khutbah"},"tarawih":{"active":true,"duration":180},"info":[["Aplikasi Display-Masjid","Selamat datang di aplikasi Display Masjid, aplikasi baru saja diinstal dan belum ada data, silakan masuk ke menu admin untuk mengganti data","Display|Masjid V.1.0.0",true],["Info non-active","Ini contoh info tidak aktif","active = false",false],["\u0633\u064e\u0648\u064f\u0651\u0648\u0627 \u0635\u064f\u0641\u064f\u0648\u0641\u064e\u0643\u064f\u0645\u0652 , \u0641\u064e\u0625\u0650\u0646\u064e\u0651 \u062a\u064e\u0633\u0652\u0648\u0650\u064a\u064e\u0629\u064e \u0627\u0644\u0635\u064e\u0651\u0641\u0650\u0651 \u0645\u0650\u0646\u0652 \u062a\u064e\u0645\u064e\u0627\u0645\u0650 \u0627\u0644\u0635\u064e\u0651\u0644\u0627\u0629\u0650","Luruskanlah shaf-shaf kalian, karena lurusnya shaf adalah kesempurnaan shalat","HR. Bukhari no.690, Muslim no.433",true]],"running_text":["Selamat datang di aplikasi Display-Masjid","Silakan masuk ke menu admin untuk mengubah data"]}
--------------------------------------------------------------------------------
/display/css/style.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'Titillium Web';
3 | src: url('../fonts/Titillium-Web-ExtraLight.ttf.woff') format('woff'),
4 | url('../fonts/Titillium-Web-ExtraLight.ttf.svg#Titillium-Web-ExtraLight') format('svg'),
5 | url('../fonts/Titillium-Web-ExtraLight.ttf.eot'),
6 | url('../fonts/Titillium-Web-ExtraLight.eot?#iefix') format('embedded-opentype');
7 | font-weight: normal;
8 | font-style: normal;
9 | }
10 |
11 |
12 |
13 | @font-face {
14 | font-family: 'OpenSansCondLight';
15 | src: url('../fonts/OpenSansCondLight/OpenSansCondLight.eot');
16 | src: local('OpenSansCondLight'), url('../fonts/OpenSansCondLight/OpenSansCondLight.woff') format('woff'), url('../fonts/OpenSansCondLight/OpenSansCondLight.ttf') format('truetype');
17 | }
18 |
19 | @font-face {
20 | font-family: "Arial";
21 | src: url("../fonts/Arial/Arial.eot"); /* IE9*/
22 | src: url("../fonts/Arial/Arial.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
23 | url("../fonts/Arial/Arial.woff2") format("woff2"), /* chrome、firefox */
24 | url("../fonts/Arial/Arial.woff") format("woff"), /* chrome、firefox */
25 | url("../fonts/Arial/Arial.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
26 | url("../fonts/Arial/Arial.svg#Arial") format("svg"); /* iOS 4.1- */
27 | }
28 |
29 |
30 |
31 |
32 |
33 |
34 | * { box-sizing: border-box; }
35 |
36 | body {
37 | padding: 0;
38 | margin: 0;
39 | font-family: 'Titillium Web', Helvetica, Arial, sans-serif;
40 | }
41 |
42 |
43 | h1,h2,h3,h4,h5{
44 | color: #333;
45 | }
46 | #full-screen-clock{
47 | position: fixed;
48 | bottom:0;
49 | left:0;
50 | right:0;
51 | font-size:4vw;
52 | color:#FFF;
53 | padding:1vw 5vw;
54 | background:rgba(0,0,0,0.3);
55 | text-align:right;
56 | opacity:0.5;
57 | z-index:100;
58 | }
59 | .full-screen {
60 | position: fixed;
61 | top:0;
62 | left:0;
63 | right:0;
64 | bottom:0;
65 | background-color:#122;
66 | /* background-image: url(../img/bg-kubah.png); */
67 | background-size: cover;
68 | background-position: center top;
69 | background-repeat: no-repeat;
70 | z-index:99;
71 | color:#fff;
72 | }
73 | #display-khutbah{
74 | background-image: url(../img/bg-kubah.png);
75 | }
76 | #count-down{
77 | background-image: url(../img/bg-masjid.png);
78 | }
79 | #display-sholat{
80 | background-image: url(../img/bg-sholat.png);
81 | }
82 | #display-adzan{
83 | background-image: url(../img/bg-adzan.png);
84 | }
85 | #display-adzan>div{
86 | position: absolute;
87 | top: 50%;
88 | left: 50%;
89 | transform: translate(-50%,-50%);
90 | color: #788;
91 | text-shadow: 0.3vw 0.3vw 0 rgba(0,0,0,.3);
92 | padding:10vw;
93 | width: 100%;
94 | padding: 0 3vw;
95 | font-size:10vw;
96 | text-align: center;
97 | text-transform: uppercase;
98 | font-family: 'OpenSansCondLight', Helvetica, Arial, sans-serif;
99 | /* font-weight:bold; */
100 | }
101 | #display-khutbah>div{
102 | position: absolute;
103 | top: 45%;
104 | left: 50%;
105 | transform: translate(-50%,-50%);
106 | color: #788;
107 | text-shadow: 0.3vw 0.3vw 0 rgba(0,0,0,.3);
108 | padding:10vw;
109 | width: 100%;
110 | padding: 0 3vw;
111 | font-size:6vw;
112 | text-align: center;
113 | font-family: 'OpenSansCondLight', 'Titillium Web', Helvetica, Arial, sans-serif;
114 | text-transform: uppercase;
115 | /* font-weight:bold; */
116 | }
117 |
118 | #count-down .counter {
119 | color: #fff;
120 | position: absolute;
121 | top: 50%;
122 | left: 50%;
123 | transform: translate(-50%,-50%);
124 | color: #788;
125 | width: 100%;
126 | padding: 0 3vw;
127 | text-align: center;
128 | text-transform: uppercase;
129 | font-family: 'OpenSansCondLight', Helvetica, Arial, sans-serif;
130 | }
131 | #count-down .counter>h1{
132 | margin: 0 auto;
133 | font-size:7vh;
134 | line-height:9vh;
135 | /* background:#F00; */
136 | width:61.5vw;
137 | color: #788;
138 | border: 0.3vh solid #788;
139 | border-radius: 1vh;
140 | font-family: 'Titillium Web', 'OpenSansCondLight', Helvetica, Arial, sans-serif;
141 | font-weight:bold;
142 | }
143 | #count-down .counter>div{
144 | display: inline-block;
145 | width:20vw;
146 | font-size:25vh;
147 | line-height:30vh;
148 | margin:0 0.3vw;
149 | text-shadow: 1px 1px 0 rgba(0,0,0,.75);
150 | padding:0;
151 | /* background:#f00; */
152 | }
153 | #count-down .counter>div>span {
154 | background:#788;
155 | font-size:5vh;
156 | line-height:7vh;
157 | font-weight:bold;
158 | text-shadow: none;
159 | color:#000;
160 | display: block;
161 | border-radius: 1vh;
162 | }
163 |
164 |
165 | /*============== Preloader ==============*/
166 |
167 | /* Preloader */
168 | #preloader {
169 | position: fixed;
170 | top:0;
171 | left:0;
172 | right:0;
173 | bottom:0;
174 | background-color:#fff; /* change if the mask should have another color then white */
175 | z-index:99; /* makes sure it stays on top */
176 | }
177 |
178 | #status {
179 | width:200px;
180 | height:200px;
181 | position:absolute;
182 | left:50%; /* centers the loading animation horizontally one the screen */
183 | top:50%; /* centers the loading animation vertically one the screen */
184 | background-image:url(../img/preloader.gif); /* path to your loading animation */
185 | background-repeat:no-repeat;
186 | background-position:center;
187 | margin:-100px 0 0 -100px; /* is width and height divided by two */
188 | }
189 |
190 |
191 |
192 | /*
193 | Fade content bs-carousel with hero headers
194 | Code snippet by maridlcrmn (Follow me on Twitter @maridlcrmn) for Bootsnipp.com
195 | Image credits: unsplash.com
196 | */
197 |
198 | /********************************/
199 | /* Fade Bs-carousel */
200 | /********************************/
201 | .fade-carousel {
202 | position: fixed;
203 | top:0;
204 | right:0;
205 | bottom:0;
206 | left:0;
207 | z-index:-1;
208 | /* height: 100vh; */
209 | }
210 | .fade-carousel .carousel-inner .item {
211 | height: 100vh;
212 | }
213 |
214 |
215 |
216 |
217 | /********************************/
218 | /* Hero Headers */
219 | /********************************/
220 |
221 |
222 | .fade-carousel .carousel-inner .item .hero {
223 | opacity: 0;
224 | -webkit-transition: 2s all ease-in-out .1s;
225 | -moz-transition: 2s all ease-in-out .1s;
226 | -ms-transition: 2s all ease-in-out .1s;
227 | -o-transition: 2s all ease-in-out .1s;
228 | transition: 2s all ease-in-out .1s;
229 | }
230 | .fade-carousel .carousel-inner .item.active .hero {
231 | opacity: 1;
232 | -webkit-transition: 2s all ease-in-out .1s;
233 | -moz-transition: 2s all ease-in-out .1s;
234 | -ms-transition: 2s all ease-in-out .1s;
235 | -o-transition: 2s all ease-in-out .1s;
236 | transition: 2s all ease-in-out .1s;
237 | }
238 |
239 | /********************************/
240 | /* Overlay */
241 | /********************************/
242 | .overlay {
243 | position: absolute;
244 | width: 100%;
245 | height: 100%;
246 | z-index: 2;
247 | background-color: #080d15;
248 | opacity: .7;
249 | /* background-image: url(../img/bg-pattern-01.png); */
250 | }
251 |
252 | /********************************/
253 | /* Custom Buttons */
254 | /********************************/
255 | .btn.btn-lg {padding: 10px 40px;}
256 | .btn.btn-hero,
257 | .btn.btn-hero:hover,
258 | .btn.btn-hero:focus {
259 | color: #f5f5f5;
260 | background-color: #33cccc;
261 | border-color: #33cccc;
262 | outline: none;
263 | margin: 20px auto;
264 | }
265 |
266 | /********************************/
267 | /* Slides backgrounds */
268 | /********************************/
269 | .fade-carousel .slides div{
270 | height: 100vh;
271 | background-size: cover;
272 | background-position: center center;
273 | background-repeat: no-repeat;
274 | }
275 | .fade-carousel .slides .slide-1 {
276 | background-image: url(../img/photo-01.jpg);
277 | }
278 | .fade-carousel .slides .slide-2 {
279 | background-image: url(../img/photo-02.jpg);
280 | }
281 | .fade-carousel .slides .slide-3 {
282 | background-image: url(../img/photo-03.jpg);
283 | }
284 |
285 | .fade-carousel .slides.active .slide-1,
286 | .fade-carousel .slides.active .slide-2,
287 | .fade-carousel .slides.active .slide-3{
288 | /* gak jadi, resourse prosesornya jadi full */
289 | /* animation: imgMove1 100s linear infinite; */
290 | }
291 |
292 |
293 | @keyframes imgMove1 {
294 | 0% {background-size: 120%;background-position: right bottom;}
295 | 50% {background-size: 150%;background-position: left top;}
296 | 100% {background-size: 120%;background-position: right bottom;}
297 | }
298 | @keyframes imgMove2 {
299 | 0% {background-size: 120%;background-position: left top;}
300 | 50% {background-size: 150%;background-position: right bottom;}
301 | 100% {background-size: 120%;background-position: left top;}
302 | }
303 | @keyframes imgMove3 {
304 | 0% {background-size: 120%;background-position: right top;}
305 | 50% {background-size: 150%;background-position: left bottom;}
306 | 100% {background-size: 120%;background-position: right top;}
307 | }
308 |
309 |
310 | .main{
311 |
312 | }
313 |
314 | #left-container{
315 | position:fixed;
316 | top:0;
317 | bottom:0;
318 | left:0;
319 | width:26vw;
320 | /* background-color:#fff; */
321 | background:linear-gradient(90deg, rgba(0,0,0,1) 0%, rgba(0,0,0,0.9) 40%, rgba(0,0,0,0.7) 100%);
322 | box-shadow: 0 0 20vw 20vw rgba(0,0,0,0.7);
323 | /* background-image: url(../img/bg-pattern-01.png); */
324 | }
325 | #left-container:before{
326 | display: block;
327 | content: "";
328 | position:absolute;
329 | top: 0;
330 | right:0;
331 | bottom:0;
332 | left:0;
333 | background-image: url(../img/bg-pattern-01.png);
334 | opacity:0.6;
335 | }
336 |
337 | #jam{
338 | font-size:6vw;
339 | /* height:90px; */
340 | line-height: 0.8;
341 | /* background:#F00; */
342 | text-align: center;
343 | margin:15vh 0 0 0;
344 | padding:0 4vw 0 0;
345 | /* font-family: 'OpenSansCondLight', Impact,'Times New Roman', Helvetica, Arial, sans-serif; */
346 | font-weight:bold;
347 | color:#FFF;
348 | position:relative;
349 | }
350 | #jam div{
351 | position:absolute;
352 | top:0.2vw;
353 | right:3vw;
354 | /* background:#33cccc; */
355 | color:#33cccc;
356 | line-height: 0.8;
357 | width:4vw;
358 | font-size:3vw;
359 | font-weight:bold;
360 | font-family: 'Titillium Web', Helvetica, Arial, sans-serif;
361 | border-left: 0.7px solid rgba(255,255,255,0.6);
362 | /* padding-left: 1.1vw; */
363 | }
364 | #tgl{
365 | text-align: center;
366 | color:#FFF;
367 | /* background-color:var(--main-bg-color); */
368 | /* background-color:#33cccc; */
369 | font-size:2vw;
370 | margin: 0.8vh auto 7vw auto;
371 | font-weight:bold;
372 | position:relative;
373 | }
374 | #tgl:after{
375 | display: block;
376 | content: "";
377 | position:absolute;
378 | height:6vw;
379 | width:20vw;
380 | bottom: -5.8vw;
381 | right:3vw;
382 | /* background-color:#e2ad0055; */
383 | background-image: url(../img/clock-line.png);
384 | background-size: contain;
385 | background-position: center center;
386 | background-repeat: no-repeat;
387 | }
388 | #jadwal{
389 | color:#33cccc;
390 |
391 | margin: 4vh;
392 | font-weight:bold;
393 | }
394 | #jadwal .row .col-xs-5{
395 | font-size:2vw;
396 | padding-top:1.5vh;
397 | position:relative;
398 | padding-left:1.5vw;
399 | width:50%;
400 | }
401 | #jadwal .row .col-xs-7{
402 | font-size:3vw;
403 | /* line-height:4vh; */
404 | font-weight:bold;
405 | text-align:right;
406 | padding-right:1.8vw;
407 | width:50%;
408 | color:#FFFFFF;
409 | }
410 | #jadwal .row .col-xs-7 span{
411 | position:absolute;
412 | right:0vw;
413 | top:0.5vw;
414 | font-size:1vw;
415 | color:#e2ad00;
416 | padding: 0 5px;
417 | border-radius:1px;
418 | }
419 | /* #jadwal .active .col-xs-7 span{ */
420 | /* color:#000000; */
421 | /* } */
422 | #jadwal .row{
423 | border-bottom:0.7px solid rgba(52, 152, 219, 0.3);
424 | /* border-radius:0.5vw; */
425 | position:relative;
426 | }
427 | #jadwal .active .col-xs-5:before{
428 | display: block;
429 | content: "";
430 | position:absolute;
431 | height:3vw;
432 | width:3vw;
433 | top: 0.7vw;
434 | right:-1vw;
435 | /* background-color:#e2ad00; */
436 | border-radius:5px;
437 | background-image: url(../img/pattern01.png);
438 | background-size: contain;
439 | background-position: center center;
440 | background-repeat: no-repeat;
441 | opacity:0.3;
442 | }
443 |
444 | #jadwal .active{
445 | /* background-color : #33cccc; */
446 | /* color:#000; */
447 | border-radius:0.5vw;
448 | /* border:1.5px solid #33cccc; */
449 | overflow:hidden;
450 | /* background-color : #e2ad00AA; */
451 | background-color : #33cccc33;
452 | /* background-color : rgba(51,204,204,0.2); */
453 | /* border:1px solid #33cccc; */
454 | /* border-top:none; */
455 | color:#fff;
456 | font-weight:bold;
457 | border-color:transparent;
458 | border-left:0.3vw solid #e2ad00;
459 | /* border-bottom:0.1vw solid #33cccc99; */
460 | }
461 |
462 |
463 | #jadwal .active .col-xs-5{
464 | /* font-weight:bold;
465 | font-size:2.5vw;
466 | padding-top:0.5vh; */
467 | /* padding-top:1.5vh; */
468 | }
469 | /* #jadwal .active .col-xs-7{ */
470 | /* background-color : #33cccc; */
471 | /* color:#000; */
472 | /* } */
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 | #right-counter{
481 | position:fixed;
482 | top:0;
483 | right:0;
484 | bottom:0;
485 | left:26vw;
486 | }
487 | #right-counter .counter {
488 | color: #fff;
489 | position: absolute;
490 | top: 40%;
491 | left: 50%;
492 | transform: translate(-50%,-50%);
493 | color: #fff;
494 | width: 100%;
495 | padding: 0 3vw;
496 | text-align: center;
497 | text-transform: uppercase;
498 | font-family: 'OpenSansCondLight', Helvetica, Arial, sans-serif;
499 | }
500 | #right-counter .counter>h1{
501 | margin: 0 auto;
502 | font-size:5vh;
503 | line-height:7vh;
504 | font-family: 'Titillium Web', 'OpenSansCondLight', Helvetica, Arial, sans-serif;
505 | font-weight:bold;
506 | /* background:#F00; */
507 | width:46.5vw;
508 | color: #33cccc;
509 | border: 0.3vh solid #33cccc;
510 | border-radius: 1vh;
511 | }
512 | #right-counter .counter>div{
513 | display: inline-block;
514 | width:15vw;
515 | font-size:20vh;
516 | line-height:25vh;
517 | margin:0 0.3vw;
518 | text-shadow: 1px 1px 0 rgba(0,0,0,.75);
519 | padding:0;
520 | color:#FFF;
521 | /* background:#f00; */
522 | }
523 | #right-counter .counter>div>span {
524 | background:#e2ad00;
525 | font-size:5vh;
526 | line-height:7vh;
527 | font-weight:bold;
528 | text-shadow: none;
529 | color:#000;
530 | display: block;
531 | border-radius: 1vh;
532 | }
533 |
534 |
535 |
536 | #right-container{
537 | position:fixed;
538 | top:0;
539 | right:0;
540 | bottom:0;
541 | left:26vw;
542 | /* background-color:rgba(255,0,0,0.3) */
543 | }
544 | #running-text:before{
545 | display: block;
546 | content: "";
547 | position:absolute;
548 | height:3.5vw;
549 | width:5vw;
550 | top: 0;
551 | left:0;
552 | background-color:#e2ad00;
553 | border-radius:5px;
554 | background-image: url(../img/pattern01.png);
555 | background-size: contain;
556 | background-position: center center;
557 | background-repeat: no-repeat;
558 |
559 | }
560 | #running-text{
561 | height:3.5vw;
562 | width:70vw;
563 | color:#fff;
564 | /* margin:3vh 3vw 4vh 3vw; */
565 | background-color:rgba(51,204,204,0.2);
566 | position:fixed;
567 | bottom:2vh;
568 | /* bottom:4vh; */
569 | right:2vw;
570 | border-radius:5px;
571 |
572 | /* right:30vw; */
573 | /* overflow: hidden; */
574 | /* overflow:show; */
575 | /* background-image: url(img/logo.png); */
576 | /* background-size: contain; */
577 | /* background-position: center center; */
578 | /* background-repeat: no-repeat; */
579 | }
580 |
581 | #running-text .item i{
582 | color:#e2ad00;
583 | margin-left: 20px;
584 | margin-right: 7px;
585 | font-size: 2vw;
586 |
587 | }
588 | #running-text .item{
589 | position: absolute;
590 | left: 5.5vw;
591 | right: 0.5vw;
592 | height:100%;
593 | overflow: hidden;
594 |
595 | font-family: 'Titillium Web', 'OpenSansCondLight', Helvetica, Arial, sans-serif;
596 | padding-top: 0.3vw;
597 | font-size: 2.1vw;
598 | white-space: nowrap;
599 | }
600 |
601 |
602 | /* @keyframes scroll-left { */
603 | /* 0% { */
604 | /* transform: translateX(100%); */
605 | /* } */
606 | /* 100% { */
607 | /* transform: translateX(-100%); */
608 | /* } */
609 | /* } */
610 |
611 |
612 | #logo{
613 | height:7vw;
614 | width:70vw;
615 | /* margin:3vh 3vw 4vh 3vw; */
616 | /* background-color: #f00; */
617 | position:fixed;
618 | /* bottom:-4vh; */
619 | bottom:5.6vw;
620 | right:2vw;
621 | /* background-color:#F00; */
622 | /* background-image: url(../img/logo.png); */
623 | background-size: contain;
624 | background-position: right bottom;
625 | background-repeat: no-repeat;
626 | }
627 |
628 | .quote-carousel {
629 | /* position: relative; */
630 | /* background-color:rgba(255,255,0,0.3); */
631 | /* top:0; */
632 | /* right:0; */
633 | /* bottom:0; */
634 | /* left:0; */
635 | /* height: 100vh; */
636 | }
637 | .quote-carousel .carousel-inner .item {
638 | height: 100vh;
639 | }
640 | .quote-carousel .carousel-inner .item .hero {
641 | color: #fff;
642 | position: absolute;
643 | top: 40%;
644 | left: 50%;
645 | transform: translate(-50%,-50%);
646 | /* z-index: 3; */
647 | color: #fff;
648 | /* background-color:#f00; */
649 | width: 100%;
650 | padding: 0 3vw;
651 | text-align: right;
652 | /* text-transform: uppercase; */
653 | text-shadow: 1px 1px 0 rgba(0,0,0,.75);
654 | font-family: 'OpenSansCondLight', 'Titillium Web', Helvetica, Arial, sans-serif;
655 | }
656 |
657 | .quote-carousel .text1{
658 | text-transform: uppercase;
659 | font-size: 3.3vw;
660 | color:#33cccc;
661 | }
662 | /* .quote-carousel .text2:before{
663 | display: block;
664 | content: "";
665 | font-size:10vw;
666 | background-image: url(../img/quote.png);
667 | background-size: contain;
668 | background-position: center center;
669 | background-repeat: no-repeat;
670 | font-family: Helvetica, Arial, sans-serif;
671 | position:absolute;
672 | top: -1vw;
673 | left:-2vw;
674 | width: 2vw;
675 | height:2vw;
676 | margin: 0 1rem;
677 | } */
678 |
679 | .quote-carousel .text2{
680 | font-size: 2.9vw;
681 | position:relative;
682 | font-style:italic;
683 | }
684 | .quote-carousel .text3:before{
685 | display: block;
686 | content: "";
687 | position:absolute;
688 | height:1vw;
689 | width:10vw;
690 | top: -1vw;
691 | right:0vw;
692 | /* background-color:#e2ad0055; */
693 | background-image: url(../img/hadist-line.png);
694 | background-size: contain;
695 | background-position: right center;
696 | background-repeat: no-repeat;
697 | }
698 | .quote-carousel .text3{
699 | margin-top:3vh;
700 | font-size: 1.5vw;
701 | font-style: italic;
702 | position:relative;
703 | }
704 |
--------------------------------------------------------------------------------
/display/fonts/Arial/Arial.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/Arial/Arial.eot
--------------------------------------------------------------------------------
/display/fonts/Arial/Arial.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/Arial/Arial.ttf
--------------------------------------------------------------------------------
/display/fonts/Arial/Arial.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/Arial/Arial.woff
--------------------------------------------------------------------------------
/display/fonts/Arial/Arial.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/Arial/Arial.woff2
--------------------------------------------------------------------------------
/display/fonts/Arial/Demo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Arial Font - OnlineWebFonts.COM
6 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | OnlineWebFonts.Com features an amazing collection of free fonts,
24 | premium fonts and free dingbats. With over 8,000,000 freeware fonts,
25 | you've come to the best place to download fonts!
26 |
27 | مَنْ رَاحَ إِلَى مَسْجِدِ الْجَمَاعَةِ فَخَطْوَةٌ تَمْحُو سَيِّئَةً، وَخَطْوَةٌ تُكْتَبُ لَهُ حَسَنَ
28 |
29 |
30 | سَوُّوا صُفُوفَكُمْ , فَإِنَّ تَسْوِيَةَ الصَّفِّ مِنْ تَمَامِ الصَّلاةِ
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/display/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/OpenSansCondLight-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/OpenSansCondLight/OpenSansCondLight-bg.png
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/OpenSansCondLight-thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/OpenSansCondLight/OpenSansCondLight-thumb.png
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/OpenSansCondLight.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/OpenSansCondLight/OpenSansCondLight.eot
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/OpenSansCondLight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/OpenSansCondLight/OpenSansCondLight.png
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/OpenSansCondLight.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/OpenSansCondLight/OpenSansCondLight.ttf
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/OpenSansCondLight.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/OpenSansCondLight/OpenSansCondLight.woff
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/font.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'OpenSansCondLight';
3 | src: url('./OpenSansCondLight.eot');
4 | src: local('OpenSansCondLight'), url('./OpenSansCondLight.woff') format('woff'), url('./OpenSansCondLight.ttf') format('truetype');
5 | }
6 | /* use this class to attach this font to any element i.e. Text with this font applied
*/
7 | .fontsforweb_fontid_6958 {
8 | font-family: 'OpenSansCondLight' !important;
9 | }
10 |
11 | /* Font downloaded from FontsForWeb.com */
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | web font from FontsForWeb.com
7 |
8 |
9 |
10 |
16 |
17 |
18 | Thank you for using FontsForWeb.com
19 | Look in the source of this file to see how to embed this font on your website
20 |
21 |
--------------------------------------------------------------------------------
/display/fonts/OpenSansCondLight/readme.txt:
--------------------------------------------------------------------------------
1 | Apache License
2 |
3 | Version 2.0, January 2004
4 |
5 | http://www.apache.org/licenses/
6 |
7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
8 |
9 | 1. Definitions.
10 |
11 | "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
16 |
17 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
18 |
19 | "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
20 |
21 | "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
22 |
23 | "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
24 |
25 | "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
26 |
27 | "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
28 |
29 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
30 |
31 | 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
32 |
33 | 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
34 |
35 | 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
36 |
37 | You must give any other recipients of the Work or Derivative Works a copy of this License; and
38 |
39 | You must cause any modified files to carry prominent notices stating that You changed the files; and
40 |
41 | You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
42 |
43 | If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
44 |
45 | 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
46 |
47 | 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
48 |
49 | 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
50 |
51 | 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
52 |
53 | 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
--------------------------------------------------------------------------------
/display/fonts/Titillium-Web-ExtraLight.ttf.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/Titillium-Web-ExtraLight.ttf.eot
--------------------------------------------------------------------------------
/display/fonts/Titillium-Web-ExtraLight.ttf.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/Titillium-Web-ExtraLight.ttf.woff
--------------------------------------------------------------------------------
/display/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/display/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/display/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/display/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/display/img/beep.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/beep.mp3
--------------------------------------------------------------------------------
/display/img/bg-adzan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/bg-adzan.png
--------------------------------------------------------------------------------
/display/img/bg-kubah.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/bg-kubah.png
--------------------------------------------------------------------------------
/display/img/bg-masjid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/bg-masjid.png
--------------------------------------------------------------------------------
/display/img/bg-pattern-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/bg-pattern-01.png
--------------------------------------------------------------------------------
/display/img/bg-pattern-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/bg-pattern-02.png
--------------------------------------------------------------------------------
/display/img/bg-sholat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/bg-sholat.png
--------------------------------------------------------------------------------
/display/img/clock-line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/clock-line.png
--------------------------------------------------------------------------------
/display/img/hadist-line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/hadist-line.png
--------------------------------------------------------------------------------
/display/img/pattern01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/pattern01.png
--------------------------------------------------------------------------------
/display/img/preloader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/img/preloader.gif
--------------------------------------------------------------------------------
/display/index.php:
--------------------------------------------------------------------------------
1 | Jalankan admin terlebih dahulu";
7 | die;
8 | }
9 | $json = file_get_contents($file);
10 | $db = json_decode($json, true);
11 | $showDb = $db;
12 | unset($showDb['akses']);
13 |
14 | $info_timer = $db['timer']['info'] * 1000; //detik
15 | $wallpaper_timer = $db['timer']['wallpaper'] * 1000;
16 | $adzan_timer = $db['timer']['adzan'] * 1000 * 60; //menit
17 | // $iqomah_timer = $db['timer']['iqomah'] * 1000 * 60;
18 | $sholat_timer = $db['timer']['sholat'] * 1000 * 60;
19 |
20 | //optional
21 | $khutbah_jumat = $db['jumat']['duration'] * 1000 * 60;
22 | $sholat_tarawih = $db['tarawih']['duration'] * 1000 * 60;
23 |
24 | //Logo
25 | // nge trik ==> kalo replace file, di display logo yang lama masih kesimpen di cache ==> solusi ganti logo ganti nama file
26 | $dirLogo = 'logo/';
27 | $filesLogo = array_diff(scandir($dirLogo),array('.','..','Thumbs.db'));
28 | $filesLogo = array_values($filesLogo);//re index
29 | $logo = $filesLogo[0];
30 |
31 |
32 | $dir = 'wallpaper/';
33 | $files = array_diff(scandir($dir),array('.','..','Thumbs.db'));
34 | $wallpaper = '';
35 | $i = 0;
36 | foreach($files as $v){
37 | $active = $i==0?'active':'';
38 | $wallpaper .= '';
39 | $i++;
40 | }
41 | // print_r($files);die;
42 | ?>
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Display|Masjid
52 |
53 |
54 |
55 |
56 |
57 |
60 |
61 |
62 |
63 |
66 |
67 |
68 |
69 |
70 |
71 |
COUNTER
72 |
00JAM
73 |
00MENIT
74 |
00DETIK
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
=$wallpaper?>
87 |
88 |
89 |
90 |
95 |
96 |
97 |
98 |
COUNTER
99 |
19JAM
100 |
25MENIT
101 |
45DETIK
102 |
103 |
104 |
105 |
106 |
107 |
108 | $v){
111 | if($v[3]){
112 | echo '
113 |
114 |
115 |
116 | '.htmlentities($v[0]).'
117 | '.nl2br(htmlentities($v[1])).'
118 | '.htmlentities($v[2]).'
119 |
120 |
121 |
122 | ';
123 | $i++;
124 | }
125 | }
126 | ?>
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 | $v){
137 | echo ' '.htmlentities($v);
138 | }
139 | // $ip = gethostbyname(php_uname('n')); // PHP < 5.3.0
140 | $ip = gethostbyname(gethostname()); // PHP >= 5.3.0 ==> di linux keluar 127.0.0.1
141 | if(PHP_OS=='Linux'){
142 | //raspi 3
143 | // $command="/sbin/ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";//raspi pake wlan0 jadi hotspot
144 | // $ip = exec ($command);
145 |
146 | //raspi 4
147 | $command="/sbin/ifconfig wlan0 | grep 'inet '| cut -d 't' -f2 | cut -d 'n' -f1 | awk '{ print $1}'";//raspi pake wlan0 jadi hotspot
148 | $ip = trim(exec ($command));
149 | }
150 | if($db['akses']['pass']=='admin'){
151 | echo ' Konek ke wifi (SSID: DisplayMasjid, password: 12345678)';
152 | echo ' Alamat admin http://'.$ip.'/';
153 | echo ' Default akses user : admin, password : admin';
154 | echo ' Silakan mengganti password admin untuk menghilangkan tulisan ini';
155 | }
156 | ?>
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
574 |
575 |
576 |
--------------------------------------------------------------------------------
/display/js/PrayTimes.js:
--------------------------------------------------------------------------------
1 | //--------------------- Copyright Block ----------------------
2 | /*
3 |
4 | PrayTimes.js: Prayer Times Calculator (ver 2.3)
5 | Copyright (C) 2007-2011 PrayTimes.org
6 |
7 | Developer: Hamid Zarrabi-Zadeh
8 | License: GNU LGPL v3.0
9 |
10 | TERMS OF USE:
11 | Permission is granted to use this code, with or
12 | without modification, in any website or application
13 | provided that credit is given to the original work
14 | with a link back to PrayTimes.org.
15 |
16 | This program is distributed in the hope that it will
17 | be useful, but WITHOUT ANY WARRANTY.
18 |
19 | PLEASE DO NOT REMOVE THIS COPYRIGHT BLOCK.
20 |
21 | */
22 |
23 |
24 | //--------------------- Help and Manual ----------------------
25 | /*
26 |
27 | User's Manual:
28 | http://praytimes.org/manual
29 |
30 | Calculation Formulas:
31 | http://praytimes.org/calculation
32 |
33 |
34 |
35 | //------------------------ User Interface -------------------------
36 |
37 |
38 | getTimes (date, coordinates [, timeZone [, dst [, timeFormat]]])
39 |
40 | setMethod (method) // set calculation method
41 | adjust (parameters) // adjust calculation parameters
42 | tune (offsets) // tune times by given offsets
43 |
44 | getMethod () // get calculation method
45 | getSetting () // get current calculation parameters
46 | getOffsets () // get current time offsets
47 |
48 |
49 | //------------------------- Sample Usage --------------------------
50 |
51 |
52 | var PT = new PrayTimes('ISNA');
53 | var times = PT.getTimes(new Date(), [43, -80], -5);
54 | document.write('Sunrise = '+ times.sunrise)
55 |
56 |
57 | */
58 |
59 |
60 | //----------------------- PrayTimes Class ------------------------
61 |
62 |
63 | function PrayTimes(method) {
64 |
65 |
66 | //------------------------ Constants --------------------------
67 | var
68 |
69 | // Time Names
70 | timeNames = {
71 | imsak : 'Imsak',
72 | fajr : 'Fajr',
73 | sunrise : 'Sunrise',
74 | dhuhr : 'Dhuhr',
75 | asr : 'Asr',
76 | sunset : 'Sunset',
77 | maghrib : 'Maghrib',
78 | isha : 'Isha',
79 | midnight : 'Midnight'
80 | },
81 |
82 |
83 | // Calculation Methods
84 | methods = {
85 | MWL: {
86 | name: 'Muslim World League',
87 | params: { fajr: 18, isha: 17 } },
88 | ISNA: {
89 | name: 'Islamic Society of North America (ISNA)',
90 | params: { fajr: 15, isha: 15 } },
91 | Egypt: {
92 | name: 'Egyptian General Authority of Survey',
93 | params: { fajr: 19.5, isha: 17.5 } },
94 | Makkah: {
95 | name: 'Umm Al-Qura University, Makkah',
96 | params: { fajr: 18.5, isha: '90 min' } }, // fajr was 19 degrees before 1430 hijri
97 | Karachi: {
98 | name: 'University of Islamic Sciences, Karachi',
99 | params: { fajr: 18, isha: 18 } },
100 | Tehran: {
101 | name: 'Institute of Geophysics, University of Tehran',
102 | params: { fajr: 17.7, isha: 14, maghrib: 4.5, midnight: 'Jafari' } }, // isha is not explicitly specified in this method
103 | Jafari: {
104 | name: 'Shia Ithna-Ashari, Leva Institute, Qum',
105 | params: { fajr: 16, isha: 14, maghrib: 4, midnight: 'Jafari' } }
106 | },
107 |
108 |
109 | // Default Parameters in Calculation Methods
110 | defaultParams = {
111 | maghrib: '0 min', midnight: 'Standard'
112 |
113 | },
114 |
115 |
116 | //----------------------- Parameter Values ----------------------
117 | /*
118 |
119 | // Asr Juristic Methods
120 | asrJuristics = [
121 | 'Standard', // Shafi`i, Maliki, Ja`fari, Hanbali
122 | 'Hanafi' // Hanafi
123 | ],
124 |
125 |
126 | // Midnight Mode
127 | midnightMethods = [
128 | 'Standard', // Mid Sunset to Sunrise
129 | 'Jafari' // Mid Sunset to Fajr
130 | ],
131 |
132 |
133 | // Adjust Methods for Higher Latitudes
134 | highLatMethods = [
135 | 'NightMiddle', // middle of night
136 | 'AngleBased', // angle/60th of night
137 | 'OneSeventh', // 1/7th of night
138 | 'None' // No adjustment
139 | ],
140 |
141 |
142 | // Time Formats
143 | timeFormats = [
144 | '24h', // 24-hour format
145 | '12h', // 12-hour format
146 | '12hNS', // 12-hour format with no suffix
147 | 'Float' // floating point number
148 | ],
149 | */
150 |
151 |
152 | //---------------------- Default Settings --------------------
153 |
154 | calcMethod = 'MWL',
155 |
156 | // do not change anything here; use adjust method instead
157 | setting = {
158 | imsak : '10 min',
159 | dhuhr : '0 min',
160 | asr : 'Standard',
161 | highLats : 'NightMiddle'
162 | },
163 |
164 | timeFormat = '24h',
165 | timeSuffixes = ['am', 'pm'],
166 | invalidTime = '-----',
167 |
168 | numIterations = 1,
169 | offset = {},
170 |
171 |
172 | //----------------------- Local Variables ---------------------
173 |
174 | lat, lng, elv, // coordinates
175 | timeZone, jDate; // time variables
176 |
177 |
178 | //---------------------- Initialization -----------------------
179 |
180 |
181 | // set methods defaults
182 | var defParams = defaultParams;
183 | for (var i in methods) {
184 | var params = methods[i].params;
185 | for (var j in defParams)
186 | if ((typeof(params[j]) == 'undefined'))
187 | params[j] = defParams[j];
188 | };
189 |
190 | // initialize settings
191 | calcMethod = methods[method] ? method : calcMethod;
192 | var params = methods[calcMethod].params;
193 | for (var id in params)
194 | setting[id] = params[id];
195 |
196 | // init time offsets
197 | for (var i in timeNames)
198 | offset[i] = 0;
199 |
200 |
201 |
202 | //----------------------- Public Functions ------------------------
203 | return {
204 |
205 |
206 | // set calculation method
207 | setMethod: function(method) {
208 | if (methods[method]) {
209 | this.adjust(methods[method].params);
210 | calcMethod = method;
211 | }
212 | },
213 |
214 |
215 | // set calculating parameters
216 | adjust: function(params) {
217 | for (var id in params)
218 | setting[id] = params[id];
219 | },
220 |
221 |
222 | // set time offsets
223 | tune: function(timeOffsets) {
224 | for (var i in timeOffsets)
225 | offset[i] = timeOffsets[i];
226 | },
227 |
228 |
229 | // get current calculation method
230 | getMethod: function() { return calcMethod; },
231 |
232 | // get current setting
233 | getSetting: function() { return setting; },
234 |
235 | // get current time offsets
236 | getOffsets: function() { return offset; },
237 |
238 | // get default calc parametrs
239 | getDefaults: function() { return methods; },
240 |
241 |
242 | // return prayer times for a given date
243 | getTimes: function(date, coords, timezone, dst, format) {
244 | lat = 1* coords[0];
245 | lng = 1* coords[1];
246 | elv = coords[2] ? 1* coords[2] : 0;
247 | timeFormat = format || timeFormat;
248 | if (date.constructor === Date)
249 | date = [date.getFullYear(), date.getMonth()+ 1, date.getDate()];
250 | if (typeof(timezone) == 'undefined' || timezone == 'auto')
251 | timezone = this.getTimeZone(date);
252 | if (typeof(dst) == 'undefined' || dst == 'auto')
253 | dst = this.getDst(date);
254 | timeZone = 1* timezone+ (1* dst ? 1 : 0);
255 | jDate = this.julian(date[0], date[1], date[2])- lng/ (15* 24);
256 |
257 | return this.computeTimes();
258 | },
259 |
260 |
261 | // convert float time to the given format (see timeFormats)
262 | getFormattedTime: function(time, format, suffixes) {
263 | if (isNaN(time))
264 | return invalidTime;
265 | if (format == 'Float') return time;
266 | suffixes = suffixes || timeSuffixes;
267 |
268 | time = DMath.fixHour(time+ 0.5/ 60); // add 0.5 minutes to round
269 | var hours = Math.floor(time);
270 | var minutes = Math.floor((time- hours)* 60);
271 | var suffix = (format == '12h') ? suffixes[hours < 12 ? 0 : 1] : '';
272 | var hour = (format == '24h') ? this.twoDigitsFormat(hours) : ((hours+ 12 -1)% 12+ 1);
273 | return hour+ ':'+ this.twoDigitsFormat(minutes)+ (suffix ? ' '+ suffix : '');
274 | },
275 |
276 |
277 | //---------------------- Calculation Functions -----------------------
278 |
279 |
280 | // compute mid-day time
281 | midDay: function(time) {
282 | var eqt = this.sunPosition(jDate+ time).equation;
283 | var noon = DMath.fixHour(12- eqt);
284 | return noon;
285 | },
286 |
287 |
288 | // compute the time at which sun reaches a specific angle below horizon
289 | sunAngleTime: function(angle, time, direction) {
290 | var decl = this.sunPosition(jDate+ time).declination;
291 | var noon = this.midDay(time);
292 | var t = 1/15* DMath.arccos((-DMath.sin(angle)- DMath.sin(decl)* DMath.sin(lat))/
293 | (DMath.cos(decl)* DMath.cos(lat)));
294 | return noon+ (direction == 'ccw' ? -t : t);
295 | },
296 |
297 |
298 | // compute asr time
299 | asrTime: function(factor, time) {
300 | var decl = this.sunPosition(jDate+ time).declination;
301 | var angle = -DMath.arccot(factor+ DMath.tan(Math.abs(lat- decl)));
302 | return this.sunAngleTime(angle, time);
303 | },
304 |
305 |
306 | // compute declination angle of sun and equation of time
307 | // Ref: http://aa.usno.navy.mil/faq/docs/SunApprox.php
308 | sunPosition: function(jd) {
309 | var D = jd - 2451545.0;
310 | var g = DMath.fixAngle(357.529 + 0.98560028* D);
311 | var q = DMath.fixAngle(280.459 + 0.98564736* D);
312 | var L = DMath.fixAngle(q + 1.915* DMath.sin(g) + 0.020* DMath.sin(2*g));
313 |
314 | var R = 1.00014 - 0.01671* DMath.cos(g) - 0.00014* DMath.cos(2*g);
315 | var e = 23.439 - 0.00000036* D;
316 |
317 | var RA = DMath.arctan2(DMath.cos(e)* DMath.sin(L), DMath.cos(L))/ 15;
318 | var eqt = q/15 - DMath.fixHour(RA);
319 | var decl = DMath.arcsin(DMath.sin(e)* DMath.sin(L));
320 |
321 | return {declination: decl, equation: eqt};
322 | },
323 |
324 |
325 | // convert Gregorian date to Julian day
326 | // Ref: Astronomical Algorithms by Jean Meeus
327 | julian: function(year, month, day) {
328 | if (month <= 2) {
329 | year -= 1;
330 | month += 12;
331 | };
332 | var A = Math.floor(year/ 100);
333 | var B = 2- A+ Math.floor(A/ 4);
334 |
335 | var JD = Math.floor(365.25* (year+ 4716))+ Math.floor(30.6001* (month+ 1))+ day+ B- 1524.5;
336 | return JD;
337 | },
338 |
339 |
340 | //---------------------- Compute Prayer Times -----------------------
341 |
342 |
343 | // compute prayer times at given julian date
344 | computePrayerTimes: function(times) {
345 | times = this.dayPortion(times);
346 | var params = setting;
347 |
348 | var imsak = this.sunAngleTime(this.eval(params.imsak), times.imsak, 'ccw');
349 | var fajr = this.sunAngleTime(this.eval(params.fajr), times.fajr, 'ccw');
350 | var sunrise = this.sunAngleTime(this.riseSetAngle(), times.sunrise, 'ccw');
351 | var dhuhr = this.midDay(times.dhuhr);
352 | var asr = this.asrTime(this.asrFactor(params.asr), times.asr);
353 | var sunset = this.sunAngleTime(this.riseSetAngle(), times.sunset);;
354 | var maghrib = this.sunAngleTime(this.eval(params.maghrib), times.maghrib);
355 | var isha = this.sunAngleTime(this.eval(params.isha), times.isha);
356 |
357 | return {
358 | imsak: imsak, fajr: fajr, sunrise: sunrise, dhuhr: dhuhr,
359 | asr: asr, sunset: sunset, maghrib: maghrib, isha: isha
360 | };
361 | },
362 |
363 |
364 | // compute prayer times
365 | computeTimes: function() {
366 | // default times
367 | var times = {
368 | imsak: 5, fajr: 5, sunrise: 6, dhuhr: 12,
369 | asr: 13, sunset: 18, maghrib: 18, isha: 18
370 | };
371 |
372 | // main iterations
373 | for (var i=1 ; i<=numIterations ; i++)
374 | times = this.computePrayerTimes(times);
375 |
376 | times = this.adjustTimes(times);
377 |
378 | // add midnight time
379 | times.midnight = (setting.midnight == 'Jafari') ?
380 | times.sunset+ this.timeDiff(times.sunset, times.fajr)/ 2 :
381 | times.sunset+ this.timeDiff(times.sunset, times.sunrise)/ 2;
382 |
383 | times = this.tuneTimes(times);
384 | return this.modifyFormats(times);
385 | },
386 |
387 |
388 | // adjust times
389 | adjustTimes: function(times) {
390 | var params = setting;
391 | for (var i in times)
392 | times[i] += timeZone- lng/ 15;
393 |
394 | if (params.highLats != 'None')
395 | times = this.adjustHighLats(times);
396 |
397 | if (this.isMin(params.imsak))
398 | times.imsak = times.fajr- this.eval(params.imsak)/ 60;
399 | if (this.isMin(params.maghrib))
400 | times.maghrib = times.sunset+ this.eval(params.maghrib)/ 60;
401 | if (this.isMin(params.isha))
402 | times.isha = times.maghrib+ this.eval(params.isha)/ 60;
403 | times.dhuhr += this.eval(params.dhuhr)/ 60;
404 |
405 | return times;
406 | },
407 |
408 |
409 | // get asr shadow factor
410 | asrFactor: function(asrParam) {
411 | var factor = {Standard: 1, Hanafi: 2}[asrParam];
412 | return factor || this.eval(asrParam);
413 | },
414 |
415 |
416 | // return sun angle for sunset/sunrise
417 | riseSetAngle: function() {
418 | //var earthRad = 6371009; // in meters
419 | //var angle = DMath.arccos(earthRad/(earthRad+ elv));
420 | var angle = 0.0347* Math.sqrt(elv); // an approximation
421 | return 0.833+ angle;
422 | },
423 |
424 |
425 | // apply offsets to the times
426 | tuneTimes: function(times) {
427 | for (var i in times)
428 | times[i] += offset[i]/ 60;
429 | return times;
430 | },
431 |
432 |
433 | // convert times to given time format
434 | modifyFormats: function(times) {
435 | for (var i in times)
436 | times[i] = this.getFormattedTime(times[i], timeFormat);
437 | return times;
438 | },
439 |
440 |
441 | // adjust times for locations in higher latitudes
442 | adjustHighLats: function(times) {
443 | var params = setting;
444 | var nightTime = this.timeDiff(times.sunset, times.sunrise);
445 |
446 | times.imsak = this.adjustHLTime(times.imsak, times.sunrise, this.eval(params.imsak), nightTime, 'ccw');
447 | times.fajr = this.adjustHLTime(times.fajr, times.sunrise, this.eval(params.fajr), nightTime, 'ccw');
448 | times.isha = this.adjustHLTime(times.isha, times.sunset, this.eval(params.isha), nightTime);
449 | times.maghrib = this.adjustHLTime(times.maghrib, times.sunset, this.eval(params.maghrib), nightTime);
450 |
451 | return times;
452 | },
453 |
454 |
455 | // adjust a time for higher latitudes
456 | adjustHLTime: function(time, base, angle, night, direction) {
457 | var portion = this.nightPortion(angle, night);
458 | var timeDiff = (direction == 'ccw') ?
459 | this.timeDiff(time, base):
460 | this.timeDiff(base, time);
461 | if (isNaN(time) || timeDiff > portion)
462 | time = base+ (direction == 'ccw' ? -portion : portion);
463 | return time;
464 | },
465 |
466 |
467 | // the night portion used for adjusting times in higher latitudes
468 | nightPortion: function(angle, night) {
469 | var method = setting.highLats;
470 | var portion = 1/2 // MidNight
471 | if (method == 'AngleBased')
472 | portion = 1/60* angle;
473 | if (method == 'OneSeventh')
474 | portion = 1/7;
475 | return portion* night;
476 | },
477 |
478 |
479 | // convert hours to day portions
480 | dayPortion: function(times) {
481 | for (var i in times)
482 | times[i] /= 24;
483 | return times;
484 | },
485 |
486 |
487 | //---------------------- Time Zone Functions -----------------------
488 |
489 |
490 | // get local time zone
491 | getTimeZone: function(date) {
492 | var year = date[0];
493 | var t1 = this.gmtOffset([year, 0, 1]);
494 | var t2 = this.gmtOffset([year, 6, 1]);
495 | return Math.min(t1, t2);
496 | },
497 |
498 |
499 | // get daylight saving for a given date
500 | getDst: function(date) {
501 | return 1* (this.gmtOffset(date) != this.getTimeZone(date));
502 | },
503 |
504 |
505 | // GMT offset for a given date
506 | gmtOffset: function(date) {
507 | var localDate = new Date(date[0], date[1]- 1, date[2], 12, 0, 0, 0);
508 | var GMTString = localDate.toGMTString();
509 | var GMTDate = new Date(GMTString.substring(0, GMTString.lastIndexOf(' ')- 1));
510 | var hoursDiff = (localDate- GMTDate) / (1000* 60* 60);
511 | return hoursDiff;
512 | },
513 |
514 |
515 | //---------------------- Misc Functions -----------------------
516 |
517 | // convert given string into a number
518 | eval: function(str) {
519 | return 1* (str+ '').split(/[^0-9.+-]/)[0];
520 | },
521 |
522 |
523 | // detect if input contains 'min'
524 | isMin: function(arg) {
525 | return (arg+ '').indexOf('min') != -1;
526 | },
527 |
528 |
529 | // compute the difference between two times
530 | timeDiff: function(time1, time2) {
531 | return DMath.fixHour(time2- time1);
532 | },
533 |
534 |
535 | // add a leading 0 if necessary
536 | twoDigitsFormat: function(num) {
537 | return (num <10) ? '0'+ num : num;
538 | }
539 |
540 | }}
541 |
542 |
543 |
544 | //---------------------- Degree-Based Math Class -----------------------
545 |
546 |
547 | var DMath = {
548 |
549 | dtr: function(d) { return (d * Math.PI) / 180.0; },
550 | rtd: function(r) { return (r * 180.0) / Math.PI; },
551 |
552 | sin: function(d) { return Math.sin(this.dtr(d)); },
553 | cos: function(d) { return Math.cos(this.dtr(d)); },
554 | tan: function(d) { return Math.tan(this.dtr(d)); },
555 |
556 | arcsin: function(d) { return this.rtd(Math.asin(d)); },
557 | arccos: function(d) { return this.rtd(Math.acos(d)); },
558 | arctan: function(d) { return this.rtd(Math.atan(d)); },
559 |
560 | arccot: function(x) { return this.rtd(Math.atan(1/x)); },
561 | arctan2: function(y, x) { return this.rtd(Math.atan2(y, x)); },
562 |
563 | fixAngle: function(a) { return this.fix(a, 360); },
564 | fixHour: function(a) { return this.fix(a, 24 ); },
565 |
566 | fix: function(a, b) {
567 | a = a- b* (Math.floor(a/ b));
568 | return (a < 0) ? a+ b : a;
569 | }
570 | }
571 |
572 |
573 | //---------------------- Init Object -----------------------
574 |
575 |
576 | var prayTimes = new PrayTimes();
577 |
578 |
579 |
--------------------------------------------------------------------------------
/display/js/jquery.marquee.js:
--------------------------------------------------------------------------------
1 | /**
2 | * jQuery.marquee - scrolling text like old marquee element
3 | * @author Aamir Afridi - aamirafridi(at)gmail(dot)com / http://aamirafridi.com/jquery/jquery-marquee-plugin
4 | */;
5 | (function($) {
6 | $.fn.marquee = function(options) {
7 | return this.each(function() {
8 | // Extend the options if any provided
9 | var o = $.extend({}, $.fn.marquee.defaults, options),
10 | $this = $(this),
11 | $marqueeWrapper, containerWidth, animationCss, verticalDir, elWidth,
12 | loopCount = 3,
13 | playState = 'animation-play-state',
14 | css3AnimationIsSupported = false,
15 |
16 | // Private methods
17 | _prefixedEvent = function(element, type, callback) {
18 | var pfx = ["webkit", "moz", "MS", "o", ""];
19 | for (var p = 0; p < pfx.length; p++) {
20 | if (!pfx[p]) type = type.toLowerCase();
21 | element.addEventListener(pfx[p] + type, callback, false);
22 | }
23 | },
24 |
25 | _objToString = function(obj) {
26 | var tabjson = [];
27 | for (var p in obj) {
28 | if (obj.hasOwnProperty(p)) {
29 | tabjson.push(p + ':' + obj[p]);
30 | }
31 | }
32 | tabjson.push();
33 | return '{' + tabjson.join(',') + '}';
34 | },
35 |
36 | _startAnimationWithDelay = function() {
37 | $this.timer = setTimeout(animate, o.delayBeforeStart);
38 | },
39 |
40 | // Public methods
41 | methods = {
42 | pause: function() {
43 | if (css3AnimationIsSupported && o.allowCss3Support) {
44 | $marqueeWrapper.css(playState, 'paused');
45 | } else {
46 | // pause using pause plugin
47 | if ($.fn.pause) {
48 | $marqueeWrapper.pause();
49 | }
50 | }
51 | // save the status
52 | $this.data('runningStatus', 'paused');
53 | // fire event
54 | $this.trigger('paused');
55 | },
56 |
57 | resume: function() {
58 | // resume using css3
59 | if (css3AnimationIsSupported && o.allowCss3Support) {
60 | $marqueeWrapper.css(playState, 'running');
61 | } else {
62 | // resume using pause plugin
63 | if ($.fn.resume) {
64 | $marqueeWrapper.resume();
65 | }
66 | }
67 | // save the status
68 | $this.data('runningStatus', 'resumed');
69 | // fire event
70 | $this.trigger('resumed');
71 | },
72 |
73 | toggle: function() {
74 | methods[$this.data('runningStatus') === 'resumed' ? 'pause' : 'resume']();
75 | },
76 |
77 | destroy: function() {
78 | // Clear timer
79 | clearTimeout($this.timer);
80 | // Unbind all events
81 | $this.find("*").addBack().off();
82 | // Just unwrap the elements that has been added using this plugin
83 | $this.html($this.find('.js-marquee:first').html());
84 | }
85 | };
86 |
87 | // Check for methods
88 | if (typeof options === 'string') {
89 | if ($.isFunction(methods[options])) {
90 | // Following two IF statements to support public methods
91 | if (!$marqueeWrapper) {
92 | $marqueeWrapper = $this.find('.js-marquee-wrapper');
93 | }
94 | if ($this.data('css3AnimationIsSupported') === true) {
95 | css3AnimationIsSupported = true;
96 | }
97 | methods[options]();
98 | }
99 | return;
100 | }
101 |
102 | /* Check if element has data attributes. They have top priority
103 | For details https://twitter.com/aamirafridi/status/403848044069679104 - Can't find a better solution :/
104 | jQuery 1.3.2 doesn't support $.data().KEY hence writting the following */
105 | var dataAttributes = {},
106 | attr;
107 | $.each(o, function(key) {
108 | // Check if element has this data attribute
109 | attr = $this.attr('data-' + key);
110 | if (typeof attr !== 'undefined') {
111 | // Now check if value is boolean or not
112 | switch (attr) {
113 | case 'true':
114 | attr = true;
115 | break;
116 | case 'false':
117 | attr = false;
118 | break;
119 | }
120 | o[key] = attr;
121 | }
122 | });
123 |
124 | // Reintroduce speed as an option. It calculates duration as a factor of the container width
125 | // measured in pixels per second.
126 | if (o.speed) {
127 | o.duration = parseInt($this.width(), 10) / o.speed * 1000;
128 | }
129 |
130 | // Shortcut to see if direction is upward or downward
131 | verticalDir = o.direction === 'up' || o.direction === 'down';
132 |
133 | // no gap if not duplicated
134 | o.gap = o.duplicated ? parseInt(o.gap) : 0;
135 |
136 | // wrap inner content into a div
137 | $this.wrapInner('
');
138 |
139 | // Make copy of the element
140 | var $el = $this.find('.js-marquee').css({
141 | 'margin-right': o.gap,
142 | 'float': 'left'
143 | });
144 |
145 | if (o.duplicated) {
146 | $el.clone(true).appendTo($this);
147 | }
148 |
149 | // wrap both inner elements into one div
150 | $this.wrapInner('
');
151 |
152 | // Save the reference of the wrapper
153 | $marqueeWrapper = $this.find('.js-marquee-wrapper');
154 |
155 | // If direction is up or down, get the height of main element
156 | if (verticalDir) {
157 | var containerHeight = $this.height();
158 | $marqueeWrapper.removeAttr('style');
159 | $this.height(containerHeight);
160 |
161 | // Change the CSS for js-marquee element
162 | $this.find('.js-marquee').css({
163 | 'float': 'none',
164 | 'margin-bottom': o.gap,
165 | 'margin-right': 0
166 | });
167 |
168 | // Remove bottom margin from 2nd element if duplicated
169 | if (o.duplicated) {
170 | $this.find('.js-marquee:last').css({
171 | 'margin-bottom': 0
172 | });
173 | }
174 |
175 | var elHeight = $this.find('.js-marquee:first').height() + o.gap;
176 |
177 | // adjust the animation duration according to the text length
178 | if (o.startVisible && !o.duplicated) {
179 | // Compute the complete animation duration and save it for later reference
180 | // formula is to: (Height of the text node + height of the main container / Height of the main container) * duration;
181 | o._completeDuration = ((parseInt(elHeight, 10) + parseInt(containerHeight, 10)) / parseInt(containerHeight, 10)) * o.duration;
182 |
183 | // formula is to: (Height of the text node / height of the main container) * duration
184 | o.duration = (parseInt(elHeight, 10) / parseInt(containerHeight, 10)) * o.duration;
185 | } else {
186 | // formula is to: (Height of the text node + height of the main container / Height of the main container) * duration;
187 | o.duration = ((parseInt(elHeight, 10) + parseInt(containerHeight, 10)) / parseInt(containerHeight, 10)) * o.duration;
188 | }
189 |
190 | } else {
191 | // Save the width of the each element so we can use it in animation
192 | elWidth = $this.find('.js-marquee:first').width() + o.gap;
193 |
194 | // container width
195 | containerWidth = $this.width();
196 |
197 | // adjust the animation duration according to the text length
198 | if (o.startVisible && !o.duplicated) {
199 | // Compute the complete animation duration and save it for later reference
200 | // formula is to: (Width of the text node + width of the main container / Width of the main container) * duration;
201 | o._completeDuration = ((parseInt(elWidth, 10) + parseInt(containerWidth, 10)) / parseInt(containerWidth, 10)) * o.duration;
202 |
203 | // (Width of the text node / width of the main container) * duration
204 | o.duration = (parseInt(elWidth, 10) / parseInt(containerWidth, 10)) * o.duration;
205 | } else {
206 | // formula is to: (Width of the text node + width of the main container / Width of the main container) * duration;
207 | o.duration = ((parseInt(elWidth, 10) + parseInt(containerWidth, 10)) / parseInt(containerWidth, 10)) * o.duration;
208 | }
209 | }
210 |
211 | // if duplicated then reduce the duration
212 | if (o.duplicated) {
213 | o.duration = o.duration / 2;
214 | }
215 |
216 | if (o.allowCss3Support) {
217 | var elm = document.body || document.createElement('div'),
218 | animationName = 'marqueeAnimation-' + Math.floor(Math.random() * 10000000),
219 | domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
220 | animationString = 'animation',
221 | animationCss3Str = '',
222 | keyframeString = '';
223 |
224 | // Check css3 support
225 | if (elm.style.animation !== undefined) {
226 | keyframeString = '@keyframes ' + animationName + ' ';
227 | css3AnimationIsSupported = true;
228 | }
229 |
230 | if (css3AnimationIsSupported === false) {
231 | for (var i = 0; i < domPrefixes.length; i++) {
232 | if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {
233 | var prefix = '-' + domPrefixes[i].toLowerCase() + '-';
234 | animationString = prefix + animationString;
235 | playState = prefix + playState;
236 | keyframeString = '@' + prefix + 'keyframes ' + animationName + ' ';
237 | css3AnimationIsSupported = true;
238 | break;
239 | }
240 | }
241 | }
242 |
243 | if (css3AnimationIsSupported) {
244 | animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's infinite ' + o.css3easing;
245 | $this.data('css3AnimationIsSupported', true);
246 | }
247 | }
248 |
249 | var _rePositionVertically = function() {
250 | $marqueeWrapper.css('transform', 'translateY(' + (o.direction === 'up' ? containerHeight + 'px' : '-' + elHeight + 'px') + ')');
251 | },
252 | _rePositionHorizontally = function() {
253 | $marqueeWrapper.css('transform', 'translateX(' + (o.direction === 'left' ? containerWidth + 'px' : '-' + elWidth + 'px') + ')');
254 | };
255 |
256 | // if duplicated option is set to true than position the wrapper
257 | if (o.duplicated) {
258 | if (verticalDir) {
259 | if (o.startVisible) {
260 | $marqueeWrapper.css('transform', 'translateY(0)');
261 | } else {
262 | $marqueeWrapper.css('transform', 'translateY(' + (o.direction === 'up' ? containerHeight + 'px' : '-' + ((elHeight * 2) - o.gap) + 'px') + ')');
263 | }
264 | } else {
265 | if (o.startVisible) {
266 | $marqueeWrapper.css('transform', 'translateX(0)');
267 | } else {
268 | $marqueeWrapper.css('transform', 'translateX(' + (o.direction === 'left' ? containerWidth + 'px' : '-' + ((elWidth * 2) - o.gap) + 'px') + ')');
269 | }
270 | }
271 |
272 | // If the text starts out visible we can skip the two initial loops
273 | if (!o.startVisible) {
274 | loopCount = 1;
275 | }
276 | } else if (o.startVisible) {
277 | // We only have two different loops if marquee is duplicated and starts visible
278 | loopCount = 2;
279 | } else {
280 | if (verticalDir) {
281 | _rePositionVertically();
282 | } else {
283 | _rePositionHorizontally();
284 | }
285 | }
286 |
287 | // Animate recursive method
288 | var animate = function() {
289 | if (o.duplicated) {
290 | // When duplicated, the first loop will be scroll longer so double the duration
291 | if (loopCount === 1) {
292 | o._originalDuration = o.duration;
293 | if (verticalDir) {
294 | o.duration = o.direction === 'up' ? o.duration + (containerHeight / ((elHeight) / o.duration)) : o.duration * 2;
295 | } else {
296 | o.duration = o.direction === 'left' ? o.duration + (containerWidth / ((elWidth) / o.duration)) : o.duration * 2;
297 | }
298 | // Adjust the css3 animation as well
299 | if (animationCss3Str) {
300 | animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's ' + o.css3easing;
301 | }
302 | loopCount++;
303 | }
304 | // On 2nd loop things back to normal, normal duration for the rest of animations
305 | else if (loopCount === 2) {
306 | o.duration = o._originalDuration;
307 | // Adjust the css3 animation as well
308 | if (animationCss3Str) {
309 | animationName = animationName + '0';
310 | keyframeString = $.trim(keyframeString) + '0 ';
311 | animationCss3Str = animationName + ' ' + o.duration / 1000 + 's 0s infinite ' + o.css3easing;
312 | }
313 | loopCount++;
314 | }
315 | }
316 |
317 | if (verticalDir) {
318 | if (o.duplicated) {
319 |
320 | // Adjust the starting point of animation only when first loops finishes
321 | if (loopCount > 2) {
322 | $marqueeWrapper.css('transform', 'translateY(' + (o.direction === 'up' ? 0 : '-' + elHeight + 'px') + ')');
323 | }
324 |
325 | animationCss = {
326 | 'transform': 'translateY(' + (o.direction === 'up' ? '-' + elHeight + 'px' : 0) + ')'
327 | };
328 | } else if (o.startVisible) {
329 | // This loop moves the marquee out of the container
330 | if (loopCount === 2) {
331 | // Adjust the css3 animation as well
332 | if (animationCss3Str) {
333 | animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's ' + o.css3easing;
334 | }
335 | animationCss = {
336 | 'transform': 'translateY(' + (o.direction === 'up' ? '-' + elHeight + 'px' : containerHeight + 'px') + ')'
337 | };
338 | loopCount++;
339 | } else if (loopCount === 3) {
340 | // Set the duration for the animation that will run forever
341 | o.duration = o._completeDuration;
342 | // Adjust the css3 animation as well
343 | if (animationCss3Str) {
344 | animationName = animationName + '0';
345 | keyframeString = $.trim(keyframeString) + '0 ';
346 | animationCss3Str = animationName + ' ' + o.duration / 1000 + 's 0s infinite ' + o.css3easing;
347 | }
348 | _rePositionVertically();
349 | }
350 | } else {
351 | _rePositionVertically();
352 | animationCss = {
353 | 'transform': 'translateY(' + (o.direction === 'up' ? '-' + ($marqueeWrapper.height()) + 'px' : containerHeight + 'px') + ')'
354 | };
355 | }
356 | } else {
357 | if (o.duplicated) {
358 |
359 | // Adjust the starting point of animation only when first loops finishes
360 | if (loopCount > 2) {
361 | $marqueeWrapper.css('transform', 'translateX(' + (o.direction === 'left' ? 0 : '-' + elWidth + 'px') + ')');
362 | }
363 |
364 | animationCss = {
365 | 'transform': 'translateX(' + (o.direction === 'left' ? '-' + elWidth + 'px' : 0) + ')'
366 | };
367 |
368 | } else if (o.startVisible) {
369 | // This loop moves the marquee out of the container
370 | if (loopCount === 2) {
371 | // Adjust the css3 animation as well
372 | if (animationCss3Str) {
373 | animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's ' + o.css3easing;
374 | }
375 | animationCss = {
376 | 'transform': 'translateX(' + (o.direction === 'left' ? '-' + elWidth + 'px' : containerWidth + 'px') + ')'
377 | };
378 | loopCount++;
379 | } else if (loopCount === 3) {
380 | // Set the duration for the animation that will run forever
381 | o.duration = o._completeDuration;
382 | // Adjust the css3 animation as well
383 | if (animationCss3Str) {
384 | animationName = animationName + '0';
385 | keyframeString = $.trim(keyframeString) + '0 ';
386 | animationCss3Str = animationName + ' ' + o.duration / 1000 + 's 0s infinite ' + o.css3easing;
387 | }
388 | _rePositionHorizontally();
389 | }
390 | } else {
391 | _rePositionHorizontally();
392 | animationCss = {
393 | 'transform': 'translateX(' + (o.direction === 'left' ? '-' + elWidth + 'px' : containerWidth + 'px') + ')'
394 | };
395 | }
396 | }
397 |
398 | // fire event
399 | $this.trigger('beforeStarting');
400 |
401 | // If css3 support is available than do it with css3, otherwise use jQuery as fallback
402 | if (css3AnimationIsSupported) {
403 | // Add css3 animation to the element
404 | $marqueeWrapper.css(animationString, animationCss3Str);
405 | var keyframeCss = keyframeString + ' { 100% ' + _objToString(animationCss) + '}',
406 | $styles = $marqueeWrapper.find('style');
407 |
408 | // Now add the keyframe animation to the marquee element
409 | if ($styles.length !== 0) {
410 | // Bug fixed for jQuery 1.3.x - Instead of using .last(), use following
411 | $styles.filter(":last").html(keyframeCss);
412 | } else {
413 | $('head').append('');
414 | }
415 |
416 | // Animation iteration event
417 | _prefixedEvent($marqueeWrapper[0], "AnimationIteration", function() {
418 | $this.trigger('finished');
419 | });
420 | // Animation stopped
421 | _prefixedEvent($marqueeWrapper[0], "AnimationEnd", function() {
422 | animate();
423 | $this.trigger('finished');
424 | });
425 |
426 | } else {
427 | // Start animating
428 | $marqueeWrapper.animate(animationCss, o.duration, o.easing, function() {
429 | // fire event
430 | $this.trigger('finished');
431 | // animate again
432 | if (o.pauseOnCycle) {
433 | _startAnimationWithDelay();
434 | } else {
435 | animate();
436 | }
437 | });
438 | }
439 | // save the status
440 | $this.data('runningStatus', 'resumed');
441 | };
442 |
443 | // bind pause and resume events
444 | $this.on('pause', methods.pause);
445 | $this.on('resume', methods.resume);
446 |
447 | if (o.pauseOnHover) {
448 | $this.on('mouseenter', methods.pause);
449 | $this.on('mouseleave', methods.resume);
450 | }
451 |
452 | // If css3 animation is supported than call animate method at once
453 | if (css3AnimationIsSupported && o.allowCss3Support) {
454 | animate();
455 | } else {
456 | // Starts the recursive method
457 | _startAnimationWithDelay();
458 | }
459 |
460 | });
461 | }; // End of Plugin
462 | // Public: plugin defaults options
463 | $.fn.marquee.defaults = {
464 | // If you wish to always animate using jQuery
465 | allowCss3Support: true,
466 | // works when allowCss3Support is set to true - for full list see http://www.w3.org/TR/2013/WD-css3-transitions-20131119/#transition-timing-function
467 | css3easing: 'linear',
468 | // requires jQuery easing plugin. Default is 'linear'
469 | easing: 'linear',
470 | // pause time before the next animation turn in milliseconds
471 | delayBeforeStart: 1000,
472 | // 'left', 'right', 'up' or 'down'
473 | direction: 'left',
474 | // true or false - should the marquee be duplicated to show an effect of continues flow
475 | duplicated: false,
476 | // duration in milliseconds of the marquee in milliseconds
477 | duration: 5000,
478 | // Speed allows you to set a relatively constant marquee speed regardless of the width of the containing element. Speed is measured in pixels per second.
479 | speed: 0,
480 | // gap in pixels between the tickers
481 | gap: 20,
482 | // on cycle pause the marquee
483 | pauseOnCycle: false,
484 | // on hover pause the marquee - using jQuery plugin https://github.com/tobia/Pause
485 | pauseOnHover: false,
486 | // the marquee is visible initially positioned next to the border towards it will be moving
487 | startVisible: false
488 | };
489 | })(jQuery);
490 |
--------------------------------------------------------------------------------
/display/js/main.js:
--------------------------------------------------------------------------------
1 | // loader
2 | $(window).on('load', function(){ // makes sure the whole site is loaded
3 | //$('#status').fadeOut(); // will first fade out the loading animation
4 | $('#preloader').delay(350).fadeOut('slow'); // will fade out the white DIV that covers the website.
5 | //$('body').delay(350).css({'overflow':'visible'});
6 | })
7 |
8 | moment.locale('id');
9 | /*
10 | Input Example Description
11 | YYYY 2014 4 or 2 digit year
12 | YY 14 2 digit year
13 | Y -25 Year with any number of digits and sign
14 | Q 1..4 Quarter of year. Sets month to first month in quarter.
15 | M MM 1..12 Month number
16 | MMM MMMM Jan..December Month name in locale set by moment.locale()
17 | D DD 1..31 Day of month
18 | Do 1st..31st Day of month with ordinal
19 | DDD DDDD 1..365 Day of year
20 | X 1410715640.579 Unix timestamp
21 | x 1410715640579 Unix ms timestamp
22 | ddd dddd Mon...Sunday Day name in locale set by moment.locale()
23 |
24 | H HH 0..23 Hours (24 hour time)
25 | h hh 1..12 Hours (12 hour time used with a A.)
26 | k kk 1..24 Hours (24 hour time from 1 to 24)
27 | a A am pm Post or ante meridiem (Note the one character a p are also considered valid)
28 | m mm 0..59 Minutes
29 | s ss 0..59 Seconds
30 | S SS SSS 0..999 Fractional seconds
31 | Z ZZ +12:00 Offset from UTC as +-HH:mm, +-HHmm, or Z
32 |
33 |
34 | */
35 |
36 | var db = false;
37 | showJam();
38 | function showJam(){
39 | $('#jam').html(moment().format("HH.mm[]ss[
]"));
40 | $('#tgl').html(moment().format("dddd, DD MMMM YYYY"));
41 | setTimeout(showJam,1000);
42 | }
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | var currentDate = new Date();
58 | var bulan = ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'];
59 | var items = {
60 | fajr: 'Subuh',
61 | //sunrise: 'Sunrise',
62 | dhuhr: 'Dzuhur',
63 | asr: 'Ashar',
64 | //sunset: 'Sunset',
65 | maghrib: 'Maghrib',
66 | isha: 'Isya\''
67 | };
68 | var format = '24h';
69 |
70 | //setting PKPU untuk bekasi
71 | var lat = -6.14;
72 | var lng = 106.59;
73 | var timeZone = 7;
74 | var dst = 0;
75 |
76 | prayTimes.adjust({
77 | fajr : 20,
78 | // dhuhr : '5 min',
79 | // asr : 'Standard',
80 | isha : 18,
81 | imsak : '10 min'
82 | });
83 |
84 | //+2 menit untuk waktu Ihtiyati (pengaman)
85 | // prayTimes.tune({
86 | // fajr : 2,
87 | // dhuhr : 2,
88 | // asr : 2,
89 | // isha : 2,
90 | // imsak : 2
91 | // });
92 |
93 |
94 | //prayTimes.setMethod('Egypt');
95 | jadwalHariIni();
96 |
97 | function jadwalHariIni(){
98 | let times = prayTimes.getTimes(currentDate, [lat, lng], timeZone, dst, format);
99 | // times.day = currentDate.getDate();
100 | // console.log(times);
101 | var jadwal ='';
102 | $.each( items, function( k, v) {
103 | jadwal += '';
104 | // console.log(v+' : '+times[k]);
105 | });
106 | // jadwal += '';
107 | $('#jadwal').html(jadwal);
108 | }
109 |
110 |
111 |
112 | /*
113 | $('#running-text .item').marquee({
114 | //duration in milliseconds of the marquee
115 | duration: 10000,
116 | //gap in pixels between the tickers
117 | // gap: 20,
118 | //time in milliseconds before the marquee will start animating
119 | // delayBeforeStart: 0,
120 | //'left' or 'right'
121 | // direction: 'left',
122 | //true or false - should the marquee be duplicated to show an effect of continues flow
123 | // duplicated: true
124 | });
125 | */
126 |
--------------------------------------------------------------------------------
/display/logo/1584790576.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/logo/1584790576.png
--------------------------------------------------------------------------------
/display/wallpaper/15822524510.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/wallpaper/15822524510.jpg
--------------------------------------------------------------------------------
/display/wallpaper/15822524511.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/wallpaper/15822524511.jpg
--------------------------------------------------------------------------------
/display/wallpaper/15822524740.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/display/wallpaper/15822524740.jpg
--------------------------------------------------------------------------------
/dist/css/bootstrap-datetimepicker.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Datetimepicker for Bootstrap 3
3 | * version : 4.17.47
4 | * https://github.com/Eonasdan/bootstrap-datetimepicker/
5 | */
6 | .bootstrap-datetimepicker-widget {
7 | list-style: none;
8 | }
9 | .bootstrap-datetimepicker-widget.dropdown-menu {
10 | display: block;
11 | margin: 2px 0;
12 | padding: 4px;
13 | width: 19em;
14 | }
15 | @media (min-width: 768px) {
16 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs {
17 | width: 38em;
18 | }
19 | }
20 | @media (min-width: 992px) {
21 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs {
22 | width: 38em;
23 | }
24 | }
25 | @media (min-width: 1200px) {
26 | .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs {
27 | width: 38em;
28 | }
29 | }
30 | .bootstrap-datetimepicker-widget.dropdown-menu:before,
31 | .bootstrap-datetimepicker-widget.dropdown-menu:after {
32 | content: '';
33 | display: inline-block;
34 | position: absolute;
35 | }
36 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:before {
37 | border-left: 7px solid transparent;
38 | border-right: 7px solid transparent;
39 | border-bottom: 7px solid #ccc;
40 | border-bottom-color: rgba(0, 0, 0, 0.2);
41 | top: -7px;
42 | left: 7px;
43 | }
44 | .bootstrap-datetimepicker-widget.dropdown-menu.bottom:after {
45 | border-left: 6px solid transparent;
46 | border-right: 6px solid transparent;
47 | border-bottom: 6px solid white;
48 | top: -6px;
49 | left: 8px;
50 | }
51 | .bootstrap-datetimepicker-widget.dropdown-menu.top:before {
52 | border-left: 7px solid transparent;
53 | border-right: 7px solid transparent;
54 | border-top: 7px solid #ccc;
55 | border-top-color: rgba(0, 0, 0, 0.2);
56 | bottom: -7px;
57 | left: 6px;
58 | }
59 | .bootstrap-datetimepicker-widget.dropdown-menu.top:after {
60 | border-left: 6px solid transparent;
61 | border-right: 6px solid transparent;
62 | border-top: 6px solid white;
63 | bottom: -6px;
64 | left: 7px;
65 | }
66 | .bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before {
67 | left: auto;
68 | right: 6px;
69 | }
70 | .bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after {
71 | left: auto;
72 | right: 7px;
73 | }
74 | .bootstrap-datetimepicker-widget .list-unstyled {
75 | margin: 0;
76 | }
77 | .bootstrap-datetimepicker-widget a[data-action] {
78 | padding: 6px 0;
79 | }
80 | .bootstrap-datetimepicker-widget a[data-action]:active {
81 | box-shadow: none;
82 | }
83 | .bootstrap-datetimepicker-widget .timepicker-hour,
84 | .bootstrap-datetimepicker-widget .timepicker-minute,
85 | .bootstrap-datetimepicker-widget .timepicker-second {
86 | width: 54px;
87 | font-weight: bold;
88 | font-size: 1.2em;
89 | margin: 0;
90 | }
91 | .bootstrap-datetimepicker-widget button[data-action] {
92 | padding: 6px;
93 | }
94 | .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after {
95 | position: absolute;
96 | width: 1px;
97 | height: 1px;
98 | margin: -1px;
99 | padding: 0;
100 | overflow: hidden;
101 | clip: rect(0, 0, 0, 0);
102 | border: 0;
103 | content: "Increment Hours";
104 | }
105 | .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after {
106 | position: absolute;
107 | width: 1px;
108 | height: 1px;
109 | margin: -1px;
110 | padding: 0;
111 | overflow: hidden;
112 | clip: rect(0, 0, 0, 0);
113 | border: 0;
114 | content: "Increment Minutes";
115 | }
116 | .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after {
117 | position: absolute;
118 | width: 1px;
119 | height: 1px;
120 | margin: -1px;
121 | padding: 0;
122 | overflow: hidden;
123 | clip: rect(0, 0, 0, 0);
124 | border: 0;
125 | content: "Decrement Hours";
126 | }
127 | .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after {
128 | position: absolute;
129 | width: 1px;
130 | height: 1px;
131 | margin: -1px;
132 | padding: 0;
133 | overflow: hidden;
134 | clip: rect(0, 0, 0, 0);
135 | border: 0;
136 | content: "Decrement Minutes";
137 | }
138 | .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after {
139 | position: absolute;
140 | width: 1px;
141 | height: 1px;
142 | margin: -1px;
143 | padding: 0;
144 | overflow: hidden;
145 | clip: rect(0, 0, 0, 0);
146 | border: 0;
147 | content: "Show Hours";
148 | }
149 | .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after {
150 | position: absolute;
151 | width: 1px;
152 | height: 1px;
153 | margin: -1px;
154 | padding: 0;
155 | overflow: hidden;
156 | clip: rect(0, 0, 0, 0);
157 | border: 0;
158 | content: "Show Minutes";
159 | }
160 | .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after {
161 | position: absolute;
162 | width: 1px;
163 | height: 1px;
164 | margin: -1px;
165 | padding: 0;
166 | overflow: hidden;
167 | clip: rect(0, 0, 0, 0);
168 | border: 0;
169 | content: "Toggle AM/PM";
170 | }
171 | .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after {
172 | position: absolute;
173 | width: 1px;
174 | height: 1px;
175 | margin: -1px;
176 | padding: 0;
177 | overflow: hidden;
178 | clip: rect(0, 0, 0, 0);
179 | border: 0;
180 | content: "Clear the picker";
181 | }
182 | .bootstrap-datetimepicker-widget .btn[data-action="today"]::after {
183 | position: absolute;
184 | width: 1px;
185 | height: 1px;
186 | margin: -1px;
187 | padding: 0;
188 | overflow: hidden;
189 | clip: rect(0, 0, 0, 0);
190 | border: 0;
191 | content: "Set the date to today";
192 | }
193 | .bootstrap-datetimepicker-widget .picker-switch {
194 | text-align: center;
195 | }
196 | .bootstrap-datetimepicker-widget .picker-switch::after {
197 | position: absolute;
198 | width: 1px;
199 | height: 1px;
200 | margin: -1px;
201 | padding: 0;
202 | overflow: hidden;
203 | clip: rect(0, 0, 0, 0);
204 | border: 0;
205 | content: "Toggle Date and Time Screens";
206 | }
207 | .bootstrap-datetimepicker-widget .picker-switch td {
208 | padding: 0;
209 | margin: 0;
210 | height: auto;
211 | width: auto;
212 | line-height: inherit;
213 | }
214 | .bootstrap-datetimepicker-widget .picker-switch td span {
215 | line-height: 2.5;
216 | height: 2.5em;
217 | width: 100%;
218 | }
219 | .bootstrap-datetimepicker-widget table {
220 | width: 100%;
221 | margin: 0;
222 | }
223 | .bootstrap-datetimepicker-widget table td,
224 | .bootstrap-datetimepicker-widget table th {
225 | text-align: center;
226 | border-radius: 4px;
227 | }
228 | .bootstrap-datetimepicker-widget table th {
229 | height: 20px;
230 | line-height: 20px;
231 | width: 20px;
232 | }
233 | .bootstrap-datetimepicker-widget table th.picker-switch {
234 | width: 145px;
235 | }
236 | .bootstrap-datetimepicker-widget table th.disabled,
237 | .bootstrap-datetimepicker-widget table th.disabled:hover {
238 | background: none;
239 | color: #777777;
240 | cursor: not-allowed;
241 | }
242 | .bootstrap-datetimepicker-widget table th.prev::after {
243 | position: absolute;
244 | width: 1px;
245 | height: 1px;
246 | margin: -1px;
247 | padding: 0;
248 | overflow: hidden;
249 | clip: rect(0, 0, 0, 0);
250 | border: 0;
251 | content: "Previous Month";
252 | }
253 | .bootstrap-datetimepicker-widget table th.next::after {
254 | position: absolute;
255 | width: 1px;
256 | height: 1px;
257 | margin: -1px;
258 | padding: 0;
259 | overflow: hidden;
260 | clip: rect(0, 0, 0, 0);
261 | border: 0;
262 | content: "Next Month";
263 | }
264 | .bootstrap-datetimepicker-widget table thead tr:first-child th {
265 | cursor: pointer;
266 | }
267 | .bootstrap-datetimepicker-widget table thead tr:first-child th:hover {
268 | background: #eeeeee;
269 | }
270 | .bootstrap-datetimepicker-widget table td {
271 | height: 54px;
272 | line-height: 54px;
273 | width: 54px;
274 | }
275 | .bootstrap-datetimepicker-widget table td.cw {
276 | font-size: .8em;
277 | height: 20px;
278 | line-height: 20px;
279 | color: #777777;
280 | }
281 | .bootstrap-datetimepicker-widget table td.day {
282 | height: 20px;
283 | line-height: 20px;
284 | width: 20px;
285 | }
286 | .bootstrap-datetimepicker-widget table td.day:hover,
287 | .bootstrap-datetimepicker-widget table td.hour:hover,
288 | .bootstrap-datetimepicker-widget table td.minute:hover,
289 | .bootstrap-datetimepicker-widget table td.second:hover {
290 | background: #eeeeee;
291 | cursor: pointer;
292 | }
293 | .bootstrap-datetimepicker-widget table td.old,
294 | .bootstrap-datetimepicker-widget table td.new {
295 | color: #777777;
296 | }
297 | .bootstrap-datetimepicker-widget table td.today {
298 | position: relative;
299 | }
300 | .bootstrap-datetimepicker-widget table td.today:before {
301 | content: '';
302 | display: inline-block;
303 | border: solid transparent;
304 | border-width: 0 0 7px 7px;
305 | border-bottom-color: #337ab7;
306 | border-top-color: rgba(0, 0, 0, 0.2);
307 | position: absolute;
308 | bottom: 4px;
309 | right: 4px;
310 | }
311 | .bootstrap-datetimepicker-widget table td.active,
312 | .bootstrap-datetimepicker-widget table td.active:hover {
313 | background-color: #337ab7;
314 | color: #fff;
315 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
316 | }
317 | .bootstrap-datetimepicker-widget table td.active.today:before {
318 | border-bottom-color: #fff;
319 | }
320 | .bootstrap-datetimepicker-widget table td.disabled,
321 | .bootstrap-datetimepicker-widget table td.disabled:hover {
322 | background: none;
323 | color: #777777;
324 | cursor: not-allowed;
325 | }
326 | .bootstrap-datetimepicker-widget table td span {
327 | display: inline-block;
328 | width: 54px;
329 | height: 54px;
330 | line-height: 54px;
331 | margin: 2px 1.5px;
332 | cursor: pointer;
333 | border-radius: 4px;
334 | }
335 | .bootstrap-datetimepicker-widget table td span:hover {
336 | background: #eeeeee;
337 | }
338 | .bootstrap-datetimepicker-widget table td span.active {
339 | background-color: #337ab7;
340 | color: #fff;
341 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
342 | }
343 | .bootstrap-datetimepicker-widget table td span.old {
344 | color: #777777;
345 | }
346 | .bootstrap-datetimepicker-widget table td span.disabled,
347 | .bootstrap-datetimepicker-widget table td span.disabled:hover {
348 | background: none;
349 | color: #777777;
350 | cursor: not-allowed;
351 | }
352 | .bootstrap-datetimepicker-widget.usetwentyfour td.hour {
353 | height: 27px;
354 | line-height: 27px;
355 | }
356 | .bootstrap-datetimepicker-widget.wider {
357 | width: 21em;
358 | }
359 | .bootstrap-datetimepicker-widget .datepicker-decades .decade {
360 | line-height: 1.8em !important;
361 | }
362 | .input-group.date .input-group-addon {
363 | cursor: pointer;
364 | }
365 | .sr-only {
366 | position: absolute;
367 | width: 1px;
368 | height: 1px;
369 | margin: -1px;
370 | padding: 0;
371 | overflow: hidden;
372 | clip: rect(0, 0, 0, 0);
373 | border: 0;
374 | }
375 |
--------------------------------------------------------------------------------
/dist/css/buttons.dataTables.min.css:
--------------------------------------------------------------------------------
1 | @keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection-title{text-align:center;padding:0.3em 0 0.5em;font-size:0.9em}div.dt-button-collection-title:empty{display:none}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;margin-bottom:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(to bottom, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(to bottom, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(to bottom, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(to bottom, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-sizing:border-box}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}
2 |
--------------------------------------------------------------------------------
/dist/css/datatables.min.css:
--------------------------------------------------------------------------------
1 | /*
2 | * This combined file was created by the DataTables downloader builder:
3 | * https://datatables.net/download
4 | *
5 | * To rebuild or modify this file with the latest versions of the included
6 | * software please visit:
7 | * https://datatables.net/download/#bs/dt-1.10.18
8 | *
9 | * Included libraries:
10 | * DataTables 1.10.18
11 | */
12 |
13 | table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
14 |
15 |
16 |
--------------------------------------------------------------------------------
/dist/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/dist/img/bgTransparent.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/dist/img/bgTransparent.jpg
--------------------------------------------------------------------------------
/dist/js/adminlte.min.js:
--------------------------------------------------------------------------------
1 | /*! AdminLTE app.js
2 | * ================
3 | * Main JS application file for AdminLTE v2. This file
4 | * should be included in all pages. It controls some layout
5 | * options and implements exclusive AdminLTE plugins.
6 | *
7 | * @author Colorlib
8 | * @support
9 | * @version v2.4.18
10 | * @repository git://github.com/ColorlibHQ/AdminLTE.git
11 | * @license MIT
12 | */
13 | if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");!function(i){"use strict";function s(t,e){if(this.element=t,this.options=e,this.$overlay=i(e.overlayTemplate),""===e.source)throw new Error("Source url was not defined. Please specify a url in your BoxRefresh source option.");this._setUpListeners(),this.load()}var r="lte.boxrefresh",a={source:"",params:{},trigger:".refresh-btn",content:".box-body",loadInContent:!0,responseType:"",overlayTemplate:'',onLoadStart:function(){},onLoadDone:function(t){return t}},t='[data-widget="box-refresh"]';function e(n){return this.each(function(){var t=i(this),e=t.data(r);if(!e){var o=i.extend({},a,t.data(),"object"==typeof n&&n);t.data(r,e=new s(t,o))}if("string"==typeof e){if(void 0===e[n])throw new Error("No method named "+n);e[n]()}})}s.prototype.load=function(){this._addOverlay(),this.options.onLoadStart.call(i(this)),i.get(this.options.source,this.options.params,function(t){this.options.loadInContent&&i(this.element).find(this.options.content).html(t),this.options.onLoadDone.call(i(this),t),this._removeOverlay()}.bind(this),""!==this.options.responseType&&this.options.responseType)},s.prototype._setUpListeners=function(){i(this.element).on("click",this.options.trigger,function(t){t&&t.preventDefault(),this.load()}.bind(this))},s.prototype._addOverlay=function(){i(this.element).append(this.$overlay)},s.prototype._removeOverlay=function(){i(this.$overlay).remove()};var o=i.fn.boxRefresh;i.fn.boxRefresh=e,i.fn.boxRefresh.Constructor=s,i.fn.boxRefresh.noConflict=function(){return i.fn.boxRefresh=o,this},i(window).on("load",function(){i(t).each(function(){e.call(i(this))})})}(jQuery),function(i){"use strict";function s(t,e){this.element=t,this.options=e,this._setUpListeners()}var r="lte.boxwidget",a={animationSpeed:500,collapseTrigger:'[data-widget="collapse"]',removeTrigger:'[data-widget="remove"]',collapseIcon:"fa-minus",expandIcon:"fa-plus",removeIcon:"fa-times"},t=".box",e=".collapsed-box",d=".box-header",l=".box-body",c=".box-footer",h=".box-tools",f="collapsed-box",p="collapsing.boxwidget",u="collapsed.boxwidget",g="expanding.boxwidget",v="expanded.boxwidget",o="removing.boxwidget",n="removed.boxwidget";function b(n){return this.each(function(){var t=i(this),e=t.data(r);if(!e){var o=i.extend({},a,t.data(),"object"==typeof n&&n);t.data(r,e=new s(t,o))}if("string"==typeof n){if(void 0===e[n])throw new Error("No method named "+n);e[n]()}})}s.prototype.toggle=function(){!i(this.element).is(e)?this.collapse():this.expand()},s.prototype.expand=function(){var t=i.Event(v),e=i.Event(g),o=this.options.collapseIcon,n=this.options.expandIcon;i(this.element).removeClass(f),i(this.element).children(d+", "+l+", "+c).children(h).find("."+n).removeClass(n).addClass(o),i(this.element).children(l+", "+c).slideDown(this.options.animationSpeed,function(){i(this.element).trigger(t)}.bind(this)).trigger(e)},s.prototype.collapse=function(){var t=i.Event(u),e=i.Event(p),o=this.options.collapseIcon,n=this.options.expandIcon;i(this.element).children(d+", "+l+", "+c).children(h).find("."+o).removeClass(o).addClass(n),i(this.element).children(l+", "+c).slideUp(this.options.animationSpeed,function(){i(this.element).addClass(f),i(this.element).trigger(t)}.bind(this)).trigger(e)},s.prototype.remove=function(){var t=i.Event(n),e=i.Event(o);i(this.element).slideUp(this.options.animationSpeed,function(){i(this.element).trigger(t),i(this.element).remove()}.bind(this)).trigger(e)},s.prototype._setUpListeners=function(){var e=this;i(this.element).on("click",this.options.collapseTrigger,function(t){return t&&t.preventDefault(),e.toggle(i(this)),!1}),i(this.element).on("click",this.options.removeTrigger,function(t){return t&&t.preventDefault(),e.remove(i(this)),!1})};var m=i.fn.boxWidget;i.fn.boxWidget=b,i.fn.boxWidget.Constructor=s,i.fn.boxWidget.noConflict=function(){return i.fn.boxWidget=m,this},i(window).on("load",function(){i(t).each(function(){b.call(i(this))})})}(jQuery),function(i){"use strict";function s(t,e){this.element=t,this.options=e,this.hasBindedResize=!1,this.init()}var r="lte.controlsidebar",a={controlsidebarSlide:!0},e=".control-sidebar",t='[data-toggle="control-sidebar"]',o=".control-sidebar-open",n=".control-sidebar-bg",d=".wrapper",l=".layout-boxed",c="control-sidebar-open",h="control-sidebar-hold-transition",f="collapsed.controlsidebar",p="expanded.controlsidebar";function u(n){return this.each(function(){var t=i(this),e=t.data(r);if(!e){var o=i.extend({},a,t.data(),"object"==typeof n&&n);t.data(r,e=new s(t,o))}"string"==typeof n&&e.toggle()})}s.prototype.init=function(){i(this.element).is(t)||i(this).on("click",this.toggle),this.fix(),i(window).resize(function(){this.fix()}.bind(this))},s.prototype.toggle=function(t){t&&t.preventDefault(),this.fix(),i(e).is(o)||i("body").is(o)?this.collapse():this.expand()},s.prototype.expand=function(){i(e).show(),this.options.controlsidebarSlide?i(e).addClass(c):i("body").addClass(h).addClass(c).delay(50).queue(function(){i("body").removeClass(h),i(this).dequeue()}),i(this.element).trigger(i.Event(p))},s.prototype.collapse=function(){this.options.controlsidebarSlide?i(e).removeClass(c):i("body").addClass(h).removeClass(c).delay(50).queue(function(){i("body").removeClass(h),i(this).dequeue()}),i(e).fadeOut(),i(this.element).trigger(i.Event(f))},s.prototype.fix=function(){i("body").is(l)&&this._fixForBoxed(i(n))},s.prototype._fixForBoxed=function(t){t.css({position:"absolute",height:i(d).height()})};var g=i.fn.controlSidebar;i.fn.controlSidebar=u,i.fn.controlSidebar.Constructor=s,i.fn.controlSidebar.noConflict=function(){return i.fn.controlSidebar=g,this},i(document).on("click",t,function(t){t&&t.preventDefault(),u.call(i(this),"toggle")})}(jQuery),function(n){"use strict";function i(t){this.element=t}var s="lte.directchat",t='[data-widget="chat-pane-toggle"]',e=".direct-chat",o="direct-chat-contacts-open";function r(o){return this.each(function(){var t=n(this),e=t.data(s);e||t.data(s,e=new i(t)),"string"==typeof o&&e.toggle(t)})}i.prototype.toggle=function(t){t.parents(e).first().toggleClass(o)};var a=n.fn.directChat;n.fn.directChat=r,n.fn.directChat.Constructor=i,n.fn.directChat.noConflict=function(){return n.fn.directChat=a,this},n(document).on("click",t,function(t){t&&t.preventDefault(),r.call(n(this),"toggle")})}(jQuery),function(i){"use strict";function s(t){this.options=t,this.init()}var r="lte.pushmenu",a={collapseScreenSize:767,expandOnHover:!1,expandTransitionDelay:200},t=".sidebar-collapse",e=".main-sidebar",o=".content-wrapper",n=".sidebar-form .form-control",d='[data-toggle="push-menu"]',l=".sidebar-mini",c=".sidebar-expanded-on-hover",h=".fixed",f="sidebar-collapse",p="sidebar-open",u="sidebar-expanded-on-hover",g="sidebar-mini-expand-feature",v="expanded.pushMenu",b="collapsed.pushMenu";function m(n){return this.each(function(){var t=i(this),e=t.data(r);if(!e){var o=i.extend({},a,t.data(),"object"==typeof n&&n);t.data(r,e=new s(o))}"toggle"===n&&e.toggle()})}s.prototype.init=function(){(this.options.expandOnHover||i("body").is(l+h))&&(this.expandOnHover(),i("body").addClass(g)),i(o).click(function(){i(window).width()<=this.options.collapseScreenSize&&i("body").hasClass(p)&&this.close()}.bind(this)),i(n).click(function(t){t.stopPropagation()})},s.prototype.toggle=function(){var t=i(window).width(),e=!i("body").hasClass(f);t<=this.options.collapseScreenSize&&(e=i("body").hasClass(p)),e?this.close():this.open()},s.prototype.open=function(){i(window).width()>this.options.collapseScreenSize?i("body").removeClass(f).trigger(i.Event(v)):i("body").addClass(p).trigger(i.Event(v))},s.prototype.close=function(){i(window).width()>this.options.collapseScreenSize?i("body").addClass(f).trigger(i.Event(b)):i("body").removeClass(p+" "+f).trigger(i.Event(b))},s.prototype.expandOnHover=function(){i(e).hover(function(){i("body").is(l+t)&&i(window).width()>this.options.collapseScreenSize&&this.expand()}.bind(this),function(){i("body").is(c)&&this.collapse()}.bind(this))},s.prototype.expand=function(){setTimeout(function(){i("body").removeClass(f).addClass(u)},this.options.expandTransitionDelay)},s.prototype.collapse=function(){setTimeout(function(){i("body").removeClass(u).addClass(f)},this.options.expandTransitionDelay)};var y=i.fn.pushMenu;i.fn.pushMenu=m,i.fn.pushMenu.Constructor=s,i.fn.pushMenu.noConflict=function(){return i.fn.pushMenu=y,this},i(document).on("click",d,function(t){t.preventDefault(),m.call(i(this),"toggle")}),i(window).on("load",function(){m.call(i(d))})}(jQuery),function(i){"use strict";function s(t,e){this.element=t,this.options=e,this._setUpListeners()}var r="lte.todolist",a={onCheck:function(t){return t},onUnCheck:function(t){return t}},e={data:'[data-widget="todo-list"]'},o="done";function t(n){return this.each(function(){var t=i(this),e=t.data(r);if(!e){var o=i.extend({},a,t.data(),"object"==typeof n&&n);t.data(r,e=new s(t,o))}if("string"==typeof e){if(void 0===e[n])throw new Error("No method named "+n);e[n]()}})}s.prototype.toggle=function(t){t.parents(e.li).first().toggleClass(o),t.prop("checked")?this.check(t):this.unCheck(t)},s.prototype.check=function(t){this.options.onCheck.call(t)},s.prototype.unCheck=function(t){this.options.onUnCheck.call(t)},s.prototype._setUpListeners=function(){var t=this;i(this.element).on("change ifChanged","input:checkbox",function(){t.toggle(i(this))})};var n=i.fn.todoList;i.fn.todoList=t,i.fn.todoList.Constructor=s,i.fn.todoList.noConflict=function(){return i.fn.todoList=n,this},i(window).on("load",function(){i(e.data).each(function(){t.call(i(this))})})}(jQuery),function(s){"use strict";function n(t,e){this.element=t,this.options=e,s(this.element).addClass(h),s(a+o,this.element).addClass(c),this._setUpListeners()}var i="lte.tree",r={animationSpeed:500,accordion:!0,followLink:!1,trigger:".treeview a"},a=".treeview",d=".treeview-menu",l=".menu-open, .active",t='[data-widget="tree"]',o=".active",c="menu-open",h="tree",f="collapsed.tree",p="expanded.tree";function e(o){return this.each(function(){var t=s(this);if(!t.data(i)){var e=s.extend({},r,t.data(),"object"==typeof o&&o);t.data(i,new n(t,e))}})}n.prototype.toggle=function(t,e){var o=t.next(d),n=t.parent(),i=n.hasClass(c);n.is(a)&&(this.options.followLink&&"#"!==t.attr("href")||e.preventDefault(),i?this.collapse(o,n):this.expand(o,n))},n.prototype.expand=function(t,e){var o=s.Event(p);if(this.options.accordion){var n=e.siblings(l),i=n.children(d);this.collapse(i,n)}e.addClass(c),t.stop().slideDown(this.options.animationSpeed,function(){s(this.element).trigger(o),e.height("auto")}.bind(this))},n.prototype.collapse=function(t,e){var o=s.Event(f);e.removeClass(c),t.stop().slideUp(this.options.animationSpeed,function(){s(this.element).trigger(o),e.find(a).removeClass(c).find(d).hide()}.bind(this))},n.prototype._setUpListeners=function(){var e=this;s(this.element).on("click",this.options.trigger,function(t){e.toggle(s(this),t)})};var u=s.fn.tree;s.fn.tree=e,s.fn.tree.Constructor=n,s.fn.tree.noConflict=function(){return s.fn.tree=u,this},s(window).on("load",function(){s(t).each(function(){e.call(s(this))})})}(jQuery),function(a){"use strict";function i(t){this.options=t,this.bindedResize=!1,this.activate()}var s="lte.layout",r={slimscroll:!0,resetHeight:!0},d=".wrapper",l=".content-wrapper",c=".layout-boxed",h=".main-footer",f=".main-header",t=".main-sidebar",e="slimScrollDiv",p=".sidebar",u=".control-sidebar",o=".sidebar-menu",n=".main-header .logo",g="fixed",v="hold-transition";function b(n){return this.each(function(){var t=a(this),e=t.data(s);if(!e){var o=a.extend({},r,t.data(),"object"==typeof n&&n);t.data(s,e=new i(o))}if("string"==typeof n){if(void 0===e[n])throw new Error("No method named "+n);e[n]()}})}i.prototype.activate=function(){this.fix(),this.fixSidebar(),a("body").removeClass(v),this.options.resetHeight&&a("body, html, "+d).css({height:"auto","min-height":"100%"}),this.bindedResize||(a(window).resize(function(){this.fix(),this.fixSidebar(),a(n+", "+p).one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend",function(){this.fix(),this.fixSidebar()}.bind(this))}.bind(this)),this.bindedResize=!0),a(o).on("expanded.tree",function(){this.fix(),this.fixSidebar()}.bind(this)),a(o).on("collapsed.tree",function(){this.fix(),this.fixSidebar()}.bind(this))},i.prototype.fix=function(){a(c+" > "+d).css("overflow","hidden");var t=a(h).outerHeight()||0,e=a(f).outerHeight()||0,o=e+t,n=a(window).height(),i=a(p).outerHeight()||0;if(a("body").hasClass(g))a(l).css("min-height",n-t);else{var s;s=i+e<=n?(a(l).css("min-height",n-o),n-o):(a(l).css("min-height",i),i);var r=a(u);void 0!==r&&r.height()>s&&a(l).css("min-height",r.height())}},i.prototype.fixSidebar=function(){a("body").hasClass(g)?this.options.slimscroll&&void 0!==a.fn.slimScroll&&0===a(t).find(e).length&&a(p).slimScroll({height:a(window).height()-a(f).height()+"px"}):void 0!==a.fn.slimScroll&&a(p).slimScroll({destroy:!0}).height("auto")};var m=a.fn.layout;a.fn.layout=b,a.fn.layout.Constuctor=i,a.fn.layout.noConflict=function(){return a.fn.layout=m,this},a(window).on("load",function(){b.call(a("body"))})}(jQuery);
--------------------------------------------------------------------------------
/dist/js/fn.js:
--------------------------------------------------------------------------------
1 |
2 | var app = {
3 | //variable
4 | db : null,
5 | resetDevice: function(self){
6 | var konfirm = prompt("Ketik 'KONFIRMASI' untuk melanjutkan");
7 | if (konfirm == 'KONFIRMASI') {
8 | $btn = $(self);
9 | btnText = $btn.html();
10 | $btn.html(' loading...').attr('disabled','disabled');
11 | $.ajax({
12 | type : "POST",
13 | url : "proses.php",
14 | dataType: "json",
15 | data : {id:'resetDevice',dt:konfirm}
16 | }).done(function(dt){
17 | app.cekRegistered(dt.registered);
18 | if(dt.success){
19 | location.reload();
20 | }
21 | else{
22 | alert(dt.data);
23 | $btn.html(btnText).removeAttr('disabled');
24 | }
25 | }).fail(function(msg){
26 | alert(msg.status+"\n"+msg.statusText);
27 | });
28 | }
29 | else alert("Gagal...");
30 | },
31 | shutdown: function(self,opt){
32 | if (confirm('Konfirmasi?')){
33 | $btn = $(self);
34 | btnText = $btn.html();
35 | $btn.html(' command send...').attr('disabled','disabled');
36 | $.ajax({
37 | type : "POST",
38 | url : "proses.php",
39 | dataType: "json",
40 | data : {id:'shutdown',dt:opt}
41 | }).done(function(dt){
42 | app.cekRegistered(dt.registered);
43 | if(dt.success){
44 | $btn.html(' Sukses');
45 | }
46 | else{
47 | // alert(dt.data);
48 | // $btn.html(btnText).removeAttr('disabled');
49 | }
50 | }).fail(function(msg){
51 | console.log(msg.status+"\n"+msg.statusText);
52 | });
53 | }
54 | },
55 | updateClock: function(self){
56 | $btn = $(self);
57 | btnText = $btn.html();
58 | $btn.html(' Loading...').attr('disabled','disabled');
59 | let jam = moment().format('YYYY-MM-DD HH:mm:ss');
60 | $.ajax({
61 | type : "POST",
62 | url : "proses.php",
63 | dataType: "json",
64 | data : {id:'updateClock',dt:jam}
65 | }).done(function(dt){
66 | app.cekRegistered(dt.registered);
67 | if(dt.success){
68 | setTimeout(function(){
69 | $btn.html(' '+jam);
70 | setTimeout(function(){
71 | $btn.html(btnText).removeAttr('disabled');
72 | $('.sidebar-menu .active a').trigger( "click" );
73 | },2000);
74 | },10);
75 | }
76 | else{
77 | alert(dt.data);
78 | $btn.html(btnText).removeAttr('disabled');
79 | }
80 | }).fail(function(msg){
81 | alert(msg.status+"\n"+msg.statusText);
82 | });
83 | },
84 | loading: function(){
85 | $('#container').html(`
86 |
87 | Loading...
88 |
89 | `);
90 | },
91 | cekRegistered: function(registered){
92 | //Cek sudah login atau session sudah habis ==> reload browser
93 | if(!registered)location.reload();
94 | },
95 |
96 | initialize: function() {
97 | // app.showDateTime();
98 |
99 | $(document).onSwipe(function(res){
100 | if(res.right)$('body').addClass('sidebar-open');
101 | else if(res.left)$('body').removeClass('sidebar-open');
102 | });
103 |
104 |
105 |
106 | // $('button').show();
107 | $(document).on("click",'.sidebar-menu>li>a',function(){
108 | // if($(this).parent().hasClass('active'))return;
109 | target = $(this).data('target');
110 | if(target=='logout'&&!confirm('Keluar aplikasi?'))return;
111 |
112 | $('.sidebar-menu>li').removeClass('active');
113 | $(this).parent().addClass('active');
114 | $('section.content-dynamic').hide();
115 |
116 | app.loading();
117 | $('body').removeClass('sidebar-open');
118 | $.ajax({
119 | type : "POST",
120 | url : "proses.php",
121 | dataType: "json",
122 | data : {id:target}
123 | }).done(function(dt){
124 | app.cekRegistered(dt.registered);
125 | $('#container').html(dt.data).promise().done(function(){
126 | $('.box').boxWidget({
127 | animationSpeed : 500,
128 | collapseTrigger: '[data-widget="collapse"]',
129 | removeTrigger : '[data-widget="remove"]',
130 | collapseIcon : 'fa-minus',
131 | expandIcon : 'fa-plus',
132 | removeIcon : 'fa-times'
133 | });
134 |
135 |
136 | if(target=='jadwal'){
137 | $('#prayTimesMethod').trigger('change');
138 | $('.btn-primary>.badge').remove();
139 | }
140 | else if(target=='sistem')$('#jamLokal').val(moment().format("YYYY-MM-DD HH:mm:ss"));
141 | else if(target=='simulasi'){
142 | $('.month-picker input').val(moment().format('MMMM YYYY')).datetimepicker({
143 | format: 'MMMM YYYY',
144 | // locale: 'id',//jangan rubah locale, karena next dan prev pake locale default
145 | // useCurrent: false,
146 | showTodayButton: true,
147 | ignoreReadonly: true,
148 | icons : {
149 | today : 'fa fa-calendar-check-o'
150 | }
151 | });
152 | }
153 | });
154 | }).fail(function(msg){
155 | alert(msg.status+"\n"+msg.statusText);
156 | $('#container').html("Error...");
157 | });
158 |
159 | });
160 | // click default menu
161 | $('.sidebar-menu .active a').trigger( "click" );
162 |
163 |
164 |
165 |
166 | //even badge jika ada perubahan form
167 | $(document).on('change keyup','form .form-control',function(){
168 | var $btn = $(this).closest('form').find('button.btn-primary');
169 | $btn.find('.badge').remove();
170 | $btn.append('! ');
171 | });
172 |
173 | //form save
174 | $(document).on('submit','form.form',function(event){
175 | // alert("aaa");
176 | var $btn = $(this).find('button.btn-primary');
177 | var btnText = $btn.html();
178 | var arr = {};
179 | $btn.html(' loading...').attr('disabled','disabled');
180 | $.each($(this).serializeArray(), function( k, v ){
181 | arr[v.name] = v.value;
182 | });
183 |
184 | $.ajax({
185 | type : "POST",
186 | url : "proses.php",
187 | dataType: "json",
188 | data : {id:'formSave',dt:arr}
189 | }).done(function(dt){
190 | app.cekRegistered(dt.registered);
191 | console.log(dt);
192 | setTimeout(function(){//terlalu cepet, ngggak keren, tak kasih delay aja... hihihihiii
193 | if(dt.success){
194 | $btn.html(' tersimpan');
195 | setTimeout(function(){
196 | if(arr['index']=='new')$('.sidebar-menu .active a').trigger( "click" );
197 | else {
198 | $('input[type=password]').val('');
199 | $btn.html(btnText).removeAttr('disabled');
200 | $btn.find('.badge').remove();
201 | }
202 | },1000);
203 | }
204 | else{
205 | alert(dt.data);
206 | $btn.html(btnText).removeAttr('disabled');
207 | }
208 | },300);
209 |
210 | // $('.sidebar-menu a[data-target='+arr['formId']+']').parent().trigger( "click" );
211 | }).fail(function(msg){
212 | alert(msg.status+"\n"+msg.statusText);
213 | // $('#container').html("Error...");
214 | });
215 |
216 |
217 | event.preventDefault();
218 | });
219 |
220 | //upload wallpaper
221 | $(document).on('submit','form.form-file',function(event){
222 | var verification = false;
223 | var form_data = new FormData(this);
224 | // form_data.append('id', 'formFileSave');
225 | $(this).find(".form-control").each(function(){
226 | // console.log(this);
227 | // console.log($(this).data('proses'));
228 | form_data.append('id', $(this).data('proses'));
229 | if($(this).attr('type')=='file'){
230 | files = this.files;
231 | for (i = 0; i < files.length; i++) {
232 | if(i>4){
233 | alert('Maksimal 5 file sekali upload...');
234 | verification = false;
235 | return;
236 | }
237 | else if(files[i].size > 2000000){
238 | alert(files[i].name+' lebih > 2Mb');
239 | verification = false;
240 | return;
241 | }
242 | /* cek di server
243 | else if (files[i].type!="image/jpeg") {
244 | alert(files[i].name+' : ext file bukan jpg');
245 | verification = false;
246 | return;
247 | }
248 | */
249 | // console.log(files[i]);
250 | form_data.append('file' + i, files[i]);
251 | verification = true;
252 | }
253 | }
254 |
255 | });
256 | // event.preventDefault();return;
257 | if(verification){
258 | var $btn = $(this).find('button.btn-primary');
259 | var btnText = $btn.html();
260 | $btn.html(' loading...').attr('disabled','disabled');
261 | $.ajax({
262 | type : "POST",
263 | url : "proses.php",
264 | dataType: "json",
265 | cache : false,
266 | contentType: false,
267 | processData: false,
268 | data : form_data
269 | }).done(function(dt){
270 | app.cekRegistered(dt.registered);
271 | console.log(dt);
272 | setTimeout(function(){//terlalu cepet, ngggak keren, tak kasih delay aja... hihihihiii
273 | if(dt.success){
274 | $btn.html(' tersimpan');
275 | setTimeout(function(){
276 | $('.sidebar-menu .active a').trigger( "click" );
277 | },1000);
278 |
279 | }
280 | else{
281 | alert(dt.data);
282 | $btn.html(btnText).removeAttr('disabled');
283 | }
284 | },300);
285 | }).fail(function(msg){
286 | alert(msg.status+"\n"+msg.statusText);
287 | });
288 | event.preventDefault();
289 | }
290 |
291 | event.preventDefault();
292 | });
293 |
294 | //hapus wallpaper
295 | $(document).on('click','.section-wallpaper a.small-box-footer',function(){
296 | if(confirm('Konfirmasi menghapus?')){
297 | //console.log($(this).data('file'))
298 | $(this).html(' loading...');
299 | data = $(this).data('file');
300 | $.ajax({
301 | type : "POST",
302 | url : "proses.php",
303 | dataType: "json",
304 | data : {id:'wallpaperDelete',dt:data}
305 | }).done(function(dt){
306 | app.cekRegistered(dt.registered);
307 | console.log(dt);
308 | if(!dt.success) alert(dt.data);
309 | $('.sidebar-menu .active a').trigger( "click" );
310 | }).fail(function(msg){
311 | alert(msg.status+"\n"+msg.statusText);
312 | $('.sidebar-menu .active a').trigger( "click" );
313 | });
314 | }
315 | });
316 |
317 | //hapus form
318 | $(document).on('click','form button.delete',function(event){
319 | // alert("aaa");
320 | if(confirm('Konfirmasi menghapus?')){
321 | var $btn = $(this);
322 | var $form = $(this).closest('form');
323 | var btnText = $btn.html();
324 | arr = {};
325 | $btn.html(' loading...').attr('disabled','disabled');
326 | $.each($form.serializeArray(), function( k, v ){
327 | arr[v.name] = v.value;
328 | });
329 |
330 | $.ajax({
331 | type : "POST",
332 | url : "proses.php",
333 | dataType: "json",
334 | data : {id:'formDelete',dt:arr}
335 | }).done(function(dt){
336 | app.cekRegistered(dt.registered);
337 | console.log(dt);
338 | setTimeout(function(){//terlalu cepet, ngggak keren, tak kasih delay aja... hihihihiii
339 | if(dt.success){
340 | $btn.html(' dihapus');
341 | setTimeout(function(){
342 | // $form.slideUp();//index berubah, harus load ulang
343 | $('.sidebar-menu .active a').trigger( "click" );
344 | },300);
345 | }
346 | else{
347 | $btn.html(' gagal menghapus...');
348 | alert(dt.data);
349 | setTimeout(function(){
350 | $btn.html(' coba lagi?').removeAttr('disabled');
351 | },700);
352 | }
353 | },300);
354 |
355 | // $('.sidebar-menu a[data-target='+arr['formId']+']').parent().trigger( "click" );
356 | }).fail(function(msg){
357 | alert(msg.status+"\n"+msg.statusText);
358 | // $('#container').html("Error...");
359 | });
360 | }
361 | });
362 |
363 | //change prayTimes method
364 | $(document).on('change','#prayTimesMethod',function(){
365 | if($(this).val()=='0')
366 | $('#prayTimesAdjust').show();
367 | else
368 | $('#prayTimesAdjust').hide();
369 | });
370 |
371 |
372 |
373 | //MONTH PICKER EVENT__________________________________________________________________________________
374 | $(document).on('click','.month-picker .prev', function(){
375 | $input = $(this).closest('.month-picker').find('.picker');
376 | thisDt = moment($input.val(),'MMMM YYYY');
377 | $input.val(thisDt.subtract(1,'months').format('MMMM YYYY')).trigger('change');
378 | // console.log($input.val());
379 | // console.log(moment(thisDt).format('YYYY-MM-DD'));
380 | });
381 | $(document).on('click','.month-picker .next', function(){
382 | $input = $(this).closest('.month-picker').find('.picker');
383 | thisDt = moment($input.val(),'MMMM YYYY');
384 | $input.val(thisDt.add(1,'months').format('MMMM YYYY')).trigger('change');
385 | });
386 |
387 | $(document).on('dp.change','.month-picker .picker', function(e){
388 | // console.log(e);
389 | if(e.oldDate== null) app.simulasiJadwal(e.date);
390 | else if(e.oldDate.format('YYYY-MM') != e.date.format('YYYY-MM')){
391 | app.simulasiJadwal(e.date);
392 | }
393 | // console.log(moment(e.oldDate).format('YYYY-MM-DD')+':'+e.date.format('YYYY-MM-DD'));
394 | // if(e.oldDate.format('YYYY-MM-DD')!=e.date.format('YYYY-MM-DD')){
395 | // console.log(e.oldDate.format('YYYY-MM-DD')+':'+e.date.format('YYYY-MM-DD'));
396 | // app.tableDataBulanan(e.date);
397 | // }
398 | });
399 |
400 |
401 |
402 | },
403 | simulasiJadwal: function(date){
404 | // console.log(date.format('YYYY-MM'));
405 | // console.log(date);
406 | var stDate = moment(date).startOf('month');
407 | // var enDate = moment(date).endOf('month');//ini jam 23.59.59 --> di loop + 1 day kehitung 2x
408 | var enDate = moment(date).add(1,'M');
409 |
410 | // console.log(stDate.format('YYYY-MM-DD HH:mm:ss'));
411 | // console.log(enDate.format('YYYY-MM-DD HH:mm:ss'));
412 |
413 | let compileJadwal = function(dt){
414 | // console.log(dt);
415 | let jadwal = new PrayTimes();
416 | if(dt['prayTimesMethod']=='0'){
417 | if(Object.keys(dt['prayTimesAdjust']).length>0){
418 | jadwal.adjust(dt['prayTimesAdjust']);
419 | // console.log('jadwal - ajust :');
420 | // console.log(dt['prayTimesAdjust']);
421 | }
422 | }
423 | else{
424 | jadwal.setMethod(dt['prayTimesMethod']);
425 | // console.log('jadwal - setMethod :');
426 | // console.log(dt['prayTimesMethod']);
427 | }
428 |
429 | if(Object.keys(dt['prayTimesTune']).length>0){
430 | jadwal.tune(dt['prayTimesTune']);
431 | // console.log('jadwal - tune :');
432 | // console.log(dt['prayTimesTune']);
433 | }
434 |
435 | let thead = '' + (dt['thead'].join(' ')) + ' ';
436 | // console.log(thead);
437 | $.each(dt['thead'], function( k, v ){
438 | // arr[v.name] = v.value;
439 | });
440 |
441 | let today = moment().format('YYYY-MM-DD');
442 | let lat = dt['setting']['latitude'];
443 | let lng = dt['setting']['longitude'];
444 | let timeZone = dt['setting']['timeZone'];
445 | let dst = dt['setting']['dst'];
446 | let format = '24h';
447 | let tbody = '';
448 | // console.log(today);
449 | for (let m = moment(stDate); m.diff(enDate, 'days') < 0; m.add(1, 'days')) {
450 | // console.log(m.diff(enDate, 'days'));
451 | let jsDate = m.toDate();
452 | let times = jadwal.getTimes(jsDate, [lat, lng], timeZone, dst, format);
453 | let rowClass = m.format('YYYY-MM-DD')==today?'class="today"':'';
454 | console.log(m.format('YYYY-MM-DD'));
455 | // console.log(times);
456 | tbody += '';
457 | tbody += ''+m.format('DD')+' ';
458 | $.each( dt['items'], function( k, v) {
459 | tbody += ''+times[v] +' ';
460 | });
461 | tbody += ' ';
462 | }
463 | tbody += ' ';
464 | // console.log(tbody);
465 | $('.table-responsive').html('');
466 | }
467 |
468 | $('.table-responsive').html(' loading...');
469 | $.ajax({
470 | type : "POST",
471 | url : "proses.php",
472 | dataType: "json",
473 | data : {id:'getPraySetting'}
474 | }).done(function(dt){
475 | app.cekRegistered(dt.registered);
476 | // console.log(dt);
477 |
478 | compileJadwal(dt.data);
479 |
480 |
481 | }).fail(function(msg){
482 | alert(msg.status+"\n"+msg.statusText);
483 | // $('#container').html("Error...");
484 | });
485 |
486 | },
487 | /*
488 | showDateTime: function(){
489 | $('#datenow').html(moment().format('dddd, DD MMMM YYYY HH:mm:ss'));
490 | // if(app.tgl != moment().format('YYYYMMDD'))location.reload();//ganti hari
491 | // else if(app.tblName != 'attd'+ moment().format('YYYYMM')) location.reload();//ganti bulan
492 | setTimeout(app.showDateTime,1000);
493 | },
494 | */
495 | renderTable: function(id,col,row){
496 | app.tabelId.destroy();
497 | $('#'+id+' .table tbody').empty();
498 | app.tabelId = $('#'+id+' .table').DataTable( {
499 | data: row,
500 | columns: col,
501 | "lengthMenu": [[5, 10, 20, 25, 50, 100, 500, -1], [5, 10, 20, 25, 50, 100, 500, "All"]],
502 | "pageLength": 20,
503 | dom: 'Bfrtip',
504 | buttons: [
505 | 'pageLength',
506 | 'copyHtml5'
507 | ],
508 | "initComplete": function(){
509 | // $('table').fadeIn(500);
510 | }
511 | } );
512 | },
513 | getRndInteger:function(min, max) {
514 | return Math.floor(Math.random() * (max - min) ) + min;
515 | },
516 |
517 | };
518 | app.initialize();
--------------------------------------------------------------------------------
/dist/js/swipe.js:
--------------------------------------------------------------------------------
1 | (function( $ ){
2 |
3 | function calculateResults(startX, startY, endX, endY, tresholdX, tresholdY){
4 | var swipeDirection = {up:false, right:false, down: false, left:false};
5 | // console.log(startX + ':' + endX + ' = ' + (startX - endX) + '>' + tresholdX);
6 | if(startX > endX && startX - endX >= tresholdX)
7 | swipeDirection.left = true;
8 | else if(startX < endX && endX - startX >= tresholdX && startX <=30)
9 | swipeDirection.right = true;
10 |
11 | if(startY < endY && endY - startY >= tresholdY)
12 | swipeDirection.down = true
13 | else if(startY > endY && startY - endY >=tresholdY)
14 | swipeDirection.up = true;
15 |
16 | return swipeDirection;
17 |
18 | }
19 | $.fn.onSwipe = function(f, timeTreshold, tresholdX, tresholdY){
20 | if(jQuery.isFunction(f)){ //We are only going to do our thing if the user passed a function
21 |
22 | if(typeof timeTreshold === 'undefined' || timeTreshold === null)
23 | timeTreshold = 50;//ms
24 |
25 | if(typeof tresholdX === 'undefined' || tresholdX === null)
26 | tresholdX = 30;//px
27 |
28 | if(typeof tresholdY === 'undefined' || tresholdY === null)
29 | tresholdY = 30;//px
30 |
31 | var startX, startY; //Position when touch begins
32 | var endX, endY; //Position when touch ends
33 |
34 | var time; //Our timer variable
35 | var totalTime = 0; //Total time that the swipe took
36 |
37 | //When a touch starts on this element.
38 | //We can start a timer, and start getting coordinates.
39 | $(this).on("touchstart", function(e){
40 |
41 | //Let's get our touch coordinates
42 | startX = e.touches[0].clientX; //This is where touchstart coordinates are stored
43 | startY = e.touches[0].clientY;
44 |
45 | time = setInterval(function(){ //Let's see how long the swipe lasts.
46 | totalTime += 10;
47 | }, 10);
48 | });
49 |
50 | $(this).on("touchend", function(e){
51 |
52 | endX = e.changedTouches[0].clientX; //This is where touchend coordinates are stored.
53 | endY = e.changedTouches[0].clientY;
54 |
55 | clearInterval(time); //Let's stop calculating time and free up resources.
56 |
57 | if(totalTime >= timeTreshold) //If swipe time is less than our treshold we won't do anything. Useful for preventing spam and accidental swipes.
58 | f(calculateResults(startX, startY, endX, endY, tresholdX, tresholdY)); //Send results to user's function
59 |
60 |
61 |
62 | totalTime = 0;
63 | });
64 | } else console.error("You need to pass a function in order to process swipe data.");
65 |
66 | return $(this);
67 | }
68 | })( jQuery );
--------------------------------------------------------------------------------
/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/icon.png
--------------------------------------------------------------------------------
/index.php:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | Display|Masjid|Admin
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
117 |
118 |
119 |
120 |
121 |
122 | DM
123 | Display Masjid
124 |
125 |
126 |
129 |
136 |
137 |
138 |
139 |
159 |
160 |
161 |
162 |
163 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
--------------------------------------------------------------------------------
/login.php:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
Display|Masjid|Admin
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
38 |
39 |
Halaman login - =$name?>
40 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/readme-image/compare.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/compare.xlsx
--------------------------------------------------------------------------------
/readme-image/img1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img1.jpg
--------------------------------------------------------------------------------
/readme-image/img2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img2.jpg
--------------------------------------------------------------------------------
/readme-image/img3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img3.jpg
--------------------------------------------------------------------------------
/readme-image/img4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img4.jpg
--------------------------------------------------------------------------------
/readme-image/img5.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img5.JPG
--------------------------------------------------------------------------------
/readme-image/img6.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img6.JPG
--------------------------------------------------------------------------------
/readme-image/img7.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img7.JPG
--------------------------------------------------------------------------------
/readme-image/img8.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fahroniganteng/Display-Masjid/d66505ac6ae41d12dbb1d0b748daea4d38321346/readme-image/img8.JPG
--------------------------------------------------------------------------------
/session.php:
--------------------------------------------------------------------------------
1 | ' . print_r($_SESSION, TRUE) . '';
15 | session_name($sessName);
16 | session_start();
17 | }
18 |
19 |
20 |
21 | /* *****************************************************************************************************************
22 | * *** FEEDBACK
23 | * *****************************************************************************************************************/
24 | class fb{ //feedback
25 | protected
26 | $success = true,//jika proses sukses
27 | $registered = true,//jika teregister/ udah login
28 | $data = NULL;//callback data--> jika ada --> jika banyak dibuat array (convert to json)
29 |
30 | //Write feedback dalam JSON________________________________________________________________________
31 | public function writeFeedBack(){
32 | $feedBack=array(
33 | "success" => $this->success,
34 | "registered"=> $this->registered,
35 | "data" => $this->data
36 | );
37 | echo json_encode($feedBack);
38 | }
39 | public function retSuccess(){
40 | $this->writeFeedBack();
41 | }
42 | public function retError($err){
43 | $this->success = false;
44 | $this->data = $err;
45 | $this->writeFeedBack();
46 | exit;
47 | }
48 | public function verification($id){
49 | //Cek sudah login/ belom_____________________________________________________________________
50 | if(!isset($_SESSION["user_id"])){
51 | $this->registered=false;
52 | $this->writeFeedBack();
53 | }
54 | //Jika request proses ditemukan______________________________________________________________
55 | else if(method_exists($this,$id)){
56 | $this->id = $id;
57 | $this->dt = isset($_POST['dt'])?$_POST['dt']:"";// data
58 | return true; //gak perlu callback
59 | }
60 | //Jika request tidak ditemukan________________________________________________________________
61 | else{
62 | $this->success = false;
63 | $this->data = "Request tidak ditemukan...";
64 | $this->writeFeedBack();
65 | }
66 | }
67 |
68 |
69 | }
70 |
71 |
72 | ?>
--------------------------------------------------------------------------------