├── log.txt ├── uploads └── index.html ├── config ├── .htaccess ├── valid_modules.php └── config.php ├── include ├── .htaccess ├── admin │ ├── modules │ │ ├── default.php │ │ ├── kate_configurator.php │ │ ├── admins.php │ │ └── radios.php │ └── check_logged.php ├── api │ ├── get_radios_by_ids.php │ └── radiosearch.php ├── template.php ├── security.php └── mysql.php ├── templates └── admin │ ├── cross.html │ ├── box_end.html │ ├── aftercross.html │ ├── box_start.html │ ├── sideblock.html │ ├── footer.html │ ├── header.html │ ├── header_full.html │ ├── login.html │ └── adm_create.html ├── images ├── ddwrt.png ├── loading.gif ├── spacer.gif ├── xiaomi.jpg └── admin │ └── template │ ├── edit.png │ ├── home.png │ ├── mail.png │ ├── plus.gif │ ├── plus.png │ ├── save.png │ ├── sprv.png │ ├── tabs.png │ ├── typo.png │ ├── accept.png │ ├── addnew.png │ ├── admin.png │ ├── admins.png │ ├── cancel.png │ ├── checked.gif │ ├── close.png │ ├── cmslogo.png │ ├── comment.png │ ├── config.png │ ├── content.png │ ├── design.png │ ├── error.png │ ├── footer.jpg │ ├── forms.png │ ├── gallery.png │ ├── general.png │ ├── graphs.png │ ├── grids.png │ ├── logout.png │ ├── media.png │ ├── pages.png │ ├── preview.png │ ├── spacer.jpg │ ├── stats.png │ ├── success.png │ ├── tables.png │ ├── users.png │ ├── warning.png │ ├── welcome.png │ ├── back_blue.jpg │ ├── back_grey.jpg │ ├── back_red.jpg │ ├── mods_nav.png │ ├── new_mail.png │ ├── settings.png │ ├── ui-icons.png │ ├── back_green.jpg │ ├── back_navbar.jpg │ ├── back_purple.jpg │ ├── back_red_2.jpg │ ├── back_topbar.jpg │ ├── back_white.jpg │ ├── close_blue.png │ ├── cmslogo_big.png │ ├── information.png │ ├── navbar_sub.png │ ├── search_input.png │ ├── small │ ├── bullet.gif │ ├── arrow_up.png │ └── arrow_down.png │ ├── back_nav_hover.jpg │ ├── back_red_hover.jpg │ ├── back_subnavbar.png │ ├── cmslogo_small.png │ ├── general_white.png │ ├── grayscale │ ├── sort.png │ ├── user.png │ ├── options.png │ ├── thumbup.png │ ├── calendar.png │ └── comments.png │ ├── icons │ ├── 16 │ │ ├── blog.png │ │ ├── files.png │ │ ├── news.png │ │ ├── pages.png │ │ ├── shop.png │ │ ├── users.png │ │ ├── video.png │ │ ├── banners.png │ │ ├── callback.png │ │ ├── colors.png │ │ ├── contacts.png │ │ ├── homepage.png │ │ ├── manager.png │ │ ├── measure.png │ │ ├── photos.png │ │ ├── reviews.png │ │ ├── calculator.png │ │ ├── catalogue.png │ │ └── questions.png │ └── 48 │ │ ├── blog.png │ │ ├── files.png │ │ ├── news.png │ │ ├── notes.png │ │ ├── pages.png │ │ ├── shop.png │ │ ├── stats.png │ │ ├── users.png │ │ ├── video.png │ │ ├── contacts.png │ │ ├── database.png │ │ ├── design.png │ │ ├── homepage.png │ │ ├── install.png │ │ ├── manager.png │ │ ├── packages.png │ │ ├── photos.png │ │ ├── settings.png │ │ ├── catalogue.png │ │ ├── admin_users.png │ │ └── filemanager.png │ ├── back_blue_hover.jpg │ ├── back_green_hover.jpg │ ├── back_grey_hover.jpg │ ├── back_h2_box_black.jpg │ ├── back_h2_box_blue.jpg │ ├── back_h2_box_green.jpg │ ├── back_h2_box_red.jpg │ ├── back_h2_box_white.jpg │ ├── back_header_table.jpg │ ├── back_white_hover.jpg │ ├── subbutton_active.jpg │ ├── subbutton_active2.jpg │ ├── subbutton_active3.jpg │ ├── subbutton_hover.jpg │ └── back_navbar_active.jpg ├── css ├── jquery │ ├── jquery.ui.all.css │ ├── images │ │ ├── ui-anim_basic_16x16.gif │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_2e83ff_256x240.png │ │ ├── ui-icons_454545_256x240.png │ │ ├── ui-icons_888888_256x240.png │ │ ├── ui-icons_cd0a0a_256x240.png │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ └── ui-bg_highlight-soft_75_cccccc_1x100.png │ ├── jquery.ui.selectable.css │ ├── jquery.ui.progressbar.css │ ├── jquery.ui.base.css │ ├── jquery.ui.accordion.css │ ├── jquery.ui.autocomplete.css │ ├── jquery.ui.slider.css │ ├── jquery.ui.resizable.css │ ├── jquery.ui.dialog.css │ ├── jquery.ui.tabs.css │ ├── jquery.ui.core.css │ ├── jquery.ui.button.css │ └── jquery.ui.datepicker.css └── table_data.css ├── lib └── Requests │ ├── Exception │ ├── Transport.php │ ├── HTTP │ │ ├── 410.php │ │ ├── 403.php │ │ ├── 404.php │ │ ├── 409.php │ │ ├── 305.php │ │ ├── 400.php │ │ ├── 502.php │ │ ├── 304.php │ │ ├── 401.php │ │ ├── 306.php │ │ ├── 406.php │ │ ├── 402.php │ │ ├── 408.php │ │ ├── 411.php │ │ ├── 501.php │ │ ├── 504.php │ │ ├── 405.php │ │ ├── 412.php │ │ ├── 417.php │ │ ├── 503.php │ │ ├── 414.php │ │ ├── 500.php │ │ ├── 415.php │ │ ├── 413.php │ │ ├── 505.php │ │ ├── 407.php │ │ ├── 416.php │ │ ├── 418.php │ │ ├── 428.php │ │ ├── 431.php │ │ ├── 511.php │ │ ├── 429.php │ │ └── Unknown.php │ ├── Transport │ │ └── cURL.php │ └── HTTP.php │ ├── Hooker.php │ ├── Auth.php │ ├── Proxy.php │ ├── Utility │ ├── FilteredIterator.php │ └── CaseInsensitiveDictionary.php │ ├── Exception.php │ ├── Transport.php │ ├── Hooks.php │ ├── Auth │ └── Basic.php │ ├── Response │ └── Headers.php │ ├── Response.php │ ├── Proxy │ └── HTTP.php │ ├── Cookie │ └── Jar.php │ ├── SSL.php │ ├── IPv6.php │ └── Session.php ├── admin.php ├── db.sql ├── index.php ├── js ├── jquery.droppy.js ├── cookie.js └── custom.js ├── play.php └── README.md /log.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /uploads/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all -------------------------------------------------------------------------------- /include/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all -------------------------------------------------------------------------------- /templates/admin/cross.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
-------------------------------------------------------------------------------- /templates/admin/box_end.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | -------------------------------------------------------------------------------- /images/ddwrt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/ddwrt.png -------------------------------------------------------------------------------- /images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/loading.gif -------------------------------------------------------------------------------- /images/spacer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/spacer.gif -------------------------------------------------------------------------------- /images/xiaomi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/xiaomi.jpg -------------------------------------------------------------------------------- /css/jquery/jquery.ui.all.css: -------------------------------------------------------------------------------- 1 | @import "jquery.ui.base.css"; 2 | @import "jquery.ui.theme.css"; 3 | -------------------------------------------------------------------------------- /templates/admin/aftercross.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | -------------------------------------------------------------------------------- /images/admin/template/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/edit.png -------------------------------------------------------------------------------- /images/admin/template/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/home.png -------------------------------------------------------------------------------- /images/admin/template/mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/mail.png -------------------------------------------------------------------------------- /images/admin/template/plus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/plus.gif -------------------------------------------------------------------------------- /images/admin/template/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/plus.png -------------------------------------------------------------------------------- /images/admin/template/save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/save.png -------------------------------------------------------------------------------- /images/admin/template/sprv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/sprv.png -------------------------------------------------------------------------------- /images/admin/template/tabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/tabs.png -------------------------------------------------------------------------------- /images/admin/template/typo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/typo.png -------------------------------------------------------------------------------- /images/admin/template/accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/accept.png -------------------------------------------------------------------------------- /images/admin/template/addnew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/addnew.png -------------------------------------------------------------------------------- /images/admin/template/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/admin.png -------------------------------------------------------------------------------- /images/admin/template/admins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/admins.png -------------------------------------------------------------------------------- /images/admin/template/cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/cancel.png -------------------------------------------------------------------------------- /images/admin/template/checked.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/checked.gif -------------------------------------------------------------------------------- /images/admin/template/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/close.png -------------------------------------------------------------------------------- /images/admin/template/cmslogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/cmslogo.png -------------------------------------------------------------------------------- /images/admin/template/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/comment.png -------------------------------------------------------------------------------- /images/admin/template/config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/config.png -------------------------------------------------------------------------------- /images/admin/template/content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/content.png -------------------------------------------------------------------------------- /images/admin/template/design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/design.png -------------------------------------------------------------------------------- /images/admin/template/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/error.png -------------------------------------------------------------------------------- /images/admin/template/footer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/footer.jpg -------------------------------------------------------------------------------- /images/admin/template/forms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/forms.png -------------------------------------------------------------------------------- /images/admin/template/gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/gallery.png -------------------------------------------------------------------------------- /images/admin/template/general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/general.png -------------------------------------------------------------------------------- /images/admin/template/graphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/graphs.png -------------------------------------------------------------------------------- /images/admin/template/grids.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/grids.png -------------------------------------------------------------------------------- /images/admin/template/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/logout.png -------------------------------------------------------------------------------- /images/admin/template/media.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/media.png -------------------------------------------------------------------------------- /images/admin/template/pages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/pages.png -------------------------------------------------------------------------------- /images/admin/template/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/preview.png -------------------------------------------------------------------------------- /images/admin/template/spacer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/spacer.jpg -------------------------------------------------------------------------------- /images/admin/template/stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/stats.png -------------------------------------------------------------------------------- /images/admin/template/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/success.png -------------------------------------------------------------------------------- /images/admin/template/tables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/tables.png -------------------------------------------------------------------------------- /images/admin/template/users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/users.png -------------------------------------------------------------------------------- /images/admin/template/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/warning.png -------------------------------------------------------------------------------- /images/admin/template/welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/welcome.png -------------------------------------------------------------------------------- /images/admin/template/back_blue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_blue.jpg -------------------------------------------------------------------------------- /images/admin/template/back_grey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_grey.jpg -------------------------------------------------------------------------------- /images/admin/template/back_red.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_red.jpg -------------------------------------------------------------------------------- /images/admin/template/mods_nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/mods_nav.png -------------------------------------------------------------------------------- /images/admin/template/new_mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/new_mail.png -------------------------------------------------------------------------------- /images/admin/template/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/settings.png -------------------------------------------------------------------------------- /images/admin/template/ui-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/ui-icons.png -------------------------------------------------------------------------------- /images/admin/template/back_green.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_green.jpg -------------------------------------------------------------------------------- /images/admin/template/back_navbar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_navbar.jpg -------------------------------------------------------------------------------- /images/admin/template/back_purple.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_purple.jpg -------------------------------------------------------------------------------- /images/admin/template/back_red_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_red_2.jpg -------------------------------------------------------------------------------- /images/admin/template/back_topbar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_topbar.jpg -------------------------------------------------------------------------------- /images/admin/template/back_white.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_white.jpg -------------------------------------------------------------------------------- /images/admin/template/close_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/close_blue.png -------------------------------------------------------------------------------- /images/admin/template/cmslogo_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/cmslogo_big.png -------------------------------------------------------------------------------- /images/admin/template/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/information.png -------------------------------------------------------------------------------- /images/admin/template/navbar_sub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/navbar_sub.png -------------------------------------------------------------------------------- /images/admin/template/search_input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/search_input.png -------------------------------------------------------------------------------- /images/admin/template/small/bullet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/small/bullet.gif -------------------------------------------------------------------------------- /lib/Requests/Exception/Transport.php: -------------------------------------------------------------------------------- 1 | 2 |

$title

3 |
-------------------------------------------------------------------------------- /images/admin/template/back_nav_hover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_nav_hover.jpg -------------------------------------------------------------------------------- /images/admin/template/back_red_hover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_red_hover.jpg -------------------------------------------------------------------------------- /images/admin/template/back_subnavbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_subnavbar.png -------------------------------------------------------------------------------- /images/admin/template/cmslogo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/cmslogo_small.png -------------------------------------------------------------------------------- /images/admin/template/general_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/general_white.png -------------------------------------------------------------------------------- /images/admin/template/grayscale/sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/grayscale/sort.png -------------------------------------------------------------------------------- /images/admin/template/grayscale/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/grayscale/user.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/blog.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/files.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/news.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/pages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/pages.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/shop.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/users.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/video.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/blog.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/files.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/news.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/notes.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/pages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/pages.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/shop.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/stats.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/users.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/video.png -------------------------------------------------------------------------------- /images/admin/template/small/arrow_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/small/arrow_up.png -------------------------------------------------------------------------------- /css/jquery/images/ui-anim_basic_16x16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-anim_basic_16x16.gif -------------------------------------------------------------------------------- /images/admin/template/back_blue_hover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_blue_hover.jpg -------------------------------------------------------------------------------- /images/admin/template/back_green_hover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_green_hover.jpg -------------------------------------------------------------------------------- /images/admin/template/back_grey_hover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_grey_hover.jpg -------------------------------------------------------------------------------- /images/admin/template/back_h2_box_black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_h2_box_black.jpg -------------------------------------------------------------------------------- /images/admin/template/back_h2_box_blue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_h2_box_blue.jpg -------------------------------------------------------------------------------- /images/admin/template/back_h2_box_green.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_h2_box_green.jpg -------------------------------------------------------------------------------- /images/admin/template/back_h2_box_red.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_h2_box_red.jpg -------------------------------------------------------------------------------- /images/admin/template/back_h2_box_white.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_h2_box_white.jpg -------------------------------------------------------------------------------- /images/admin/template/back_header_table.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_header_table.jpg -------------------------------------------------------------------------------- /images/admin/template/back_white_hover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_white_hover.jpg -------------------------------------------------------------------------------- /images/admin/template/grayscale/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/grayscale/options.png -------------------------------------------------------------------------------- /images/admin/template/grayscale/thumbup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/grayscale/thumbup.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/banners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/banners.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/callback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/callback.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/colors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/colors.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/contacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/contacts.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/homepage.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/manager.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/measure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/measure.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/photos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/photos.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/reviews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/reviews.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/contacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/contacts.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/database.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/database.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/design.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/homepage.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/install.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/manager.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/packages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/packages.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/photos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/photos.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/settings.png -------------------------------------------------------------------------------- /images/admin/template/small/arrow_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/small/arrow_down.png -------------------------------------------------------------------------------- /images/admin/template/subbutton_active.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/subbutton_active.jpg -------------------------------------------------------------------------------- /images/admin/template/subbutton_active2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/subbutton_active2.jpg -------------------------------------------------------------------------------- /images/admin/template/subbutton_active3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/subbutton_active3.jpg -------------------------------------------------------------------------------- /images/admin/template/subbutton_hover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/subbutton_hover.jpg -------------------------------------------------------------------------------- /css/jquery/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /css/jquery/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /css/jquery/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /css/jquery/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /css/jquery/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /css/jquery/jquery.ui.selectable.css: -------------------------------------------------------------------------------- 1 | /* Selectable 2 | ----------------------------------*/ 3 | .ui-selectable-helper { border:1px dotted black } 4 | -------------------------------------------------------------------------------- /images/admin/template/back_navbar_active.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/back_navbar_active.jpg -------------------------------------------------------------------------------- /images/admin/template/grayscale/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/grayscale/calendar.png -------------------------------------------------------------------------------- /images/admin/template/grayscale/comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/grayscale/comments.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/calculator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/calculator.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/catalogue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/catalogue.png -------------------------------------------------------------------------------- /images/admin/template/icons/16/questions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/16/questions.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/catalogue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/catalogue.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/admin_users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/admin_users.png -------------------------------------------------------------------------------- /images/admin/template/icons/48/filemanager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/images/admin/template/icons/48/filemanager.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /css/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfedotoff/miwifiradio/HEAD/css/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /config/valid_modules.php: -------------------------------------------------------------------------------- 1 | 2 |

$btitle

3 |
4 | $bcontent 5 |
6 |
7 |
8 |
-------------------------------------------------------------------------------- /css/jquery/jquery.ui.progressbar.css: -------------------------------------------------------------------------------- 1 | /* Progressbar 2 | ----------------------------------*/ 3 | .ui-progressbar { height:2em; text-align: left; } 4 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } -------------------------------------------------------------------------------- /config/config.php: -------------------------------------------------------------------------------- 1 | Панель управления"; 5 | $pagetitle = "Панель управления"; 6 | head(0); 7 | box_start("Панель управления сайтом"); 8 | ?> 9 | Панель предназначена для управления содержимым сайта, его настройками и свойствами 10 | -------------------------------------------------------------------------------- /admin.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /css/jquery/jquery.ui.base.css: -------------------------------------------------------------------------------- 1 | @import url("jquery.ui.core.css"); 2 | @import url("jquery.ui.resizable.css"); 3 | @import url("jquery.ui.selectable.css"); 4 | @import url("jquery.ui.accordion.css"); 5 | @import url("jquery.ui.autocomplete.css"); 6 | @import url("jquery.ui.button.css"); 7 | @import url("jquery.ui.dialog.css"); 8 | @import url("jquery.ui.slider.css"); 9 | @import url("jquery.ui.tabs.css"); 10 | @import url("jquery.ui.datepicker.css"); 11 | @import url("jquery.ui.progressbar.css"); -------------------------------------------------------------------------------- /lib/Requests/Exception/HTTP/410.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 20 | 21 | -------------------------------------------------------------------------------- /lib/Requests/Exception/HTTP/304.php: -------------------------------------------------------------------------------- 1 | 0 is executed later 22 | */ 23 | public function register($hook, $callback, $priority = 0); 24 | 25 | /** 26 | * Dispatch a message 27 | * 28 | * @param string $hook Hook name 29 | * @param array $parameters Parameters to pass to callbacks 30 | * @return boolean Successfulness 31 | */ 32 | public function dispatch($hook, $parameters = array()); 33 | } -------------------------------------------------------------------------------- /css/jquery/jquery.ui.accordion.css: -------------------------------------------------------------------------------- 1 | /* Accordion 2 | ----------------------------------*/ 3 | .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } 4 | .ui-accordion .ui-accordion-li-fix { display: inline; } 5 | .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } 6 | .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } 7 | /* IE7-/Win - Fix extra vertical space in lists */ 8 | .ui-accordion a { zoom: 1; } 9 | .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } 10 | .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } 11 | .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } 12 | .ui-accordion .ui-accordion-content-active { display: block; } -------------------------------------------------------------------------------- /lib/Requests/Auth.php: -------------------------------------------------------------------------------- 1 | callback = $callback; 33 | } 34 | 35 | /** 36 | * Get the current item's value after filtering 37 | * 38 | * @return string 39 | */ 40 | public function current() { 41 | $value = parent::current(); 42 | $value = call_user_func($this->callback, $value); 43 | return $value; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/Requests/Exception/HTTP/Unknown.php: -------------------------------------------------------------------------------- 1 | code = $data->status_code; 40 | } 41 | 42 | parent::__construct($reason, $data); 43 | } 44 | } -------------------------------------------------------------------------------- /lib/Requests/Exception/Transport/cURL.php: -------------------------------------------------------------------------------- 1 | type = $type; 35 | } 36 | 37 | if ($code !== null) { 38 | $this->code = $code; 39 | } 40 | 41 | if ($message !== null) { 42 | $this->reason = $message; 43 | } 44 | 45 | $message = sprintf('%d %s', $this->code, $this->reason); 46 | parent::__construct($message, $this->type, $data, $this->code); 47 | } 48 | 49 | /** 50 | * Get the error message 51 | */ 52 | public function getReason() { 53 | return $this->reason; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /css/jquery/jquery.ui.dialog.css: -------------------------------------------------------------------------------- 1 | /* Dialog 2 | ----------------------------------*/ 3 | .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } 4 | .ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } 5 | .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } 6 | .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } 7 | .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } 8 | .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } 9 | .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } 10 | .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } 11 | .ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } 12 | .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } 13 | .ui-draggable .ui-dialog-titlebar { cursor: move; } 14 | -------------------------------------------------------------------------------- /css/jquery/jquery.ui.tabs.css: -------------------------------------------------------------------------------- 1 | /* Tabs 2 | ----------------------------------*/ 3 | .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 4 | .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } 5 | .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } 6 | .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } 7 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } 8 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } 9 | .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ 10 | .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } 11 | .ui-tabs .ui-tabs-hide { display: none !important; } 12 | -------------------------------------------------------------------------------- /lib/Requests/Exception.php: -------------------------------------------------------------------------------- 1 | type = $type; 40 | $this->data = $data; 41 | } 42 | 43 | /** 44 | * Like {@see getCode()}, but a string code. 45 | * 46 | * @codeCoverageIgnore 47 | * @return string 48 | */ 49 | public function getType() { 50 | return $this->type; 51 | } 52 | 53 | /** 54 | * Gives any relevant data 55 | * 56 | * @codeCoverageIgnore 57 | * @return mixed 58 | */ 59 | public function getData() { 60 | return $this->data; 61 | } 62 | } -------------------------------------------------------------------------------- /lib/Requests/Transport.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | $pagetitle 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 29 | 30 | $menu 31 | 32 | 35 | 36 |
37 | 38 |
39 | -------------------------------------------------------------------------------- /templates/admin/header_full.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | $pagetitle 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 29 | 30 | $menu 31 | 32 | 35 | 36 |
37 | 38 |
39 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | body; 35 | */ echo "error"; 36 | // Logging unknown/untracked requests 37 | //addlog($url); // URL composed by our wrapper 38 | //addlog($requestParams['requestPath']); // API path 39 | //addlog($response->body); // Response from API 40 | } -------------------------------------------------------------------------------- /lib/Requests/Hooks.php: -------------------------------------------------------------------------------- 1 | 0 is executed later 36 | */ 37 | public function register($hook, $callback, $priority = 0) { 38 | if (!isset($this->hooks[$hook])) { 39 | $this->hooks[$hook] = array(); 40 | } 41 | if (!isset($this->hooks[$hook][$priority])) { 42 | $this->hooks[$hook][$priority] = array(); 43 | } 44 | 45 | $this->hooks[$hook][$priority][] = $callback; 46 | } 47 | 48 | /** 49 | * Dispatch a message 50 | * 51 | * @param string $hook Hook name 52 | * @param array $parameters Parameters to pass to callbacks 53 | * @return boolean Successfulness 54 | */ 55 | public function dispatch($hook, $parameters = array()) { 56 | if (empty($this->hooks[$hook])) { 57 | return false; 58 | } 59 | 60 | foreach ($this->hooks[$hook] as $priority => $hooked) { 61 | foreach ($hooked as $callback) { 62 | call_user_func_array($callback, $parameters); 63 | } 64 | } 65 | 66 | return true; 67 | } 68 | } -------------------------------------------------------------------------------- /lib/Requests/Exception/HTTP.php: -------------------------------------------------------------------------------- 1 | reason = $reason; 40 | } 41 | 42 | $message = sprintf('%d %s', $this->code, $this->reason); 43 | parent::__construct($message, 'httpresponse', $data, $this->code); 44 | } 45 | 46 | /** 47 | * Get the status message 48 | */ 49 | public function getReason() { 50 | return $this->reason; 51 | } 52 | 53 | /** 54 | * Get the correct exception class for a given error code 55 | * 56 | * @param int|bool $code HTTP status code, or false if unavailable 57 | * @return string Exception class name to use 58 | */ 59 | public static function get_class($code) { 60 | if (!$code) { 61 | return 'Requests_Exception_HTTP_Unknown'; 62 | } 63 | 64 | $class = sprintf('Requests_Exception_HTTP_%d', $code); 65 | if (class_exists($class)) { 66 | return $class; 67 | } 68 | 69 | return 'Requests_Exception_HTTP_Unknown'; 70 | } 71 | } -------------------------------------------------------------------------------- /js/jquery.droppy.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Droppy 0.1.2 3 | * (c) 2008 Jason Frame (jason@onehackoranother.com) 4 | */ 5 | $.fn.droppy = function(options) { 6 | 7 | options = $.extend({speed: 250}, options || {}); 8 | 9 | this.each(function() { 10 | 11 | var root = this, zIndex = 1000; 12 | 13 | function getSubnav(ele) { 14 | if (ele.nodeName.toLowerCase() == 'li') { 15 | var subnav = $('> ul', ele); 16 | return subnav.length ? subnav[0] : null; 17 | } else { 18 | return ele; 19 | } 20 | } 21 | 22 | function getActuator(ele) { 23 | if (ele.nodeName.toLowerCase() == 'ul') { 24 | return $(ele).parents('li')[0]; 25 | } else { 26 | return ele; 27 | } 28 | } 29 | 30 | function hide() { 31 | var subnav = getSubnav(this); 32 | if (!subnav) return; 33 | $.data(subnav, 'cancelHide', false); 34 | setTimeout(function() { 35 | if (!$.data(subnav, 'cancelHide')) { 36 | $(subnav).fadeOut(options.speed); 37 | } 38 | }, 500); 39 | } 40 | 41 | function show() { 42 | var subnav = getSubnav(this); 43 | if (!subnav) return; 44 | $.data(subnav, 'cancelHide', true); 45 | $(subnav).css({zIndex: zIndex++}).fadeIn(options.speed); 46 | if (this.nodeName.toLowerCase() == 'ul') { 47 | var li = getActuator(this); 48 | $(li).addClass('hover'); 49 | $('> a', li).addClass('hover'); 50 | } 51 | } 52 | 53 | $('ul, li', this).hover(show, hide); 54 | $('li', this).hover( 55 | function() { $(this).addClass('hover'); $('> a', this).addClass('hover'); }, 56 | function() { $(this).removeClass('hover'); $('> a', this).removeClass('hover'); } 57 | ); 58 | 59 | }); 60 | 61 | }; 62 | -------------------------------------------------------------------------------- /css/jquery/jquery.ui.button.css: -------------------------------------------------------------------------------- 1 | /* Button 2 | ----------------------------------*/ 3 | 4 | .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ 5 | .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ 6 | button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ 7 | .ui-button-icons-only { width: 3.4em; } 8 | button.ui-button-icons-only { width: 3.7em; } 9 | 10 | /*button text element */ 11 | .ui-button .ui-button-text { display: block; line-height: 1.4; } 12 | .ui-button-text-only .ui-button-text { padding: .4em 1em; } 13 | .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } 14 | .ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } 15 | .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } 16 | /* no icon support for input elements, provide padding by default */ 17 | input.ui-button { padding: .4em 1em; } 18 | 19 | /*button icon element(s) */ 20 | .ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } 21 | .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } 22 | .ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } 23 | .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 24 | 25 | /*button sets*/ 26 | .ui-buttonset { margin-right: 7px; } 27 | .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } 28 | 29 | /* workarounds */ 30 | button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /templates/admin/login.html: -------------------------------------------------------------------------------- 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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |

35 | $messages 36 | 37 |
38 |
39 |
40 |
41 |
42 | 43 | -------------------------------------------------------------------------------- /play.php: -------------------------------------------------------------------------------- 1 | sql_fetchrow($db->sql_query("SELECT * FROM radios WHERE xid='$xid' LIMIT 1")); 12 | if($radioRow['streamurl'] !== '') { 13 | if(!file_exists($global_path . 'uploads/playing/' . $xid . '/pl.m3u8')) { 14 | // Check if we have ffmpeg already running for another radio station 15 | exec("ps aux | grep 'ffmpeg'", $grep); 16 | $grep = implode("\n", $grep); 17 | $count = substr_count($grep, "ffmpeg"); 18 | if($count > 1) { 19 | // Kill already running ffmpeg not to overload our server 20 | exec("killall ffmpeg"); 21 | } 22 | // Sleep to wait for killing ffmpeg 23 | sleep(1); 24 | 25 | // Now let's remove the playing dir 26 | rrmdir($global_path . 'uploads/playing'); 27 | // And create a new one 28 | mkdir($global_path . 'uploads/playing/'.$xid, 0777, true); 29 | // Then launch ffmpeg in background, redirect its output to devnull and sleep 7sec before returning playlist contents 30 | exec('/usr/local/bin/ffmpeg -headers \'User-Agent: "Dalvik/1.6.0 (Linux; U; Android 4.2.2; C2004 Build/15.2.A.2.5)"\' -i "'.$radioRow['streamurl'].'" -c:a libfdk_aac -b:a 64k -f ssegment -segment_list '.escapeshellarg($global_path . 'uploads/playing/' . $xid . '/pl.m3u8').' -segment_list_flags +live -segment_time 7 -segment_list_size 3 -segment_wrap 5 -segment_list_entry_prefix '.escapeshellarg('http://api.ximalaya.com/uploads/playing/' . $xid . '/').' ' . escapeshellarg($global_path . 'uploads/playing/' . $xid . '/64%03d.aac') . ' > /dev/null 2>&1 < /dev/null &'); 31 | sleep(7); 32 | } 33 | output_file($global_path . 'uploads/playing/' . $xid . '/pl.m3u8', 'pl.m3u8'); 34 | } else { 35 | header("HTTP/1.0 404 Not Found"); 36 | exit; 37 | } 38 | -------------------------------------------------------------------------------- /lib/Requests/Auth/Basic.php: -------------------------------------------------------------------------------- 1 | user, $this->pass) = $args; 46 | } 47 | } 48 | 49 | /** 50 | * Register the necessary callbacks 51 | * 52 | * @see curl_before_send 53 | * @see fsockopen_header 54 | * @param Requests_Hooks $hooks Hook system 55 | */ 56 | public function register(Requests_Hooks &$hooks) { 57 | $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); 58 | $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); 59 | } 60 | 61 | /** 62 | * Set cURL parameters before the data is sent 63 | * 64 | * @param resource $handle cURL resource 65 | */ 66 | public function curl_before_send(&$handle) { 67 | curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 68 | curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString()); 69 | } 70 | 71 | /** 72 | * Add extra headers to the request before sending 73 | * 74 | * @param string $out HTTP header string 75 | */ 76 | public function fsockopen_header(&$out) { 77 | $out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString())); 78 | } 79 | 80 | /** 81 | * Get the authentication string (user:pass) 82 | * 83 | * @return string 84 | */ 85 | public function getAuthString() { 86 | return $this->user . ':' . $this->pass; 87 | } 88 | } -------------------------------------------------------------------------------- /templates/admin/adm_create.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Создание учетной записи администратора 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 |
22 | $messages 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |

49 |
50 |
51 |
52 |
53 |
54 | 55 | -------------------------------------------------------------------------------- /include/admin/modules/kate_configurator.php: -------------------------------------------------------------------------------- 1 | Панель управления » Настройки"; 7 | $pagetitle = "Настройки сайта"; 8 | $subnavmenu = ""; 11 | 12 | head(0); 13 | box_start("Настройки сайта"); 14 | if (!is_writeable($global_path . "config/config.php")) echo "Данные не могут быть сохранены, т.к. система не может получить доступ к файлу " . $global_path . "config/config.php"; 15 | if (count($_POST) > 0) { 16 | $content = " 17 | \$dbhost = \"" . $_POST['dbhost'] . "\"; 18 | \$dbuname = \"" . $_POST['dbuname'] . "\"; 19 | \$dbpass = \"" . $_POST['dbpass'] . "\"; 20 | \$dbname = \"" . $_POST['dbname'] . "\"; 21 | \$global_path = \"" . $_POST['global_path'] . "\";"; 22 | 23 | writefile("config/config.php", $content); 24 | echo "Настройки сайта сохранены"; 25 | } 26 | include($global_path . "config/config.php"); 27 | echo "
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
MySQL хост:
MySQL пользователь:
MySQL пароль:
MySQL имя базы:
Абсолютный путь к корневому каталогу:
Сохранить
36 |
"; 37 | box_end(); 38 | foot(0); 39 | -------------------------------------------------------------------------------- /lib/Requests/Response/Headers.php: -------------------------------------------------------------------------------- 1 | data[$key])) { 29 | return null; 30 | } 31 | 32 | return $this->flatten($this->data[$key]); 33 | } 34 | 35 | /** 36 | * Set the given item 37 | * 38 | * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) 39 | * 40 | * @param string $key Item name 41 | * @param string $value Item value 42 | */ 43 | public function offsetSet($key, $value) { 44 | if ($key === null) { 45 | throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); 46 | } 47 | 48 | $key = strtolower($key); 49 | 50 | if (!isset($this->data[$key])) { 51 | $this->data[$key] = array(); 52 | } 53 | 54 | $this->data[$key][] = $value; 55 | } 56 | 57 | /** 58 | * Get all values for a given header 59 | * 60 | * @param string $key 61 | * @return array Header values 62 | */ 63 | public function getValues($key) { 64 | $key = strtolower($key); 65 | if (!isset($this->data[$key])) { 66 | return null; 67 | } 68 | 69 | return $this->data[$key]; 70 | } 71 | 72 | /** 73 | * Flattens a value into a string 74 | * 75 | * Converts an array into a string by imploding values with a comma, as per 76 | * RFC2616's rules for folding headers. 77 | * 78 | * @param string|array $value Value to flatten 79 | * @return string Flattened value 80 | */ 81 | public function flatten($value) { 82 | if (is_array($value)) { 83 | $value = implode(',', $value); 84 | } 85 | 86 | return $value; 87 | } 88 | 89 | /** 90 | * Get an iterator for the data 91 | * 92 | * Converts the internal 93 | * @return ArrayIterator 94 | */ 95 | public function getIterator() { 96 | return new Requests_Utility_FilteredIterator($this->data, array($this, 'flatten')); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /lib/Requests/Utility/CaseInsensitiveDictionary.php: -------------------------------------------------------------------------------- 1 | $value) { 30 | $this->offsetSet($key, $value); 31 | } 32 | } 33 | 34 | /** 35 | * Check if the given item exists 36 | * 37 | * @param string $key Item key 38 | * @return boolean Does the item exist? 39 | */ 40 | public function offsetExists($key) { 41 | $key = strtolower($key); 42 | return isset($this->data[$key]); 43 | } 44 | 45 | /** 46 | * Get the value for the item 47 | * 48 | * @param string $key Item key 49 | * @return string Item value 50 | */ 51 | public function offsetGet($key) { 52 | $key = strtolower($key); 53 | if (!isset($this->data[$key])) { 54 | return null; 55 | } 56 | 57 | return $this->data[$key]; 58 | } 59 | 60 | /** 61 | * Set the given item 62 | * 63 | * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) 64 | * 65 | * @param string $key Item name 66 | * @param string $value Item value 67 | */ 68 | public function offsetSet($key, $value) { 69 | if ($key === null) { 70 | throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); 71 | } 72 | 73 | $key = strtolower($key); 74 | $this->data[$key] = $value; 75 | } 76 | 77 | /** 78 | * Unset the given header 79 | * 80 | * @param string $key 81 | */ 82 | public function offsetUnset($key) { 83 | unset($this->data[strtolower($key)]); 84 | } 85 | 86 | /** 87 | * Get an iterator for the data 88 | * 89 | * @return ArrayIterator 90 | */ 91 | public function getIterator() { 92 | return new ArrayIterator($this->data); 93 | } 94 | 95 | /** 96 | * Get the headers as an array 97 | * 98 | * @return array Header data 99 | */ 100 | public function getAll() { 101 | return $this->data; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /include/api/get_radios_by_ids.php: -------------------------------------------------------------------------------- 1 | sql_fetchrow($db->sql_query("SELECT * FROM radios WHERE xid='$id' LIMIT 1")); 39 | $myRadios[] = '{"id":'.$radioRow['xid'].',"kind":"radio","program_name":"","radio_name":"'.$radioRow['title'].'","radio_desc":"'.$radioRow['description'].'","schedule_id":0,"support_bitrates":[64],"rate24_aac_url":"","rate64_aac_url":"http://api.ximalaya.com/'.$radioRow['xid'].'.m3u8","rate24_ts_url":"","rate64_ts_url":"","radio_play_count":1,"cover_url_small":"http://api.ximalaya.com/images/radiologos/thumb/thumb_'.$radioRow['logo'].'","cover_url_large":"http://api.ximalaya.com/images/radiologos/'.$radioRow['logo'].'","updated_at":0,"created_at":0}'; 40 | } else { 41 | // Adding this id to list for parsing from real Ximalaya 42 | $realXimalayaIds[] = $id; 43 | } 44 | } 45 | 46 | // Combine real Ximalaya ids to string and replace the existing parameter in the request 47 | $requestParams['params']['ids'] = implode(',', $realXimalayaIds); 48 | 49 | 50 | // TODO: perform request to API if needed. Then override the response 51 | 52 | echo '{"radios":['.implode(',', $myRadios).']}'; 53 | -------------------------------------------------------------------------------- /js/cookie.js: -------------------------------------------------------------------------------- 1 | jQuery.cookie = function(name, value, options) { 2 | if (typeof value != 'undefined') { // name and value given, set cookie 3 | options = options || {}; 4 | if (value === null) { 5 | value = ''; 6 | options.expires = -1; 7 | } 8 | var expires = ''; 9 | if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { 10 | var date; 11 | if (typeof options.expires == 'number') { 12 | date = new Date(); 13 | date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); 14 | } else { 15 | date = options.expires; 16 | } 17 | expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE 18 | } 19 | // CAUTION: Needed to parenthesize options.path and options.domain 20 | // in the following expressions, otherwise they evaluate to undefined 21 | // in the packed version for some reason... 22 | var path = options.path ? '; path=' + (options.path) : ''; 23 | var domain = options.domain ? '; domain=' + (options.domain) : ''; 24 | var secure = options.secure ? '; secure' : ''; 25 | document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); 26 | } else { // only name given, get cookie 27 | var cookieValue = null; 28 | if (document.cookie && document.cookie != '') { 29 | var cookies = document.cookie.split(';'); 30 | for (var i = 0; i < cookies.length; i++) { 31 | var cookie = jQuery.trim(cookies[i]); 32 | // Does this cookie string begin with the name we want? 33 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 34 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 35 | break; 36 | } 37 | } 38 | } 39 | return cookieValue; 40 | } 41 | }; 42 | /** 43 | * 44 | * @access public 45 | * @return void 46 | **/ 47 | function send_question(){ 48 | var name = $('#quname').val(); 49 | var mail = $('#qumail').val(); 50 | var phone = $('#quphone').val(); 51 | var quest = $('#qmessage').val(); 52 | if((name.length==0)||(mail.length==0)||(phone.length==0)||(quest.length==0)||(name=="Ваше имя")||(mail=="E-mail")||(phone=="Контактный телефон")||(quest=="Вопрос")) 53 | alert("Необходимо заполнить все поля"); 54 | else 55 | $.ajax({ 56 | url: '/ajax.php', 57 | data: 'name='+name+'&mail='+mail+'&mes='+quest+'&phone='+phone+'&act=question', 58 | success: function( data ) { 59 | $('#sendquest').html('
Ваш вопрос успешно отправлен.
Ожидайте ответа').show('fast').delay(3000).hide('fast'); 60 | $('#quname').val(''); 61 | $('#qumail').val(''); 62 | $('#quphone').val(''); 63 | $('#qmessage').val(''); 64 | } 65 | }); 66 | } -------------------------------------------------------------------------------- /lib/Requests/Response.php: -------------------------------------------------------------------------------- 1 | headers = new Requests_Response_Headers(); 21 | $this->cookies = new Requests_Cookie_Jar(); 22 | } 23 | 24 | /** 25 | * Response body 26 | * 27 | * @var string 28 | */ 29 | public $body = ''; 30 | 31 | /** 32 | * Raw HTTP data from the transport 33 | * 34 | * @var string 35 | */ 36 | public $raw = ''; 37 | 38 | /** 39 | * Headers, as an associative array 40 | * 41 | * @var Requests_Response_Headers Array-like object representing headers 42 | */ 43 | public $headers = array(); 44 | 45 | /** 46 | * Status code, false if non-blocking 47 | * 48 | * @var integer|boolean 49 | */ 50 | public $status_code = false; 51 | 52 | /** 53 | * Protocol version, false if non-blocking 54 | * @var float|boolean 55 | */ 56 | public $protocol_version = false; 57 | 58 | /** 59 | * Whether the request succeeded or not 60 | * 61 | * @var boolean 62 | */ 63 | public $success = false; 64 | 65 | /** 66 | * Number of redirects the request used 67 | * 68 | * @var integer 69 | */ 70 | public $redirects = 0; 71 | 72 | /** 73 | * URL requested 74 | * 75 | * @var string 76 | */ 77 | public $url = ''; 78 | 79 | /** 80 | * Previous requests (from redirects) 81 | * 82 | * @var array Array of Requests_Response objects 83 | */ 84 | public $history = array(); 85 | 86 | /** 87 | * Cookies from the request 88 | * 89 | * @var Requests_Cookie_Jar Array-like object representing a cookie jar 90 | */ 91 | public $cookies = array(); 92 | 93 | /** 94 | * Is the response a redirect? 95 | * 96 | * @return boolean True if redirect (3xx status), false if not. 97 | */ 98 | public function is_redirect() { 99 | $code = $this->status_code; 100 | return in_array($code, array(300, 301, 302, 303, 307)) || $code > 307 && $code < 400; 101 | } 102 | 103 | /** 104 | * Throws an exception if the request was not successful 105 | * 106 | * @throws Requests_Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`) 107 | * @throws Requests_Exception_HTTP On non-successful status code. Exception class corresponds to code (e.g. {@see Requests_Exception_HTTP_404}) 108 | * @param boolean $allow_redirects Set to false to throw on a 3xx as well 109 | */ 110 | public function throw_for_status($allow_redirects = true) { 111 | if ($this->is_redirect()) { 112 | if (!$allow_redirects) { 113 | throw new Requests_Exception('Redirection not allowed', 'response.no_redirects', $this); 114 | } 115 | } 116 | elseif (!$this->success) { 117 | $exception = Requests_Exception_HTTP::get_class($this->status_code); 118 | throw new $exception(null, $this); 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /include/api/radiosearch.php: -------------------------------------------------------------------------------- 1 | 1) ? 20 * ($curPage - 1) : 0; 32 | list($resultNum) = $db->sql_fetchrow($db->sql_query("SELECT COUNT(*) FROM radios WHERE title LIKE '%$query%' OR description LIKE '%$query%'")); 33 | if($resultNum == 0) { 34 | echo '{"total_page":0,"total_count":0,"current_page":1,"radios":[]}'; 35 | exit; 36 | } else { 37 | $result = $db->sql_query("SELECT id, xid, title, description, logo FROM radios WHERE title LIKE '%$query%' OR description LIKE '%$query%' ORDER BY xid ASC LIMIT $starting, 20"); 38 | $radios = []; 39 | while($radioRow = $db->sql_fetchrow($result)) { 40 | $radios[] = '{"id":'.$radioRow['xid'].',"kind":"radio","program_name":"","radio_name":"'.$radioRow['title'].'","radio_desc":"'.$radioRow['description'].'","schedule_id":0,"support_bitrates":[64],"rate24_aac_url":"","rate64_aac_url":"http://api.ximalaya.com/'.$radioRow['xid'].'.m3u8","rate24_ts_url":"","rate64_ts_url":"","radio_play_count":1,"cover_url_small":"http://api.ximalaya.com/images/radiologos/thumb/thumb_'.$radioRow['logo'].'","cover_url_large":"http://api.ximalaya.com/images/radiologos/'.$radioRow['logo'].'","updated_at":0,"created_at":0}'; 41 | } 42 | $response = '{"total_page":'.ceil($resultNum/20).',"total_count":'.$resultNum.',"current_page":'.$curPage.',"radios":['.implode(",", $radios).']}'; 43 | echo $response; 44 | exit; 45 | } -------------------------------------------------------------------------------- /include/template.php: -------------------------------------------------------------------------------- 1 | 0) ? $meta_keywords.", ".$site_keywords : $site_keywords; 9 | $metadesc = ($meta_description AND strlen($meta_description)>0) ? $meta_description.", ".$site_description : $site_description; 10 | $pagetitle = (strlen($pagetitle)>0) ? $pagetitle." - ".$site_title : $site_title; 11 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/site/header.html"))."\";"; 12 | eval($thefile); 13 | echo stripslashes($r_file); 14 | } 15 | function foot() { 16 | global $db; 17 | $sqlinfo = $db->sql_info(); 18 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/site/footer.html"))."\";"; 19 | eval($thefile); 20 | echo stripslashes($r_file); 21 | } 22 | function error($text){ 23 | global $error; 24 | $error = "1"; 25 | echo "

Ошибка!

$text

"; 26 | echo ""; 27 | foot(); 28 | exit; 29 | } 30 | 31 | 32 | function get_template($template_name) { 33 | $content = file_get_contents("templates/site/".$template_name.".html"); 34 | return preg_replace_callback('/{%block-(\w+)%}/i', "block_parse", $content); 35 | } 36 | 37 | function parse_template($arr,$template) { 38 | if(!isset($arr['pagesnum'])) $arr['pagesnum'] = ""; 39 | date_default_timezone_set("Europe/London"); 40 | $arr['sitedate_l'] = date("d/m/Y H:i"); 41 | date_default_timezone_set("Europe/Moscow"); 42 | $arr['sitedate_m'] = date("d/m/Y H:i"); 43 | foreach($arr as $key => $value) { 44 | $template = str_replace("{".$key."}", $value, $template); 45 | } 46 | return $template; 47 | } 48 | function block_parse($matches){ 49 | global $global_path; 50 | ob_start(); 51 | include("templates/site/blocks/".$matches[1].".php"); 52 | $b_content = ob_get_contents(); 53 | ob_end_clean(); 54 | return $b_content; 55 | } 56 | } else { 57 | function head() { 58 | global $pagetitle, $breadcrumbs, $db, $subnavmenu; 59 | $user_real = $_COOKIE['ad_name']; 60 | if(preg_match("/gzip/", $_SERVER['HTTP_ACCEPT_ENCODING'])) ob_start("ob_gzhandler"); 61 | $menu = top_admin_menu(); 62 | if($_COOKIE['fullsize']=="yes") $hider = " style=\"width: 100%;\""; else $hider = ""; 63 | $sqlinfo = $db->sql_info(); 64 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/admin/header_full.html"))."\";"; 65 | eval($thefile); 66 | echo stripslashes($r_file); 67 | } 68 | function foot() { 69 | global $db; 70 | $sqlinfo = $db->sql_info(); 71 | if($_COOKIE['fullsize']=="yes") $hider2 = " style=\"display:none\""; else $hider2 = ""; 72 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/admin/footer.html"))."\";"; 73 | eval($thefile); 74 | echo stripslashes($r_file); 75 | } 76 | 77 | function get_block_contents($mod_connect) { 78 | global $global_path; 79 | include_once($global_path."include/admin/blocks/$mod_connect.php"); 80 | $block_ = array($btitle, $bcontent); 81 | return $block_; 82 | } 83 | function box_start($title, $hidden='0') { 84 | if($hidden=="1") $hide = " style=\"display:none;\""; else $hide = ""; 85 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/admin/box_start.html"))."\";"; 86 | eval($thefile); 87 | echo stripslashes($r_file); 88 | } 89 | function box_end() { 90 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/admin/box_end.html"))."\";"; 91 | eval($thefile); 92 | echo stripslashes($r_file); 93 | } 94 | } 95 | 96 | ?> -------------------------------------------------------------------------------- /css/jquery/jquery.ui.datepicker.css: -------------------------------------------------------------------------------- 1 | /* Datepicker 2 | ----------------------------------*/ 3 | .ui-datepicker { width: 17em; padding: .2em .2em 0; } 4 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } 5 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } 6 | .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } 7 | .ui-datepicker .ui-datepicker-prev { left:2px; } 8 | .ui-datepicker .ui-datepicker-next { right:2px; } 9 | .ui-datepicker .ui-datepicker-prev-hover { left:1px; } 10 | .ui-datepicker .ui-datepicker-next-hover { right:1px; } 11 | .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } 12 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } 13 | .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } 14 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;} 15 | .ui-datepicker select.ui-datepicker-month, 16 | .ui-datepicker select.ui-datepicker-year { width: 49%;} 17 | .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } 18 | .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } 19 | .ui-datepicker td { border: 0; padding: 1px; } 20 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } 21 | .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } 22 | .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } 23 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } 24 | 25 | /* with multiple calendars */ 26 | .ui-datepicker.ui-datepicker-multi { width:auto; } 27 | .ui-datepicker-multi .ui-datepicker-group { float:left; } 28 | .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } 29 | .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } 30 | .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } 31 | .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } 32 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } 33 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } 34 | .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } 35 | .ui-datepicker-row-break { clear:both; width:100%; } 36 | 37 | /* RTL support */ 38 | .ui-datepicker-rtl { direction: rtl; } 39 | .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } 40 | .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } 41 | .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } 42 | .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } 43 | .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } 44 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } 45 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } 46 | .ui-datepicker-rtl .ui-datepicker-group { float:right; } 47 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 48 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 49 | 50 | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ 51 | .ui-datepicker-cover { 52 | display: none; /*sorry for IE5*/ 53 | display/**/: block; /*sorry for IE5*/ 54 | position: absolute; /*must have*/ 55 | z-index: -1; /*must have*/ 56 | filter: mask(); /*must have*/ 57 | top: -4px; /*must have*/ 58 | left: -4px; /*must have*/ 59 | width: 200px; /*must have*/ 60 | height: 200px; /*must have*/ 61 | } -------------------------------------------------------------------------------- /lib/Requests/Proxy/HTTP.php: -------------------------------------------------------------------------------- 1 | proxy = $args; 60 | } 61 | elseif (is_array($args)) { 62 | if (count($args) == 1) { 63 | list($this->proxy) = $args; 64 | } 65 | elseif (count($args) == 3) { 66 | list($this->proxy, $this->user, $this->pass) = $args; 67 | $this->use_authentication = true; 68 | } 69 | else { 70 | throw new Requests_Exception('Invalid number of arguments', 'proxyhttpbadargs'); 71 | } 72 | } 73 | } 74 | 75 | /** 76 | * Register the necessary callbacks 77 | * 78 | * @since 1.6 79 | * @see curl_before_send 80 | * @see fsockopen_remote_socket 81 | * @see fsockopen_remote_host_path 82 | * @see fsockopen_header 83 | * @param Requests_Hooks $hooks Hook system 84 | */ 85 | public function register(Requests_Hooks &$hooks) { 86 | $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); 87 | 88 | $hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket')); 89 | $hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path')); 90 | if ($this->use_authentication) { 91 | $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); 92 | } 93 | } 94 | 95 | /** 96 | * Set cURL parameters before the data is sent 97 | * 98 | * @since 1.6 99 | * @param resource $handle cURL resource 100 | */ 101 | public function curl_before_send(&$handle) { 102 | curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); 103 | curl_setopt($handle, CURLOPT_PROXY, $this->proxy); 104 | 105 | if ($this->use_authentication) { 106 | curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); 107 | curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string()); 108 | } 109 | } 110 | 111 | /** 112 | * Alter remote socket information before opening socket connection 113 | * 114 | * @since 1.6 115 | * @param string $remote_socket Socket connection string 116 | */ 117 | public function fsockopen_remote_socket(&$remote_socket) { 118 | $remote_socket = $this->proxy; 119 | } 120 | 121 | /** 122 | * Alter remote path before getting stream data 123 | * 124 | * @since 1.6 125 | * @param string $path Path to send in HTTP request string ("GET ...") 126 | * @param string $url Full URL we're requesting 127 | */ 128 | public function fsockopen_remote_host_path(&$path, $url) { 129 | $path = $url; 130 | } 131 | 132 | /** 133 | * Add extra headers to the request before sending 134 | * 135 | * @since 1.6 136 | * @param string $out HTTP header string 137 | */ 138 | public function fsockopen_header(&$out) { 139 | $out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string())); 140 | } 141 | 142 | /** 143 | * Get the authentication string (user:pass) 144 | * 145 | * @since 1.6 146 | * @return string 147 | */ 148 | public function get_auth_string() { 149 | return $this->user . ':' . $this->pass; 150 | } 151 | } -------------------------------------------------------------------------------- /include/admin/check_logged.php: -------------------------------------------------------------------------------- 1 | sql_numrows($db->sql_query("SELECT id FROM admins LIMIT 1"))==0) { 8 | if(!isset($_POST['login'])) { 9 | $messages = "Не создано ни одной учетной записи администратора. Создайте новую запись, используя форму ниже"; 10 | $redirect = (strlen($_SERVER['HTTP_REFERER'])>0) ? $_SERVER['HTTP_REFERER'] : $_SERVER['PHP_SELF']; 11 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/admin/adm_create.html"))."\";"; 12 | eval($thefile); 13 | echo stripslashes($r_file); 14 | } else { 15 | $login = $_POST['login']; 16 | $password = $_POST['password']; 17 | $pass2 = $_POST['password2']; 18 | $mail = $_POST['adm_mail']; 19 | $name = addslashes($_POST['name']); 20 | if(strlen($login)==0 OR strlen($password)==0 OR strlen($pass2)==0 OR strlen($mail)==0 OR strlen($name)==0) $error = "Не заполнено одно из полей. Все поля являются обязательными к заполнению."; 21 | if($password!=$pass2) $error = "Введенные пароли не совпадают"; 22 | if($error) { 23 | $messages = "Не создано ни одной учетной записи администратора. Создайте новую запись, используя форму на странице".$error; 24 | $redirect = (strlen($_SERVER['HTTP_REFERER'])>0) ? $_SERVER['HTTP_REFERER'] : $_SERVER['PHP_SELF']; 25 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/admin/adm_create.html"))."\";"; 26 | eval($thefile); 27 | echo stripslashes($r_file); 28 | exit; 29 | } else { 30 | $db->sql_query("INSERT INTO admins VALUES(NULL, '$login', '".md5($password)."', '$mail', '$name')"); 31 | header("Location: admin.php"); 32 | } 33 | } 34 | exit; 35 | } 36 | 37 | function showLoginForm($error="") { 38 | $messages = $error; 39 | $redirect = (strlen($_SERVER['REQUEST_URI'])>0) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']; 40 | $thefile = "\$r_file=\"".addslashes(file_get_contents("templates/admin/login.html"))."\";"; 41 | eval($thefile); 42 | echo stripslashes($r_file); 43 | } 44 | 45 | function login() { 46 | global $db; 47 | $password = isset($_COOKIE['ad_pass']) ? $_COOKIE['ad_pass'] : ""; 48 | $login = isset($_COOKIE['ad_login']) ? $_COOKIE['ad_login'] : ""; 49 | if(strlen($password)>0) $num = $db->sql_numrows($db->sql_query("SELECT id FROM admins WHERE login='$login' AND pass='$password' LIMIT 1")); else $num = 0; 50 | if(!isset($_POST['password']) AND $num == 0) { 51 | $error = "Данное действие требует авторизации. Введите свои данные в форму выше"; 52 | // if(strlen($password)>0) $error .= "
Неверно указан логин или пароль
"; 53 | showLoginForm($error); 54 | exit(); 55 | } else if (isset($_POST['password'])) { 56 | $pass = isset($_POST['password']) ? $_POST['password'] : ''; 57 | $login = isset($_POST['login']) ? $_POST['login'] : ''; 58 | $result = $db->sql_query("SELECT * FROM admins WHERE login='$login' AND pass='".md5($pass)."'"); 59 | $num = $db->sql_numrows($result); 60 | if ($num==0) { 61 | $error = "Данное действие требует авторизации. Введите свои данные в форму выше"; 62 | if(strlen($pass)>0) $error .= "Неверно указан логин или пароль"; 63 | showLoginForm($error); 64 | exit(); 65 | } else { 66 | $time = ($_POST['remember']) ? time()+604800 : 0; 67 | $row = $db->sql_fetchrow($result); 68 | setcookie("ad_pass", md5($pass), $time); 69 | setcookie("ad_login", $login, $time); 70 | setcookie("ad_mail", $row['mail'], $time); 71 | setcookie("ad_name", $row['name'], $time); 72 | header("Location: ".$_POST['redirect']); 73 | } 74 | } 75 | 76 | } 77 | 78 | login(); 79 | if(isset($_REQUEST['logout'])) { 80 | $redirect = (strlen($_SERVER['REQUEST_URI'])>0) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']; 81 | setcookie("ad_pass", ""); 82 | setcookie("ad_login", ""); 83 | setcookie("ad_mail", ""); 84 | setcookie("ad_name", ""); 85 | if(!preg_match("/logout/", $redirect)) header("Location: $redirect"); else header("Location: admin.php"); 86 | } 87 | ?> -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mi WiFi Online Radio wrapper :radio: 2 | Wrapper on Xiaomi Mi WiFi Online radio to add functionality for adding own radio stations. Remember to read the instructions first. 3 | 4 | It allows you to create a list of your own radio stations (no limits for Chinese stations only). You can add stations from your region and listen them on your favorite device. 5 | 6 | It requires you to redirect subdomains on your router to work correctly and a separate (may be combined with router) web server for working with them. 7 | 8 | # Tools needed 9 | 1. Mi WiFi Online Radio 10 | 11 | ![Mi WiFi Online Radio](/images/xiaomi.jpg) 12 | 13 | 2. WiFi Router supporting DNSMasq (DD-WRT supports it) 14 | 3. Local/Remote Server with root access for installing programs 15 | - PHP 5.4+ (allowing you to use **exec** function) (PHP 7 with mysqli supported) 16 | - MySQL 17 | - Nginx (you can remake everything for Apache as well) 18 | - ffmpeg + fdk_acc 19 | 4. Unix knowledge 20 | 21 | ## Remember 22 | Things will only work when you use your phone in the same WiFi network with the radio or have added radio stations to your 23 | favorites. 24 | 25 | This wrapper works as an interceptor for all your requests to *.ximalaya.com to emulate API. So some things may go broken. 26 | 27 | **This wrapper is only inteded for private use and is not allowed to use publicly**. 28 | 29 | All you are doing may or may not hurt your device and finally brick it :trollface: 30 | 31 | 32 | # How to configure 33 | 34 | 1. Config your linux/bsd server to be up and running. Use nginx + PHP 5.4+ + MySQL for that 35 | 2. Here is an example of my configuration for domain (using Vesta as my control panel). Pay attention to the lines rewriting m3u8 files and redirecting requests to nonexistant files to our main php-script. Don't forget to replace domainname.com with the one you like (and have access to). This config can be non-functional on your nginx installation, so just pay attention to what i mentioned above and modify it to fit your server. 36 | 37 | ``` 38 | server { 39 | listen 192.168.0.100:80; 40 | server_name domainname.com ximalaya.com www.ximalaya.com api.ximalaya.com mobile.ximalaya.com open.ximalaya.com; 41 | root /home/webuser/web/ximalaya.com/public_html; 42 | index index.php index.html index.htm; 43 | location / { 44 | rewrite ^/(.*).m3u8 /play.php?xid=$1; 45 | try_files $uri $uri/ /index.php; 46 | 47 | location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ { 48 | expires max; 49 | } 50 | 51 | location ~ [^/]\.php(/|$) { 52 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 53 | if (!-f $document_root$fastcgi_script_name) { 54 | return 404; 55 | } 56 | 57 | fastcgi_pass 127.0.0.1:9000; 58 | fastcgi_index index.php; 59 | include /etc/nginx/fastcgi_params; 60 | } 61 | } 62 | 63 | location ~* "/\.(htaccess|htpasswd)$" { 64 | deny all; 65 | return 404; 66 | } 67 | 68 | } 69 | ``` 70 | 3. Copy the files from this repository to your site's root folder. 71 | 4. Configure database credentials inside **config/config.php** 72 | 5. Import initial database via phpmyadmin (file **db.sql**) 73 | 6. Configure directory **uploads** and file **config/config.php** to be writable 74 | 7. Access your wrapper admin panel adding /admin.php to your **domainname.com** from nginx config. Like domainname.com/admin.php. It will guide you through creating an admin account and login. 75 | 8. Try to understand the way of creating your own radios in admin panel. 76 | 9. Install ffmpeg with fdk-aac. I used the ppa from here: https://launchpad.net/~mc3man/+archive/ubuntu/trusty-media For freebsd you need recompile it from ports. 77 | 10. Check your ffmpeg starts and is functioning 78 | 11. Now configure DNSMasq on your router to redirect #.ximalaya.com to your server. In DD-WRT this is done in section Services -> Services. Find the textbox **Additional DNSMasq Options** and add the code below, then save configuration and reboot router. You may refer to the image below. 79 | 80 | `address=/.ximalaya.com/192.168.0.100` 81 | ![DD-WRT DNSMasq](/images/ddwrt.png) 82 | 12. Start using your app for the Radio device as usual. Try adding radio station in it and search for the stations you've added in admin panel before. 83 | 84 | Sorry for the code quality in wrapper script. It's as old as Ice Age. Feel free to recommend your changes and new wrapper functions. -------------------------------------------------------------------------------- /include/security.php: -------------------------------------------------------------------------------- 1 | 8 | // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs 9 | $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val); 10 | // straight replacements, the user should never need these since they're normal characters 11 | // this prevents like 12 | $search = 'abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя'; 13 | $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; 14 | $search .= '1234567890!@#$%^&*()'; 15 | $search .= '~`";:?+/={}[]-_|\'\\'; 16 | for ($i = 0; $i < strlen($search); $i++) { 17 | // ;? matches the ;, which is optional 18 | // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 19 | // @ search for the hex values 20 | $val = preg_replace('/(&#[xX]0{0,8}' . dechex(ord($search[$i])) . ';?)/i', $search[$i], $val); // with a ; 21 | // @ 0{0,7} matches '0' zero to seven times 22 | $val = preg_replace('/(�{0,8}' . ord($search[$i]) . ';?)/', $search[$i], $val); // with a ; 23 | } 24 | // now the only remaining whitespace attacks are \t, \n, and \r 25 | $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'base'); 26 | $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); 27 | $ra = array_merge($ra1, $ra2); 28 | 29 | $found = true; // keep replacing as long as the previous round replaced something 30 | while ($found == true) { 31 | $val_before = $val; 32 | for ($i = 0; $i < sizeof($ra); $i++) { 33 | $pattern = '/'; 34 | for ($j = 0; $j < strlen($ra[$i]); $j++) { 35 | if ($j > 0) { 36 | $pattern .= '('; 37 | $pattern .= '(&#[xX]0{0,8}([9ab]);)'; 38 | $pattern .= '|'; 39 | $pattern .= '|(�{0,8}([9|10|13]);)'; 40 | $pattern .= ')*'; 41 | } 42 | $pattern .= $ra[$i][$j]; 43 | } 44 | $pattern .= '/i'; 45 | $replacement = substr($ra[$i], 0, 2) . '' . substr($ra[$i], 2); // add in <> to nerf the tag 46 | $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags 47 | if ($val_before == $val) { 48 | // no replacements were made, so exit the loop 49 | $found = false; 50 | } 51 | } 52 | } 53 | return $val; 54 | } 55 | // Security magic quotes gpc 56 | if (!get_magic_quotes_gpc()) { 57 | function add_slashes($value) 58 | { 59 | if (is_array($value)) { 60 | $value = array_map("add_slashes", $value); 61 | } elseif (!empty($value) && is_string($value)) { 62 | $value = addslashes($value); 63 | } 64 | return $value; 65 | } 66 | $_GET = add_slashes($_GET); 67 | $_POST = add_slashes($_POST); 68 | $_COOKIE = add_slashes($_COOKIE); 69 | $_REQUEST = add_slashes($_REQUEST); 70 | } 71 | // making mysql var safe 72 | function make_safe($variable) 73 | { 74 | $variable = mysql_real_escape_string(trim($variable)); 75 | return $variable; 76 | } 77 | // redirecting 78 | function redirect($location) 79 | { 80 | // do not forget to "exit;" the current script 81 | header ('HTTP/1.1 301 Moved Permanently'); 82 | header ('Location: ' . $location); 83 | exit; 84 | } 85 | 86 | function arr2str($array) { 87 | $str = implode(":", $array); 88 | if(substr()); 89 | } 90 | -------------------------------------------------------------------------------- /lib/Requests/Cookie/Jar.php: -------------------------------------------------------------------------------- 1 | cookies = $cookies; 30 | } 31 | 32 | /** 33 | * Normalise cookie data into a Requests_Cookie 34 | * 35 | * @param string|Requests_Cookie $cookie 36 | * @return Requests_Cookie 37 | */ 38 | public function normalize_cookie($cookie, $key = null) { 39 | if ($cookie instanceof Requests_Cookie) { 40 | return $cookie; 41 | } 42 | 43 | return Requests_Cookie::parse($cookie, $key); 44 | } 45 | 46 | /** 47 | * Normalise cookie data into a Requests_Cookie 48 | * 49 | * @codeCoverageIgnore 50 | * @deprecated Use {@see Requests_Cookie_Jar::normalize_cookie} 51 | * @return Requests_Cookie 52 | */ 53 | public function normalizeCookie($cookie, $key = null) { 54 | return $this->normalize_cookie($cookie, $key); 55 | } 56 | 57 | /** 58 | * Check if the given item exists 59 | * 60 | * @param string $key Item key 61 | * @return boolean Does the item exist? 62 | */ 63 | public function offsetExists($key) { 64 | return isset($this->cookies[$key]); 65 | } 66 | 67 | /** 68 | * Get the value for the item 69 | * 70 | * @param string $key Item key 71 | * @return string Item value 72 | */ 73 | public function offsetGet($key) { 74 | if (!isset($this->cookies[$key])) { 75 | return null; 76 | } 77 | 78 | return $this->cookies[$key]; 79 | } 80 | 81 | /** 82 | * Set the given item 83 | * 84 | * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) 85 | * 86 | * @param string $key Item name 87 | * @param string $value Item value 88 | */ 89 | public function offsetSet($key, $value) { 90 | if ($key === null) { 91 | throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); 92 | } 93 | 94 | $this->cookies[$key] = $value; 95 | } 96 | 97 | /** 98 | * Unset the given header 99 | * 100 | * @param string $key 101 | */ 102 | public function offsetUnset($key) { 103 | unset($this->cookies[$key]); 104 | } 105 | 106 | /** 107 | * Get an iterator for the data 108 | * 109 | * @return ArrayIterator 110 | */ 111 | public function getIterator() { 112 | return new ArrayIterator($this->cookies); 113 | } 114 | 115 | /** 116 | * Register the cookie handler with the request's hooking system 117 | * 118 | * @param Requests_Hooker $hooks Hooking system 119 | */ 120 | public function register(Requests_Hooker $hooks) { 121 | $hooks->register('requests.before_request', array($this, 'before_request')); 122 | $hooks->register('requests.before_redirect_check', array($this, 'before_redirect_check')); 123 | } 124 | 125 | /** 126 | * Add Cookie header to a request if we have any 127 | * 128 | * As per RFC 6265, cookies are separated by '; ' 129 | * 130 | * @param string $url 131 | * @param array $headers 132 | * @param array $data 133 | * @param string $type 134 | * @param array $options 135 | */ 136 | public function before_request($url, &$headers, &$data, &$type, &$options) { 137 | if (!$url instanceof Requests_IRI) { 138 | $url = new Requests_IRI($url); 139 | } 140 | 141 | if (!empty($this->cookies)) { 142 | $cookies = array(); 143 | foreach ($this->cookies as $key => $cookie) { 144 | $cookie = $this->normalize_cookie($cookie, $key); 145 | 146 | // Skip expired cookies 147 | if ($cookie->is_expired()) { 148 | continue; 149 | } 150 | 151 | if ($cookie->domain_matches($url->host)) { 152 | $cookies[] = $cookie->format_for_header(); 153 | } 154 | } 155 | 156 | $headers['Cookie'] = implode('; ', $cookies); 157 | } 158 | } 159 | 160 | /** 161 | * Parse all cookies from a response and attach them to the response 162 | * 163 | * @var Requests_Response $response 164 | */ 165 | public function before_redirect_check(Requests_Response &$return) { 166 | $url = $return->url; 167 | if (!$url instanceof Requests_IRI) { 168 | $url = new Requests_IRI($url); 169 | } 170 | 171 | $cookies = Requests_Cookie::parse_from_headers($return->headers, $url); 172 | $this->cookies = array_merge($this->cookies, $cookies); 173 | $return->cookies = $this; 174 | } 175 | } -------------------------------------------------------------------------------- /lib/Requests/SSL.php: -------------------------------------------------------------------------------- 1 | FF01:0:0:0:0:0:0:101 27 | * ::1 -> 0:0:0:0:0:0:0:1 28 | * 29 | * @author Alexander Merz 30 | * @author elfrink at introweb dot nl 31 | * @author Josh Peck 32 | * @copyright 2003-2005 The PHP Group 33 | * @license http://www.opensource.org/licenses/bsd-license.php 34 | * @param string $ip An IPv6 address 35 | * @return string The uncompressed IPv6 address 36 | */ 37 | public static function uncompress($ip) { 38 | if (substr_count($ip, '::') !== 1) { 39 | return $ip; 40 | } 41 | 42 | list($ip1, $ip2) = explode('::', $ip); 43 | $c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':'); 44 | $c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':'); 45 | 46 | if (strpos($ip2, '.') !== false) { 47 | $c2++; 48 | } 49 | // :: 50 | if ($c1 === -1 && $c2 === -1) { 51 | $ip = '0:0:0:0:0:0:0:0'; 52 | } 53 | // ::xxx 54 | else if ($c1 === -1) { 55 | $fill = str_repeat('0:', 7 - $c2); 56 | $ip = str_replace('::', $fill, $ip); 57 | } 58 | // xxx:: 59 | else if ($c2 === -1) { 60 | $fill = str_repeat(':0', 7 - $c1); 61 | $ip = str_replace('::', $fill, $ip); 62 | } 63 | // xxx::xxx 64 | else { 65 | $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); 66 | $ip = str_replace('::', $fill, $ip); 67 | } 68 | return $ip; 69 | } 70 | 71 | /** 72 | * Compresses an IPv6 address 73 | * 74 | * RFC 4291 allows you to compress consecutive zero pieces in an address to 75 | * '::'. This method expects a valid IPv6 address and compresses consecutive 76 | * zero pieces to '::'. 77 | * 78 | * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 79 | * 0:0:0:0:0:0:0:1 -> ::1 80 | * 81 | * @see uncompress() 82 | * @param string $ip An IPv6 address 83 | * @return string The compressed IPv6 address 84 | */ 85 | public static function compress($ip) { 86 | // Prepare the IP to be compressed 87 | $ip = self::uncompress($ip); 88 | $ip_parts = self::split_v6_v4($ip); 89 | 90 | // Replace all leading zeros 91 | $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); 92 | 93 | // Find bunches of zeros 94 | if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { 95 | $max = 0; 96 | $pos = null; 97 | foreach ($matches[0] as $match) { 98 | if (strlen($match[0]) > $max) { 99 | $max = strlen($match[0]); 100 | $pos = $match[1]; 101 | } 102 | } 103 | 104 | $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); 105 | } 106 | 107 | if ($ip_parts[1] !== '') { 108 | return implode(':', $ip_parts); 109 | } 110 | else { 111 | return $ip_parts[0]; 112 | } 113 | } 114 | 115 | /** 116 | * Splits an IPv6 address into the IPv6 and IPv4 representation parts 117 | * 118 | * RFC 4291 allows you to represent the last two parts of an IPv6 address 119 | * using the standard IPv4 representation 120 | * 121 | * Example: 0:0:0:0:0:0:13.1.68.3 122 | * 0:0:0:0:0:FFFF:129.144.52.38 123 | * 124 | * @param string $ip An IPv6 address 125 | * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part 126 | */ 127 | protected static function split_v6_v4($ip) { 128 | if (strpos($ip, '.') !== false) { 129 | $pos = strrpos($ip, ':'); 130 | $ipv6_part = substr($ip, 0, $pos); 131 | $ipv4_part = substr($ip, $pos + 1); 132 | return array($ipv6_part, $ipv4_part); 133 | } 134 | else { 135 | return array($ip, ''); 136 | } 137 | } 138 | 139 | /** 140 | * Checks an IPv6 address 141 | * 142 | * Checks if the given IP is a valid IPv6 address 143 | * 144 | * @param string $ip An IPv6 address 145 | * @return bool true if $ip is a valid IPv6 address 146 | */ 147 | public static function check_ipv6($ip) { 148 | $ip = self::uncompress($ip); 149 | list($ipv6, $ipv4) = self::split_v6_v4($ip); 150 | $ipv6 = explode(':', $ipv6); 151 | $ipv4 = explode('.', $ipv4); 152 | if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { 153 | foreach ($ipv6 as $ipv6_part) { 154 | // The section can't be empty 155 | if ($ipv6_part === '') { 156 | return false; 157 | } 158 | 159 | // Nor can it be over four characters 160 | if (strlen($ipv6_part) > 4) { 161 | return false; 162 | } 163 | 164 | // Remove leading zeros (this is safe because of the above) 165 | $ipv6_part = ltrim($ipv6_part, '0'); 166 | if ($ipv6_part === '') { 167 | $ipv6_part = '0'; 168 | } 169 | 170 | // Check the value is valid 171 | $value = hexdec($ipv6_part); 172 | if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) { 173 | return false; 174 | } 175 | } 176 | if (count($ipv4) === 4) { 177 | foreach ($ipv4 as $ipv4_part) { 178 | $value = (int) $ipv4_part; 179 | if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) { 180 | return false; 181 | } 182 | } 183 | } 184 | return true; 185 | } 186 | else { 187 | return false; 188 | } 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /include/mysql.php: -------------------------------------------------------------------------------- 1 | db_connect_id = new mysqli($sqlserver, $sqluser, $sqlpassword, $database); 17 | $this->sql_query("SET NAMES UTF8"); 18 | if ($this->db_connect_id) { 19 | return $this->db_connect_id; 20 | } else { 21 | return false; 22 | } 23 | } 24 | 25 | function sql_close() { 26 | if ($this->db_connect_id) { 27 | if ($this->query_result) @mysqli_free_result($this->query_result); 28 | $result = @mysqli_close($this->db_connect_id); 29 | return $result; 30 | } else { 31 | return false; 32 | } 33 | } 34 | 35 | public function sql_query($query = "", $transaction = false) { 36 | unset($this->query_result); 37 | if ($query != "") { 38 | $st = array_sum(explode(" ", microtime())); 39 | //$query = mysql_real_escape_string(trim($query)); 40 | $this->query_result=$this->db_connect_id->query($query); 41 | $total_tdb = round(array_sum(explode(" ", microtime())) - $st, 5); 42 | $this->total_time_db += $total_tdb; 43 | $this->time_query .= "".$total_tdb > 0.01."" ? "".$total_tdb." сек. - [".$query."]

" : "".$total_tdb." сек. - [".$query."]

"; 44 | } 45 | if ($this->query_result) { 46 | $this->num_queries += 1; 47 | unset($this->row[$this->query_result]); 48 | unset($this->rowset[$this->query_result]); 49 | return $this->query_result; 50 | } else { 51 | return ($transaction == END_TRANSACTION) ? true : false; 52 | } 53 | } 54 | 55 | function sql_fetchrow($query_id = 0) { 56 | if (!$query_id) $query_id = $this->query_result; 57 | $res=mysqli_use_result($query_id); 58 | if ($query_id) { 59 | $this->row[$res] = @mysqli_fetch_array($query_id); 60 | return str_replace("&", "&", $this->row[$res]); 61 | } else { 62 | return false; 63 | } 64 | } 65 | 66 | function sql_numrows($query_id = 0) { 67 | if (!$query_id) $query_id = $this->query_result; 68 | if ($query_id) { 69 | $result = @mysqli_num_rows($query_id); 70 | return $result; 71 | } else { 72 | return false; 73 | } 74 | } 75 | 76 | function sql_affectedrows() { 77 | if ($this->db_connect_id) { 78 | $result = @mysqli_affected_rows($this->db_connect_id); 79 | return $result; 80 | } else { 81 | return false; 82 | } 83 | } 84 | 85 | function sql_numfields($query_id = 0) { 86 | if (!$query_id) $query_id = $this->query_result; 87 | if ($query_id) { 88 | $result = @mysqli_num_fields($query_id); 89 | return $result; 90 | } else { 91 | return false; 92 | } 93 | } 94 | 95 | function sql_fieldname($offset, $query_id = 0) { 96 | if (!$query_id) $query_id = $this->query_result; 97 | if ($query_id) { 98 | // $result = @mysql_field_name($query_id, $offset); 99 | $result = @mysqli_fetch_field_direct($query_id. $i)->name; 100 | return $result; 101 | } else { 102 | return false; 103 | } 104 | } 105 | 106 | function sql_fieldtype($offset, $query_id = 0) { 107 | if (!$query_id) $query_id = $this->query_result; 108 | if($query_id) { 109 | // $result = @mysqli_field_type($query_id, $offset); 110 | $result = @mysqli_fetch_field_direct($query_id,$offset)->type; 111 | return $result; 112 | } else { 113 | return false; 114 | } 115 | } 116 | 117 | 118 | function sql_fetchrowset($query_id = 0) { 119 | if (!$query_id) $query_id = $this->query_result; 120 | $res=mysqli_use_result($query_id); 121 | if ($query_id) { 122 | unset($this->rowset[$res]); 123 | unset($this->row[$res]); 124 | while ($this->rowset[$res] = @mysqli_fetch_array($query_id)) { 125 | $result[] = $this->rowset[$res]; 126 | } 127 | return $result; 128 | } else { 129 | return false; 130 | } 131 | } 132 | 133 | function sql_fetchfield($field, $rownum = -1, $query_id = 0) { 134 | if (!$query_id) $query_id = $this->query_result; 135 | if ($query_id) { 136 | if ($rownum > -1) { 137 | $result = @mysqli_result($query_id, $rownum, $field); 138 | } else { 139 | if (empty($this->row[$query_id]) && empty($this->rowset[$query_id])) { 140 | if ($this->sql_fetchrow()) { 141 | $result = $this->row[$query_id][$field]; 142 | } 143 | } else { 144 | if ($this->rowset[$query_id]) { 145 | $result = $this->rowset[$query_id][0][$field]; 146 | } else if ($this->row[$query_id]) { 147 | $result = $this->row[$query_id][$field]; 148 | } 149 | } 150 | } 151 | return $result; 152 | } else { 153 | return false; 154 | } 155 | } 156 | 157 | function sql_rowseek($rownum, $query_id = 0) { 158 | if (!$query_id) $query_id = $this->query_result; 159 | if ($query_id) { 160 | $result = @mysqli_data_seek($query_id, $rownum); 161 | return $result; 162 | } else { 163 | return false; 164 | } 165 | } 166 | 167 | function sql_nextid() { 168 | if ($this->db_connect_id) { 169 | $result = @mysqli_insert_id($this->db_connect_id); 170 | return $result; 171 | } else { 172 | return false; 173 | } 174 | } 175 | 176 | function sql_freeresult($query_id = 0){ 177 | if (!$query_id) $query_id = $this->query_result; 178 | $res=mysqli_use_result($query_id); 179 | if ($query_id) { 180 | unset($this->row[$res]); 181 | unset($this->rowset[$res]); 182 | @mysqli_free_result($query_id); 183 | return true; 184 | } else { 185 | return false; 186 | } 187 | } 188 | 189 | function sql_error($query_id = 0) { 190 | $result["message"] = @mysqli_error($this->db_connect_id); 191 | $result["code"] = @mysqli_errno($this->db_connect_id); 192 | return $result; 193 | } 194 | 195 | function sql_info($full=0) { 196 | if(!isset($this->full)) $this->full = 0; 197 | if ($this->full==1) { 198 | return "Всего запросов к базе данных: ".$this->num_queries." | Общее время выполнения запросов: ".$this->total_time_db." | Время на каждый из запросов: ".$this->time_query.""; 199 | } else { 200 | return "Всего запросов к базе данных: ".$this->num_queries." | Общее время выполнения запросов: ".$this->total_time_db." сек."; 201 | } 202 | } 203 | /* 204 | public function __destruct() { 205 | if ($this->mysqli) $this->mysqli->close(); 206 | } 207 | */ 208 | } 209 | 210 | $db = new sql_db($dbhost, $dbuname, $dbpass, $dbname, false); 211 | if (!$db->db_connect_id) die("Ошибка соединения с базой данных"); 212 | ?> -------------------------------------------------------------------------------- /include/admin/modules/admins.php: -------------------------------------------------------------------------------- 1 | Панель управления » Администраторы"; 9 | $pagetitle = "Администраторы"; 10 | if (strlen($act) == 0) { 11 | $active[0] = " class=\"active\""; 12 | $active[1] = ""; 13 | } else { 14 | $active[1] = ($act == "add") ? " class=\"active\"" : ""; 15 | $active[0] = ""; 16 | } 17 | $subnavmenu = ""; 21 | 22 | switch ($act) { 23 | case "add": 24 | $breadcrumbs = "Панель управления » Администраторы » Добавить администратора"; 25 | $pagetitle .= " - Добавить"; 26 | head(); 27 | box_start("Администраторы - Добавить"); 28 | echo "
29 | 30 | 31 | 32 | 33 | 34 | 35 |
Логин админа:
Имя админа:
Электропочта админа:
Пароль админа:
Добавить
36 |
37 | "; 38 | box_end(); 39 | foot(); 40 | break; 41 | case "edit": 42 | $id = $_GET['id']; 43 | if ($id == 1) header("Location: admin.php?mod=admins"); 44 | $breadcrumbs = "Панель управления » Администраторы » Редактировать администратора"; 45 | $pagetitle .= " - Редактировать"; 46 | list($id, $login, $pass, $mail, $name) = $db->sql_fetchrow($db->sql_query("SELECT * FROM admins WHERE id='$id'")); 47 | head(); 48 | box_start("Администраторы - Редактировать"); 49 | echo "
50 | 51 | 52 | 53 | 54 | 55 | 56 |
Логин админа:
Имя админа:
Электропочта админа:
Новый пароль админа:
Сохранить
57 |
58 | "; 59 | box_end(); 60 | foot(); 61 | break; 62 | case "do_edit": 63 | $id = $_POST['id']; 64 | $alogin = $_POST['alogin']; 65 | $adname = $_POST['rname']; 66 | $amail = $_POST['mail']; 67 | $apass = md5($_POST['apassword']); 68 | $db->sql_query("UPDATE admins SET login='$alogin', name='$adname', mail='$amail', pass='$apass' WHERE id='$id'"); 69 | header("Location: admin.php?mod=admins&mes=saved"); 70 | break; 71 | case "do_add": 72 | $id = $_POST['id']; 73 | $alogin = $_POST['alogin']; 74 | $adname = $_POST['rname']; 75 | $amail = $_POST['mail']; 76 | $apass = md5($_POST['apassword']); 77 | $db->sql_query("INSERT INTO admins (login, pass, mail, name) 78 | VALUES ('$alogin', '$apass', '$amail', '$adname')"); 79 | header("Location: admin.php?mod=admins&mes=added"); 80 | break; 81 | case "del": 82 | $id = $_GET['id']; 83 | if ($id == 1) header("Location: admin.php?mod=admins"); 84 | $db->sql_query("DELETE FROM admins WHERE id='$id'"); 85 | header("Location: admin.php?mod=admins&mes=deleted"); 86 | break; 87 | case "admins": 88 | default: 89 | head(); 90 | box_start("Администраторы"); 91 | echo "Добавить" 92 | . "
"; 93 | if (isset($_REQUEST['mes'])) { 94 | if ($_REQUEST['mes'] == "added") echo "Администратор успешно добавлен"; 95 | if ($_REQUEST['mes'] == "saved") echo "Администратор успешно изменен"; 96 | if ($_REQUEST['mes'] == "deleted") echo "Администратор успешно удален"; 97 | } 98 | echo " 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | "; 110 | $pagenum = $_GET['pagenum']; 111 | $pagenum = (!$pagenum) ? 1 : $pagenum; 112 | $offset = ($pagenum - 1) * 25; 113 | $num = $db->sql_numrows($db->sql_query("SELECT id FROM admins")); 114 | $result = $db->sql_query("SELECT id, login, name, mail FROM admins" . $sql_add . " ORDER BY id ASC LIMIT $offset,25"); 115 | while (list($id, $login, $name, $mail) = $db->sql_fetchrow($result)) { 116 | echo ""; 119 | } 120 | echo " 121 |
IdЛогинИмяПочта
$id$login$name$mail"; 117 | if ($id != 1) echo " "; 118 | echo "
122 |
"; 123 | box_end(); 124 | foot(); 125 | break; 126 | } 127 | -------------------------------------------------------------------------------- /js/custom.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | 3 | $('#navbar').droppy(); 4 | 5 | 6 | //LANGUAGE // 7 | $(".flag").hide(); 8 | $(".language_button").click(function() { 9 | $(".flag").toggle('drop'); 10 | }); 11 | 12 | //BOX SORTABLE // 13 | $(".column.half").sortable({ 14 | connectWith: '.column.half', 15 | handle: '.box-header' 16 | }); 17 | $(".column.full").sortable({ 18 | connectWith: '.column.full', 19 | handle: '.box-header' 20 | }); 21 | $(".box").find(".box-header").prepend('').end(); 22 | $(".box-header .close ").click(function() { 23 | $(this).parents(".box .box-header").toggleClass("box-header closed").toggleClass("box-header"); 24 | $(this).parents(".box:first").find(".box-content").toggle(); 25 | $(this).parents(".box:first").find(".example").toggle(); 26 | }); 27 | 28 | //MESSAGE - TAG HIDE // 29 | $(".message").click(function() { 30 | $(this).hide('blind', 500); 31 | return false; 32 | }); 33 | $(".tag").click(function() { 34 | $(this).hide('highlight', 500); 35 | return false; 36 | }); 37 | 38 | //SEARCH INPUT// 39 | $("#search_input").focusin( 40 | function() { 41 | $('#search_input').val(''); 42 | }); 43 | $("#search_input").focusout( 44 | function() { 45 | $('#search_input').val('Search...'); 46 | }); 47 | 48 | //TEXTAREA INPUT// 49 | $("#form-message").resizable({ 50 | handle: "se", 51 | containment: '#formtest' 52 | }); 53 | $("textarea.form-field").resizable({ 54 | handle: "se", 55 | containment: '.box-content' 56 | }); 57 | 58 | //CHECKBOX // 59 | 60 | $(".checkbox").button(); 61 | $(".radiocheck").buttonset(); 62 | 63 | $(".openable").click(function() 64 | { 65 | $(this).parents().next(".openable-tr").toggle(); 66 | }); 67 | 68 | //GALLERY// 69 | $(".gallery-list li").hover(function() { 70 | $(this).find(".gallery-buttons").toggle(); 71 | }); 72 | 73 | //ACCORDION// 74 | $(".accordion").accordion(); 75 | 76 | //DIALOG// 77 | $('.dialog').dialog({ 78 | autoOpen: false, 79 | width: 800, 80 | height: 260, 81 | modal: true 82 | }); 83 | $('.opener').click(function() { 84 | $('.dialog').dialog('open'); 85 | }); 86 | $('.closer').click(function() { 87 | $('.dialog').dialog('close'); 88 | }); 89 | 90 | //DATAPICKER// 91 | $(".datepicker").datepicker(); 92 | 93 | //TABS - SORTABLE// 94 | $(".tabs").tabs(); 95 | $(".tabs.sortable").tabs().find(".ui-tabs-nav").sortable({axis:'x'}); 96 | 97 | //SKIN// 98 | $(".skin_block").hide(); 99 | $('.skin_button').click(function() { 100 | $(".skin_block").toggle('drop'); 101 | }); 102 | 103 | //TABLE// 104 | oTable = $('#tabledata').dataTable({ 105 | "bJQueryUI": true, 106 | "sPaginationType": "full_numbers", 107 | "oLanguage": { 108 | "sProcessing": "Подождите...", 109 | "sLengthMenu": "Показать _MENU_ записей", 110 | "sZeroRecords": "Записи отсутствуют.", 111 | "sInfo": "Показаны _START_ - _END_ из _TOTAL_", 112 | "sInfoEmpty": "Показаны _START_ - _END_ из _TOTAL_", 113 | "sInfoFiltered": "(отфильтровано из _MAX_ записей)", 114 | "sInfoPostFix": "", 115 | "sSearch": "Поиск:", 116 | "sUrl": "", 117 | "oPaginate": { 118 | "sFirst": "<<", 119 | "sPrevious": "←", 120 | "sNext": "→", 121 | "sLast": ">>" 122 | } 123 | }, 124 | "fnDrawCallback": function(){ 125 | $('td').bind('mouseenter', function () { $(this).parent().children().each(function(){$(this).addClass('datatablerowhighlight');}); }); 126 | $('td').bind('mouseleave', function () { $(this).parent().children().each(function(){$(this).removeClass('datatablerowhighlight');}); }); 127 | $('.nosort').unbind('click').children('span').remove(); 128 | } 129 | }); 130 | $("#checkboxall").click(function() 131 | { 132 | var checked_status = this.checked; 133 | $("input[name=checkall]").each(function() 134 | { 135 | this.checked = checked_status; 136 | }); 137 | }); 138 | $("#checkboxalltabs").click(function() 139 | { 140 | var checked_status = this.checked; 141 | $("input[name=checkalltabs]").each(function() 142 | { 143 | this.checked = checked_status; 144 | }); 145 | }); 146 | $("#checkboxalltabs2").click(function() 147 | { 148 | var checked_status = this.checked; 149 | $("input[name=checkalltabs2]").each(function() 150 | { 151 | this.checked = checked_status; 152 | }); 153 | }); 154 | $(".openable").click(function() 155 | { 156 | $(this).parents().next(".openable-tr").toggle(); 157 | }); 158 | 159 | //SLIDER// 160 | $(".slider-vertical").slider({ 161 | orientation: "vertical", 162 | range: "min", 163 | min: 0, 164 | max: 100, 165 | value: 60, 166 | slide: function(event, ui) { 167 | $(".amount-vert").val(ui.value); 168 | } 169 | }); 170 | $(".amount-vert").val($(".slider-vertical").slider("value")); 171 | 172 | $(".slider-horizontal").slider({ 173 | range: true, 174 | min: 0, 175 | max: 500, 176 | values: [75, 300], 177 | slide: function(event, ui) { 178 | $(".amount-hor").val('$' + ui.values[0] + ' - $' + ui.values[1]); 179 | } 180 | }); 181 | $(".amount-hor").val('$' + $(".slider-horizontal").slider("values", 0) + ' - $' + $(".slider-horizontal").slider("values", 1)); 182 | 183 | //PROGRESSBAR// 184 | 185 | $(".progressbar").progressbar({value:0}); 186 | $(".progressbar .ui-progressbar-value").animate({width:'5%'}, 1500); 187 | 188 | $("#prog-10").click(function() { 189 | $(".progressbar .ui-progressbar-value").animate({width:'10%'}, 1500); 190 | }); 191 | $("#prog-30").click(function() { 192 | $(".progressbar .ui-progressbar-value").animate({width:'30%'}, 1500); 193 | }); 194 | $("#prog-50").click(function() { 195 | $(".progressbar .ui-progressbar-value").animate({width:'50%'}, 1500); 196 | }); 197 | $("#prog-70").click(function() { 198 | $(".progressbar .ui-progressbar-value").animate({width:'70%'}, 1500); 199 | }); 200 | $("#prog-100").click(function() { 201 | $(".progressbar .ui-progressbar-value").animate({width:'100%'}, 1500); 202 | }); 203 | 204 | $(".progressbaractive").progressbar({value: 0}); 205 | $(".progressbarpending").progressbar({value: 0}); 206 | $(".progressbarsuspended").progressbar({value: 0}); 207 | 208 | $(".progressbaractive .ui-progressbar-value").animate({width:'60%'}, 1500); 209 | $(".progressbarpending .ui-progressbar-value").animate({width:'30%'}, 1500); 210 | $(".progressbarsuspended .ui-progressbar-value").animate({width:'10%'}, 1500); 211 | }); 212 | 213 | /** 214 | * 215 | * @access public 216 | * @return void 217 | **/ 218 | function showhide_fields(val){ 219 | if(val=="link") { 220 | $('#shablon, #tit, #tit2, #parent, #showmenu, #cont, #keys, #desc').hide(); 221 | $('#link_pref').show(); 222 | } else { 223 | $('#shablon, #tit, #tit2, #parent, #showmenu, #cont, #keys, #desc').show(); 224 | $('#link_pref').hide(); 225 | } 226 | } 227 | 228 | /** 229 | * 230 | * @access public 231 | * @return void 232 | **/ 233 | function showinfo_special(val){ 234 | if((val=='none') || (val=='colors')) { 235 | $('#showm').attr('checked', 'true'); 236 | $('#showmenu').show(); 237 | $('#pid').removeAttr('disabled'); 238 | } else { 239 | $('#showm').attr('checked', 'false'); 240 | $('#showmenu').hide(); 241 | $('#pid').attr('disabled', 'true'); 242 | } 243 | if(val=="index") $('#tit2').hide(); 244 | } -------------------------------------------------------------------------------- /lib/Requests/Session.php: -------------------------------------------------------------------------------- 1 | useragent = 'X';` 53 | * 54 | * @var array 55 | */ 56 | public $options = array(); 57 | 58 | /** 59 | * Create a new session 60 | * 61 | * @param string|null $url Base URL for requests 62 | * @param array $headers Default headers for requests 63 | * @param array $data Default data for requests 64 | * @param array $options Default options for requests 65 | */ 66 | public function __construct($url = null, $headers = array(), $data = array(), $options = array()) { 67 | $this->url = $url; 68 | $this->headers = $headers; 69 | $this->data = $data; 70 | $this->options = $options; 71 | 72 | if (empty($this->options['cookies'])) { 73 | $this->options['cookies'] = new Requests_Cookie_Jar(); 74 | } 75 | } 76 | 77 | /** 78 | * Get a property's value 79 | * 80 | * @param string $key Property key 81 | * @return mixed|null Property value, null if none found 82 | */ 83 | public function __get($key) { 84 | if (isset($this->options[$key])) { 85 | return $this->options[$key]; 86 | } 87 | 88 | return null; 89 | } 90 | 91 | /** 92 | * Set a property's value 93 | * 94 | * @param string $key Property key 95 | * @param mixed $value Property value 96 | */ 97 | public function __set($key, $value) { 98 | $this->options[$key] = $value; 99 | } 100 | 101 | /** 102 | * Remove a property's value 103 | * 104 | * @param string $key Property key 105 | */ 106 | public function __isset($key) { 107 | return isset($this->options[$key]); 108 | } 109 | 110 | /** 111 | * Remove a property's value 112 | * 113 | * @param string $key Property key 114 | */ 115 | public function __unset($key) { 116 | if (isset($this->options[$key])) { 117 | unset($this->options[$key]); 118 | } 119 | } 120 | 121 | /**#@+ 122 | * @see request() 123 | * @param string $url 124 | * @param array $headers 125 | * @param array $options 126 | * @return Requests_Response 127 | */ 128 | /** 129 | * Send a GET request 130 | */ 131 | public function get($url, $headers = array(), $options = array()) { 132 | return $this->request($url, $headers, null, Requests::GET, $options); 133 | } 134 | 135 | /** 136 | * Send a HEAD request 137 | */ 138 | public function head($url, $headers = array(), $options = array()) { 139 | return $this->request($url, $headers, null, Requests::HEAD, $options); 140 | } 141 | 142 | /** 143 | * Send a DELETE request 144 | */ 145 | public function delete($url, $headers = array(), $options = array()) { 146 | return $this->request($url, $headers, null, Requests::DELETE, $options); 147 | } 148 | /**#@-*/ 149 | 150 | /**#@+ 151 | * @see request() 152 | * @param string $url 153 | * @param array $headers 154 | * @param array $data 155 | * @param array $options 156 | * @return Requests_Response 157 | */ 158 | /** 159 | * Send a POST request 160 | */ 161 | public function post($url, $headers = array(), $data = array(), $options = array()) { 162 | return $this->request($url, $headers, $data, Requests::POST, $options); 163 | } 164 | 165 | /** 166 | * Send a PUT request 167 | */ 168 | public function put($url, $headers = array(), $data = array(), $options = array()) { 169 | return $this->request($url, $headers, $data, Requests::PUT, $options); 170 | } 171 | 172 | /** 173 | * Send a PATCH request 174 | * 175 | * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the 176 | * specification recommends that should send an ETag 177 | * 178 | * @link https://tools.ietf.org/html/rfc5789 179 | */ 180 | public function patch($url, $headers, $data = array(), $options = array()) { 181 | return $this->request($url, $headers, $data, Requests::PATCH, $options); 182 | } 183 | /**#@-*/ 184 | 185 | /** 186 | * Main interface for HTTP requests 187 | * 188 | * This method initiates a request and sends it via a transport before 189 | * parsing. 190 | * 191 | * @see Requests::request() 192 | * 193 | * @throws Requests_Exception On invalid URLs (`nonhttp`) 194 | * 195 | * @param string $url URL to request 196 | * @param array $headers Extra headers to send with the request 197 | * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests 198 | * @param string $type HTTP request type (use Requests constants) 199 | * @param array $options Options for the request (see {@see Requests::request}) 200 | * @return Requests_Response 201 | */ 202 | public function request($url, $headers = array(), $data = array(), $type = Requests::GET, $options = array()) { 203 | $request = $this->merge_request(compact('url', 'headers', 'data', 'options')); 204 | 205 | return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']); 206 | } 207 | 208 | /** 209 | * Send multiple HTTP requests simultaneously 210 | * 211 | * @see Requests::request_multiple() 212 | * 213 | * @param array $requests Requests data (see {@see Requests::request_multiple}) 214 | * @param array $options Global and default options (see {@see Requests::request}) 215 | * @return array Responses (either Requests_Response or a Requests_Exception object) 216 | */ 217 | public function request_multiple($requests, $options = array()) { 218 | foreach ($requests as $key => $request) { 219 | $requests[$key] = $this->merge_request($request, false); 220 | } 221 | 222 | $options = array_merge($this->options, $options); 223 | 224 | // Disallow forcing the type, as that's a per request setting 225 | unset($options['type']); 226 | 227 | return Requests::request_multiple($requests, $options); 228 | } 229 | 230 | /** 231 | * Merge a request's data with the default data 232 | * 233 | * @param array $request Request data (same form as {@see request_multiple}) 234 | * @param boolean $merge_options Should we merge options as well? 235 | * @return array Request data 236 | */ 237 | protected function merge_request($request, $merge_options = true) { 238 | if ($this->url !== null) { 239 | $request['url'] = Requests_IRI::absolutize($this->url, $request['url']); 240 | $request['url'] = $request['url']->uri; 241 | } 242 | 243 | if (empty($request['headers'])) { 244 | $request['headers'] = array(); 245 | } 246 | $request['headers'] = array_merge($this->headers, $request['headers']); 247 | 248 | if (empty($request['data'])) { 249 | if (is_array($this->data)) { 250 | $request['data'] = $this->data; 251 | } 252 | } 253 | elseif (is_array($request['data']) && is_array($this->data)) { 254 | $request['data'] = array_merge($this->data, $request['data']); 255 | } 256 | 257 | if ($merge_options !== false) { 258 | $request['options'] = array_merge($this->options, $request['options']); 259 | 260 | // Disallow forcing the type, as that's a per request setting 261 | unset($request['options']['type']); 262 | } 263 | 264 | return $request; 265 | } 266 | } 267 | -------------------------------------------------------------------------------- /include/admin/modules/radios.php: -------------------------------------------------------------------------------- 1 | Панель управления » Радиостанции"; 10 | $pagetitle = "Радиостанции"; 11 | if (strlen($act) == 0) { 12 | $active[0] = " class=\"active\""; 13 | $active[1] = ""; 14 | } else { 15 | $active[1] = ($act == "add") ? " class=\"active\"" : ""; 16 | $active[0] = ""; 17 | } 18 | $subnavmenu = ""; 22 | 23 | switch ($act) { 24 | // Create station form 25 | case "add": 26 | $breadcrumbs = "Панель управления » Радиостанции » Добавить радиостанцию"; 27 | $pagetitle .= " - Добавить радиостанцию"; 28 | head(); 29 | box_start("Радиостанции - Добавить"); 30 | echo "
31 | 32 | 33 | 34 | 35 | 36 | 37 |
Название радио:
URL потока:
Логотип:
(640x640px)
Описание:
(теги не включать!)
Добавить
38 |
39 | "; 40 | box_end(); 41 | foot(); 42 | break; 43 | 44 | // Create station DB actions 45 | case "do_add": 46 | $title = $_POST['title']; 47 | $streamurl = $_POST['streamurl']; 48 | $description = $_POST['description']; 49 | $image = upload_file("userfile", "images/radiologos", "", "images/radiologos/thumb", 64, 64, true); 50 | 51 | $db->sql_query("INSERT INTO radios (title, description, streamurl, logo) 52 | VALUES ('$title', '$description', '$streamurl', '$image')"); 53 | // We need a 9 digit long id for storing it on Xiaomi server for further interaction 54 | // This is the way we generate it. I am using standard template and replacing its last 55 | // digits with my id from database 56 | $id = $db->sql_nextid(); 57 | $xid = substr('527782000', 0, (9-strlen($id))) . $id; 58 | $db->sql_query("UPDATE radios SET xid='$xid' WHERE id='$id'"); 59 | header("Location: admin.php?mod=radios&mes=added"); 60 | break; 61 | 62 | // Update station form 63 | case "edit": 64 | $id = $_GET['id']; 65 | $breadcrumbs .= " » Редактировать радиостанцию"; 66 | $pagetitle .= " - Редактировать"; 67 | list($id, $title, $description, $streamurl, $logo) = $db->sql_fetchrow($db->sql_query("SELECT id, title, description, streamurl, logo FROM radios WHERE id='$id' LIMIT 1")); 68 | head(); 69 | box_start("Радиостанции - Редактировать"); 70 | echo "
71 | 72 | 73 | 74 | 75 | 81 | 82 | 83 |
Название радио:
URL потока:
Логотип:
(640x640px)
"; 76 | 77 | if (strlen($logo) > 0) 78 | echo " Отметьте, чтобы удалить, или выберите новое
"; 79 | 80 | echo "
Описание:
Сохранить
84 |
85 | "; 86 | box_end(); 87 | foot(); 88 | break; 89 | 90 | // Update station DB actions 91 | case "do_edit": 92 | $id = $_POST['id']; 93 | $title = $_POST['title']; 94 | $streamurl = $_POST['streamurl']; 95 | $description = $_POST['description']; 96 | $image = upload_file("userfile", "images/radiologos", "", "images/radiologos/thumb", 64, 64, true); 97 | if ($_POST['del_image']) 98 | $db->sql_query("UPDATE radios SET logo='' WHERE id='$id'"); 99 | if (strlen($image) > 0) $db->sql_query("UPDATE radios SET logo='$image' WHERE id='$id'"); 100 | $db->sql_query("UPDATE radios SET title='$title', description='$description', streamurl='$streamurl' WHERE id='$id'"); 101 | header("Location: admin.php?mod=radios&mes=saved"); 102 | break; 103 | 104 | // Deleting station 105 | case "del": 106 | $id = $_GET['id']; 107 | $db->sql_query("DELETE FROM radios WHERE id='$id'"); 108 | header("Location: admin.php?mod=radios&mes=deleted"); 109 | break; 110 | 111 | case "radios": 112 | default: 113 | head(); 114 | box_start("Радиостанции"); 115 | echo "Добавить" 116 | . "
"; 117 | if (isset($_REQUEST['mes'])) { 118 | if ($_REQUEST['mes'] == "added") echo "Радиостанция успешно добавлена"; 119 | if ($_REQUEST['mes'] == "saved") echo "Радиостанция успешно изменена"; 120 | if ($_REQUEST['mes'] == "deleted") echo "Радиостанция успешно удалена"; 121 | } 122 | echo " 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | "; 131 | $result = $db->sql_query("SELECT id, xid, title, description, streamurl, logo FROM radios ORDER BY id ASC"); 132 | while (list($id, $xid, $title, $description, $streamurl, $logo) = $db->sql_fetchrow($result)) { 133 | echo " 134 | 135 | 136 | 140 | "; 141 | } 142 | echo " 143 |
xidНазвание
$xid" . stripslashes($title) . " 137 | 138 | 139 |
"; 144 | box_end(); 145 | foot(); 146 | break; 147 | } 148 | -------------------------------------------------------------------------------- /css/table_data.css: -------------------------------------------------------------------------------- 1 | 2 | #dt_example { 3 | font: 80%/1.45em "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; 4 | margin: 0; 5 | padding: 0; 6 | color: #333; 7 | background-color: #fff; 8 | } 9 | 10 | 11 | #dt_example #container { 12 | width: 800px; 13 | margin: 30px auto; 14 | padding: 0; 15 | } 16 | 17 | 18 | #dt_example #footer { 19 | margin: 50px auto 0 auto; 20 | padding: 0; 21 | } 22 | 23 | #dt_example #demo { 24 | margin: 30px auto 0 auto; 25 | } 26 | 27 | #dt_example .demo_jui { 28 | margin: 30px auto 0 auto; 29 | } 30 | 31 | #dt_example .big { 32 | font-size: 1.3em; 33 | font-weight: bold; 34 | line-height: 1.6em; 35 | color: #4E6CA3; 36 | } 37 | 38 | #dt_example .spacer { 39 | height: 20px; 40 | clear: both; 41 | } 42 | 43 | #dt_example .clear { 44 | clear: both; 45 | } 46 | 47 | #dt_example pre { 48 | padding: 15px; 49 | background-color: #F5F5F5; 50 | border: 1px solid #CCCCCC; 51 | } 52 | 53 | #dt_example h1 { 54 | margin-top: 2em; 55 | font-size: 1.3em; 56 | font-weight: normal; 57 | line-height: 1.6em; 58 | color: #4E6CA3; 59 | border-bottom: 1px solid #B0BED9; 60 | clear: both; 61 | } 62 | 63 | #dt_example h2 { 64 | font-size: 1.2em; 65 | font-weight: normal; 66 | line-height: 1.6em; 67 | color: #4E6CA3; 68 | clear: both; 69 | } 70 | 71 | #dt_example a { 72 | color: #0063DC; 73 | text-decoration: none; 74 | } 75 | 76 | #dt_example a:hover { 77 | text-decoration: underline; 78 | } 79 | 80 | #dt_example ul { 81 | color: #4E6CA3; 82 | } 83 | 84 | .css_right { 85 | float: right; 86 | } 87 | 88 | .css_left { 89 | float: left; 90 | } 91 | 92 | .paging_two_button .fg-button { 93 | float: left; 94 | cursor: pointer; 95 | * cursor: hand; 96 | } 97 | 98 | .paging_full_numbers .fg-button { 99 | padding: 2px 6px; 100 | cursor: pointer; 101 | * cursor: hand; 102 | } 103 | 104 | .paging_full_numbers { 105 | width: 350px !important; 106 | } 107 | 108 | .fg-toolbar { 109 | padding: 5px; 110 | } 111 | 112 | .dataTables_paginate { 113 | width: auto; 114 | } 115 | 116 | table.display thead th { 117 | padding: 3px 0px 3px 10px; 118 | cursor: pointer; 119 | * cursor: hand; 120 | } 121 | 122 | .dataTables_wrapper { 123 | position: relative; 124 | min-height: 302px; 125 | _height: 302px; 126 | clear: both; 127 | } 128 | 129 | .dataTables_processing { 130 | position: absolute; 131 | top: 0px; 132 | left: 50%; 133 | width: 250px; 134 | margin-left: -125px; 135 | border: 1px solid #ddd; 136 | text-align: center; 137 | color: #999; 138 | font-size: 11px; 139 | padding: 2px 0; 140 | } 141 | 142 | .dataTables_length { 143 | width: 40%; 144 | float: left; 145 | } 146 | 147 | .dataTables_filter { 148 | width: 50%; 149 | float: right; 150 | text-align: right; 151 | } 152 | 153 | .dataTables_info { 154 | width: 50%; 155 | float: left; 156 | } 157 | 158 | .dataTables_paginate { 159 | float: right; 160 | text-align: right; 161 | } 162 | 163 | .paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { 164 | height: 19px; 165 | width: 19px; 166 | margin-left: 3px; 167 | float: left; 168 | } 169 | 170 | .paginate_disabled_previous { 171 | background-image: url('../images/back_disabled.html'); 172 | } 173 | 174 | .paginate_enabled_previous { 175 | background-image: url('../images/back_enabled.html'); 176 | } 177 | 178 | .paginate_disabled_next { 179 | background-image: url('../images/forward_disabled.html'); 180 | } 181 | 182 | .paginate_enabled_next { 183 | background-image: url('../images/forward_enabled.html'); 184 | } 185 | 186 | table.display { 187 | margin: 0 auto; 188 | width: 100%; 189 | clear: both; 190 | border-collapse: collapse; 191 | } 192 | 193 | table.display tfoot th { 194 | padding: 3px 0px 3px 10px; 195 | font-weight: bold; 196 | font-weight: normal; 197 | } 198 | 199 | table.display tr.heading2 td { 200 | border-bottom: 1px solid #aaa; 201 | } 202 | 203 | table.display td { 204 | padding: 3px 10px; 205 | } 206 | 207 | table.display td.center { 208 | text-align: center; 209 | } 210 | 211 | .sorting_asc { 212 | background: url('../images/sort_asc.html') no-repeat center right; 213 | } 214 | 215 | .sorting_desc { 216 | background: url('../images/sort_desc.html') no-repeat center right; 217 | } 218 | 219 | .sorting { 220 | background: url('../images/sort_both.html') no-repeat center right; 221 | } 222 | 223 | 224 | table.display tr.odd.gradeA { 225 | background-color: #ddffdd; 226 | } 227 | 228 | table.display tr.even.gradeA { 229 | background-color: #eeffee; 230 | } 231 | 232 | table.display tr.odd.gradeA { 233 | background-color: #ddffdd; 234 | } 235 | 236 | table.display tr.even.gradeA { 237 | background-color: #eeffee; 238 | } 239 | 240 | table.display tr.odd.gradeC { 241 | background-color: #ddddff; 242 | } 243 | 244 | table.display tr.even.gradeC { 245 | background-color: #eeeeff; 246 | } 247 | 248 | table.display tr.odd.gradeX { 249 | background-color: #ffdddd; 250 | } 251 | 252 | table.display tr.even.gradeX { 253 | background-color: #ffeeee; 254 | } 255 | 256 | table.display tr.odd.gradeU { 257 | background-color: #ddd; 258 | } 259 | 260 | table.display tr.even.gradeU { 261 | background-color: #eee; 262 | } 263 | 264 | tr.odd { 265 | background-color: #E2E4FF; 266 | } 267 | 268 | tr.even { 269 | background-color: white; 270 | } 271 | 272 | .dataTables_scroll { 273 | clear: both; 274 | } 275 | 276 | .top, .bottom { 277 | padding: 15px; 278 | background-color: #F5F5F5; 279 | border: 1px solid #CCCCCC; 280 | } 281 | 282 | .top .dataTables_info { 283 | float: none; 284 | } 285 | 286 | .clear { 287 | clear: both; 288 | } 289 | 290 | .dataTables_empty { 291 | text-align: center; 292 | } 293 | 294 | tfoot input { 295 | margin: 0.5em 0; 296 | width: 100%; 297 | color: #444; 298 | } 299 | 300 | tfoot input.search_init { 301 | color: #999; 302 | } 303 | 304 | td.group { 305 | background-color: #d1cfd0; 306 | border-bottom: 2px solid #A19B9E; 307 | border-top: 2px solid #A19B9E; 308 | } 309 | 310 | td.details { 311 | background-color: #d1cfd0; 312 | border: 2px solid #A19B9E; 313 | } 314 | 315 | .example_alt_pagination div.dataTables_info { 316 | width: 40%; 317 | } 318 | 319 | .paging_full_numbers span.paginate_button, 320 | .paging_full_numbers span.paginate_active { 321 | border: 1px solid #aaa; 322 | -webkit-border-radius: 5px; 323 | -moz-border-radius: 5px; 324 | padding: 2px 5px; 325 | margin: 0 3px; 326 | cursor: pointer; 327 | *cursor: hand; 328 | } 329 | 330 | .paging_full_numbers span.paginate_button { 331 | background-color: #ddd; 332 | } 333 | 334 | .paging_full_numbers span.paginate_button:hover { 335 | background-color: #ccc; 336 | } 337 | 338 | .paging_full_numbers span.paginate_active { 339 | background-color: #99B3FF; 340 | } 341 | 342 | table.display tr.even.row_selected td { 343 | background-color: #B0BED9; 344 | } 345 | 346 | table.display tr.odd.row_selected td { 347 | background-color: #9FAFD1; 348 | } 349 | 350 | 351 | tr.odd td.sorting_1 { 352 | background-color: #D3D6FF; 353 | } 354 | 355 | tr.odd td.sorting_2 { 356 | background-color: #DADCFF; 357 | } 358 | 359 | tr.odd td.sorting_3 { 360 | background-color: #E0E2FF; 361 | } 362 | 363 | tr.even td.sorting_1 { 364 | background-color: #EAEBFF; 365 | } 366 | 367 | tr.even td.sorting_2 { 368 | background-color: #F2F3FF; 369 | } 370 | 371 | tr.even td.sorting_3 { 372 | background-color: #F9F9FF; 373 | } 374 | 375 | tr.odd.gradeA td.sorting_1 { 376 | background-color: #c4ffc4; 377 | } 378 | 379 | tr.odd.gradeA td.sorting_2 { 380 | background-color: #d1ffd1; 381 | } 382 | 383 | tr.odd.gradeA td.sorting_3 { 384 | background-color: #d1ffd1; 385 | } 386 | 387 | tr.even.gradeA td.sorting_1 { 388 | background-color: #d5ffd5; 389 | } 390 | 391 | tr.even.gradeA td.sorting_2 { 392 | background-color: #e2ffe2; 393 | } 394 | 395 | tr.even.gradeA td.sorting_3 { 396 | background-color: #e2ffe2; 397 | } 398 | 399 | tr.odd.gradeC td.sorting_1 { 400 | background-color: #c4c4ff; 401 | } 402 | 403 | tr.odd.gradeC td.sorting_2 { 404 | background-color: #d1d1ff; 405 | } 406 | 407 | tr.odd.gradeC td.sorting_3 { 408 | background-color: #d1d1ff; 409 | } 410 | 411 | tr.even.gradeC td.sorting_1 { 412 | background-color: #d5d5ff; 413 | } 414 | 415 | tr.even.gradeC td.sorting_2 { 416 | background-color: #e2e2ff; 417 | } 418 | 419 | tr.even.gradeC td.sorting_3 { 420 | background-color: #e2e2ff; 421 | } 422 | 423 | tr.odd.gradeX td.sorting_1 { 424 | background-color: #ffc4c4; 425 | } 426 | 427 | tr.odd.gradeX td.sorting_2 { 428 | background-color: #ffd1d1; 429 | } 430 | 431 | tr.odd.gradeX td.sorting_3 { 432 | background-color: #ffd1d1; 433 | } 434 | 435 | tr.even.gradeX td.sorting_1 { 436 | background-color: #ffd5d5; 437 | } 438 | 439 | tr.even.gradeX td.sorting_2 { 440 | background-color: #ffe2e2; 441 | } 442 | 443 | tr.even.gradeX td.sorting_3 { 444 | background-color: #ffe2e2; 445 | } 446 | 447 | tr.odd.gradeU td.sorting_1 { 448 | background-color: #c4c4c4; 449 | } 450 | 451 | tr.odd.gradeU td.sorting_2 { 452 | background-color: #d1d1d1; 453 | } 454 | 455 | tr.odd.gradeU td.sorting_3 { 456 | background-color: #d1d1d1; 457 | } 458 | 459 | tr.even.gradeU td.sorting_1 { 460 | background-color: #d5d5d5; 461 | } 462 | 463 | tr.even.gradeU td.sorting_2 { 464 | background-color: #e2e2e2; 465 | } 466 | 467 | tr.even.gradeU td.sorting_3 { 468 | background-color: #e2e2e2; 469 | } 470 | 471 | .ex_highlight #example tbody tr.even:hover, #example tbody tr.even td.highlighted { 472 | background-color: #ECFFB3; 473 | } 474 | 475 | .ex_highlight #example tbody tr.odd:hover, #example tbody tr.odd td.highlighted { 476 | background-color: #E6FF99; 477 | } --------------------------------------------------------------------------------