├── 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 | [![Demo & Manual](http://img.youtube.com/vi/odmJeMKmeQw/0.jpg)](https://youtu.be/odmJeMKmeQw) 54 | 55 | #### 02. Demo Admin (video lama) 56 | [![Demo Admin](http://img.youtube.com/vi/94Yjqq0RiNY/0.jpg)](https://youtu.be/94Yjqq0RiNY) 57 | 58 | #### 03. Instalasi 59 | [![Instalasi](http://img.youtube.com/vi/HfmVgQ77y5w/0.jpg)](https://youtu.be/HfmVgQ77y5w) 60 | 61 | 62 | ### Overview 63 | 64 | ![Image Display 1](readme-image/img1.jpg) 65 | 66 | 67 | ![Image Display 2](readme-image/img2.jpg) 68 | 69 | 70 | ![Image Display 3](readme-image/img3.jpg) 71 | 72 | 73 | ![Image Display 4](readme-image/img4.jpg) 74 | 75 | ### Admin menu 76 | ![Image Admin 1](readme-image/img5.JPG) 77 | ![Image Admin 2](readme-image/img6.JPG) 78 | ![Image Admin 3](readme-image/img7.JPG) 79 | ![Image Admin 4](readme-image/img8.JPG) 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 | &quot;License&quot; shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | &quot;Licensor&quot; shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. 14 | 15 | &quot;Legal Entity&quot; 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, &quot;control&quot; 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 | &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity exercising permissions granted by this License. 18 | 19 | &quot;Source&quot; form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. 20 | 21 | &quot;Object&quot; 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 | &quot;Work&quot; 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 | &quot;Derivative Works&quot; 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 | &quot;Contribution&quot; 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, &quot;submitted&quot; 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 &quot;Not a Contribution.&quot; 28 | 29 | &quot;Contributor&quot; 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 &quot;NOTICE&quot; 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 &quot;AS IS&quot; 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 |
64 |
 
65 |
66 | 67 | 68 | 69 | 77 | 78 | 79 | 80 | 81 | 82 | 88 | 89 | 90 |
91 |
92 |
93 |
94 |
95 | 96 | 104 |
105 |
106 | 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 += '
'+v+'
'+times[k] +'
'; 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(''+thead+tbody+'
'); 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 | 125 | 137 |
138 | 139 | 159 | 160 | 161 |
162 |
163 |
164 |
165 | Version 1.0.0 (Feb 2020) 166 |
167 | Display|Masjid Aplication 168 |
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 | 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 | ?> --------------------------------------------------------------------------------