├── .gitignore ├── LICENSE ├── README.md ├── Rakefile ├── database ├── migrations │ ├── 001_init_db.rb │ ├── 002_add_application_enabled.rb │ ├── 003_create_notifications.rb │ ├── 004_create_sessions.rb │ ├── 005_create_application_instances.rb │ ├── 006_add_application_instance_splash_screen.rb │ ├── 007_add_application_icon_string.rb │ ├── 008_add_application_color_string.rb │ ├── 009_add_application_type_string.rb │ └── 010_add_application_instance_order_int.rb ├── models.rb └── models │ ├── application.rb │ ├── application_instance.rb │ ├── notification.rb │ └── session.rb ├── etc └── config.yml ├── init ├── etherpad-lite.service ├── mazi-portal ├── mazi-rest └── rc.local ├── lib ├── helpers │ ├── authorizer.rb │ ├── mazi_camera.rb │ ├── mazi_config.rb │ ├── mazi_exec_cmd.rb │ ├── mazi_locales.rb │ ├── mazi_logger.rb │ ├── mazi_monitor.rb │ ├── mazi_network.rb │ ├── mazi_sensors.rb │ └── mazi_version.rb └── routes │ ├── mazi_application.rb │ ├── mazi_config.rb │ ├── mazi_devices.rb │ ├── mazi_exec.rb │ ├── mazi_locales.rb │ ├── mazi_main.rb │ ├── mazi_maps.rb │ ├── mazi_monitor.rb │ ├── mazi_notification.rb │ ├── mazi_rest.rb │ └── mazi_sessions.rb ├── locales ├── ar.yml ├── ast.yml ├── ca.yml ├── de.yml ├── diq.yml ├── el.yml ├── en.yml ├── eo.yml ├── es.yml ├── eu.yml ├── fi.yml ├── fr.yml ├── he.yml ├── it.yml ├── ko.yml ├── lb.yml ├── my.yml ├── pl.yml ├── pt-br.yml ├── qqq.yml ├── sv.yml ├── tr.yml ├── zh-hans.yml └── zh-hant.yml ├── mazi_portal_server.rb ├── mazi_rest_service.rb ├── public ├── css │ ├── admin_main.css │ ├── bootstrap.css │ ├── bootstrap.min.css │ ├── font-awesome │ │ ├── css │ │ │ ├── fa-brands.css │ │ │ ├── fa-brands.min.css │ │ │ ├── fa-regular.css │ │ │ ├── fa-regular.min.css │ │ │ ├── fa-solid.css │ │ │ ├── fa-solid.min.css │ │ │ ├── fontawesome-all.css │ │ │ ├── fontawesome-all.min.css │ │ │ ├── fontawesome.css │ │ │ └── fontawesome.min.css │ │ ├── less │ │ │ ├── _animated.less │ │ │ ├── _bordered-pulled.less │ │ │ ├── _core.less │ │ │ ├── _fixed-width.less │ │ │ ├── _icons.less │ │ │ ├── _larger.less │ │ │ ├── _list.less │ │ │ ├── _mixins.less │ │ │ ├── _rotated-flipped.less │ │ │ ├── _screen-reader.less │ │ │ ├── _stacked.less │ │ │ ├── _variables.less │ │ │ ├── fa-brands.less │ │ │ ├── fa-regular.less │ │ │ ├── fa-solid.less │ │ │ └── fontawesome.less │ │ ├── scss │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ ├── fa-brands.scss │ │ │ ├── fa-regular.scss │ │ │ ├── fa-solid.scss │ │ │ └── fontawesome.scss │ │ └── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.svg │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.svg │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-regular-400.woff2 │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.svg │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ └── fa-solid-900.woff2 │ ├── images │ │ ├── ui-bg_diagonals-thick_18_b81900_40x40.png │ │ ├── ui-bg_diagonals-thick_20_666666_40x40.png │ │ ├── ui-bg_flat_10_000000_40x100.png │ │ ├── ui-bg_glass_100_f6f6f6_1x400.png │ │ ├── ui-bg_glass_100_fdf5ce_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_gloss-wave_35_f6a828_500x100.png │ │ ├── ui-bg_highlight-soft_100_eeeeee_1x100.png │ │ ├── ui-bg_highlight-soft_75_ffe45c_1x100.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_228ef1_256x240.png │ │ ├── ui-icons_ef8c08_256x240.png │ │ ├── ui-icons_ffd27a_256x240.png │ │ └── ui-icons_ffffff_256x240.png │ ├── index_main.css │ ├── jquery-ui.min.css │ ├── jquery.datetimepicker.css │ ├── jquery.tagit.css │ ├── languages.min.css │ ├── languages.png │ ├── plugins │ │ └── morris.css │ └── setup.css ├── favicon.ico ├── font-awesome │ ├── HELP-US-OUT.txt │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── less │ │ ├── animated.less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── screen-reader.less │ │ ├── stacked.less │ │ └── variables.less │ └── scss │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── images │ ├── arrow.svg │ ├── compass.svg │ ├── etherpad_doc.png │ ├── etherpad_doc_2.png │ ├── framadate_doc.png │ ├── guestbook_doc.png │ ├── mazi-background.jpg │ ├── maziLogo.png │ ├── nextcloud-doc3.png │ ├── nextcloud_doc.png │ ├── nextcloud_doc2.png │ ├── video_img.png │ └── wordpress_doc.png └── js │ ├── admin_application.js │ ├── admin_configuration.js │ ├── admin_dashboard.js │ ├── admin_devices.js │ ├── admin_guestbook.js │ ├── admin_logs.js │ ├── admin_main.js │ ├── admin_monitor.js │ ├── admin_network.js │ ├── admin_notification.js │ ├── admin_set_date.js │ ├── admin_settings.js │ ├── admin_snapshot.js │ ├── admin_update.js │ ├── bootstrap.min.js │ ├── index_application.js │ ├── index_camera.js │ ├── index_devices_map.js │ ├── index_main.js │ ├── index_monitoring.js │ ├── index_sensors.js │ ├── index_statistics.js │ ├── jquery-ui.min.js │ ├── jquery.datetimepicker.min.js │ ├── jquery.js │ ├── jscolor.min.js │ ├── moment.js │ ├── plugins │ ├── flot │ │ ├── excanvas.min.js │ │ ├── flot-data.js │ │ ├── jquery.flot.js │ │ ├── jquery.flot.pie.js │ │ ├── jquery.flot.resize.js │ │ └── jquery.flot.tooltip.min.js │ ├── jvectormap │ │ ├── jquery-jvectormap-2.0.3.css │ │ ├── jquery-jvectormap-2.0.3.min.js │ │ └── jquery-jvectormap-world-mill.js │ ├── morris │ │ ├── morris-data.js │ │ ├── morris.js │ │ ├── morris.min.js │ │ └── raphael.min.js │ ├── qrcode │ │ ├── jquery.qrcode.js │ │ └── qrcode.js │ └── unitegallery │ │ ├── css │ │ └── unite-gallery.css │ │ ├── images │ │ ├── button-close.png │ │ ├── cover-grid.png │ │ ├── icon-link32.png │ │ ├── icon-play32.png │ │ ├── icon-zoom32.png │ │ ├── lightbox-arrow-left.png │ │ ├── lightbox-arrow-right.png │ │ ├── lightbox-icon-close-compact.png │ │ ├── lightbox-icon-close-compact2.png │ │ ├── lightbox-icon-close.png │ │ ├── loader-black1.gif │ │ ├── loader-black2.gif │ │ ├── loader-black3.gif │ │ ├── loader-black4.gif │ │ ├── loader-black5.gif │ │ ├── loader-black6.gif │ │ ├── loader-black7.gif │ │ ├── loader-white1.gif │ │ ├── loader-white2.gif │ │ ├── loader-white3.gif │ │ ├── loader-white4.gif │ │ ├── loader-white5.gif │ │ ├── loader-white6.gif │ │ ├── loader-white7.gif │ │ ├── loader.gif │ │ ├── loader_bright.gif │ │ ├── loader_skype_trans.gif │ │ ├── not_loaded.png │ │ ├── play-button-round.png │ │ ├── play-button-square.png │ │ └── transparent.png │ │ ├── js │ │ ├── jquery-11.0.min.js │ │ ├── unitegallery.js │ │ └── unitegallery.min.js │ │ ├── release_log.txt │ │ ├── skins │ │ ├── alexis │ │ │ ├── alexis.css │ │ │ └── images │ │ │ │ ├── arrows_strip_left.png │ │ │ │ ├── arrows_strip_right.png │ │ │ │ ├── button_fullscreen.png │ │ │ │ ├── button_playpause.png │ │ │ │ ├── button_zoom_back.png │ │ │ │ ├── button_zoom_minus.png │ │ │ │ ├── button_zoom_plus.png │ │ │ │ ├── grid_arrow_down.png │ │ │ │ ├── grid_arrow_left.png │ │ │ │ ├── grid_arrow_left_hortype.png │ │ │ │ ├── grid_arrow_right.png │ │ │ │ ├── grid_arrow_right_hortype.png │ │ │ │ ├── grid_arrow_up.png │ │ │ │ ├── grid_handle_down.png │ │ │ │ ├── grid_handle_left.png │ │ │ │ ├── grid_handle_right.png │ │ │ │ ├── grid_handle_up.png │ │ │ │ ├── slider_arrow_left.png │ │ │ │ ├── slider_arrow_right.png │ │ │ │ └── slider_bullets.png │ │ └── default │ │ │ ├── arrow_grid_down.png │ │ │ ├── arrow_grid_up.png │ │ │ ├── arrows_strip_down.png │ │ │ ├── arrows_strip_left.png │ │ │ ├── arrows_strip_right.png │ │ │ ├── arrows_strip_up.png │ │ │ ├── button_fullscreen.png │ │ │ ├── button_playpause.png │ │ │ ├── grid_arrow_left.png │ │ │ ├── grid_arrow_right.png │ │ │ ├── grid_handle_black_bottom.png │ │ │ ├── grid_handle_black_left.png │ │ │ ├── grid_handle_black_right.png │ │ │ ├── grid_handle_black_top.png │ │ │ ├── icon_zoom_back.png │ │ │ ├── icon_zoom_minus.png │ │ │ ├── icon_zoom_plus.png │ │ │ ├── slider_arrow_left.png │ │ │ ├── slider_arrow_right.png │ │ │ ├── slider_bullets.png │ │ │ ├── tile_bullets_blue.png │ │ │ ├── tile_bullets_brown.png │ │ │ ├── tile_bullets_gray.png │ │ │ ├── tile_bullets_green.png │ │ │ ├── tile_bullets_red.png │ │ │ ├── tile_button_left.png │ │ │ ├── tile_button_play_pause.png │ │ │ └── tile_button_right.png │ │ └── themes │ │ ├── carousel │ │ └── ug-theme-carousel.js │ │ ├── compact │ │ └── ug-theme-compact.js │ │ ├── default │ │ ├── images │ │ │ ├── arrow_down_up.png │ │ │ ├── arrows_strip_left.png │ │ │ ├── arrows_strip_right.png │ │ │ ├── button_fullscreen.png │ │ │ ├── button_fullscreen_single.png │ │ │ ├── button_playpause.png │ │ │ └── button_playpause_single.png │ │ ├── ug-theme-default.css │ │ └── ug-theme-default.js │ │ ├── grid │ │ └── ug-theme-grid.js │ │ ├── slider │ │ └── ug-theme-slider.js │ │ ├── tiles │ │ └── ug-theme-tiles.js │ │ ├── tilesgrid │ │ └── ug-theme-tilesgrid.js │ │ └── video │ │ ├── images │ │ ├── arrow_left.png │ │ └── arrow_right.png │ │ ├── skin-bottom-text.css │ │ ├── skin-right-no-thumb.css │ │ ├── skin-right-thumb.css │ │ ├── skin-right-title-only.css │ │ └── ug-theme-video.js │ ├── setup.js │ └── tag-it.js └── views ├── admin_application.erb ├── admin_change_mysql_password.erb ├── admin_change_password.erb ├── admin_change_username.erb ├── admin_configuration.erb ├── admin_dashboard.erb ├── admin_devices.erb ├── admin_documentation.erb ├── admin_guestbook.erb ├── admin_login.erb ├── admin_logs.erb ├── admin_main.erb ├── admin_main_menu.erb ├── admin_monitor.erb ├── admin_network.erb ├── admin_notification.erb ├── admin_set_date.erb ├── admin_settings.erb ├── admin_snapshot.erb ├── admin_update.erb ├── index_application.erb ├── index_camera.erb ├── index_documentation.erb ├── index_main.erb ├── index_main_menu.erb ├── index_monitoring.erb ├── index_monitoring_map.erb ├── index_sensors.erb ├── index_statistics.erb ├── monitoring_map.erb ├── setup.erb └── splash.erb /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | /.config 4 | /coverage/ 5 | /InstalledFiles 6 | /pkg/ 7 | /spec/reports/ 8 | /spec/examples.txt 9 | /test/tmp/ 10 | /test/version_tmp/ 11 | /tmp/ 12 | 13 | # Used by dotenv library to load environment variables. 14 | # .env 15 | 16 | ## Specific to RubyMotion: 17 | .dat* 18 | .repl_history 19 | build/ 20 | *.bridgesupport 21 | build-iPhoneOS/ 22 | build-iPhoneSimulator/ 23 | 24 | ## Specific to RubyMotion (use of CocoaPods): 25 | # 26 | # We recommend against adding the Pods directory to your .gitignore. However 27 | # you should judge for yourself, the pros and cons are mentioned at: 28 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 29 | # 30 | # vendor/Pods/ 31 | 32 | ## Documentation cache and generated files: 33 | /.yardoc/ 34 | /_yardoc/ 35 | /doc/ 36 | /rdoc/ 37 | 38 | ## Environment normalization: 39 | /.bundle/ 40 | /vendor/bundle 41 | /lib/bundler/man/ 42 | 43 | # for a library or gem, you might want to ignore these files since the code is 44 | # intended to run in multiple environments; otherwise, check them in: 45 | # Gemfile.lock 46 | # .ruby-version 47 | # .ruby-gemset 48 | 49 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 50 | .rvmrc 51 | /database/inventory.db 52 | users.log 53 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 MAZI project 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 | MAZI Portal 2 | ================= 3 | 4 | This repository contains the Portal of the MAZI toolkit. It is comprised of the user interface which enables users to interact with the available applications and the admin interface which enables the administrator of the Mazizone to customize the appearance of the Portal, configure important networking parameters (network name, SSID etc.), observe statistics of the Mazizone and much more. 5 | 6 | You can find a detailed documentation for the usage of the Portal in the wiki of this repository https://github.com/mazi-project/portal/wiki. 7 | 8 | Or in the MAZI guides repository https://github.com/mazi-project/guides/wiki. 9 | 10 | Prerequirements 11 | --------------- 12 | 13 | Install the following packages: 14 | 15 | $ apt-get update 16 | $ apt-get install build-essential git-core libsqlite3-dev ruby ruby-dev libmysqlclient-dev 17 | 18 | Also install the following gems: 19 | 20 | $ gem install sinatra sequel sqlite3 rake thin rubyzip mysql --no-ri --no-rdoc 21 | 22 | And download the back-end scripts 23 | 24 | $ sudo su 25 | $ cd /root 26 | $ git clone git@github.com:mazi-project/back-end.git 27 | 28 | Installation 29 | ------------ 30 | 31 | $ sudo su 32 | $ cd /root 33 | $ git clone git@github.com:mazi-project/portal.git 34 | $ cd portal 35 | $ rake init 36 | $ rake db:migrate 37 | 38 | 39 | Execution 40 | --------- 41 | 42 | $ ruby -I lib -I database mazi_portal_server.rb 43 | 44 | Update 45 | ------- 46 | 47 | Since version 1.6.4 there is an update function to the admin menu. 48 | In order to update using the command line, you need to execute the following commands: 49 | 50 | $ sudo su 51 | $ cd /root/portal 52 | $ git pull origin master 53 | $ rake db:migrate 54 | $ cp /etc/mazi/config.yml /etc/mazi/config.yml.bu 55 | $ cp etc/config.yml /etc/mazi/config.yml 56 | $ cd /root/back-end 57 | $ git pull origin master 58 | $ service mazi-portal restart 59 | 60 | ## License 61 | 62 | See the [LICENSE] (https://github.com/mazi-project/portal/blob/master/LICENSE) file for license rights and limitations (MIT). 63 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | require 'fileutils' 3 | 4 | db = "sqlite://database/inventory.db" 5 | 6 | desc "Run migrations ('rake db:migrate' to run all migrations, 'rake db:migrate[10]'' to run the 10th migration, 'rake db:migrate[0] to reset the db)" 7 | task :init do 8 | puts "Initializing" 9 | unless File.directory?("/etc/mazi") 10 | puts "Folder '/etc/mazi' does not exist. Generating." 11 | FileUtils.mkdir_p("/etc/mazi") 12 | end 13 | 14 | unless File.directory?("/etc/mazi/snapshots") 15 | puts "Folder '/etc/mazi/snapshots' does not exist. Generating." 16 | FileUtils.mkdir_p("/etc/mazi/snapshots") 17 | end 18 | 19 | unless File.exist?("/etc/mazi/config.yml") 20 | puts "File '/etc/mazi/config.yml' does not exist. Generating." 21 | FileUtils.cp 'etc/config.yml', '/etc/mazi/config.yml' 22 | end 23 | 24 | unless File.exist?("/etc/mazi/snapshots/default.yml") 25 | puts "File '/etc/mazi/snapshots/default.yml' does not exist. Generating." 26 | FileUtils.cp 'etc/config.yml', '/etc/mazi/snapshots/default.yml' 27 | end 28 | 29 | unless File.exist?("/etc/mazi/snapshots/default.net") 30 | puts "File '/etc/mazi/snapshots/default.net' does not exist. Generating." 31 | FileUtils.touch '/etc/mazi/snapshots/default.net' 32 | end 33 | 34 | puts "done!" 35 | end 36 | 37 | 38 | namespace :db do 39 | desc "Run migrations ('rake db:migrate' to run all migrations, 'rake db:migrate[10]'' to run the 10th migration, 'rake db:migrate[0] to reset the db)" 40 | task :migrate, [:version] do |t, args| 41 | desc "Migrate the db" 42 | require "sequel" 43 | Sequel.extension :migration 44 | db = Sequel.connect(db) 45 | if args[:version] 46 | puts "Migrating to version #{args[:version]}" 47 | Sequel::Migrator.run(db, "database/migrations", target: args[:version].to_i) 48 | puts "done!" 49 | else 50 | puts "Migrating to latest" 51 | Sequel::Migrator.run(db, "database/migrations") 52 | puts "done!" 53 | end 54 | end 55 | task :reset do |t| 56 | desc "Migrate the db" 57 | require "sequel" 58 | Sequel.extension :migration 59 | db = Sequel.connect(db) 60 | puts "Reseting the database" 61 | Sequel::Migrator.run(db, "database/migrations", target: 0) 62 | puts "done!" 63 | end 64 | end 65 | -------------------------------------------------------------------------------- /database/migrations/001_init_db.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | create_table :applications do 4 | primary_key :id 5 | String :name 6 | String :description 7 | String :url 8 | Integer :click_counter 9 | end 10 | end 11 | 12 | down do 13 | drop_table(:applications) 14 | end 15 | end -------------------------------------------------------------------------------- /database/migrations/002_add_application_enabled.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | add_column :applications, :enabled, TrueClass 4 | end 5 | 6 | down do 7 | drop_column :applications, :enabled 8 | end 9 | end -------------------------------------------------------------------------------- /database/migrations/003_create_notifications.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | create_table :notifications do 4 | primary_key :id 5 | String :title 6 | String :body 7 | TrueClass :enabled 8 | end 9 | end 10 | 11 | down do 12 | drop_table(:notifications) 13 | end 14 | end -------------------------------------------------------------------------------- /database/migrations/004_create_sessions.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | create_table :sessions do 4 | primary_key :id 5 | Datetime :created_at 6 | String :ip 7 | String :uuid 8 | end 9 | end 10 | 11 | down do 12 | drop_table(:sessions) 13 | end 14 | end -------------------------------------------------------------------------------- /database/migrations/005_create_application_instances.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | create_table :application_instances do 4 | primary_key :id 5 | foreign_key :application_id, :applications 6 | String :name 7 | String :description 8 | String :url 9 | Integer :click_counter 10 | TrueClass :enabled 11 | end 12 | end 13 | 14 | down do 15 | drop_table(:application_instances) 16 | end 17 | end -------------------------------------------------------------------------------- /database/migrations/006_add_application_instance_splash_screen.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | add_column :application_instances, :splash_screen, TrueClass 4 | end 5 | 6 | down do 7 | drop_column :applications, :splash_screen 8 | end 9 | end -------------------------------------------------------------------------------- /database/migrations/007_add_application_icon_string.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | add_column :applications, :icon, String 4 | add_column :application_instances, :icon, String 5 | end 6 | 7 | down do 8 | drop_column :applications, :icon 9 | drop_column :application_instances, :icon 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /database/migrations/008_add_application_color_string.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | add_column :applications, :color, String 4 | add_column :application_instances, :color, String 5 | end 6 | 7 | down do 8 | drop_column :applications, :color 9 | drop_column :application_instances, :color 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /database/migrations/009_add_application_type_string.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | add_column :applications, :type, String 4 | end 5 | 6 | down do 7 | drop_column :applications, :type 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /database/migrations/010_add_application_instance_order_int.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | up do 3 | add_column :application_instances, :order, Integer 4 | end 5 | 6 | down do 7 | drop_column :application_instances, :order 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /database/models.rb: -------------------------------------------------------------------------------- 1 | module Mazi 2 | module Model; end 3 | end 4 | 5 | Sequel.default_timezone = :utc 6 | Dir['./database/models/*.rb'].each{|f| require f} 7 | -------------------------------------------------------------------------------- /database/models/application.rb: -------------------------------------------------------------------------------- 1 | require "helpers/mazi_exec_cmd" 2 | 3 | module Mazi::Model 4 | class Application < Sequel::Model 5 | one_to_many :application_instances 6 | # validate if there is something missing in the 7 | # returns nil if it is OK, else it returns the key that is missing 8 | def self.validate(description={}) 9 | mandatory_keys = ['name', 'description', 'url', 'color', 'icon'] 10 | mandatory_keys.each do |key| 11 | return key if description[key].nil? || description[key].empty? 12 | end 13 | valid_keys = ['name', 'description', 'url', 'color', 'icon'] 14 | description.each do |key| 15 | description.delete_if {|k, v| !valid_keys.include?(k) } 16 | end 17 | description['click_counter'] = 0 18 | description['enabled'] ||= true 19 | description['type'] ||= 'custom' 20 | nil 21 | end 22 | 23 | # validate if there is something missing in the 24 | # returns nil if it is OK, else it returns the key that is missing 25 | def self.validate_edit(description={}) 26 | mandatory_keys = ['id', 'name', 'description', 'url', 'color', 'icon'] 27 | mandatory_keys.each do |key| 28 | return key if description[key].nil? || description[key].empty? 29 | end 30 | valid_keys = ['id', 'name', 'description', 'url', 'enabled', 'color', 'icon'] 31 | description.each do |key| 32 | description.delete_if {|k, v| !valid_keys.include?(k) } 33 | end 34 | description['click_counter'] = 0 35 | description['enabled'] ||= true 36 | nil 37 | end 38 | 39 | def enable 40 | self.enabled = true 41 | self.save 42 | end 43 | 44 | def disable 45 | self.enabled = false 46 | self.save 47 | end 48 | 49 | def status 50 | if self.type == 'web' 51 | return 'ON' 52 | elsif self.type == 'custom' 53 | return 'N/A' 54 | end 55 | 56 | case self.name.downcase 57 | when 'nextcloud' 58 | return 'ON' 59 | when 'wordpress' 60 | return 'ON' 61 | when 'framadate' 62 | return 'ON' 63 | when 'guestbook' 64 | nm = 'mazi-board' 65 | when 'interview-archive' 66 | nm = 'mazi-princess' 67 | else 68 | nm = self.name.downcase 69 | end 70 | 71 | ex = MaziExecCmd.new('sh', '/root/back-end/', 'mazi-app.sh', ['-a', 'status', nm], ['mazi-app.sh'], 'normal') 72 | lines = ex.exec_command 73 | case lines.first 74 | when 'active' 75 | return 'ON' 76 | when 'inactive' 77 | return 'OFF' 78 | end 79 | return 'FAIL' 80 | end 81 | 82 | def start 83 | case self.name.downcase 84 | when 'nextcloud' 85 | return 'ON' 86 | when 'guestbook' 87 | nm = 'mazi-board' 88 | when 'interview-archive' 89 | nm = 'mazi-princess' 90 | else 91 | nm = self.name.downcase 92 | end 93 | 94 | ex = MaziExecCmd.new('sh', '/root/back-end/', 'mazi-app.sh', ['-a', 'start', nm], ['mazi-app.sh'], 'normal') 95 | ex.exec_command 96 | 97 | "OK" 98 | end 99 | 100 | def stop 101 | case self.name.downcase 102 | when 'nextcloud' 103 | return 'ON' 104 | when 'guestbook' 105 | nm = 'mazi-board' 106 | when 'interview-archive' 107 | nm = 'mazi-princess' 108 | else 109 | nm = self.name.downcase 110 | end 111 | 112 | ex = MaziExecCmd.new('sh', '/root/back-end/', 'mazi-app.sh', ['-a', 'stop', nm], ['mazi-app.sh'], 'normal') 113 | ex.exec_command 114 | 115 | "OK" 116 | end 117 | end 118 | end 119 | -------------------------------------------------------------------------------- /database/models/application_instance.rb: -------------------------------------------------------------------------------- 1 | module Mazi::Model 2 | class ApplicationInstance < Sequel::Model 3 | many_to_one :application 4 | # validate if there is something missing in the 5 | # returns nil if it is OK, else it returns the key that is missing 6 | def self.validate(description={}) 7 | description['application_id'] = description.delete('application') if description['application'] 8 | mandatory_keys = ['name', 'url', 'application_id', 'color'] 9 | mandatory_keys.each do |key| 10 | return key if description[key].nil? || description[key].empty? 11 | end 12 | valid_keys = ['name', 'description', 'url', 'application_id', 'color', 'icon'] 13 | description.each do |key| 14 | description.delete_if {|k, v| !valid_keys.include?(k) } 15 | end 16 | description['click_counter'] = 0 17 | description['enabled'] ||= true 18 | description['order'] = ApplicationInstance.dataset.order(:order).all.last.order + 1 19 | nil 20 | end 21 | 22 | # validate if there is something missing in the 23 | # returns nil if it is OK, else it returns the key that is missing 24 | def self.validate_edit(description={}) 25 | mandatory_keys = ['id', 'name', 'description', 'url', 'color'] 26 | mandatory_keys.each do |key| 27 | return key if description[key].nil? || description[key].empty? 28 | end 29 | valid_keys = ['id', 'name', 'description', 'url', 'enabled', 'color', 'icon'] 30 | description.each do |key| 31 | description.delete_if {|k, v| !valid_keys.include?(k) } 32 | end 33 | description['enabled'] ||= true 34 | nil 35 | end 36 | 37 | def before_destroy 38 | flag = false 39 | ApplicationInstance.dataset.order(:order).all.each do |app| 40 | flag = true if self.id == app.id 41 | if flag 42 | app.order -= 1 43 | app.save 44 | end 45 | end 46 | super 47 | end 48 | 49 | def enable 50 | self.enabled = true 51 | self.save 52 | end 53 | 54 | def disable 55 | self.enabled = false 56 | self.save 57 | end 58 | 59 | def up 60 | app = ApplicationInstance.find(order: self.order - 1) 61 | app.order += 1 62 | app.save 63 | self.order -= 1 64 | self.save 65 | end 66 | 67 | def down 68 | app = ApplicationInstance.find(order: self.order + 1) 69 | app.order -= 1 70 | app.save 71 | self.order += 1 72 | self.save 73 | end 74 | end 75 | end 76 | -------------------------------------------------------------------------------- /database/models/notification.rb: -------------------------------------------------------------------------------- 1 | module Mazi::Model 2 | class Notification < Sequel::Model 3 | def enable 4 | self.enabled = true 5 | self.save 6 | end 7 | 8 | def disable 9 | self.enabled = false 10 | self.save 11 | end 12 | end 13 | end -------------------------------------------------------------------------------- /database/models/session.rb: -------------------------------------------------------------------------------- 1 | require 'securerandom' 2 | 3 | module Mazi::Model 4 | class Session < Sequel::Model 5 | def after_create 6 | self.created_at = Time.now 7 | self.uuid = SecureRandom.uuid 8 | self.save 9 | end 10 | end 11 | end -------------------------------------------------------------------------------- /etc/config.yml: -------------------------------------------------------------------------------- 1 | # This is the main configuration file for the MAZI Zone portal. 2 | # If you manually change some values on this file a server restart is 3 | # mandatory for the changes to take effect. 4 | # On the general section: 5 | # - mode: (normal/demo) mode determines if there is an actual MAZI Zone 6 | # or this runs just for demo purposes 7 | # On the admin section: 8 | # - admin_username: admin username for the admin panel 9 | # - admin_password: admin password for the admin panel. 10 | # On the scripts section: 11 | # - backend_scripts_folder: the folder that contains the scripts that the portal 12 | # will need to execute for various actions 13 | # - enabled_scripts: the scripts that are allowed to be executed by the 14 | # backend (for security reasons) 15 | # On the portal configuration section: 16 | # - title: the title on both the top left corner and on browser title 17 | # - applications_title: title on the applications body page 18 | # - applications_subtitle: subtitle on the applications body page 19 | # - applications_welcome_text: welcome text on the applications body page 20 | # - applications_background_image: background image on the applications body page. 21 | # - side_panel_color: side panel main color (hex value) 22 | # - side_panel_active_color: side panel active and on hover color (hex value) 23 | # - top_panel_color: top panel main color (hex value) 24 | # - side_panel_active_color: top panel active and on hover color (hex value) 25 | # On the sensors section: 26 | # - enable: true/force to enable/disable the sensors tab on the user portal 27 | # On the camera section: 28 | # - enable: true/false to enable/disable the camera tab on the user portal 29 | # - photos_folder: the target nextcloud photos folder 30 | # - photos_link: the target nextcloud link for photos 31 | # - video_folder: the target nextcloud video folder 32 | # - video_link: the target nextcloud link for video 33 | # On the monitoring section: 34 | # - enable: true/false to enable/disable the monitoring feature 35 | --- 36 | :general: 37 | :mode: normal 38 | :admin: 39 | :admin_username: mazi_admin 40 | :admin_password: '1234' 41 | :scripts: 42 | :backend_scripts_folder: /root/back-end/ 43 | :enabled_scripts: 44 | - wifiap.sh 45 | - current.sh 46 | - internet.sh 47 | - mazi-app.sh 48 | - mazi-stat.sh 49 | - mazi-router.sh 50 | - mazi-domain.sh 51 | - antenna.sh 52 | - date 53 | - ls 54 | - mazi-mesh.sh 55 | :portal_configuration: 56 | :title: MAZI Zone Portal 57 | :applications_title: MAZI Zone 58 | :applications_subtitle: Applications 59 | :applications_welcome_text: |- 60 | Welcome to the MAZI Zone Applications Portal, please 61 | use the links bellow to navigate to the applications offered by this MAZI Zone. 62 | :applications_background_image: mazi-background.jpg 63 | :side_panel_color: '222' 64 | :side_panel_active_color: 080808 65 | :top_panel_color: '222' 66 | :top_panel_active_color: 080808 67 | :sensors: 68 | :enable: false 69 | :camera: 70 | :enable: false 71 | :monitoring: 72 | :enable: false 73 | :applications_enable: false 74 | :hardware_enable: false 75 | :map: false 76 | -------------------------------------------------------------------------------- /init/etherpad-lite.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Etherpad-lite, the collaborative editor. 3 | After=syslog.target network.target 4 | 5 | [Service] 6 | Type=simple 7 | User=etherpad 8 | Group=etherpad 9 | WorkingDirectory=/var/www/html/etherpad-lite 10 | Environment=NODE_ENV=production 11 | ExecStart=/usr/bin/nodejs /var/www/html/etherpad-lite/node_modules/ep_etherpad-lite/node/server.js 12 | Restart=always # use mysql plus a complete settings.json to avoid Service hold-off time over, scheduling restart. 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /init/mazi-portal: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ### BEGIN INIT INFO 4 | # Provides: mazi-portal 5 | # Required-Start: $local_fs $remote_fs $network $syslog 6 | # Required-Stop: $local_fs $remote_fs $network $syslog 7 | # Default-Start: 2 3 4 5 8 | # Default-Stop: 0 1 6 9 | # Short-Description: Starts Mazizone Portal Server 10 | # Description: Mazizone portal 11 | ### END INIT INFO 12 | 13 | case "$1" in 14 | start) 15 | cd /root/portal 16 | ruby -I lib/ -I database/ mazi_portal_server.rb & 17 | ;; 18 | stop) 19 | id=$(ps aux | grep mazi_portal | grep root | awk '{print $2}') 20 | if [ "$id" ]; 21 | then sudo kill $id 22 | fi 23 | ;; 24 | restart) 25 | stop 26 | start 27 | ;; 28 | *) 29 | echo $"Usage: $0 {start|stop|restart}" 30 | exit 1 31 | esac 32 | exit 0 33 | 34 | -------------------------------------------------------------------------------- /init/mazi-rest: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ### BEGIN INIT INFO 4 | # Provides: mazi-rest 5 | # Required-Start: $local_fs $remote_fs $network $syslog 6 | # Required-Stop: $local_fs $remote_fs $network $syslog 7 | # Default-Start: 2 3 4 5 8 | # Default-Stop: 0 1 6 9 | # Short-Description: Starts Mazizone REST Service 10 | # Description: Mazizone REST service 11 | ### END INIT INFO 12 | 13 | case "$1" in 14 | start) 15 | cd /root/portal 16 | ruby -I lib/ -I database/ mazi_rest_service.rb & 17 | ;; 18 | stop) 19 | id=$(ps aux | grep mazi_rest_service | grep root | awk '{print $2}') 20 | if [ "$id" ]; 21 | then sudo kill $id 22 | fi 23 | ;; 24 | restart) 25 | stop 26 | start 27 | ;; 28 | *) 29 | echo $"Usage: $0 {start|stop|restart}" 30 | exit 1 31 | esac 32 | exit 0 33 | -------------------------------------------------------------------------------- /init/rc.local: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | # 3 | # rc.local 4 | # 5 | # This script is executed at the end of each multiuser runlevel. 6 | # value on error. 7 | # 8 | # In order to enable or disable this script just change the execution 9 | # bits. 10 | # 11 | # By default this script does nothing. 12 | 13 | # Print the IP address 14 | _IP=$(hostname -I) || true 15 | if [ "$_IP" ]; then 16 | printf "My IP address is %s\n" "$_IP" 17 | fi 18 | 19 | 20 | ############################## 21 | ##### MAZI configuration###### 22 | ############################## 23 | 24 | # Internet forwarding 25 | echo "1"| sudo tee /proc/sys/net/ipv4/ip_forward 26 | 27 | 28 | /sbin/ifconfig wlan0 10.0.0.1 29 | #ifdown wlan0 30 | #sleep 1 31 | #hostapd -B /etc/hostapd/hostapd.conf 32 | #ifconfig wlan0 10.0.0.1 33 | 34 | #### OpenWrt #### 35 | 36 | FILE="/etc/mazi/update-lock" 37 | x=0 38 | #### Wait the Update to finish before you setup the Hostapd #### 39 | #### timeout in 1800sec=30min #### 40 | while [ $x -lt 1800 ] && [ -e $FILE ]; do 41 | x=$((x+1)) 42 | sleep 1 43 | done 44 | if [ ! -f $FILE ] 45 | then 46 | echo "Update finished" 47 | sh /root/back-end/wifiap.sh 48 | else 49 | echo "Update is not properly finished" 50 | fi 51 | 52 | echo '-------------------------------------------------------' 53 | ############################## 54 | #START RASPIMJPEG SECTION 55 | mkdir -p /dev/shm/mjpeg 56 | chown www-data:www-data /dev/shm/mjpeg 57 | chmod 777 /dev/shm/mjpeg 58 | sleep 4;su -c 'raspimjpeg > /dev/null 2>&1 &' www-data 59 | 60 | if [ -e /etc/debian_version ]; then 61 | sleep 4;su -c "php /var/www/html/schedule.php > /dev/null 2>&1 &" www-data 62 | #sleep 4;su -c "/usr/src/RPi_Cam_Web_Interface/stop.sh" root 63 | #sleep 1;su -c "/usr/src/RPi_Cam_Web_Interface/start.sh" root 64 | else 65 | sleep 4;su -s '/bin/bash' -c "php /var/www/html/schedule.php > /dev/null 2>&1 &" www-data 66 | #sleep 4;su -s '/bin/bash' -c "/usr/src/RPi_Cam_Web_Interface/stop.sh" root 67 | #sleep 1;su -s '/bin/bash' -c "/usr/src/RPi_Cam_Web_Interface/start.sh" root 68 | fi 69 | #END RASPIMJPEG SECTION 70 | 71 | exit 0 72 | -------------------------------------------------------------------------------- /lib/helpers/authorizer.rb: -------------------------------------------------------------------------------- 1 | AUTH_ENABLED = true 2 | module Authorizer 3 | def authorized? 4 | if @config[:general][:mode] == 'demo' 5 | return true 6 | end 7 | return true unless AUTH_ENABLED 8 | !session[:username].nil? 9 | end 10 | 11 | def valid_admin_credentials?(username, password) 12 | if @config[:general][:mode] == 'demo' 13 | return true 14 | end 15 | username == readConfigFile[:admin][:admin_username] && password == readConfigFile[:admin][:admin_password] 16 | end 17 | 18 | def valid_password?(password) 19 | if @config[:general][:mode] == 'demo' 20 | return true 21 | end 22 | password == readConfigFile[:admin][:admin_password] 23 | end 24 | 25 | def valid_location?(location) 26 | if @config[:general][:mode] == 'demo' 27 | return true 28 | end 29 | return false if location.include?('(') || location.include?(')') || location.include?("'") || location.include?('"') 30 | return false unless location.include?(', ') && location.include?('.') 31 | true 32 | end 33 | 34 | def first_time? 35 | readConfigFile[:admin][:admin_password] == '1234' 36 | end 37 | 38 | def valid_mysql_password?(password) 39 | file = File.read('/etc/mazi/sql.conf') 40 | data = JSON.parse(file) 41 | data["password"] == password 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /lib/helpers/mazi_exec_cmd.rb: -------------------------------------------------------------------------------- 1 | require 'open3' 2 | 3 | class MaziExecCmd 4 | class ScriptNotEnabled < StandardError 5 | end 6 | 7 | def initialize(env, path, cmd, args=[], enabled_scripts=[], demo=false) 8 | @enabled_scripts = enabled_scripts 9 | @demo = demo 10 | raise ScriptNotEnabled unless enabled?(cmd) 11 | @cmd = cmd 12 | @env = env 13 | @args = args 14 | @path = path 15 | @output = [] 16 | end 17 | 18 | def enabled?(cmd) 19 | return true if @enabled_scripts.include?(cmd) 20 | false 21 | end 22 | 23 | def exec_command 24 | return demoExec if @demo == 'demo' 25 | command = "#{@env} #{@path}#{@cmd} #{@args.join(' ')}" 26 | MaziLogger.debug "$ #{command}" 27 | @output = [] 28 | Open3.popen3(command) do |stdin, stdout, stderr, wait_thr| 29 | while line = stdout.gets 30 | MaziLogger.debug "> #{line.strip}" 31 | @output << line.strip 32 | end 33 | end 34 | @output 35 | end 36 | 37 | def parseFor(token, splitter=' ') 38 | return demoParse(token, splitter) if @demo == 'demo' 39 | @output.each do |line| 40 | return line.split(splitter) if line.include? token 41 | end 42 | false 43 | end 44 | 45 | def parseForAll(token, splitter=' ') 46 | return demoParse(token, splitter) if @demo == 'demo' 47 | out = [] 48 | @output.each do |line| 49 | out << line.split(splitter) if line.include? token 50 | end 51 | out.empty? ? false : out 52 | end 53 | 54 | def demoExec 55 | case @cmd 56 | when 'wifiap.sh' 57 | 'OK' 58 | when 'current.sh' 59 | 'OK' 60 | when 'internet.sh' 61 | 'OK' 62 | when 'antenna.sh' 63 | 'OK' 64 | when 'mazi-app.sh' 65 | 'OK' 66 | when 'mazi-stat.sh' 67 | if @args.include? '-t' 68 | 'temp=68.2\'C' 69 | elsif @args.include? '-c' 70 | ['30.1%'] 71 | elsif @args.include? '-r' 72 | ['49.5%'] 73 | elsif @args.include? '-s' 74 | ['38.0%'] 75 | else 76 | 'wifi users 3' 77 | end 78 | end 79 | end 80 | 81 | def demoParse(token, splitter) 82 | case @cmd 83 | when 'wifiap.sh' 84 | 'OK' 85 | when 'current.sh' 86 | case token 87 | when 'ssid' 88 | return ['ssid', 'MAZIZONE'] 89 | when 'channel' 90 | return ['channel', '6'] 91 | when 'password' 92 | return ['password', '123456789'] 93 | when 'mode' 94 | return ['mode', 'offline'] 95 | end 96 | when 'internet.sh' 97 | 'OK' 98 | when 'antenna.sh' 99 | 'OK' 100 | when 'mazi-app.sh' 101 | 'OK' 102 | when 'mazi-stat.sh' 103 | if @args.include? '-t' 104 | return ['temp=68.2', "C"] 105 | elsif @args.include? '-c' 106 | return ['30.1', '%'] 107 | elsif @args.include? '-r' 108 | return ['49.5', '%'] 109 | elsif @args.include? '-s' 110 | return ['38.0', '%'] 111 | else 112 | return ['wifi', 'users', '3'] 113 | end 114 | end 115 | end 116 | end 117 | -------------------------------------------------------------------------------- /lib/helpers/mazi_locales.rb: -------------------------------------------------------------------------------- 1 | module MaziLocales 2 | def init_locales 3 | I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) 4 | I18n.load_path = Dir[File.join(settings.root, 'locales', '*.yml')] 5 | I18n.backend.load_translations 6 | I18n.available_locales = [:en, :el] 7 | set_locale(:en) 8 | end 9 | 10 | def set_locale(locale) 11 | I18n.locale = locale 12 | end 13 | 14 | def get_locale 15 | I18n.locale || I18n.default_locale 16 | end 17 | end -------------------------------------------------------------------------------- /lib/helpers/mazi_logger.rb: -------------------------------------------------------------------------------- 1 | require 'logger' 2 | 3 | class MaziLogger 4 | 5 | def self.log 6 | if @logger.nil? 7 | @logger = Logger.new STDOUT 8 | @logger.level = Logger::DEBUG 9 | @logger.datetime_format = '%Y-%m-%d %H:%M:%S ' 10 | end 11 | if @filelogger.nil? 12 | @filelogger = Logger.new('/var/log/mazizone.log', 'daily') 13 | @filelogger.level = Logger::DEBUG 14 | @filelogger.datetime_format = '%Y-%m-%d %H:%M:%S ' 15 | end 16 | [@logger, @filelogger] 17 | end 18 | 19 | def self.info(msg) 20 | logger, filelogger = self.log 21 | logger.info(msg) 22 | filelogger.info(msg) 23 | end 24 | 25 | def self.debug(msg) 26 | logger, filelogger = self.log 27 | logger.debug(msg) 28 | filelogger.debug(msg) 29 | end 30 | 31 | def self.error(msg) 32 | logger, filelogger = self.log 33 | logger.error(msg) 34 | filelogger.error(msg) 35 | end 36 | 37 | def self.warn(msg) 38 | logger, filelogger = self.log 39 | logger.warn(msg) 40 | filelogger.warn(msg) 41 | end 42 | 43 | def self.read_log_file(nof_lines = 100) 44 | `tail -n #{nof_lines} /var/log/mazizone.log` 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /lib/helpers/mazi_network.rb: -------------------------------------------------------------------------------- 1 | module MaziNetwork 2 | def get_interfaces 3 | interfaces = {} 4 | ex = MaziExecCmd.new('bash', '/root/back-end/', 'current.sh', ['-i', 'all', '-i', 'wifi', '-i', 'internet', '-i', 'mesh'], @config[:scripts][:enabled_scripts]) 5 | lines = ex.exec_command 6 | wifi_if = nil 7 | internet_if = nil 8 | mesh_if = nil 9 | ex.parseForAll('interface').each do |ifc| 10 | case ifc.first 11 | when 'interface' 12 | interfaces[ifc[1].to_sym] = {} 13 | interfaces[ifc[1].to_sym][:interface] = ifc[1] 14 | interfaces[ifc[1].to_sym][:name] = ifc[2] == 'raspberry' ? 'Raspberry WiFi' : "#{ifc[2].upcase} WiFi" 15 | interfaces[ifc[1].to_sym][:mode] = nil 16 | when 'wifi_interface' 17 | wifi_if = ifc[1] == '-' ? nil : ifc[1].to_sym 18 | when 'internet_interface' 19 | internet_if = ifc[1] == '-' ? nil : ifc[1].to_sym 20 | when 'mesh_interface' 21 | mesh_if = ifc[1] == '-' ? nil : ifc[1].to_sym 22 | end 23 | end 24 | interfaces[wifi_if][:mode] = 'wifi' unless wifi_if.nil? || interfaces[wifi_if].nil? 25 | interfaces[internet_if][:mode] = 'internet' unless internet_if.nil? || interfaces[internet_if].nil? 26 | interfaces[mesh_if][:mode] = 'mesh' unless mesh_if.nil? || interfaces[mesh_if].nil? 27 | 28 | interfaces 29 | end 30 | 31 | def populate_interfaces(interfaces) 32 | interfaces.each do |if_name, if_data| 33 | case if_data[:mode] 34 | when 'wifi' 35 | ex1 = MaziExecCmd.new('bash', '/root/back-end/', 'current.sh', ['-s', '-p', '-c'], @config[:scripts][:enabled_scripts]) 36 | lines = ex1.exec_command 37 | ssid = ex1.parseFor('ssid') 38 | ssid.shift 39 | if_data[:ssid] = ssid.join(' ') if ssid.kind_of? Array 40 | channel = ex1.parseFor('channel') 41 | if_data[:channel] = channel[1] if channel.kind_of? Array 42 | password = ex1.parseFor('password') 43 | if_data[:password] = password[1] if password.kind_of? Array 44 | ap = if_name 45 | when 'internet' 46 | ex2 = MaziExecCmd.new('bash', '/root/back-end/', 'antenna.sh', ['-i', if_name.to_s, '-a'], @config[:scripts][:enabled_scripts]) 47 | lines = ex2.exec_command 48 | if lines.nil? || lines.empty? || !lines.first.include?('ESSID') 49 | if_data[:mode] = nil 50 | session['error'] = "Interface #{if_name} has not been configured properly. Please make sure the details that you have provided are correct." 51 | `ifconfig #{if_name} down` 52 | `ifconfig #{if_name} up` 53 | `bash /root/back-end/antenna.sh -i #{if_name} -d` 54 | redirect "/admin_network" 55 | end 56 | ssid = ex2.parseFor('ESSID') 57 | if_data[:ssid] = ssid.last.split(':').last.gsub('"', '') 58 | if_data[:available_ssids] = [] 59 | ex7 = MaziExecCmd.new('bash', '/root/back-end/', 'antenna.sh', ['-l', '-i', if_name], @config[:scripts][:enabled_scripts]) 60 | if_data[:available_ssids] = ex7.exec_command 61 | if_data[:available_ssids].map! {|ssid| ssid.gsub('ESSID:', '').gsub('"', '')} 62 | if_data[:available_ssids].reject! {|ssid| ssid.empty?} 63 | when 'mesh' 64 | 65 | else 66 | if_data[:available_ssids] = [] 67 | ex8 = MaziExecCmd.new('bash', '/root/back-end/', 'antenna.sh', ['-l', '-i', if_name], @config[:scripts][:enabled_scripts]) 68 | if_data[:available_ssids] = ex8.exec_command 69 | if_data[:available_ssids].map! {|ssid| ssid.gsub('ESSID:', '').gsub('"', '')} 70 | if_data[:available_ssids].reject! {|ssid| ssid.empty?} 71 | end 72 | end 73 | interfaces 74 | end 75 | 76 | def verify_domain(domain) 77 | return "contain at least one dot (.) character" unless domain.include?('.') 78 | return "not contain a hyphen (-) as the first or the last character" if domain.start_with?('-') || domain.end_with?('-') 79 | special = "?<>',?[]}{=_)(*&^%$#`~{}" 80 | regex = /[#{special.gsub(/./){|char| "\\#{char}"}}]/ 81 | return "not contain the following characters: #{special}" if domain =~ regex 82 | nil 83 | end 84 | end 85 | -------------------------------------------------------------------------------- /lib/routes/mazi_locales.rb: -------------------------------------------------------------------------------- 1 | module Sinatra 2 | module MaziApp 3 | module Routing 4 | module MaziLocales 5 | 6 | def self.registered(app) 7 | # set locale 8 | app.post '/locales/:locale/?' do |locale| 9 | session['locale'] = locale.to_sym 10 | set_locale(locale.to_sym) 11 | end 12 | end 13 | 14 | end 15 | end 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /lib/routes/mazi_maps.rb: -------------------------------------------------------------------------------- 1 | module Sinatra 2 | module MaziApp 3 | module Routing 4 | module MaziMaps 5 | 6 | def self.registered(app) 7 | 8 | app.get '/maps/monitoring_map/?' do 9 | locals = {} 10 | locals[:local_data] = {} 11 | locals[:local_data][:deployments] = enrichDeployments(getAllDeploymentsWithData) 12 | erb :index_monitoring_map, locals: locals 13 | end 14 | 15 | app.get '/maps/device/:id/data/?' do |id| 16 | data = {} 17 | data[:sensors] = getSensorDataForDevice(id) 18 | data[:applications] = getApplicaitonDataForDevice(id) 19 | data[:users] = getUserDataForDevice(id) 20 | data[:system] = getSystemDataForDevice(id) 21 | data.to_json 22 | end 23 | 24 | app.get '/maps/device/:id/data/:type/?' do |id, type| 25 | data = {} 26 | case type 27 | when 'wifi' 28 | data = getUserDataForDevice(id) 29 | end 30 | data.to_json 31 | end 32 | 33 | app.get '/maps/device/:id/sensor/:sensor_id/data/:type/?' do |id, sensor_id, type| 34 | sensor_data = getSensorDataForDevice(id) 35 | data = sensor_data[sensor_id][:data][type.to_sym] 36 | data.to_json 37 | end 38 | 39 | app.get '/maps/device/:id/application/:application/data/:type?' do |id, application, type| 40 | application_data = getApplicationDataForDevice(id) 41 | data = application_data[application.to_s][:data][type.to_sym] 42 | data.to_json 43 | end 44 | 45 | end 46 | 47 | end 48 | end 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /lib/routes/mazi_notification.rb: -------------------------------------------------------------------------------- 1 | module Sinatra 2 | module MaziApp 3 | module Routing 4 | module MaziNotification 5 | 6 | def self.registered(app) 7 | 8 | # admin create notification 9 | app.post '/notification/?' do 10 | MaziLogger.debug "request: post/notification from ip: #{request.ip} creds: #{params.inspect}" 11 | if @config[:general][:mode] == 'demo' 12 | MaziLogger.debug "Demo mode create notification" 13 | session['error'] = "This portal runs on Demo mode! This action would have created a notification." 14 | redirect '/admin_notification' 15 | end 16 | unless authorized? 17 | MaziLogger.debug "Not authorized" 18 | session['error'] = nil 19 | redirect '/admin_login?goto=admin_notification' 20 | end 21 | 22 | a = Mazi::Model::Notification.create(params) 23 | redirect '/admin_notification' 24 | end 25 | 26 | # admin edit notification 27 | app.post '/notification/edit/?' do 28 | MaziLogger.debug "request: put/notification from ip: #{request.ip} params: #{params.inspect}" 29 | if @config[:general][:mode] == 'demo' 30 | MaziLogger.debug "Demo mode edit notification" 31 | session['error'] = "This portal runs on Demo mode! This action would have editted a notification." 32 | redirect '/admin_notification' 33 | end 34 | unless authorized? 35 | MaziLogger.debug "Not authorized" 36 | session['error'] = nil 37 | redirect '/admin_login?goto=admin_notification' 38 | end 39 | id = params['id'] 40 | notif = Mazi::Model::Notification.find(id: params['id'].to_i) 41 | notif.title = params['name'] if params['name'] 42 | notif.body = params['description'] if params['description'] 43 | notif.enabled = params['enabled'] if params['enabled'] 44 | notif.save 45 | redirect '/admin_notification' 46 | end 47 | 48 | # admin delete notification 49 | app.delete '/notification/:id/?' do |id| 50 | MaziLogger.debug "request: delete/notification from ip: #{request.ip} id: #{id}" 51 | if !authorized? 52 | MaziLogger.debug "Not authorized" 53 | session['error'] = nil 54 | {error: 'Not Authorized!', id: id}.to_json 55 | elsif @config[:general][:mode] == 'demo' 56 | MaziLogger.debug "Demo mode delete notification" 57 | session['error'] = nil 58 | {error: "This portal runs on Demo mode! This action would have deleted a notification.", id: id}.to_json 59 | else 60 | notif = Mazi::Model::Notification.find(id: id) 61 | notif.destroy 62 | {result: 'OK', id: id}.to_json 63 | end 64 | end 65 | 66 | # toggles notification enable disable 67 | app.put '/notification/:id/?' do |id| 68 | MaziLogger.debug "request: put/notification from ip: #{request.ip} id: #{id}" 69 | if !authorized? 70 | MaziLogger.debug "Not authorized" 71 | session['error'] = nil 72 | {error: 'Not Authorized!', id: id}.to_json 73 | elsif @config[:general][:mode] == 'demo' 74 | MaziLogger.debug "Demo mode toggle notification enabled." 75 | session['error'] = "This portal runs on Demo mode! This action would have toggled notification visibility on the portal" 76 | {error: "This portal runs on Demo mode! This action would have toggled notification visibility on the portal", id: id}.to_json 77 | else 78 | notif = Mazi::Model::Notification.find(id: id) 79 | notif.enabled = !notif.enabled 80 | notif.save 81 | {result: 'OK', id: id}.to_json 82 | end 83 | end 84 | 85 | # toggles notification read just in session 86 | app.put '/notification/:id/read/?' do |id| 87 | MaziLogger.debug "request: put/notification from ip: #{request.ip} id: #{id}" 88 | session[:notifications_read] << id.to_i 89 | {result: 'OK', id: id}.to_json 90 | end 91 | end 92 | 93 | end 94 | end 95 | end 96 | end -------------------------------------------------------------------------------- /locales/qqq.yml: -------------------------------------------------------------------------------- 1 | # Messages for Message documentation (Message documentation) 2 | # Exported from translatewiki.net 3 | # Export driver: phpyaml 4 | # Author: Guycn2 5 | # Author: Haniavis 6 | # Author: Liuxinyu970226 7 | # Author: Robby 8 | # Author: ديفيد 9 | --- 10 | qqq: 11 | general: 12 | buttons: 13 | edit: '{{Identical|Edit}}' 14 | cancel: '{{Identical|Cancel}}' 15 | ok: '{{Identical|OK}}' 16 | close: '{{Identical|Close}}' 17 | create: '{{Identical|Create}}' 18 | delete: '{{Identical|Delete}}' 19 | start: '{{Identical|Start}}' 20 | reset: '{{Identical|Reset}}' 21 | remove: '{{Identical|Remove}}' 22 | load: '{{Identical|Load}}' 23 | next: '{{Identical|Next}}' 24 | previous: '{{Identical|Previous}}' 25 | show: '{{Identical|Show}}' 26 | messages: 27 | warning: '{{Identical|Warning}}' 28 | welcome: '{{Identical|Welcome}}' 29 | version: '{{Identical|Version}}' 30 | here: '{{Identical|Here}}' 31 | password: '{{Identical|Password}}' 32 | managed: This is a hybrid mode of the toolkit, something between offline (all 33 | users offline) and dual (all users online), where the administrator is able 34 | to configure some of the users to be offline and some of them to be online 35 | according to specific criteria 36 | active: '{{Identical|Active}}' 37 | error: '{{Identical|Error}}' 38 | portal: 39 | top-menu: 40 | documentation: '{{Identical|Documentation}}' 41 | side-menu: 42 | system: '{{Identical|System}}' 43 | camera: '{{Identical|Camera}}' 44 | devices: '{{Identical|Device}}' 45 | system-page: 46 | temperature: '{{Identical|Temperature}}' 47 | camera-page: 48 | header: '{{Identical|Camera}}' 49 | monitoring-page: 50 | popups: 51 | device: '{{Identical|Device}}' 52 | devices: '{{Identical|Device}}' 53 | administrator: '{{Identical|Administrator}}' 54 | description: '{{Identical|Description}}' 55 | admin: 56 | top-menu: 57 | portal: '{{Identical|Portal}}' 58 | username: '{{Identical|Username}}' 59 | password: '{{Identical|Password}}' 60 | settings: '{{Identical|Settings}}' 61 | side-menu: 62 | appearance: '{{Identical|Appearance}}' 63 | devices: '{{Identical|Device}}' 64 | notifications: '{{Identical|Notification}}' 65 | documentation: '{{Identical|Documentation}}' 66 | dashboard-page: 67 | notifications: 68 | header: '{{Identical|Notification}}' 69 | applications-page: 70 | instances-menu: 71 | active-column: '{{Identical|Active}}' 72 | name-column: '{{Identical|Name}}' 73 | description-column: '{{Identical|Description}}' 74 | actions-column: '{{Identical|Action}}' 75 | applications-menu: 76 | color-column: '{{Identical|Color}}' 77 | description-column: '{{Identical|Description}}' 78 | actions-column: '{{Identical|Action}}' 79 | appearance-page: 80 | subheader: '{{Identical|Appearance}}' 81 | devices-page: 82 | subheader: '{{Identical|Device}}' 83 | sensors-panel: 84 | sensors-table: 85 | type: '{{Identical|Type}}' 86 | monitoring-page: 87 | details-panel: 88 | table-label3: '{{Identical|Title}}' 89 | table-label4: '{{Identical|Description}}' 90 | statistics-panel: 91 | statistics-table: 92 | action: '{{Identical|Action}}' 93 | popups: 94 | change-details-label2: '{{Identical|Administrator}}' 95 | change-details-label3: '{{Identical|Title}}' 96 | change-details-label4: '{{Identical|Description}}' 97 | hardware-label2: '{{Identical|Temperature}}' 98 | notifications-page: 99 | subheader: '{{Identical|Notification}}' 100 | notifications-table: 101 | header1: '{{Identical|Status}}' 102 | header2: '{{Identical|Title}}' 103 | documentation-page: 104 | initial-configuration-tab: 105 | subheader1: '{{Identical|Description}}' 106 | paragraph3: '{{doc-important|Do not translate "$passwd", that''s a Raspberry 107 | Pi maintain command.}}' 108 | etherpad-tab: 109 | subheader1: '{{Identical|Description}}' 110 | nextcloud-tab: 111 | subheader1: '{{Identical|Description}}' 112 | guestbook-tab: 113 | subheader1: '{{Identical|Description}}' 114 | wordpress-tab: 115 | subheader1: '{{Identical|Description}}' 116 | framadate-tab: 117 | subheader1: '{{Identical|Description}}' 118 | settings-page: 119 | subheader: '{{Identical|Settings}}' 120 | ... 121 | -------------------------------------------------------------------------------- /mazi_rest_service.rb: -------------------------------------------------------------------------------- 1 | require 'sinatra/base' 2 | require 'helpers/mazi_logger' 3 | require 'json' 4 | require 'fileutils' 5 | require 'mysql' 6 | require 'thin' 7 | require 'date' 8 | require 'i18n' 9 | require 'i18n/backend/fallbacks' 10 | require 'helpers/mazi_config' 11 | require 'helpers/mazi_sensors' 12 | require 'helpers/mazi_locales' 13 | require 'routes/mazi_rest' 14 | require 'routes/mazi_maps' 15 | 16 | class MaziRestApp < Sinatra::Base 17 | include MaziConfig 18 | include MaziSensors 19 | include MaziLocales 20 | 21 | configure {set :show_exceptions, false} 22 | configure {set :dump_errors, false} 23 | 24 | error do |err| 25 | MaziLogger.error "#{err.message}" 26 | err.backtrace.each do |trace| 27 | MaziLogger.error " #{trace}" 28 | end 29 | err 30 | end 31 | 32 | def initialize 33 | super 34 | @config = loadConfigFile 35 | init_locales 36 | end 37 | 38 | at_exit do 39 | MaziLogger.debug "Exiting" 40 | pid = `ps aux | grep -v grep | grep 'bash /root/back-end/mazi-sense.sh -n sensehat -m -ac -g' | awk '{print $2}'` 41 | `kill -9 #{pid}` 42 | end 43 | 44 | register Sinatra::MaziApp::Routing::MaziRest 45 | register Sinatra::MaziApp::Routing::MaziMaps 46 | end 47 | 48 | Thin::Server.start MaziRestApp, '0.0.0.0', 7654 49 | -------------------------------------------------------------------------------- /public/css/font-awesome/css/fa-brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: normal; 9 | src: url("../webfonts/fa-brands-400.eot"); 10 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 11 | 12 | .fab { 13 | font-family: 'Font Awesome 5 Brands'; } 14 | -------------------------------------------------------------------------------- /public/css/font-awesome/css/fa-brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands} -------------------------------------------------------------------------------- /public/css/font-awesome/css/fa-regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | src: url("../webfonts/fa-regular-400.eot"); 10 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 11 | 12 | .far { 13 | font-family: 'Font Awesome 5 Free'; 14 | font-weight: 400; } 15 | -------------------------------------------------------------------------------- /public/css/font-awesome/css/fa-regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400} -------------------------------------------------------------------------------- /public/css/font-awesome/css/fa-solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | src: url("../webfonts/fa-solid-900.eot"); 10 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 11 | 12 | .fa, 13 | .fas { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 900; } 16 | -------------------------------------------------------------------------------- /public/css/font-awesome/css/fa-solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900} -------------------------------------------------------------------------------- /public/css/font-awesome/less/_animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | animation: fa-spin 2s infinite linear; 6 | } 7 | 8 | .@{fa-css-prefix}-pulse { 9 | animation: fa-spin 1s infinite steps(8); 10 | } 11 | 12 | @keyframes fa-spin { 13 | 0% { 14 | transform: rotate(0deg); 15 | } 16 | 100% { 17 | transform: rotate(360deg); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | border-radius: .1em; 6 | border: solid .08em @fa-border-color; 7 | padding: .2em .25em .15em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix}, .fas, .far, .fal, .fab { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}, .fas, .far, .fal, .fab { 5 | -moz-osx-font-smoothing: grayscale; 6 | -webkit-font-smoothing: antialiased; 7 | display: inline-block; 8 | font-style: normal; 9 | font-variant: normal; 10 | text-rendering: auto; 11 | line-height: 1; 12 | } 13 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | text-align: center; 5 | width: (20em / 16); 6 | } 7 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | .larger(@factor) when (@factor > 0) { 5 | .larger((@factor - 1)); 6 | 7 | .@{fa-css-prefix}-@{factor}x { 8 | font-size: (@factor * 1em); 9 | } 10 | } 11 | 12 | /* makes the font 33% larger relative to the icon container */ 13 | .@{fa-css-prefix}-lg { 14 | font-size: (4em / 3); 15 | line-height: (3em / 4); 16 | vertical-align: -.0667em; 17 | } 18 | 19 | .@{fa-css-prefix}-xs { 20 | font-size: .75em; 21 | } 22 | 23 | .@{fa-css-prefix}-sm { 24 | font-size: .875em; 25 | } 26 | 27 | .larger(10); 28 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | list-style-type: none; 6 | margin-left: @fa-li-width * 5/4; 7 | padding-left: 0; 8 | 9 | > li { position: relative; } 10 | } 11 | 12 | .@{fa-css-prefix}-li { 13 | left: -@fa-li-width; 14 | position: absolute; 15 | text-align: center; 16 | width: @fa-li-width; 17 | line-height: inherit; 18 | } 19 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | -moz-osx-font-smoothing: grayscale; 6 | -webkit-font-smoothing: antialiased; 7 | display: inline-block; 8 | font-style: normal; 9 | font-variant: normal; 10 | font-weight: normal; 11 | line-height: 1; 12 | vertical-align: -.125em; 13 | } 14 | 15 | .fa-icon-rotate(@degrees, @rotation) { 16 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 17 | transform: rotate(@degrees); 18 | } 19 | 20 | .fa-icon-flip(@horiz, @vert, @rotation) { 21 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 22 | transform: scale(@horiz, @vert); 23 | } 24 | 25 | 26 | // Only display content to screen readers. A la Bootstrap 4. 27 | // 28 | // See: http://a11yproject.com/posts/how-to-hide-content/ 29 | 30 | .sr-only() { 31 | border: 0; 32 | clip: rect(0,0,0,0); 33 | height: 1px; 34 | margin: -1px; 35 | overflow: hidden; 36 | padding: 0; 37 | position: absolute; 38 | width: 1px; 39 | } 40 | 41 | // Use in conjunction with .sr-only to only display content when it's focused. 42 | // 43 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 44 | // 45 | // Credit: HTML5 Boilerplate 46 | 47 | .sr-only-focusable() { 48 | &:active, 49 | &:focus { 50 | clip: auto; 51 | height: auto; 52 | margin: 0; 53 | overflow: visible; 54 | position: static; 55 | width: auto; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | .@{fa-css-prefix}-flip-horizontal.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(-1, -1, 2); } 11 | 12 | // Hook for IE8-9 13 | // ------------------------- 14 | 15 | :root { 16 | .@{fa-css-prefix}-rotate-90, 17 | .@{fa-css-prefix}-rotate-180, 18 | .@{fa-css-prefix}-rotate-270, 19 | .@{fa-css-prefix}-flip-horizontal, 20 | .@{fa-css-prefix}-flip-vertical { 21 | filter: none; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/_stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | display: inline-block; 6 | height: 2em; 7 | line-height: 2em; 8 | position: relative; 9 | vertical-align: middle; 10 | width: 2em; 11 | } 12 | 13 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 14 | left: 0; 15 | position: absolute; 16 | text-align: center; 17 | width: 100%; 18 | } 19 | 20 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 21 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 22 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 23 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/fa-brands.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Brands'; 9 | font-style: normal; 10 | font-weight: normal; 11 | src: url('@{fa-font-path}/fa-brands-400.eot'); 12 | src: url('@{fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'), 13 | url('@{fa-font-path}/fa-brands-400.woff2') format('woff2'), 14 | url('@{fa-font-path}/fa-brands-400.woff') format('woff'), 15 | url('@{fa-font-path}/fa-brands-400.ttf') format('truetype'), 16 | url('@{fa-font-path}/fa-brands-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fab { 20 | font-family: 'Font Awesome 5 Brands'; 21 | } 22 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/fa-regular.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url('@{fa-font-path}/fa-regular-400.eot'); 12 | src: url('@{fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'), 13 | url('@{fa-font-path}/fa-regular-400.woff2') format('woff2'), 14 | url('@{fa-font-path}/fa-regular-400.woff') format('woff'), 15 | url('@{fa-font-path}/fa-regular-400.ttf') format('truetype'), 16 | url('@{fa-font-path}/fa-regular-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .far { 20 | font-family: 'Font Awesome 5 Free'; 21 | font-weight: 400; 22 | } 23 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/fa-solid.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 900; 11 | src: url('@{fa-font-path}/fa-solid-900.eot'); 12 | src: url('@{fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'), 13 | url('@{fa-font-path}/fa-solid-900.woff2') format('woff2'), 14 | url('@{fa-font-path}/fa-solid-900.woff') format('woff'), 15 | url('@{fa-font-path}/fa-solid-900.ttf') format('truetype'), 16 | url('@{fa-font-path}/fa-solid-900.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fa, 20 | .fas { 21 | font-family: 'Font Awesome 5 Free'; 22 | font-weight: 900; 23 | } 24 | -------------------------------------------------------------------------------- /public/css/font-awesome/less/fontawesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import "_variables.less"; 6 | @import "_mixins.less"; 7 | @import "_core.less"; 8 | @import "_larger.less"; 9 | @import "_fixed-width.less"; 10 | @import "_list.less"; 11 | @import "_bordered-pulled.less"; 12 | @import "_animated.less"; 13 | @import "_rotated-flipped.less"; 14 | @import "_stacked.less"; 15 | @import "_icons.less"; 16 | @import "_screen-reader.less"; 17 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | animation: fa-spin 2s infinite linear; 6 | } 7 | 8 | .#{$fa-css-prefix}-pulse { 9 | animation: fa-spin 1s infinite steps(8); 10 | } 11 | 12 | @keyframes fa-spin { 13 | 0% { 14 | transform: rotate(0deg); 15 | } 16 | 17 | 100% { 18 | transform: rotate(360deg); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | border: solid .08em $fa-border-color; 6 | border-radius: .1em; 7 | padding: .2em .25em .15em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix}, 14 | .fas, 15 | .far, 16 | .fal, 17 | .fab { 18 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 19 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 20 | } 21 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}, 5 | .fas, 6 | .far, 7 | .fal, 8 | .fab { 9 | -moz-osx-font-smoothing: grayscale; 10 | -webkit-font-smoothing: antialiased; 11 | display: inline-block; 12 | font-style: normal; 13 | font-variant: normal; 14 | text-rendering: auto; 15 | line-height: 1; 16 | } 17 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | text-align: center; 5 | width: (20em / 16); 6 | } 7 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | // makes the font 33% larger relative to the icon container 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -.0667em; 9 | } 10 | 11 | .#{$fa-css-prefix}-xs { 12 | font-size: .75em; 13 | } 14 | 15 | .#{$fa-css-prefix}-sm { 16 | font-size: .875em; 17 | } 18 | 19 | @for $i from 1 through 10 { 20 | .#{$fa-css-prefix}-#{$i}x { 21 | font-size: $i * 1em; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | list-style-type: none; 6 | margin-left: $fa-li-width * 5/4; 7 | padding-left: 0; 8 | 9 | > li { position: relative; } 10 | } 11 | 12 | .#{$fa-css-prefix}-li { 13 | left: -$fa-li-width; 14 | position: absolute; 15 | text-align: center; 16 | width: $fa-li-width; 17 | line-height: inherit; 18 | } 19 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon { 5 | -webkit-font-smoothing: antialiased; 6 | -moz-osx-font-smoothing: grayscale; 7 | display: inline-block; 8 | font-style: normal; 9 | font-variant: normal; 10 | font-weight: normal; 11 | line-height: 1; 12 | vertical-align: -.125em; 13 | } 14 | 15 | @mixin fa-icon-rotate($degrees, $rotation) { 16 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 17 | transform: rotate($degrees); 18 | } 19 | 20 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 21 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 22 | transform: scale($horiz, $vert); 23 | } 24 | 25 | 26 | // Only display content to screen readers. A la Bootstrap 4. 27 | // 28 | // See: http://a11yproject.com/posts/how-to-hide-content/ 29 | 30 | @mixin sr-only { 31 | border: 0; 32 | clip: rect(0, 0, 0, 0); 33 | height: 1px; 34 | margin: -1px; 35 | overflow: hidden; 36 | padding: 0; 37 | position: absolute; 38 | width: 1px; 39 | } 40 | 41 | // Use in conjunction with .sr-only to only display content when it's focused. 42 | // 43 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 44 | // 45 | // Credit: HTML5 Boilerplate 46 | 47 | @mixin sr-only-focusable { 48 | &:active, 49 | &:focus { 50 | clip: auto; 51 | height: auto; 52 | margin: 0; 53 | overflow: visible; 54 | position: static; 55 | width: auto; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); } 11 | 12 | // Hook for IE8-9 13 | // ------------------------- 14 | 15 | :root { 16 | .#{$fa-css-prefix}-rotate-90, 17 | .#{$fa-css-prefix}-rotate-180, 18 | .#{$fa-css-prefix}-rotate-270, 19 | .#{$fa-css-prefix}-flip-horizontal, 20 | .#{$fa-css-prefix}-flip-vertical { 21 | filter: none; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only; } 5 | .sr-only-focusable { @include sr-only-focusable; } 6 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | display: inline-block; 6 | height: 2em; 7 | line-height: 2em; 8 | position: relative; 9 | vertical-align: middle; 10 | width: 2em; 11 | } 12 | 13 | .#{$fa-css-prefix}-stack-1x, 14 | .#{$fa-css-prefix}-stack-2x { 15 | left: 0; 16 | position: absolute; 17 | text-align: center; 18 | width: 100%; 19 | } 20 | 21 | .#{$fa-css-prefix}-stack-1x { 22 | line-height: inherit; 23 | } 24 | 25 | .#{$fa-css-prefix}-stack-2x { 26 | font-size: 2em; 27 | } 28 | 29 | .#{$fa-css-prefix}-inverse { 30 | color: $fa-inverse; 31 | } 32 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/fa-brands.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Brands'; 9 | font-style: normal; 10 | font-weight: normal; 11 | src: url('#{$fa-font-path}/fa-brands-400.eot'); 12 | src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'), 13 | url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'), 14 | url('#{$fa-font-path}/fa-brands-400.woff') format('woff'), 15 | url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'), 16 | url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fab { 20 | font-family: 'Font Awesome 5 Brands'; 21 | } 22 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/fa-regular.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url('#{$fa-font-path}/fa-regular-400.eot'); 12 | src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'), 13 | url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'), 14 | url('#{$fa-font-path}/fa-regular-400.woff') format('woff'), 15 | url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'), 16 | url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .far { 20 | font-family: 'Font Awesome 5 Free'; 21 | font-weight: 400; 22 | } 23 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/fa-solid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | 7 | @font-face { 8 | font-family: 'Font Awesome 5 Free'; 9 | font-style: normal; 10 | font-weight: 900; 11 | src: url('#{$fa-font-path}/fa-solid-900.eot'); 12 | src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'), 13 | url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'), 14 | url('#{$fa-font-path}/fa-solid-900.woff') format('woff'), 15 | url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'), 16 | url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg'); 17 | } 18 | 19 | .fa, 20 | .fas { 21 | font-family: 'Font Awesome 5 Free'; 22 | font-weight: 900; 23 | } 24 | -------------------------------------------------------------------------------- /public/css/font-awesome/scss/fontawesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @import 'variables'; 6 | @import 'mixins'; 7 | @import 'core'; 8 | @import 'larger'; 9 | @import 'fixed-width'; 10 | @import 'list'; 11 | @import 'bordered-pulled'; 12 | @import 'animated'; 13 | @import 'rotated-flipped'; 14 | @import 'stacked'; 15 | @import 'icons'; 16 | @import 'screen-reader'; 17 | -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /public/css/font-awesome/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/font-awesome/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /public/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_diagonals-thick_20_666666_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_diagonals-thick_20_666666_40x40.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_flat_10_000000_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_flat_10_000000_40x100.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_glass_100_f6f6f6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_glass_100_f6f6f6_1x400.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_glass_100_fdf5ce_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_glass_100_fdf5ce_1x400.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png -------------------------------------------------------------------------------- /public/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png -------------------------------------------------------------------------------- /public/css/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /public/css/images/ui-icons_228ef1_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-icons_228ef1_256x240.png -------------------------------------------------------------------------------- /public/css/images/ui-icons_ef8c08_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-icons_ef8c08_256x240.png -------------------------------------------------------------------------------- /public/css/images/ui-icons_ffd27a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-icons_ffd27a_256x240.png -------------------------------------------------------------------------------- /public/css/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /public/css/jquery.tagit.css: -------------------------------------------------------------------------------- 1 | ul.tagit { 2 | padding: 1px 5px; 3 | overflow: auto; 4 | margin-left: inherit; /* usually we don't want the regular ul margins. */ 5 | margin-right: inherit; 6 | } 7 | ul.tagit li { 8 | display: block; 9 | float: left; 10 | margin: 2px 5px 2px 0; 11 | } 12 | ul.tagit li.tagit-choice { 13 | position: relative; 14 | line-height: inherit; 15 | } 16 | input.tagit-hidden-field { 17 | display: none; 18 | } 19 | ul.tagit li.tagit-choice-read-only { 20 | padding: .2em .5em .2em .5em; 21 | } 22 | 23 | ul.tagit li.tagit-choice-editable { 24 | padding: .2em 18px .2em .5em; 25 | } 26 | 27 | ul.tagit li.tagit-new { 28 | padding: .25em 4px .25em 0; 29 | } 30 | 31 | ul.tagit li.tagit-choice a.tagit-label { 32 | cursor: pointer; 33 | text-decoration: none; 34 | } 35 | ul.tagit li.tagit-choice .tagit-close { 36 | cursor: pointer; 37 | position: absolute; 38 | right: .1em; 39 | top: 50%; 40 | margin-top: -8px; 41 | line-height: 17px; 42 | } 43 | 44 | /* used for some custom themes that don't need image icons */ 45 | ul.tagit li.tagit-choice .tagit-close .text-icon { 46 | display: none; 47 | } 48 | 49 | ul.tagit li.tagit-choice input { 50 | display: block; 51 | float: left; 52 | margin: 2px 5px 2px 0; 53 | } 54 | ul.tagit input[type="text"] { 55 | -moz-box-sizing: border-box; 56 | -webkit-box-sizing: border-box; 57 | box-sizing: border-box; 58 | 59 | -moz-box-shadow: none; 60 | -webkit-box-shadow: none; 61 | box-shadow: none; 62 | 63 | border: none; 64 | margin: 0; 65 | padding: 0; 66 | width: inherit; 67 | background-color: inherit; 68 | outline: none; 69 | } -------------------------------------------------------------------------------- /public/css/languages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/css/languages.png -------------------------------------------------------------------------------- /public/css/plugins/morris.css: -------------------------------------------------------------------------------- 1 | .morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0} 2 | .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0} 3 | -------------------------------------------------------------------------------- /public/css/setup.css: -------------------------------------------------------------------------------- 1 | .wizard { 2 | margin: 20px auto; 3 | background: #fff; 4 | } 5 | 6 | .wizard .nav-tabs { 7 | position: relative; 8 | margin: 40px auto; 9 | margin-bottom: 0; 10 | border-bottom-color: #e0e0e0; 11 | } 12 | 13 | .wizard > div.wizard-inner { 14 | position: relative; 15 | } 16 | 17 | .connecting-line { 18 | height: 2px; 19 | background: #e0e0e0; 20 | position: absolute; 21 | width: 80%; 22 | margin: 0 auto; 23 | left: 0; 24 | right: 0; 25 | top: 50%; 26 | z-index: 1; 27 | } 28 | 29 | .wizard .nav-tabs > li.active > a, .wizard .nav-tabs > li.active > a:hover, .wizard .nav-tabs > li.active > a:focus { 30 | color: #555555; 31 | cursor: default; 32 | border: 0; 33 | border-bottom-color: transparent; 34 | } 35 | 36 | span.round-tab { 37 | width: 70px; 38 | height: 70px; 39 | line-height: 70px; 40 | display: inline-block; 41 | border-radius: 100px; 42 | background: #fff; 43 | border: 2px solid #e0e0e0; 44 | z-index: 2; 45 | position: absolute; 46 | left: 0; 47 | text-align: center; 48 | font-size: 25px; 49 | } 50 | 51 | span.round-tab i{ 52 | color:#555555; 53 | } 54 | 55 | .wizard li.active span.round-tab { 56 | background: #fff; 57 | border: 2px solid #5bc0de; 58 | } 59 | 60 | .wizard li.active span.round-tab i{ 61 | color: #5bc0de; 62 | } 63 | 64 | span.round-tab:hover { 65 | color: #333; 66 | border: 2px solid #333; 67 | } 68 | 69 | .wizard .nav-tabs > li { 70 | width: 20%; 71 | } 72 | 73 | .wizard li:after { 74 | content: " "; 75 | position: absolute; 76 | left: 46%; 77 | opacity: 0; 78 | margin: 0 auto; 79 | bottom: 0px; 80 | border: 5px solid transparent; 81 | border-bottom-color: #5bc0de; 82 | transition: 0.1s ease-in-out; 83 | } 84 | 85 | .wizard li.active:after { 86 | content: " "; 87 | position: absolute; 88 | left: 46%; 89 | opacity: 1; 90 | margin: 0 auto; 91 | bottom: 0px; 92 | border: 10px solid transparent; 93 | border-bottom-color: #5bc0de; 94 | } 95 | 96 | .wizard .nav-tabs > li a { 97 | width: 70px; 98 | height: 70px; 99 | margin: 20px auto; 100 | border-radius: 100%; 101 | padding: 0; 102 | } 103 | 104 | .wizard .nav-tabs > li a:hover { 105 | background: transparent; 106 | } 107 | 108 | .wizard .tab-pane { 109 | position: relative; 110 | padding-top: 50px; 111 | } 112 | 113 | .wizard h3 { 114 | margin-top: 0; 115 | } 116 | 117 | @media( max-width : 585px ) { 118 | 119 | .wizard { 120 | width: 90%; 121 | height: auto !important; 122 | } 123 | 124 | span.round-tab { 125 | font-size: 16px; 126 | width: 50px; 127 | height: 50px; 128 | line-height: 50px; 129 | } 130 | 131 | .wizard .nav-tabs > li a { 132 | width: 50px; 133 | height: 50px; 134 | line-height: 50px; 135 | } 136 | 137 | .wizard li.active:after { 138 | content: " "; 139 | position: absolute; 140 | left: 35%; 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/favicon.ico -------------------------------------------------------------------------------- /public/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /public/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /public/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /public/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /public/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /public/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /public/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /public/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /public/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /public/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /public/font-awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /public/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /public/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /public/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /public/images/arrow.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/images/compass.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 16 | 24 | 26 | 28 | 30 | 32 | W 33 | S 34 | E 35 | N 36 | -------------------------------------------------------------------------------- /public/images/etherpad_doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/etherpad_doc.png -------------------------------------------------------------------------------- /public/images/etherpad_doc_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/etherpad_doc_2.png -------------------------------------------------------------------------------- /public/images/framadate_doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/framadate_doc.png -------------------------------------------------------------------------------- /public/images/guestbook_doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/guestbook_doc.png -------------------------------------------------------------------------------- /public/images/mazi-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/mazi-background.jpg -------------------------------------------------------------------------------- /public/images/maziLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/maziLogo.png -------------------------------------------------------------------------------- /public/images/nextcloud-doc3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/nextcloud-doc3.png -------------------------------------------------------------------------------- /public/images/nextcloud_doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/nextcloud_doc.png -------------------------------------------------------------------------------- /public/images/nextcloud_doc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/nextcloud_doc2.png -------------------------------------------------------------------------------- /public/images/video_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/video_img.png -------------------------------------------------------------------------------- /public/images/wordpress_doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/images/wordpress_doc.png -------------------------------------------------------------------------------- /public/js/admin_configuration.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('[id^=detail-]').hide(); 3 | $('.toggle').click(function() { 4 | $input = $( this ); 5 | $target = $('#'+$input.attr('data-toggle')); 6 | $target.slideToggle(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /public/js/admin_dashboard.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('.admin-logout-button').click(function(){ 3 | 4 | }); 5 | 6 | $('.reset-app-clicks').click(function(){ 7 | $.ajax({ 8 | url: '/application/all/click_counter', 9 | type: 'DELETE', 10 | success: function(result) { 11 | location.reload(true); 12 | } 13 | }); 14 | }); 15 | 16 | $('.reset-visits').click(function(){ 17 | $.ajax({ 18 | url: '/session/all', 19 | type: 'DELETE', 20 | success: function(result) { 21 | location.reload(true); 22 | } 23 | }); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /public/js/admin_devices.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('.enabled-camera-switch').click(function(){ 3 | $.ajax({ 4 | url: '/devices/camera/toggle', 5 | type: 'POST', 6 | success: function(result) { 7 | error = JSON.parse(result).error; 8 | if (error != null){ 9 | location.reload(true); 10 | } 11 | } 12 | }); 13 | }); 14 | 15 | $('#datetimepicker').datetimepicker({ 16 | format:'d/m/Y H:i O' 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /public/js/admin_guestbook.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('#singleFieldTags2').tagit(); 3 | 4 | }); -------------------------------------------------------------------------------- /public/js/admin_logs.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | var log_lines = $(".log-wrapper").text().split("\n"); 3 | 4 | function show_log_messages(error_msgs, warn_msgs, debug_msgs){ 5 | var new_lines = ""; 6 | $.each(log_lines, function(n, line) { 7 | if (error_msgs && line.match("^E")) { 8 | new_lines += line + "\n"; 9 | } 10 | if (warn_msgs && line.match("^W")) { 11 | new_lines += line + "\n"; 12 | } 13 | if (debug_msgs && line.match("^D")) { 14 | new_lines += line + "\n"; 15 | } 16 | }); 17 | $(".log-wrapper").text(new_lines); 18 | } 19 | 20 | error_checked = true; 21 | warn_checked = true; 22 | debug_checked = false; 23 | if (localStorage.getItem("error_checked") != null){ 24 | if (localStorage.getItem("error_checked") == 'true'){ 25 | error_checked = true; 26 | $("#error_enabled_cb").prop("checked", true); 27 | } 28 | else { 29 | error_checked = false; 30 | $("#error_enabled_cb").prop("checked", false); 31 | } 32 | } 33 | if (localStorage.getItem("warn_checked") != null){ 34 | if (localStorage.getItem("warn_checked") == 'true'){ 35 | warn_checked = true; 36 | $("#warn_enabled_cb").prop("checked", true); 37 | } 38 | else { 39 | warn_checked = false; 40 | $("#warn_enabled_cb").prop("checked", false); 41 | } 42 | } 43 | if (localStorage.getItem("debug_checked") != null){ 44 | if (localStorage.getItem("debug_checked") == 'true'){ 45 | debug_checked = true; 46 | $("#debug_enabled_cb").prop("checked", true); 47 | } 48 | else { 49 | debug_checked = false; 50 | $("#debug_enabled_cb").prop("checked", false); 51 | } 52 | } 53 | localStorage.clear(); 54 | show_log_messages(error_checked, warn_checked, debug_checked); 55 | 56 | $(".msg-lvl-cb").change(function(){ 57 | show_log_messages($("#error_enabled_cb").is(":checked"), $("#warn_enabled_cb").is(":checked"), $("#debug_enabled_cb").is(":checked")); 58 | }); 59 | 60 | $('#refresh-log-btn').click(function(){ 61 | localStorage.setItem("error_checked", $("#error_enabled_cb").is(":checked")); 62 | localStorage.setItem("warn_checked", $("#warn_enabled_cb").is(":checked")); 63 | localStorage.setItem("debug_checked", $("#debug_enabled_cb").is(":checked")); 64 | location.reload(); 65 | }); 66 | }); -------------------------------------------------------------------------------- /public/js/admin_main.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('#loading_message').hide(); 3 | 4 | $('.admin-logout-button').click(function(){ 5 | 6 | }); 7 | 8 | $('.language-button').click(function(){ 9 | var appId = $(this).attr('id').split('-')[0]; 10 | $.ajax({ 11 | url: '/locales/' + appId, 12 | type: 'POST', 13 | success: function(result) { 14 | location.reload(true); 15 | } 16 | }); 17 | }); 18 | 19 | $(".load_btn").click(function(){ 20 | $('#loading_message').show(); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /public/js/admin_network.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('[id^=detail-]').hide(); 3 | $('.toggle').click(function() { 4 | $input = $( this ); 5 | $target = $('#'+$input.attr('data-toggle')); 6 | $target.slideToggle(); 7 | }); 8 | 9 | $('#qrcodeCanvas').qrcode({ 10 | text : qrcodetext 11 | }); 12 | 13 | $(".configure-interface-type").on('change', function(){ 14 | var ifc = $(this).attr('id').split('-').pop(); 15 | var type = $(this).children(":selected").attr("value"); 16 | console.log(ifc, type); 17 | $("#configure-wifi-form-" + ifc).hide(); 18 | $("#configure-internet-form-" + ifc).hide(); 19 | $("#configure-mesh-form-" + ifc).hide(); 20 | $("#configure-" + type + "-form-" + ifc).show(); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /public/js/admin_notification.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | var confirm_element_id = null; 3 | 4 | $( "#delete-dialog-confirm" ).dialog({ 5 | resizable: false, 6 | height: "auto", 7 | width: 400, 8 | modal: true, 9 | autoOpen: false, 10 | buttons: { 11 | Yes: function() { 12 | $.ajax({ 13 | url: '/notification/' + confirm_element_id, 14 | type: 'DELETE', 15 | success: function(result) { 16 | id = JSON.parse(result).id; 17 | error = JSON.parse(result).error; 18 | if (error != null){ 19 | $("

" + error + "

").prependTo('#page-wrapper > div > div:nth-child(2)'); 20 | } 21 | else{ 22 | $('#notification_tr_' + id).remove(); 23 | } 24 | } 25 | }); 26 | $( this ).dialog( "close" ); 27 | }, 28 | No: function() { 29 | confirm_element_id = null; 30 | $( this ).dialog( "close" ); 31 | } 32 | } 33 | }); 34 | 35 | $('.del_notification').click(function(){ 36 | confirm_element_id = $(this).attr('id').split('_').pop(); 37 | $( "#delete-dialog-confirm" ).dialog( "open" ); 38 | }); 39 | 40 | $('.enabled-switch').click(function(){ 41 | var appId = $(this).attr('id').split('_').pop(); 42 | $.ajax({ 43 | url: '/notification/' + appId, 44 | type: 'PUT', 45 | success: function(result) { 46 | id = JSON.parse(result).id; 47 | error = JSON.parse(result).error; 48 | if (error != null){ 49 | location.reload(true); 50 | } 51 | } 52 | }); 53 | }); 54 | }); 55 | -------------------------------------------------------------------------------- /public/js/admin_set_date.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | jQuery('#datetimepicker').datetimepicker(); 3 | }); -------------------------------------------------------------------------------- /public/js/admin_settings.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | jQuery('#datetimepicker').datetimepicker(); 3 | }); -------------------------------------------------------------------------------- /public/js/admin_update.js: -------------------------------------------------------------------------------- 1 | function show(tag){ 2 | $('.chooseBranch').hide(); 3 | $('.checking4updates').hide(); 4 | $('.staged-error').hide(); 5 | $('.no-internet-error').hide(); 6 | $('.demo-mode-error').hide(); 7 | $('.up2date').hide(); 8 | $('.update-ready').hide(); 9 | $('.updating').hide(); 10 | $('.staged-done').hide(); 11 | $(tag).show(); 12 | } 13 | 14 | $( document ).ready(function() { 15 | $( "#update-channel-sel" ).change(function() { 16 | $('#loading_message').show(); 17 | var branch = $( "#update-channel-sel" ).val(); 18 | $.ajax({ 19 | url: '/branch/' + branch, 20 | type: 'PUT', 21 | success: function(result){ 22 | location.reload(true); 23 | } 24 | }); 25 | }); 26 | 27 | $('.choose-branch-btn').on( "click", function(){ 28 | show('.checking4updates'); 29 | $.ajax({ 30 | url: '/update/', 31 | type: 'GET', 32 | success: function(result) { 33 | res = JSON.parse(result); 34 | if(res.error){ 35 | if(res.code == -1){ 36 | show('.staged-error'); 37 | } 38 | if(res.code == -2){ 39 | show('.no-internet-error'); 40 | } 41 | if(res.code == -3){ 42 | show('.demo-mode-error'); 43 | } 44 | } 45 | else if(res.current_version){ 46 | if(res.commits_behind == 0){ 47 | show('.up2date'); 48 | } 49 | else{ 50 | $('.update-ready > p').text(update_message_1); 51 | show('.update-ready'); 52 | } 53 | } 54 | } 55 | }); 56 | }); 57 | 58 | $('.update-btn').on( "click", function(){ 59 | show('.updating'); 60 | $.ajax({ 61 | url: '/update/', 62 | type: 'PUT', 63 | success: function(result) { 64 | res = JSON.parse(result); 65 | if(res.error){ 66 | if(res.code == -1){ 67 | show('.staged-error'); 68 | } 69 | if(res.code == -2){ 70 | show('.no-internet-error'); 71 | } 72 | } 73 | else if(res.status == 'restarting'){ 74 | show('.update-done'); 75 | } 76 | } 77 | }); 78 | }); 79 | }); 80 | -------------------------------------------------------------------------------- /public/js/index_application.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('.app-link').click(function(){ 3 | var appID = $(this).attr('id').split('_').pop(); 4 | $.ajax({ 5 | url: '/application/' + appID + '/click_counter/', 6 | type: 'PUT', 7 | success: function(result) { 8 | 9 | } 10 | }); 11 | }); 12 | }); -------------------------------------------------------------------------------- /public/js/index_camera.js: -------------------------------------------------------------------------------- 1 | var mjpeg_img; 2 | 3 | function reload_img () { 4 | mjpeg_img.src = "http://local.mazizone.eu/rpi_cam/cam_pic.php?time=" + new Date().getTime(); 5 | } 6 | function error_img () { 7 | setTimeout("mjpeg_img.src = 'http://local.mazizone.eu/rpi_cam/cam_pic.php?time=' + new Date().getTime();", 100); 8 | } 9 | function init() { 10 | mjpeg_img = document.getElementById("mjpeg_dest"); 11 | mjpeg_img.onload = reload_img; 12 | mjpeg_img.onerror = error_img; 13 | reload_img(); 14 | } 15 | 16 | $( document ).ready(function() { 17 | setTimeout('init();', 100); 18 | jQuery("#gallery").unitegallery(); 19 | }); -------------------------------------------------------------------------------- /public/js/index_devices_map.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $( '.mon_map_row' ).height($( window ).height() - $( '.navbar-fixed-top' ).height() - 10); 3 | $( window ).resize(function() { 4 | $( '.mon_map_row' ).height($( window ).height() - $( '.navbar-fixed-top' ).height() - 10); 5 | }); 6 | }); 7 | -------------------------------------------------------------------------------- /public/js/index_main.js: -------------------------------------------------------------------------------- 1 | $( document ).ready(function() { 2 | $('.show-notification-button').click(function(){ 3 | var appId = $(this).attr('id').split('-').pop(); 4 | var elem = $(this); 5 | $.ajax({ 6 | url: '/notification/' + appId + '/read', 7 | type: 'PUT', 8 | success: function(result) { 9 | id = JSON.parse(result).id; 10 | elem.children('span').text('Read'); 11 | elem.children('span').addClass('label-default').removeClass('label-success'); 12 | var nof_notif = Number($(".notif-span").first().text()) - 1; 13 | if (nof_notif <= 0){ 14 | nof_notif = ''; 15 | } 16 | $(".notif-span").text( nof_notif); 17 | } 18 | }); 19 | }); 20 | 21 | var heights = $(".panel-desc-txt-block").map(function() { 22 | return $(this).height(); 23 | }).get(), 24 | maxHeight = Math.max.apply(null, heights); 25 | 26 | $(".panel-desc-txt-block").height(maxHeight); 27 | 28 | $('.language-button').click(function(){ 29 | var appId = $(this).attr('id').split('-')[0]; 30 | $.ajax({ 31 | url: '/locales/' + appId, 32 | type: 'POST', 33 | success: function(result) { 34 | location.reload(true); 35 | } 36 | }); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /public/js/index_statistics.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/index_statistics.js -------------------------------------------------------------------------------- /public/js/plugins/flot/jquery.flot.resize.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes. 2 | 3 | Copyright (c) 2007-2014 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | It works by listening for changes on the placeholder div (through the jQuery 7 | resize event plugin) - if the size changes, it will redraw the plot. 8 | 9 | There are no options. If you need to disable the plugin for some plots, you 10 | can just fix the size of their placeholders. 11 | 12 | */ 13 | 14 | /* Inline dependency: 15 | * jQuery resize event - v1.1 - 3/14/2010 16 | * http://benalman.com/projects/jquery-resize-plugin/ 17 | * 18 | * Copyright (c) 2010 "Cowboy" Ben Alman 19 | * Dual licensed under the MIT and GPL licenses. 20 | * http://benalman.com/about/license/ 21 | */ 22 | (function($,e,t){"$:nomunge";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this); 23 | 24 | (function ($) { 25 | var options = { }; // no options 26 | 27 | function init(plot) { 28 | function onResize() { 29 | var placeholder = plot.getPlaceholder(); 30 | 31 | // somebody might have hidden us and we can't plot 32 | // when we don't have the dimensions 33 | if (placeholder.width() == 0 || placeholder.height() == 0) 34 | return; 35 | 36 | plot.resize(); 37 | plot.setupGrid(); 38 | plot.draw(); 39 | } 40 | 41 | function bindEvents(plot, eventHolder) { 42 | plot.getPlaceholder().resize(onResize); 43 | } 44 | 45 | function shutdown(plot, eventHolder) { 46 | plot.getPlaceholder().unbind("resize", onResize); 47 | } 48 | 49 | plot.hooks.bindEvents.push(bindEvents); 50 | plot.hooks.shutdown.push(shutdown); 51 | } 52 | 53 | $.plot.plugins.push({ 54 | init: init, 55 | options: options, 56 | name: 'resize', 57 | version: '1.0' 58 | }); 59 | })(jQuery); 60 | -------------------------------------------------------------------------------- /public/js/plugins/flot/jquery.flot.tooltip.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jquery.flot.tooltip 3 | * 4 | * description: easy-to-use tooltips for Flot charts 5 | * version: 0.6.2 6 | * author: Krzysztof Urbas @krzysu [myviews.pl] 7 | * website: https://github.com/krzysu/flot.tooltip 8 | * 9 | * build on 2013-09-30 10 | * released under MIT License, 2012 11 | */ 12 | (function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: %y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html("")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("
").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid #111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery); -------------------------------------------------------------------------------- /public/js/plugins/qrcode/jquery.qrcode.js: -------------------------------------------------------------------------------- 1 | (function( $ ){ 2 | $.fn.qrcode = function(options) { 3 | // if options is string, 4 | if( typeof options === 'string' ){ 5 | options = { text: options }; 6 | } 7 | 8 | // set default values 9 | // typeNumber < 1 for automatic calculation 10 | options = $.extend( {}, { 11 | render : "canvas", 12 | width : 256, 13 | height : 256, 14 | typeNumber : -1, 15 | correctLevel : QRErrorCorrectLevel.H, 16 | background : "#ffffff", 17 | foreground : "#000000" 18 | }, options); 19 | 20 | var createCanvas = function(){ 21 | // create the qrcode itself 22 | var qrcode = new QRCode(options.typeNumber, options.correctLevel); 23 | qrcode.addData(options.text); 24 | qrcode.make(); 25 | 26 | // create canvas element 27 | var canvas = document.createElement('canvas'); 28 | canvas.width = options.width; 29 | canvas.height = options.height; 30 | var ctx = canvas.getContext('2d'); 31 | 32 | // compute tileW/tileH based on options.width/options.height 33 | var tileW = options.width / qrcode.getModuleCount(); 34 | var tileH = options.height / qrcode.getModuleCount(); 35 | 36 | // draw in the canvas 37 | for( var row = 0; row < qrcode.getModuleCount(); row++ ){ 38 | for( var col = 0; col < qrcode.getModuleCount(); col++ ){ 39 | ctx.fillStyle = qrcode.isDark(row, col) ? options.foreground : options.background; 40 | var w = (Math.ceil((col+1)*tileW) - Math.floor(col*tileW)); 41 | var h = (Math.ceil((row+1)*tileW) - Math.floor(row*tileW)); 42 | ctx.fillRect(Math.round(col*tileW),Math.round(row*tileH), w, h); 43 | } 44 | } 45 | // return just built canvas 46 | return canvas; 47 | } 48 | 49 | // from Jon-Carlos Rivera (https://github.com/imbcmdth) 50 | var createTable = function(){ 51 | // create the qrcode itself 52 | var qrcode = new QRCode(options.typeNumber, options.correctLevel); 53 | qrcode.addData(options.text); 54 | qrcode.make(); 55 | 56 | // create table element 57 | var $table = $('
') 58 | .css("width", options.width+"px") 59 | .css("height", options.height+"px") 60 | .css("border", "0px") 61 | .css("border-collapse", "collapse") 62 | .css('background-color', options.background); 63 | 64 | // compute tileS percentage 65 | var tileW = options.width / qrcode.getModuleCount(); 66 | var tileH = options.height / qrcode.getModuleCount(); 67 | 68 | // draw in the table 69 | for(var row = 0; row < qrcode.getModuleCount(); row++ ){ 70 | var $row = $('').css('height', tileH+"px").appendTo($table); 71 | 72 | for(var col = 0; col < qrcode.getModuleCount(); col++ ){ 73 | $('') 74 | .css('width', tileW+"px") 75 | .css('background-color', qrcode.isDark(row, col) ? options.foreground : options.background) 76 | .appendTo($row); 77 | } 78 | } 79 | // return just built canvas 80 | return $table; 81 | } 82 | 83 | 84 | return this.each(function(){ 85 | var element = options.render == "canvas" ? createCanvas() : createTable(); 86 | $(element).appendTo(this); 87 | }); 88 | }; 89 | })( jQuery ); -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/button-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/button-close.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/cover-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/cover-grid.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/icon-link32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/icon-link32.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/icon-play32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/icon-play32.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/icon-zoom32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/icon-zoom32.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/lightbox-arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/lightbox-arrow-left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/lightbox-arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/lightbox-arrow-right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/lightbox-icon-close-compact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/lightbox-icon-close-compact.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/lightbox-icon-close-compact2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/lightbox-icon-close-compact2.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/lightbox-icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/lightbox-icon-close.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-black1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-black1.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-black2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-black2.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-black3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-black3.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-black4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-black4.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-black5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-black5.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-black6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-black6.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-black7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-black7.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-white1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-white1.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-white2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-white2.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-white3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-white3.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-white4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-white4.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-white5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-white5.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-white6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-white6.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader-white7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader-white7.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader_bright.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader_bright.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/loader_skype_trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/loader_skype_trans.gif -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/not_loaded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/not_loaded.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/play-button-round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/play-button-round.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/play-button-square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/play-button-square.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/images/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/images/transparent.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/arrows_strip_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/arrows_strip_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/arrows_strip_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/arrows_strip_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/button_fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/button_fullscreen.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/button_playpause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/button_playpause.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/button_zoom_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/button_zoom_back.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/button_zoom_minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/button_zoom_minus.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/button_zoom_plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/button_zoom_plus.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_down.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_left_hortype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_left_hortype.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_right_hortype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_right_hortype.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_arrow_up.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_handle_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_handle_down.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_handle_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_handle_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_handle_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_handle_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/grid_handle_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/grid_handle_up.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/slider_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/slider_arrow_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/slider_arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/slider_arrow_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/alexis/images/slider_bullets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/alexis/images/slider_bullets.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/arrow_grid_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/arrow_grid_down.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/arrow_grid_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/arrow_grid_up.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/arrows_strip_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/arrows_strip_down.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/arrows_strip_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/arrows_strip_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/arrows_strip_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/arrows_strip_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/arrows_strip_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/arrows_strip_up.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/button_fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/button_fullscreen.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/button_playpause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/button_playpause.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/grid_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/grid_arrow_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/grid_arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/grid_arrow_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/grid_handle_black_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/grid_handle_black_bottom.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/grid_handle_black_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/grid_handle_black_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/grid_handle_black_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/grid_handle_black_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/grid_handle_black_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/grid_handle_black_top.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/icon_zoom_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/icon_zoom_back.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/icon_zoom_minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/icon_zoom_minus.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/icon_zoom_plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/icon_zoom_plus.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/slider_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/slider_arrow_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/slider_arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/slider_arrow_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/slider_bullets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/slider_bullets.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_bullets_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_bullets_blue.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_bullets_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_bullets_brown.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_bullets_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_bullets_gray.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_bullets_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_bullets_green.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_bullets_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_bullets_red.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_button_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_button_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_button_play_pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_button_play_pause.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/skins/default/tile_button_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/skins/default/tile_button_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/images/arrow_down_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/default/images/arrow_down_up.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/images/arrows_strip_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/default/images/arrows_strip_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/images/arrows_strip_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/default/images/arrows_strip_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/images/button_fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/default/images/button_fullscreen.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/images/button_fullscreen_single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/default/images/button_fullscreen_single.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/images/button_playpause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/default/images/button_playpause.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/images/button_playpause_single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/default/images/button_playpause_single.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/default/ug-theme-default.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .ug-gallery-wrapper .ug-theme-panel{ 4 | position:absolute; 5 | xbackground-color:red; 6 | z-index:11; 7 | } 8 | 9 | .ug-theme-panel .ug-strip-panel{ 10 | z-index:6; 11 | } 12 | 13 | /* --- fullscreen button -- */ 14 | 15 | .ug-theme-default .ug-default-button-fullscreen{ 16 | position:absolute; 17 | background-image:url('images/button_fullscreen.png'); 18 | width:53px; 19 | height:50px; 20 | cursor:pointer; 21 | background-position:0px 0px; 22 | z-index:3; 23 | } 24 | 25 | .ug-theme-default .ug-default-button-fullscreen.ug-button-hover{ 26 | background-position:0px -50px; 27 | } 28 | 29 | .ug-theme-default .ug-default-button-fullscreen.ug-fullscreenmode{ 30 | background-position:0px -100px; 31 | } 32 | 33 | .ug-theme-default .ug-default-button-fullscreen.ug-fullscreenmode.ug-button-hover{ 34 | background-position:0px -150px; 35 | } 36 | 37 | 38 | /* --- fullscreen button single mode-- */ 39 | 40 | .ug-theme-default .ug-default-button-fullscreen-single{ 41 | position:absolute; 42 | background-image:url('images/button_fullscreen_single.png'); 43 | width:52px; 44 | height:50px; 45 | cursor:pointer; 46 | background-position:0px 0px; 47 | z-index:3; 48 | } 49 | 50 | .ug-theme-default .ug-default-button-fullscreen-single.ug-button-hover{ 51 | background-position:0px -50px; 52 | } 53 | 54 | .ug-theme-default .ug-default-button-fullscreen-single.ug-fullscreenmode{ 55 | background-position:0px -100px; 56 | } 57 | 58 | .ug-theme-default .ug-default-button-fullscreen-single.ug-fullscreenmode.ug-button-hover{ 59 | background-position:0px -150px; 60 | } 61 | 62 | 63 | /* --- play button -- */ 64 | 65 | .ug-theme-default .ug-default-button-play{ 66 | position:absolute; 67 | background-image:url('images/button_playpause.png'); 68 | width:51px; 69 | height:50px; 70 | cursor:pointer; 71 | background-position:0px 0px; 72 | z-index:4; 73 | } 74 | 75 | .ug-theme-default .ug-default-button-play.ug-button-hover{ 76 | background-position:0px -50px; 77 | } 78 | 79 | .ug-theme-default .ug-default-button-play.ug-stop-mode{ 80 | background-position:0px -100px; 81 | } 82 | 83 | .ug-theme-default .ug-default-button-play.ug-stop-mode.ug-button-hover{ 84 | background-position:0px -150px; 85 | } 86 | 87 | /* --- play button single mode-- */ 88 | 89 | .ug-theme-default .ug-default-button-play-single{ 90 | position:absolute; 91 | background-image:url('images/button_playpause_single.png'); 92 | width:50px; 93 | height:50px; 94 | cursor:pointer; 95 | background-position:0px 0px; 96 | z-index:4; 97 | } 98 | 99 | .ug-theme-default .ug-default-button-play-single.ug-button-hover{ 100 | background-position:0px -50px; 101 | } 102 | 103 | .ug-theme-default .ug-default-button-play-single.ug-stop-mode{ 104 | background-position:0px -100px; 105 | } 106 | 107 | .ug-theme-default .ug-default-button-play-single.ug-stop-mode.ug-button-hover{ 108 | background-position:0px -150px; 109 | } 110 | 111 | 112 | /* --- hide panel button -- */ 113 | 114 | .ug-default-button-hidepanel{ 115 | position:absolute; 116 | width:23px; 117 | height:23px; 118 | z-index:5; 119 | cursor:pointer; 120 | } 121 | 122 | .ug-default-button-hidepanel .ug-default-button-hidepanel-bg{ 123 | background-color:#000000; 124 | width:23px; 125 | height:23px; 126 | position:absolute; 127 | top:0px; 128 | left:0px; 129 | opacity:0.4; 130 | filter: alpha(opacity = 40); 131 | z-index:1; 132 | } 133 | 134 | .ug-default-button-hidepanel .ug-default-button-hidepanel-tip{ 135 | position:absolute; 136 | width:7px; 137 | height:7px; 138 | background-repeat:no-repeat; 139 | background-image:url('images/arrow_down_up.png'); 140 | background-position: 0px 0px; 141 | z-index:2; 142 | } 143 | 144 | .ug-default-button-hidepanel.ug-button-hover .ug-default-button-hidepanel-tip{ 145 | background-position: 0px -7px; 146 | } 147 | 148 | .ug-default-button-hidepanel.ug-button-hidden-mode .ug-default-button-hidepanel-tip{ 149 | background-position: 0px -14px; 150 | } 151 | 152 | .ug-default-button-hidepanel.ug-button-hidden-mode.ug-button-hover .ug-default-button-hidepanel-tip{ 153 | background-position: 0px -21px; 154 | } 155 | 156 | -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/slider/ug-theme-slider.js: -------------------------------------------------------------------------------- 1 | 2 | if(typeof g_ugFunctions != "undefined") 3 | g_ugFunctions.registerTheme("slider"); 4 | else 5 | jQuery(document).ready(function(){g_ugFunctions.registerTheme("slider")}); 6 | 7 | 8 | /** 9 | * Slider gallery theme 10 | */ 11 | function UGTheme_slider(){ 12 | 13 | var t = this; 14 | var g_gallery = new UniteGalleryMain(), g_objGallery, g_objects, g_objWrapper; 15 | var g_objThumbs, g_objSlider; 16 | var g_functions = new UGFunctions(); 17 | 18 | 19 | //theme options 20 | var g_options = { 21 | 22 | }; 23 | 24 | 25 | var g_defaults = { 26 | gallery_autoplay: true, 27 | 28 | slider_scale_mode:"fill", 29 | slider_controls_always_on:true, 30 | slider_enable_text_panel:false, 31 | slider_controls_appear_ontap: true, //appear controls on tap event on touch devices 32 | slider_enable_bullets: true, 33 | slider_enable_arrows: true, 34 | slider_enable_play_button: false, 35 | slider_enable_fullscreen_button:false, 36 | slider_enable_zoom_panel: false, 37 | slider_vertical_scroll_ondrag: true 38 | }; 39 | 40 | 41 | /** 42 | * init 43 | */ 44 | this.init = function(gallery, customOptions){ 45 | 46 | g_gallery = gallery; 47 | 48 | g_options = jQuery.extend(g_options, g_defaults); 49 | g_options = jQuery.extend(g_options, customOptions); 50 | 51 | //set gallery options 52 | g_gallery.setOptions(g_options); 53 | 54 | g_gallery.initSlider(g_options); 55 | 56 | g_objects = gallery.getObjects(); 57 | 58 | //get some objects for local use 59 | g_objGallery = jQuery(gallery); 60 | g_objWrapper = g_objects.g_objWrapper; 61 | g_objSlider = g_objects.g_objSlider; 62 | } 63 | 64 | 65 | /** 66 | * set gallery html elements 67 | */ 68 | function setHtml(){ 69 | 70 | //add html elements 71 | g_objWrapper.addClass("ug-theme-slider"); 72 | 73 | //set slider html 74 | if(g_objSlider) 75 | g_objSlider.setHtml(); 76 | } 77 | 78 | 79 | /** 80 | * place the slider according the thumbs panel size and position 81 | */ 82 | function placeSlider(){ 83 | 84 | var sliderHeight = g_gallery.getHeight(); 85 | var sliderWidth = g_gallery.getWidth(); 86 | 87 | g_objSlider.setSize(sliderWidth, sliderHeight); 88 | g_objSlider.setPosition(0, 0); 89 | } 90 | 91 | 92 | 93 | /** 94 | * on gallery size change - resize the theme. 95 | */ 96 | function onSizeChange(){ 97 | 98 | placeSlider(); 99 | 100 | } 101 | 102 | 103 | /** 104 | * init buttons functionality and events 105 | */ 106 | function initEvents(){ 107 | 108 | g_objGallery.on(g_gallery.events.SIZE_CHANGE,onSizeChange); 109 | //g_objGallery.on(g_gallery.events.ITEM_CHANGE,onItemChange); 110 | } 111 | 112 | /** 113 | * init all the theme's elements and set them to their places 114 | * according gallery's dimentions. 115 | * this function should work on resize too. 116 | */ 117 | function initAndPlaceElements(){ 118 | placeSlider(); 119 | g_objSlider.run(); 120 | 121 | } 122 | 123 | /** 124 | * run the theme setting 125 | */ 126 | this.run = function(){ 127 | 128 | setHtml(); 129 | 130 | initAndPlaceElements(); 131 | 132 | initEvents(); 133 | } 134 | 135 | 136 | } 137 | -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/video/images/arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/video/images/arrow_left.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/video/images/arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mazi-project/portal/e3b85e2519e3afbd219b0da823bab4ee51ab64cb/public/js/plugins/unitegallery/themes/video/images/arrow_right.png -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/video/skin-bottom-text.css: -------------------------------------------------------------------------------- 1 | @CHARSET "ISO-8859-1"; 2 | 3 | 4 | /* ----- Strip Panel ------- */ 5 | 6 | .ug-videoskin-bottom-text .ug-strip-panel{ 7 | background-color:#232323; 8 | } 9 | 10 | /* ----- Thumb Wrapper ------- */ 11 | 12 | .ug-videoskin-bottom-text .ug-thumb-wrapper{ 13 | background-color:#232323; 14 | border-bottom:1px solid #393939; 15 | width:200px; 16 | height:80px; 17 | cursor:pointer; 18 | text-align:left; 19 | } 20 | 21 | 22 | .ug-videoskin-bottom-text .ug-thumb-wrapper:last-child{ 23 | border-bottom:none; 24 | } 25 | 26 | /* - thumb selected and over - */ 27 | 28 | .ug-videoskin-bottom-text .ug-thumb-wrapper.ug-thumb-over{ 29 | cursor:pointer; 30 | background-color:#1A1A1A; 31 | } 32 | 33 | .ug-videoskin-bottom-text .ug-thumb-wrapper.ug-thumb-selected{ 34 | cursor:default; 35 | background-color:#176DB3; 36 | } 37 | 38 | /* ----- Thumb Inner data ------- */ 39 | 40 | .ug-videoskin-bottom-text .ug-thumb-inner{ 41 | padding-top:15px; 42 | padding-left:15px; 43 | padding-right:5px; 44 | } 45 | 46 | .ug-videoskin-bottom-text .ug-thumb-title{ 47 | color:white; 48 | font-size:14px; 49 | height:18px; 50 | overflow:hidden; 51 | line-height:normal; 52 | } 53 | 54 | .ug-videoskin-bottom-text .ug-thumb-desc{ 55 | color:#dddddd; 56 | font-size:11px; 57 | line-height:normal; 58 | padding-top:5px; 59 | } 60 | 61 | -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/video/skin-right-no-thumb.css: -------------------------------------------------------------------------------- 1 | @CHARSET "ISO-8859-1"; 2 | 3 | 4 | 5 | /* ----- Strip Panel ------- */ 6 | 7 | .ug-videoskin-right-no-thumb .ug-strip-panel{ 8 | background-color:#232323; 9 | } 10 | 11 | /* ----- Thumb Wrapper ------- */ 12 | 13 | .ug-videoskin-right-no-thumb .ug-thumb-wrapper{ 14 | background-color:#232323; 15 | border-bottom:1px solid #393939; 16 | width:380px; 17 | height:70px; 18 | cursor:pointer; 19 | text-align:left; 20 | } 21 | 22 | 23 | .ug-videoskin-right-no-thumb .ug-thumb-wrapper:last-child{ 24 | border-bottom:none; 25 | } 26 | 27 | /* - thumb selected and over - */ 28 | 29 | .ug-videoskin-right-no-thumb .ug-thumb-wrapper.ug-thumb-over{ 30 | cursor:pointer; 31 | background-color:#1A1A1A; 32 | } 33 | 34 | .ug-videoskin-right-no-thumb .ug-thumb-wrapper.ug-thumb-selected{ 35 | cursor:default; 36 | background-color:#176DB3; 37 | } 38 | 39 | /* ----- Thumb Inner data ------- */ 40 | 41 | .ug-videoskin-right-no-thumb .ug-thumb-inner{ 42 | padding-top:15px; 43 | padding-left:15px; 44 | padding-right:5px; 45 | } 46 | 47 | .ug-videoskin-right-no-thumb .ug-thumb-title{ 48 | color:white; 49 | font-size:14px; 50 | height:18px; 51 | overflow:hidden; 52 | line-height:normal; 53 | } 54 | 55 | .ug-videoskin-right-no-thumb .ug-thumb-desc{ 56 | color:#dddddd; 57 | font-size:11px; 58 | line-height:normal; 59 | } 60 | 61 | /* ----- Buttons Panel ------- */ 62 | 63 | .ug-videoskin-right-no-thumb .ug-video-buttons-panel{ 64 | height:42px; 65 | background-color:#000; 66 | position:absolute; 67 | display:none; 68 | } 69 | 70 | .ug-videoskin-right-no-thumb .ug-button-prev-video{ 71 | width:50%; 72 | height:42px; 73 | float:left; 74 | background-image:url('images/arrow_left.png'); 75 | cursor:pointer; 76 | background-repeat:no-repeat; 77 | background-position:center; 78 | box-sizing:border-box; 79 | border-right:1px solid #444; 80 | } 81 | 82 | .ug-videoskin-right-no-thumb .ug-button-prev-video:hover, .ug-videoskin-right-no-thumb .ug-button-next-video:hover 83 | { 84 | background-color:#444; 85 | } 86 | 87 | .ug-videoskin-right-no-thumb .ug-button-next-video{ 88 | width:50%; 89 | height:42px; 90 | float:right; 91 | background-image:url('images/arrow_right.png'); 92 | cursor:pointer; 93 | background-repeat:no-repeat; 94 | background-position:center; 95 | } 96 | 97 | 98 | /* ----- Under 960 ------- */ 99 | .ug-under-960.ug-videoskin-right-no-thumb .ug-thumb-wrapper 100 | { 101 | width:320px; 102 | } 103 | 104 | .ug-under-960.ug-videoskin-right-no-thumb .ug-thumb-title { 105 | width: 289px; 106 | height:18px; 107 | font-size:14px; 108 | } 109 | .ug-under-960.ug-videoskin-right-no-thumb .ug-thumb-desc 110 | { 111 | width:289px; 112 | padding-top:0px; 113 | } 114 | 115 | .ug-under-960.ug-videoskin-right-no-thumb .ug-video-buttons-panel{ 116 | display:none; 117 | } 118 | 119 | /* ----- Under 780 ------- */ 120 | 121 | .ug-under-780.ug-videoskin-right-no-thumb .ug-thumb-wrapper 122 | { 123 | width:240px; 124 | } 125 | 126 | .ug-under-780.ug-videoskin-right-no-thumb .ug-thumb-title { 127 | width: 167px; 128 | height:18px; 129 | font-size:14px; 130 | } 131 | 132 | .ug-under-780.ug-videoskin-right-no-thumb .ug-thumb-desc 133 | { 134 | width:167px; 135 | padding-top:0px; 136 | } 137 | 138 | .ug-under-780.ug-videoskin-right-no-thumb .ug-video-buttons-panel{ 139 | display:none; 140 | } 141 | 142 | 143 | /* ----- Under 480 ------- */ 144 | 145 | .ug-under-480.ug-videoskin-right-no-thumb .ug-thumb-wrapper 146 | { 147 | width:0px; 148 | } 149 | 150 | .ug-under-480.ug-videoskin-right-no-thumb .ug-thumb-title { 151 | display:none; 152 | } 153 | 154 | .ug-under-480.ug-videoskin-right-no-thumb .ug-thumb-desc 155 | { 156 | display:none; 157 | } 158 | 159 | .ug-under-480.ug-videoskin-right-no-thumb .ug-thumb-inner { 160 | padding-left: 8px; 161 | padding-right: 5px; 162 | padding-top: 12px; 163 | } 164 | 165 | 166 | .ug-under-480.ug-videoskin-right-no-thumb .ug-video-buttons-panel{ 167 | display:block; 168 | } 169 | 170 | -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/video/skin-right-thumb.css: -------------------------------------------------------------------------------- 1 | @CHARSET "ISO-8859-1"; 2 | 3 | /* ----- Strip Panel ------- */ 4 | 5 | .ug-videoskin-right-thumb .ug-strip-panel{ 6 | background-color:#232323; 7 | } 8 | 9 | /* ----- Thumb Wrapper ------- */ 10 | 11 | .ug-videoskin-right-thumb .ug-thumb-wrapper{ 12 | background-color:#232323; 13 | border-bottom:1px solid #393939; 14 | width:420px; 15 | height:61px; 16 | cursor:pointer; 17 | text-align:left; 18 | } 19 | 20 | .ug-videoskin-right-thumb .ug-thumb-wrapper:last-child{ 21 | border-bottom:none; 22 | } 23 | 24 | /* - thumb selected and over - */ 25 | 26 | .ug-videoskin-right-thumb .ug-thumb-wrapper.ug-thumb-over{ 27 | cursor:pointer; 28 | background-color:#1A1A1A; 29 | } 30 | 31 | .ug-videoskin-right-thumb .ug-thumb-wrapper.ug-thumb-selected{ 32 | cursor:default; 33 | background-color:#525252; 34 | } 35 | 36 | /* ----- Thumb Inner data ------- */ 37 | 38 | 39 | .ug-videoskin-right-thumb .ug-thumb-icon{ 40 | width:72px; 41 | height:40px; 42 | float:left; 43 | background-position:center center; 44 | background-size:cover; 45 | } 46 | 47 | .ug-videoskin-right-thumb .ug-thumb-selected .ug-thumb-icon{ 48 | border:2px solid red; 49 | box-sizing: border-box; 50 | } 51 | 52 | .ug-videoskin-right-thumb .ug-thumb-right{ 53 | float:left; 54 | padding-left:15px; 55 | } 56 | 57 | 58 | .ug-videoskin-right-thumb .ug-thumb-inner{ 59 | padding-top:12px; 60 | padding-left:13px; 61 | padding-right:5px; 62 | } 63 | 64 | .ug-videoskin-right-thumb .ug-thumb-title{ 65 | color:white; 66 | font-size:16px; 67 | overflow:hidden; 68 | width:300px; 69 | height:20px; 70 | line-height:normal; 71 | } 72 | 73 | .ug-videoskin-right-thumb .ug-thumb-desc{ 74 | color:#999999; 75 | font-size:11px; 76 | width:300px; 77 | line-height:normal; 78 | } 79 | 80 | /* ----- Under 960 ------- */ 81 | .ug-under-960.ug-videoskin-right-thumb .ug-thumb-wrapper 82 | { 83 | width:320px; 84 | } 85 | 86 | .ug-under-960.ug-videoskin-right-thumb .ug-thumb-title { 87 | width: 206px; 88 | height:18px; 89 | font-size:14px; 90 | } 91 | .ug-under-960.ug-videoskin-right-thumb .ug-thumb-desc 92 | { 93 | width:167px; 94 | padding-top:0px; 95 | line-height:normal; 96 | } 97 | 98 | 99 | /* ----- Under 780 ------- */ 100 | 101 | .ug-under-780.ug-videoskin-right-thumb .ug-thumb-wrapper 102 | { 103 | width:240px; 104 | } 105 | 106 | .ug-under-780.ug-videoskin-right-thumb .ug-thumb-icon 107 | { 108 | width:40px; 109 | } 110 | 111 | .ug-under-780.ug-videoskin-right-thumb .ug-thumb-title { 112 | width: 167px; 113 | height:18px; 114 | font-size:14px; 115 | } 116 | 117 | .ug-under-780.ug-videoskin-right-thumb .ug-thumb-desc 118 | { 119 | width:167px; 120 | padding-top:0px; 121 | line-height:normal; 122 | } 123 | 124 | 125 | /* ----- Under 480 ------- */ 126 | 127 | .ug-under-480.ug-videoskin-right-thumb .ug-thumb-wrapper 128 | { 129 | width:56px; 130 | } 131 | 132 | .ug-under-480.ug-videoskin-right-thumb .ug-thumb-title { 133 | display:none; 134 | } 135 | 136 | .ug-under-480.ug-videoskin-right-thumb .ug-thumb-desc 137 | { 138 | display:none; 139 | } 140 | 141 | .ug-under-480.ug-videoskin-right-thumb .ug-thumb-inner { 142 | padding-left: 8px; 143 | padding-right: 5px; 144 | padding-top: 12px; 145 | } 146 | 147 | .ug-under-480.ug-videoskin-right-thumb .ug-thumb-icon 148 | { 149 | width:40px; 150 | } -------------------------------------------------------------------------------- /public/js/plugins/unitegallery/themes/video/skin-right-title-only.css: -------------------------------------------------------------------------------- 1 | @CHARSET "ISO-8859-1"; 2 | 3 | /* ----- Strip Panel ------- */ 4 | 5 | .ug-videoskin-right-title-only .ug-strip-panel{ 6 | background-color:#232323; 7 | } 8 | 9 | /* ----- Thumb Wrapper ------- */ 10 | 11 | .ug-videoskin-right-title-only .ug-thumb-wrapper{ 12 | background-color:#232323; 13 | border-bottom:1px solid #393939; 14 | width:360px; 15 | height:60px; 16 | cursor:pointer; 17 | text-align:left; 18 | } 19 | 20 | 21 | .ug-videoskin-right-title-only .ug-thumb-wrapper:last-child{ 22 | border-bottom:none; 23 | } 24 | 25 | /* - thumb selected and over - */ 26 | 27 | .ug-videoskin-right-title-only .ug-thumb-wrapper.ug-thumb-over{ 28 | cursor:pointer; 29 | background-color:#1A1A1A; 30 | } 31 | 32 | .ug-videoskin-right-title-only .ug-thumb-wrapper.ug-thumb-selected{ 33 | cursor:default; 34 | background-color:#176DB3; 35 | } 36 | 37 | /* ----- Thumb Inner data ------- */ 38 | 39 | .ug-videoskin-right-title-only .ug-thumb-inner{ 40 | padding-top:18px; 41 | padding-left:20px; 42 | padding-right:10px; 43 | } 44 | 45 | .ug-videoskin-right-title-only .ug-thumb-title{ 46 | color:white; 47 | font-size:14px; 48 | line-height:normal; 49 | } 50 | 51 | 52 | /* ----- Buttons Panel ------- */ 53 | 54 | .ug-videoskin-right-title-only .ug-video-buttons-panel{ 55 | height:42px; 56 | background-color:#000; 57 | position:absolute; 58 | display:none; 59 | } 60 | 61 | .ug-videoskin-right-title-only .ug-button-prev-video{ 62 | width:50%; 63 | height:42px; 64 | float:left; 65 | background-image:url('images/arrow_left.png'); 66 | cursor:pointer; 67 | background-repeat:no-repeat; 68 | background-position:center; 69 | box-sizing:border-box; 70 | border-right:1px solid #444; 71 | } 72 | 73 | .ug-videoskin-right-title-only .ug-button-prev-video:hover, .ug-videoskin-right-title-only .ug-button-next-video:hover 74 | { 75 | background-color:#444; 76 | } 77 | 78 | .ug-videoskin-right-title-only .ug-button-next-video{ 79 | width:50%; 80 | height:42px; 81 | float:right; 82 | background-image:url('images/arrow_right.png'); 83 | cursor:pointer; 84 | background-repeat:no-repeat; 85 | background-position:center; 86 | } 87 | 88 | 89 | 90 | /* ----- Under 960 ------- */ 91 | .ug-under-960.ug-videoskin-right-title-only .ug-thumb-wrapper 92 | { 93 | width:300px; 94 | } 95 | 96 | .ug-under-960.ug-videoskin-right-title-only .ug-thumb-title { 97 | width: 289px; 98 | height:18px; 99 | font-size:14px; 100 | line-height:normal; 101 | } 102 | 103 | 104 | .ug-under-960.ug-videoskin-right-title-only .ug-video-buttons-panel{ 105 | display:none; 106 | } 107 | 108 | /* ----- Under 780 ------- */ 109 | 110 | .ug-under-780.ug-videoskin-right-title-only .ug-thumb-wrapper 111 | { 112 | width:240px; 113 | } 114 | 115 | .ug-under-780.ug-videoskin-right-title-only .ug-thumb-icon 116 | { 117 | width:40px; 118 | } 119 | 120 | .ug-under-780.ug-videoskin-right-title-only .ug-thumb-title { 121 | width: 167px; 122 | height:18px; 123 | font-size:14px; 124 | } 125 | 126 | 127 | .ug-under-780.ug-videoskin-right-title-only .ug-video-buttons-panel{ 128 | display:none; 129 | } 130 | 131 | 132 | /* ----- Under 480 ------- */ 133 | 134 | .ug-under-480.ug-videoskin-right-title-only .ug-thumb-wrapper 135 | { 136 | width:0px; 137 | } 138 | 139 | .ug-under-480.ug-videoskin-right-title-only .ug-thumb-title { 140 | display:none; 141 | } 142 | 143 | 144 | .ug-under-480.ug-videoskin-right-title-only .ug-thumb-inner { 145 | padding-left: 8px; 146 | padding-right: 5px; 147 | padding-top: 12px; 148 | } 149 | 150 | .ug-under-480.ug-videoskin-right-title-only .ug-thumb-icon 151 | { 152 | width:40px; 153 | } 154 | 155 | .ug-under-480.ug-videoskin-right-title-only .ug-video-buttons-panel{ 156 | display:block; 157 | } 158 | -------------------------------------------------------------------------------- /public/js/setup.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | //Initialize tooltips 3 | $('.nav-tabs > li a[title]').tooltip(); 4 | 5 | //Wizard 6 | $('a[data-toggle="tab"]').on('show.bs.tab', function (e) { 7 | var $target = $(e.target); 8 | 9 | if ($target.parent().hasClass('disabled')) { 10 | return false; 11 | } 12 | }); 13 | 14 | $(".next-step").click(function (e) { 15 | var $active = $('.wizard .nav-tabs li.active'); 16 | $active.next().removeClass('disabled'); 17 | nextTab($active); 18 | }); 19 | 20 | $(".prev-step").click(function (e) { 21 | var $active = $('.wizard .nav-tabs li.active'); 22 | prevTab($active); 23 | }); 24 | 25 | $('.language-button').click(function(){ 26 | var appId = $(this).attr('id').split('-')[0]; 27 | $.ajax({ 28 | url: '/locales/' + appId, 29 | type: 'POST', 30 | success: function(result) { 31 | location.reload(true); 32 | } 33 | }); 34 | }); 35 | 36 | jQuery('#datetimepicker').datetimepicker(); 37 | }); 38 | 39 | function nextTab(elem) { 40 | $(elem).next().find('a[data-toggle="tab"]').click(); 41 | } 42 | function prevTab(elem) { 43 | $(elem).prev().find('a[data-toggle="tab"]').click(); 44 | } 45 | -------------------------------------------------------------------------------- /views/admin_change_mysql_password.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | 17 |
18 |
2 |
3 | 17 |
18 |
2 |
3 |
4 | 5 | <% unless error_msg.nil? %> 6 |
7 |

<%= error_msg %>

8 |
9 | <% end %> 10 | 16 |
17 |
18 | 2 |
3 |
4 | 5 | <% unless error_msg.nil? %> 6 |
7 |

<%= error_msg %>

8 |
9 | <% end %> 10 | 15 |
16 |
17 | 2 |
3 |

4 | MAZI Zone <%= I18n.translate("admin.logs-page.subheader") %> 5 |

6 |
7 | 8 | 9 |
10 |
11 |

12 | <%= I18n.translate("admin.logs-page.message") %>: 13 |

14 |
15 |
16 |
17 |
18 |
<%= I18n.translate("admin.logs-page.portal-log-panel.header") %> 19 | 20 |
21 |
22 | 23 |
24 |
25 |
26 |
27 | 30 |
31 |
32 | 35 |
36 |
37 | 40 |
41 |
42 |
43 | 44 |
45 |
46 |
<%= portal_log %>
47 |
48 |
49 |
50 |
51 |
52 |
53 | -------------------------------------------------------------------------------- /views/admin_main.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | <%= I18n.translate("admin.top-menu.header") %> 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | <% js.each do |j| %> 26 | 27 | <% end %> 28 | 29 | 30 | 31 |
32 | 33 | <% local_data[:main_body] = main_body %> 34 | <% local_data[:locale] = locale %> 35 | <% local_data[:locales] = locales %> 36 | <% local_data[:version] = version %> 37 | <%= erb :admin_main_menu, locals: local_data %> 38 |
39 |
40 |

Loading, please wait...

41 |
42 |
43 | 44 |
45 |
46 | 47 | <% local_data[:error_msg] = error_msg %> 48 | <%= erb main_body, locals: local_data %> 49 | 50 |
51 |
52 |
53 | 54 | 55 | 78 | 79 | 80 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /views/admin_set_date.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | 22 |
23 |
24 | -------------------------------------------------------------------------------- /views/index_application.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= config_data[:applications_title]%> <%= config_data[:applications_subtitle]%>

3 |

<%= config_data[:applications_welcome_text]%>

4 |
5 | 6 |
7 | <% colors = ['green', 'red', 'yellow', 'blue', 'purple']%> 8 | <% icons = ['search', 'tasks', 'ambulance', 'plane', 'shield', 'shopping-cart']%> 9 | <% application_instances.each do |app| %> 10 | <% next if !app.enabled || !app.application.enabled %> 11 | <% icon = app.icon ? app.icon : app.application.icon %> 12 | <% color = app.color ? app.color : app.application.color %> 13 |
14 | 33 |
34 | <% end %> 35 |
36 | -------------------------------------------------------------------------------- /views/index_camera.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= I18n.translate("portal.camera-page.header") %>

3 |

<%= I18n.translate("portal.camera-page.subheader") %>

4 |
5 | 6 |
7 |
8 |
9 |
<%= I18n.translate("portal.camera-page.live-stream-header") %>
10 |
11 | <% if camera_installed && rpi_enabled %> 12 |
13 | <% else %> 14 |

<%= I18n.translate("portal.camera-page.no-camera-warn") %>

15 | <% end %> 16 |
17 |
18 |
19 |
20 |
21 |
<%= I18n.translate("portal.camera-page.media-library-header") %>
22 |
23 | <% if rpi_files[:photos].empty? && rpi_files[:videos].empty? %> 24 |

<%= I18n.translate("portal.camera-page.no-media-warn") %>

25 | <% else %> 26 | 40 | <% end %> 41 |
42 |
43 |
44 |
45 | -------------------------------------------------------------------------------- /views/index_documentation.erb: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |

User Documentation

6 |

User Documentation

7 |
8 |
9 |
10 |
11 |

Description

12 |

13 | In the following we include some additional tips from our experience using the pre-installed applications on the MAZI toolkit. 14 |

15 | 16 |

Etherpad tips:

17 |

The menu items of etherpad are not very self-explanatory. These are three important functions (whose corresponding menu items are depicted in the Figure below):

18 |
    19 |
  • You can "remove" the special highlight colour of a selected text by clicking on the "Clear Authorship colours" button (it looks like a "crossed" eye)
  • 20 |
  • You can download locally any file by clicking on the "two arrows" button
  • 21 |
22 | 23 |

24 |

Feel free to explore the other menu items.

25 |

Etherpad transforms immediately URLs to clickable links and thus makes it very easy to create new pads by editing a URL address and clicking on it. You can do the same directly on your browser's address bar.

26 | 27 |

Nextcloud tips:

28 |

29 | Many people get confused by the fact that when you click on the folder icon, this is only "selected" but to "enter" you have to click on the folder name (as it works with Dropbox). 30 |

31 | 32 |

33 | For iPhone users, there is often a problem with uploading photos, which are all named image.jpg. So, if one uploads more than one photo, there is a pop-up window which asks whether it should replace or not the previous photo, and in some iPhone models this pop-up window is not fully visible and the user cannot make a choice. In this case, the solution is to upload photos one be one, and rename them everytime on nextcloud. 34 |

35 | 36 |

Interview archive tips:

37 |

38 | You can download the MAZI recorder app for Android from this link: https://github.com/lutzer/MaziRecorderAndroid/raw/master/MaziRecorder.apk (you will need to allow the installation of apps from third parties) 39 |

40 | 41 |

42 | The app for iPhone and more detailed documentation coming soon ... 43 |

44 | 45 |

Guestbook tips:

46 |

47 | Detailed documentation for the MAZI Guestbook application is available here: https://github.com/mazi-project/guestbook/wiki/ 48 |

49 |
50 |
51 |
52 |
53 |
54 |
-------------------------------------------------------------------------------- /views/index_monitoring_map.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 |
25 | <%= erb :monitoring_map, locals: local_data %> 26 |
27 |
28 | 29 | 30 | -------------------------------------------------------------------------------- /views/index_statistics.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | <%= config_data[:applications_title]%> <%= I18n.translate("portal.system-page.subheader") %> 5 |

6 |
7 |
8 | 9 |
10 |
11 |
12 |
13 |
14 |
<%= I18n.translate("portal.system-page.users") %>
15 |
<%= users[:online]%>
16 | 17 |
18 |
19 |
20 | 21 |
22 |
23 |
24 |
25 |
<%= I18n.translate("portal.system-page.app-clicks") %>
26 |
<%= clicks %>
27 | 28 |
29 |
30 |
31 | 32 | <% color = temp.gsub("'C", '').to_f > 70.0 ? 'red' : 'green' %> 33 |
34 |
35 |
36 |
37 |
<%= I18n.translate("portal.system-page.temperature") %>
38 |
<%= temp %>
39 | 40 |
41 |
42 |
43 | 44 | <% color = cpu.gsub("%", '').to_f > 80.0 ? 'red' : 'green' %> 45 |
46 |
47 |
48 |
49 |
<%= I18n.translate("portal.system-page.cpu") %>
50 |
<%= cpu %>
51 | 52 |
53 |
54 |
55 | 56 | <% color = ram.gsub("%", '').to_f > 80.0 ? 'red' : 'green' %> 57 |
58 |
59 |
60 |
61 |
<%= I18n.translate("portal.system-page.ram") %>
62 |
<%= ram %>
63 | 64 |
65 |
66 |
67 | 68 | <% color = storage.gsub("%", '').to_f > 80.0 ? 'red' : 'green' %> 69 |
70 |
71 |
72 |
73 |
<%= I18n.translate("portal.system-page.storage") %>
74 |
<%= storage %>
75 | 76 |
77 |
78 |
79 |
80 | -------------------------------------------------------------------------------- /views/splash.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 25 | 26 | 27 |
28 |

Welcome to the <%= name %>.

29 | 30 |

This zone provides access to the <%= name %> applications:

31 | 32 | <% 33 | app_names = [] 34 | apps.each do |app| 35 | app_names << app.application.name if app.enabled && !app_names.include?(app.application.name) 36 | end 37 | %> 38 | 39 | 44 |

The zone is in <%= mode %> mode, <%= message_mode %>

45 |
46 |
47 | Info! If this window stays open after you have connected, enter the following into the browser bar <%= domain %>, then close this window. 48 |
49 | ENTER 50 |
51 |
52 | 53 | 61 | 73 | 74 | --------------------------------------------------------------------------------